<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">
 <channel>
  <title>XGQT's blog: XGQT's blog</title>
  <description>XGQT's blog: XGQT's blog</description>
  <link>https://xgqt.gitlab.io/blog/index.html</link>
  <lastBuildDate>Fri, 03 Jul 2026 14:30:00 UT</lastBuildDate>
  <pubDate>Fri, 03 Jul 2026 14:30:00 UT</pubDate>
  <ttl>1800</ttl>
  <item>
   <title>My current gitmessage template</title>
   <link>https://xgqt.gitlab.io/blog/posts/2026/07/03/my-current-gitmessage-template/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2026-07-03-my-current-gitmessage-template</guid>
   <pubDate>Fri, 03 Jul 2026 14:30:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;It is possible to configure git to use a extra helpful git message when inside the &lt;code&gt;git commit&lt;/code&gt; editor.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# When committing follow those rules:&lt;/span&gt;
&lt;span class="c1"&gt;#   1. Use the Conventional Commits style when committing!&lt;/span&gt;
&lt;span class="c1"&gt;#      Follow this template:&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt; &amp;lt;type&amp;gt;[optional scope]: &amp;lt;description&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt; [optional body]&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt; [optional footer(s)]&lt;/span&gt;
&lt;span class="c1"&gt;#      Allowed commit types are:&lt;/span&gt;
&lt;span class="c1"&gt;#        fix, feat, build,&lt;/span&gt;
&lt;span class="c1"&gt;#        chore, ci, docs,&lt;/span&gt;
&lt;span class="c1"&gt;#        style, refactor, perf,&lt;/span&gt;
&lt;span class="c1"&gt;#        test.&lt;/span&gt;
&lt;span class="c1"&gt;#      See also: https://www.conventionalcommits.org/en/v1.0.0/&lt;/span&gt;
&lt;span class="c1"&gt;#   2. Remember to add a "Signed-off-by"!&lt;/span&gt;
&lt;span class="c1"&gt;#      For example:&lt;/span&gt;
&lt;span class="c1"&gt;#        &amp;gt; Signed-off-by: John Smith &amp;lt;js@js.org&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Save that as &lt;code&gt;.gitmessage&lt;/code&gt; on repo root.&lt;/p&gt;

&lt;p&gt;Then wire it to local git config with:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--local&lt;span class="w"&gt; &lt;/span&gt;commit.template&lt;span class="w"&gt; &lt;/span&gt;.gitmessage
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;See also:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://dev.to/vetswhocode/git-gud-create-a-gitmessage-4ibj"&gt;https://dev.to/vetswhocode/git-gud-create-a-gitmessage-4ibj&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://codeberg.org/xgqt/blog/src/branch/dev/.gitmessage"&gt;https://codeberg.org/xgqt/blog/src/branch/dev/.gitmessage&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>XGQT.Org gallery</title>
   <link>https://xgqt.gitlab.io/blog/posts/2026/07/01/xgqt-org-gallery/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2026-07-01-xgqt-org-gallery</guid>
   <pubDate>Wed, 01 Jul 2026 21:30:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;ul&gt;
 &lt;li&gt;&lt;a href="#__xgqt_org_gallery_sigal_script_"&gt;Sigal script&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#__xgqt_org_gallery_see_also_"&gt;See also&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;My image gallery is up on &lt;a href="https://xgqt.org/gallery/"&gt;xgqt.org/gallery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is a million times better than Instagram and also it has no likes or comments - that&amp;rsquo;s a feature!&lt;/p&gt;

&lt;p&gt;I build it with &lt;a href="https://github.com/saimn/sigal/"&gt;Sigal&lt;/a&gt; which outputs to static HTML pages.&lt;/p&gt;

&lt;p&gt;&lt;a id="__xgqt_org_gallery_sigal_script_"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="sigal-script"&gt;Sigal script&lt;/h1&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/xgqt.org/htdocs/gallery"&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
sigal&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;./sigal.conf.py&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;--title&lt;span class="w"&gt; &lt;/span&gt;Gallery&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;./pictures/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a id="__xgqt_org_gallery_see_also_"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="see-also"&gt;See also&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;Sigal upstream: &lt;a href="https://github.com/saimn/sigal/"&gt;https://github.com/saimn/sigal/&lt;/a&gt;
  &lt;ul&gt;
   &lt;li&gt;Sigal site config: &lt;a href="https://raw.githubusercontent.com/saimn/sigal/refs/heads/main/docs/conf.py"&gt;https://raw.githubusercontent.com/saimn/sigal/refs/heads/main/docs/conf.py&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;Memes: &lt;a href="https://xgqt.org/gallery/Memes/"&gt;https://xgqt.org/gallery/Memes/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Scribble hacks: insert module code</title>
   <link>https://xgqt.gitlab.io/blog/posts/2026/06/29/scribble-hacks-insert-module-code/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2026-06-29-scribble-hacks-insert-module-code</guid>
   <pubDate>Sun, 28 Jun 2026 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;ul&gt;
 &lt;li&gt;&lt;a href="#__scribble_hacks__insert_module_code_get-module-content_for_"&gt;get-module-content for showing module implementation&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#__scribble_hacks__insert_module_code_get-module-content_usage_"&gt;get-module-content usage inside Scribble&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#__scribble_hacks__insert_module_code_see_also_"&gt;See also&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;a id="__scribble_hacks__insert_module_code_get-module-content_for_"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="get-module-content-for-showing-module-implementation"&gt;get-module-content for showing module implementation&lt;/h1&gt;

&lt;p&gt;Normally Scribble, the Racket&amp;rsquo;s documentation tool, does not provide a way to see how a function/object/module is actually defined in the code. Just recently I wound a good-enough way to insert the whole content of the module we are documenting with Scribble.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s my implementation:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))" style="color: inherit"&gt;define&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get-module-content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;module-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;~&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;module-name&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/symbols.html#(def._((quote._~23~25kernel)._string-~3esymbol))" style="color: inherit"&gt;string-&amp;gt;symbol&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Module_Names_and_Loading.html#(def._((quote._~23~25kernel)._module-path-index-join))" style="color: inherit"&gt;module-path-index-join&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Module_Names_and_Loading.html#(def._((quote._~23~25kernel)._module-path-index-resolve))" style="color: inherit"&gt;module-path-index-resolve&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Module_Names_and_Loading.html#(def._((quote._~23~25kernel)._resolved-module-path-name))" style="color: inherit"&gt;resolved-module-path-name&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Filesystem.html#(def._((lib._racket/file..rkt)._file-~3elines))" style="color: inherit"&gt;file-&amp;gt;lines&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/private/list..rkt)._filter))" style="color: inherit"&gt;filter&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/lambda.html#(form._((lib._racket/private/base..rkt)._lambda))" style="color: inherit"&gt;lambda&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/booleans.html#(def._((quote._~23~25kernel)._not))" style="color: inherit"&gt;not&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/regexp.html#(def._((lib._racket/private/base..rkt)._regexp-match-exact~3f))" style="color: inherit"&gt;regexp-match-exact?&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sr"&gt;#rx"^;.*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/stx-patterns.html#(form._((lib._racket/private/stxcase-scheme..rkt).__))" style="color: inherit"&gt;_&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/strings.html#(def._((lib._racket/string..rkt)._string-join))" style="color: inherit"&gt;string-join&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/strings.html#(def._((lib._racket/string..rkt)._string-trim))" style="color: inherit"&gt;string-trim&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The input is a module name in the form that you would use in absolute require form, except that it is a string, not a bare syntax.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;get-module-content&lt;/code&gt; will reach out to Your Racket package database and find a module that you gave. It will read it and remove all comments. It returns a Racket string.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;string?&lt;/code&gt; returned by &lt;code&gt;get-module-content&lt;/code&gt; can later be used to either extract some more info but it can be effectively used to insert the full module implementation block.&lt;/p&gt;

&lt;p&gt;&lt;a id="__scribble_hacks__insert_module_code_get-module-content_usage_"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="get-module-content-usage-inside-scribble"&gt;get-module-content usage inside Scribble&lt;/h1&gt;

&lt;p&gt;In Scribble I insert the module source code like so:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._this))" style="color: inherit"&gt;this&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;module:&lt;/span&gt;

&lt;span class="n"&gt;@codeblock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;@get-module-content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mypkg/utils/path&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a id="__scribble_hacks__insert_module_code_see_also_"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="see-also"&gt;See also&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://codeberg.org/xgqt/xgqt-racket-app-enigma-emacs/src/commit/9d47fa366b215ef943f3770d92db634cbbcaa982/code/source/v1/enigma-app/doc/enigma-doc/enigma/scribblings/utils/content.rkt"&gt;scribblings/utils/content.rkt&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://codeberg.org/xgqt/xgqt-racket-app-enigma-emacs/src/commit/9d47fa366b215ef943f3770d92db634cbbcaa982/code/source/v1/enigma-app/doc/enigma-doc/enigma/system/utils/path.scrbl#L50"&gt;utils/path.scrbl#L50&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Common Project Layout, Version 1... A Rough Draft #1</title>
   <link>https://xgqt.gitlab.io/blog/posts/2026/04/15/common-project-layout-version-1-a-rough-draft-1/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2026-04-15-common-project-layout-version-1-a-rough-draft-1</guid>
   <pubDate>Wed, 15 Apr 2026 18:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;For CPL version 0 see &lt;a href="https://xgqt.gitlab.io/blog/posts/2023/10/17/common-project-layout-version-0/"&gt;common-project-layout-version&amp;ndash;0&lt;/a&gt;. A template project for CPL v1 can be found at &lt;a href="https://gitlab.com/xgqt/xgqt-misc-template-cplv1/"&gt;gitlab.com/xgqt/xgqt-misc-template-cplv1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To solve the repository layout problem we propose this hierarchy:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;separate the code from text/prose by clear distinction on top-level &amp;mdash; thus the &lt;code&gt;code&lt;/code&gt; dir&lt;/li&gt;
 &lt;li&gt;for &lt;code&gt;code&lt;/code&gt; we create this structure:
  &lt;ul&gt;
   &lt;li&gt;&lt;code&gt;authoring&lt;/code&gt; &amp;mdash; authoring scripts for developers&lt;/li&gt;
   &lt;li&gt;&lt;code&gt;copyright&lt;/code&gt; &amp;mdash; copyright documents &lt;em&gt;for the code&lt;/em&gt;&lt;/li&gt;
   &lt;li&gt;&lt;code&gt;integration&lt;/code&gt; &amp;mdash; integration scripts, ie CI/CD scripts or Groovy sources for Jenkins&lt;/li&gt;
   &lt;li&gt;&lt;code&gt;source&lt;/code&gt; &amp;mdash; versioned application/library sources, each &lt;strong&gt;major&lt;/strong&gt; version is assigned a &lt;code&gt;v&amp;lt;MAJOR&amp;gt;&lt;/code&gt; directory; this allows us to keep and maintain multiple versions, it is very reminiscent to having multiple package versions in a Ports (FreeBSD/Gentoo) repository
    &lt;ul&gt;
     &lt;li&gt;for the &lt;code&gt;v&amp;lt;MAJOR&amp;gt;&lt;/code&gt; dirs we separate each bag of sources or scripts into its own directory, for example:
      &lt;ul&gt;
       &lt;li&gt;&lt;code&gt;3rd-party&lt;/code&gt;&lt;/li&gt;
       &lt;li&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
       &lt;li&gt;&lt;code&gt;build-support&lt;/code&gt;&lt;/li&gt;
       &lt;li&gt;&lt;code&gt;run&lt;/code&gt;&lt;/li&gt;
       &lt;li&gt;&lt;code&gt;&amp;lt;APPNAME&amp;gt;-app&lt;/code&gt;&lt;/li&gt;
       &lt;li&gt;&lt;code&gt;&amp;lt;APPNAME&amp;gt;-lib&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Tutorial: PowerShell Modules in FSharp</title>
   <link>https://xgqt.gitlab.io/blog/posts/2025/05/12/tutorial-powershell-modules-in-fsharp/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2025-05-12-tutorial-powershell-modules-in-fsharp</guid>
   <pubDate>Mon, 12 May 2025 16:47:03 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/fsharp/what-is-fsharp/"&gt;F#&lt;/a&gt; is a amazing functional language bridging C#/.NET ecosystem with &lt;a href="https://ocaml.org/"&gt;OCaml&lt;/a&gt; and interactive programming. It has recently became by favorite language to create personal projects in. It both has additional security of strong typing, unlike Python or Ruby while keeping the functional and interactive properties of weak-typed languages. F# is truly a engineering marvel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/pl-pl/powershell/"&gt;PowerShell 7&lt;/a&gt; is the Open-Source implementation of the old Windows PowerShell that is also cross-platform and can be used for scripting and automation. It&amp;rsquo;s Object-orientation makes an amazing extension capability compared to Bash.&lt;/p&gt;

&lt;p&gt;You can use the F# language to create PowerShell modules. Normally PS Modules are written in C# but since the interop between .NET languages is insanely fluent one can just swap C# for F#.&lt;/p&gt;

&lt;h2 id="creating-new-project"&gt;Creating new project&lt;/h2&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/source/temporary/powershell-modules/fs-example
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/source/temporary/powershell-modules/fs-example
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="dotnet-classlib"&gt;Dotnet ClassLib&lt;/h3&gt;

&lt;p&gt;Init new F# Class project:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dotnet&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;classlib&lt;span class="w"&gt; &lt;/span&gt;--language&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"F#"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="dependencies"&gt;Dependencies&lt;/h3&gt;

&lt;p&gt;Add dependency on Powershell interaction library:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dotnet&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;PowerShellStandard.Library&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.1.1
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="f-interaction-with-powershell"&gt;F# interaction with PowerShell&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s rewrite Library.fs to contain:&lt;/p&gt;

&lt;div class="brush: fsharp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;FsExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PowerShell&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;System.Management.Automation&lt;/span&gt;

&lt;span class="o"&gt;[&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Cmdlet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;VerbsCommon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FsExample"&lt;/span&gt;&lt;span class="o"&gt;)&amp;gt;]&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;FsExample&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;inherit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PSCmdlet&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ValidateNotNullOrEmpty&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;member&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Me"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;override&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BeginProcessing&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printfn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Hello %s"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Then, change &lt;code&gt;RootNamespace&lt;/code&gt; to the main module name, that is &lt;code&gt;FsExample.PowerShell&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We need to copy all assemblies to output. Add &lt;code&gt;&amp;lt;CopyLocalLockFileAssemblies&amp;gt;true&amp;lt;/CopyLocalLockFileAssemblies&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: xml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.NET.Sdk"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net9.0&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;RootNamespace&amp;gt;&lt;/span&gt;FsExample.PowerShell&lt;span class="nt"&gt;&amp;lt;/RootNamespace&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;GenerateDocumentationFile&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/GenerateDocumentationFile&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;CopyLocalLockFileAssemblies&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/CopyLocalLockFileAssemblies&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!-- Snip ... --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="powershell-library"&gt;PowerShell library&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;PSModuleAssets&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;PSModuleAssets
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PSModuleAssets
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The main module file will in turn load the DLL compiled form above F# code.&lt;/p&gt;

&lt;p&gt;Create main module file - &lt;code&gt;fs-example.psm1&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;#!/usr/bin/env -S pwsh -NoLogo -NoProfile -NonInteractive&lt;/span&gt;

&lt;span class="nb"&gt;Import-Module&lt;/span&gt; &lt;span class="s2"&gt;"$PSScriptRoot/fs-example.dll"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;We then need to create the main manifest file &lt;code&gt;fs-example.psd1&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;Path&lt;/code&gt; - relative path to output the manifest,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;RootModule&lt;/code&gt; - relative module path to load on module import,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;ModuleVersion&lt;/code&gt;, &lt;code&gt;Description&lt;/code&gt;, &lt;code&gt;Author&lt;/code&gt; and &lt;code&gt;Copyright&lt;/code&gt;  are some of standard metadata fields,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;AliasesToExport&lt;/code&gt;, &lt;code&gt;CmdletsToExport&lt;/code&gt;, &lt;code&gt;DscResourcesToExport&lt;/code&gt;,  &lt;code&gt;FunctionsToExport&lt;/code&gt; and &lt;code&gt;VariablesToExport&lt;/code&gt; are either globs or lists that  tell what functions will be available on module load,  for simplicity we will just specify a glob expression &lt;code&gt;'*'&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;New-ModuleManifest&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;./&lt;/span&gt;&lt;span class="n"&gt;fs-example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;psd1&lt;/span&gt; &lt;span class="n"&gt;-RootModule&lt;/span&gt; &lt;span class="p"&gt;./&lt;/span&gt;&lt;span class="n"&gt;fs-example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;psm1&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;-ModuleVersion&lt;/span&gt; &lt;span class="s2"&gt;"1.0.0"&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;-Description&lt;/span&gt; &lt;span class="s2"&gt;"FSharp example module"&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;-Author&lt;/span&gt; &lt;span class="s2"&gt;"Me"&lt;/span&gt; &lt;span class="n"&gt;-Copyright&lt;/span&gt; &lt;span class="s2"&gt;"Copyright (c) 2025, Me"&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;-AliasesToExport&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-CmdletsToExport&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;-DscResourcesToExport&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-FunctionsToExport&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-VariablesToExport&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="copying-powershell-assets"&gt;Copying PowerShell assets&lt;/h2&gt;

&lt;p&gt;Following &lt;code&gt;ItemGroup&lt;/code&gt; will copy all files from &lt;code&gt;PSModuleAssets&lt;/code&gt; to the output directory:&lt;/p&gt;

&lt;div class="brush: xml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.NET.Sdk"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!-- Snip ... --&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;None&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;Include=&lt;/span&gt;&lt;span class="s"&gt;"PSModuleAssets/*.*"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Link&amp;gt;&lt;/span&gt;%(Filename)%(Extension)&lt;span class="nt"&gt;&amp;lt;/Link&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;CopyToOutputDirectory&amp;gt;&lt;/span&gt;Always&lt;span class="nt"&gt;&amp;lt;/CopyToOutputDirectory&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/None&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!-- Snip ... --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="building-the-f-module"&gt;Building the F# module&lt;/h2&gt;

&lt;p&gt;Clean up the old builds:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-fr&lt;span class="w"&gt; &lt;/span&gt;./psrepository
rm&lt;span class="w"&gt; &lt;/span&gt;-fr&lt;span class="w"&gt; &lt;/span&gt;./out-module/fs-example
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="dotnet-build"&gt;Dotnet-Build&lt;/h3&gt;

&lt;p&gt;And then build the module:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dotnet&lt;span class="w"&gt; &lt;/span&gt;restore
dotnet&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;--configuration&lt;span class="w"&gt; &lt;/span&gt;Release&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;./out-module/fs-example
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="language-locality-bug"&gt;Language locality bug&lt;/h2&gt;

&lt;p&gt;You have to use the &lt;code&gt;en-US&lt;/code&gt; locale when publishing PowerShell modules.&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;$env:LANG&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"en_US.UTF-8"&lt;/span&gt;
&lt;span class="nv"&gt;$env:LANGUAGE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"en_US.UTF-8"&lt;/span&gt;
&lt;span class="nv"&gt;$env:LC_MESSAGES&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"en_US.utf8"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;

&lt;p&gt;Remove old registered PowerShell repository:&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Unregister-PSRepository&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;fs-example&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="register-psrepository-and-publish-module"&gt;Register-PSRepository and Publish-Module&lt;/h3&gt;

&lt;p&gt;This quite complicated script will:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;set up a PowerShell repository in current location,&lt;/li&gt;
 &lt;li&gt;register the PowerShell repository,&lt;/li&gt;
 &lt;li&gt;publish the module into the PowerShell repository,&lt;/li&gt;
 &lt;li&gt;install that published module from the PowerShell repository.&lt;/li&gt;&lt;/ul&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;$repo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"fs-example"&lt;/span&gt;
&lt;span class="nv"&gt;$repoPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$pwd/psrepository/fs-example"&lt;/span&gt;

&lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-ItemType&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$repoPath&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-Null&lt;/span&gt;
&lt;span class="nb"&gt;Register-PSRepository&lt;/span&gt; &lt;span class="n"&gt;-InstallationPolicy&lt;/span&gt; &lt;span class="n"&gt;Trusted&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$repo&lt;/span&gt; &lt;span class="n"&gt;-SourceLocation&lt;/span&gt; &lt;span class="nv"&gt;$repoPath&lt;/span&gt;

&lt;span class="nb"&gt;Publish-Module&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$pwd&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;out-module&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fs-example&lt;/span&gt; &lt;span class="n"&gt;-Repository&lt;/span&gt; &lt;span class="nv"&gt;$repo&lt;/span&gt;
&lt;span class="nb"&gt;Install-Module&lt;/span&gt; &lt;span class="n"&gt;-Scope&lt;/span&gt; &lt;span class="n"&gt;CurrentUser&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;fs-example&lt;/span&gt; &lt;span class="n"&gt;-Repository&lt;/span&gt; &lt;span class="nv"&gt;$repo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="removal"&gt;Removal&lt;/h2&gt;

&lt;h3 id="uninstall-module"&gt;Uninstall-Module&lt;/h3&gt;

&lt;p&gt;Just call &lt;code&gt;Uninstall-Module&lt;/code&gt; to remove any PowerShell module.&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;Uninstall-Module&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;fs-example&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="usage-in-the-repl"&gt;Usage in the REPL&lt;/h2&gt;

&lt;h3 id="import-module"&gt;Import-Module&lt;/h3&gt;

&lt;p&gt;Import it with &lt;code&gt;Import-Module&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;Import-Module&lt;/span&gt; &lt;span class="n"&gt;-Verbose&lt;/span&gt; &lt;span class="n"&gt;fs-example&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="finally---use-format-fsexample"&gt;Finally - use Format-FsExample&lt;/h3&gt;

&lt;p&gt;Remember the above F# function that was defined in the class?&lt;/p&gt;

&lt;div class="brush: fsharp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;[&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Cmdlet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;VerbsCommon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FsExample"&lt;/span&gt;&lt;span class="o"&gt;)&amp;gt;]&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;FsExample&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;It will be now available under the name composed of the &amp;ldquo;common verb&amp;rdquo; and a secondary part, so &lt;code&gt;Format-FsExample&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Try it:&lt;/p&gt;

&lt;div class="brush: powershell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;Format-FsExample&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;Maciej&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Interacting with OneDrive in Nextcloud by using RClone</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/11/07/interacting-with-onedrive-in-nextcloud-by-using-rclone/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-11-07-interacting-with-onedrive-in-nextcloud-by-using-rclone</guid>
   <pubDate>Thu, 07 Nov 2024 15:57:37 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;There will be a FUSE OneDrive filesystem mounted on the machine Nextcloud  runs on,&lt;/li&gt;
 &lt;li&gt;You configure filesystem-local &amp;ldquo;External storage&amp;rdquo; and point to the mountpoint  of a cloud drive (in this case OneDrive),&lt;/li&gt;
 &lt;li&gt;users connected via Nextcloud Client will have a option to sync any chosen  files from the External storage as if they were Nextcloud-owned files.&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;

&lt;p&gt;There are some benefits from connecting OneDrive to Nextcloud:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;faster cached sync than by normal straight-to OneDrive connection - files  will be pushed to Nextcloud and then uploaded to Nextcloud,  this will take less time than uploading straight to OneDrive  &lt;strong&gt;because of Microsoft OneDrive rate-limiting&lt;/strong&gt; the uploads  (especially in case of larger files),&lt;/li&gt;
 &lt;li&gt;clients of Nextcloud do not have to configure any OneDrive connection,&lt;/li&gt;
 &lt;li&gt;you will be able to have two-way sync of your OneDrive files  (currently two-way sync on the RClone side is experimental,  this will use Nextcloud&amp;rsquo;s two-way sync mechanism).&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="set-up-rclone"&gt;Set up RClone&lt;/h2&gt;

&lt;p&gt;First You will have to set up RClone. Connect to your cloud of choice and then copy the config to a location that will be readable by a service that mounts a given cloud drive.&lt;/p&gt;

&lt;p&gt;For OneDrive I use &lt;code&gt;/usr/local/share/rclone/config/rclone.conf&lt;/code&gt; that is accessible only to the &lt;code&gt;apache&lt;/code&gt; user.&lt;/p&gt;

&lt;p&gt;The config will look something like this:&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;[OneDrive]
type = onedrive
region = global
token = *REDACTED*
drive_id = *REDACTED*
drive_type = personal
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="mounting-onedrive"&gt;Mounting OneDrive&lt;/h2&gt;

&lt;p&gt;I created this helper script (in &lt;code&gt;/usr/local/bin/rclone-mount.sh&lt;/code&gt;):&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-u
&lt;span class="nb"&gt;trap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exit 130"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;INT

&lt;span class="nv"&gt;conf_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;cloud_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;log_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/log/rclone"&lt;/span&gt;
&lt;span class="nv"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rclone-mount-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.log"&lt;/span&gt;

mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
touch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

chmod&lt;span class="w"&gt; &lt;/span&gt;a+r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
chown&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rclone&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--default-permissions&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--allow-other&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--verbose&lt;span class="w"&gt;                                      &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--vfs-cache-mode&lt;span class="w"&gt; &lt;/span&gt;full&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;conf_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;mount&lt;span class="w"&gt;                                          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;log_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Then, I use it in a OpenRC service like this (&lt;code&gt;/etc/init.d/mount-OneDrive&lt;/code&gt;):&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/sbin/openrc-run&lt;/span&gt;

&lt;span class="nv"&gt;conf_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/share/rclone/config/rclone.conf"&lt;/span&gt;

&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"OneDrive"&lt;/span&gt;
&lt;span class="nv"&gt;cloud_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;

&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apache"&lt;/span&gt;
&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/mnt/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/bin/rclone-mount.sh"&lt;/span&gt;
&lt;span class="nv"&gt;command_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;conf_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloud_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;command_background&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;
&lt;span class="nv"&gt;command_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;id&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"supervise-daemon"&lt;/span&gt;

depend&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;need&lt;span class="w"&gt; &lt;/span&gt;net
&lt;span class="o"&gt;}&lt;/span&gt;

start_pre&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ebegin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unmounting leftovers from &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; before service start"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;eend&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

stop_post&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ebegin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unmounting leftovers from &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; after service stop"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;eend&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="enabling-the-rclone-service"&gt;Enabling the RClone service&lt;/h3&gt;

&lt;p&gt;Set up directories and correct permissions:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/usr/local/share/rclone/config
chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;apache:apache&lt;span class="w"&gt; &lt;/span&gt;/usr/local/share/rclone/config

mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/var/log/rclone
chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;apache:apache&lt;span class="w"&gt; &lt;/span&gt;/var/log/rclone
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Do not forget to make the mount service script executable:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/etc/init.d/mount-OneDrive
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Enable and start this service on OpenRC:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;mount-OneDrive&lt;span class="w"&gt; &lt;/span&gt;default
rc-service&lt;span class="w"&gt; &lt;/span&gt;mount-OneDrive&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="drive-permissions"&gt;Drive permissions&lt;/h3&gt;

&lt;p&gt;RClone mounts cloud drives by using FUSE. To have the RClone option &lt;code&gt;--allow-other&lt;/code&gt; available in order to allow &lt;code&gt;root&lt;/code&gt; to access the drive you will have to modify the FUSE config file (&lt;code&gt;/etc/fuse.conf&lt;/code&gt;) - add &lt;code&gt;user_allow_other&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="nextcloud-configuration"&gt;Nextcloud configuration&lt;/h2&gt;

&lt;p&gt;Download and enable the &amp;ldquo;External storage&amp;rdquo; app. Then, in &amp;ldquo;Administration&amp;rdquo; settings add a external storage:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;name: &lt;code&gt;ExternalStorage_OneDrive&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;type: &lt;code&gt;Local&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;authentication: &lt;code&gt;None&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;configuration: &lt;code&gt;/mnt/OneDrive&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;available for: &lt;em&gt;YOUR USER&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;img src="/blog/images/nextcloud/nextcloud_admin_external_storage_onedrive.jpg" alt="nextcloud admin external storage onedrive" width="800" /&gt;&lt;/p&gt;</description></item>
  <item>
   <title>GHC 9.8 and Cabal 3.10.3 on Gentoo Linux</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/11/07/ghc-9-8-and-cabal-3-10-3-on-gentoo-linux/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-11-07-ghc-9-8-and-cabal-3-10-3-on-gentoo-linux</guid>
   <pubDate>Thu, 07 Nov 2024 15:02:31 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;The official &lt;code&gt;::gentoo&lt;/code&gt; repository currently contains only GHC on version 9.2.8. To install newer GHC one has to either download/build themselves or use the &lt;code&gt;::haskell&lt;/code&gt; overlay (&lt;a href="https://github.com/gentoo-haskell/gentoo-haskell"&gt;https://github.com/gentoo-haskell/gentoo-haskell&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id="enable-the-haskell-overlay"&gt;Enable the ::haskell overlay&lt;/h2&gt;

&lt;p&gt;Enable:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;eselect&lt;span class="w"&gt; &lt;/span&gt;repository&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;haskell
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Sync:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--sync&lt;span class="w"&gt; &lt;/span&gt;haskell
egencache&lt;span class="w"&gt; &lt;/span&gt;--update&lt;span class="w"&gt; &lt;/span&gt;--repo&lt;span class="w"&gt; &lt;/span&gt;haskell&lt;span class="w"&gt; &lt;/span&gt;--jobs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--load&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
eix-update
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="unmask-needed-packages"&gt;Unmask needed packages&lt;/h2&gt;

&lt;p&gt;Add to &lt;code&gt;/etc/portage/package.unmask/0000_hs.conf&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;dev-lang/ghc-9.9

&amp;lt;dev-haskell/cabal-3.11
&amp;lt;dev-haskell/cabal-install-3.11
&amp;lt;dev-haskell/cabal-install-solver-3.11
&amp;lt;dev-haskell/cabal-syntax-3.11
&amp;lt;dev-haskell/text-2.2
&amp;lt;dev-haskell/parsec-3.1.18
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Add to &lt;code&gt;/etc/portage/package.accept_keywords/0000_hs.conf&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;app-admin/haskell-updater
dev-haskell/*
dev-lang/ghc
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="install"&gt;Install&lt;/h2&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--ask&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=dev-lang/ghc-9.8"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=dev-haskell/cabal-install-3.10"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Build of GHC 9.8 takes around ~2 hours on a 8-core laptop-grade CPU.&lt;/p&gt;

&lt;h2 id="bonus-masking-packages-from-haskell"&gt;Bonus: masking packages from ::haskell&lt;/h2&gt;

&lt;p&gt;If you want to exclude a given version from the &lt;code&gt;::haskell&lt;/code&gt; overly from being installed/updated, then you can add a similar line(s) to &lt;code&gt;/etc/portage/package.mask/0000_hs.conf&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;app-emacs/haskell-mode::haskell
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Forgotten SysStat</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/10/28/forgotten-sysstat/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-10-28-forgotten-sysstat</guid>
   <pubDate>Mon, 28 Oct 2024 21:35:15 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;SysStat is a amazing tool. In the age where telegraf and grafana are all the rage everybody forgot about the good old &lt;code&gt;sysstat&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="selected-command-examples"&gt;Selected command examples&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;iostat -d -p nvme0n1 3&lt;/code&gt; - disk I/O for a NVME drive (&lt;code&gt;nvme0n1&lt;/code&gt;),&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;sar -n DEV 3&lt;/code&gt; - network throughput,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;sar -h -r 3&lt;/code&gt; - memory usage,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;sar -P ALL 3&lt;/code&gt; - CPU utilization&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;sar -q 3&lt;/code&gt; - system load levels,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;sar -A 3&lt;/code&gt; - all the metrics.&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="gathered-info"&gt;Gathered info&lt;/h2&gt;

&lt;blockquote&gt;
 &lt;p&gt;qlist app-admin/sysstat | grep /usr/bin/&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The app-admin/sysstat contains the following binaries and their respective statistic fields:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;sar&lt;/code&gt; - general utilization statistics,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;cifsiostat&lt;/code&gt; - CIFS,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;iostat&lt;/code&gt; - device input/output,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;mpstat&lt;/code&gt; - processors,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;pidstat&lt;/code&gt; - Linux tasks,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;tapestat&lt;/code&gt; - tape (yes, the real tape disks).&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;

&lt;h3 id="gentoo"&gt;Gentoo&lt;/h3&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--noreplace&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;sys-process/cronie&lt;span class="w"&gt; &lt;/span&gt;app-admin/sysstat
rc-service&lt;span class="w"&gt; &lt;/span&gt;cronie&lt;span class="w"&gt; &lt;/span&gt;start
rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;cronie&lt;span class="w"&gt; &lt;/span&gt;default
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="files"&gt;Files&lt;/h2&gt;

&lt;p&gt;By default (on Gentoo): * &lt;code&gt;sa&lt;/code&gt; (the collector) saves statistics to &lt;code&gt;/var/log/sa&lt;/code&gt;, * &lt;code&gt;/etc/sysstat&lt;/code&gt; is the configuration file * cron jobs are run via the &lt;code&gt;*system*&lt;/code&gt; cronjob table.&lt;/p&gt;</description></item>
  <item>
   <title>Tag the releases</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/10/03/tag-the-releases/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-10-03-tag-the-releases</guid>
   <pubDate>Thu, 03 Oct 2024 15:43:33 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Tag your releases!&lt;/p&gt;

&lt;p&gt;There were so many times when I wanted to use some package, it has a version on repology, but when I open the project&amp;rsquo;s repo there are no tags.&lt;/p&gt;

&lt;p&gt;Nowadays it is extremely easy to bump software versions according to semantic versioning and also to tag them, that it should go without saying that most OSS and proprietary projects could also follow that workflow.&lt;/p&gt;

&lt;p&gt;There are many projects both language-specific and agnostic to manage the release (and tagging) process. My favorite agnostic one is &lt;a href="https://github.com/your-tools/tbump/"&gt;tbump&lt;/a&gt; and I highly recommend it.&lt;/p&gt;</description></item>
  <item>
   <title>Install Bazel ZSH completion</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/08/02/install-bazel-zsh-completion/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-08-02-install-bazel-zsh-completion</guid>
   <pubDate>Fri, 02 Aug 2024 18:20:08 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bazelbuild/bazel"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://raw.githubusercontent.com/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;repo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;raw&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/master/scripts/zsh_completion/_bazel"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;site_functions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/share/zsh/site-functions"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;site_functions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/_bazel
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Afterwards, restart your ZSH shell session.&lt;/p&gt;

&lt;p&gt;This also works if you have &lt;code&gt;bazelisk&lt;/code&gt; installed but &lt;code&gt;bazel&lt;/code&gt; has to be symlinked to the &lt;code&gt;bazelisk&lt;/code&gt; executable path.&lt;/p&gt;</description></item>
  <item>
   <title>Do not split make.conf</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/07/09/do-not-split-make-conf/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-07-09-do-not-split-make-conf</guid>
   <pubDate>Tue, 09 Jul 2024 20:00:59 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I made a mistake when splitting my Portage &lt;code&gt;make.conf&lt;/code&gt; file, having it as one file instead of a directly with many small files is a lot easier to maintain.&lt;/p&gt;

&lt;p&gt;Portage allows users to split all of files inside &lt;code&gt;/etc/portage&lt;/code&gt; such as &lt;code&gt;make.conf&lt;/code&gt;, &lt;code&gt;package.use&lt;/code&gt;, &lt;code&gt;package.mask&lt;/code&gt; and other into groups of files contained in directories of the same name. This is very helpful when using automation to add some wanted configuration. But in case of &lt;code&gt;make.conf&lt;/code&gt; it becomes a &amp;ldquo;form over function&amp;rdquo; issue.&lt;/p&gt;

&lt;p&gt;I would also recommend to keep &lt;code&gt;make.conf&lt;/code&gt; as simple as possible, without useless overrides and variable reassignment.&lt;/p&gt;

&lt;p&gt;See also:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://wiki.gentoo.org/wiki//etc/portage"&gt;/etc/portage or Gentoo Wiki&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="bonus-config"&gt;Bonus: config&lt;/h2&gt;

&lt;p&gt;And of course, this is my current &lt;code&gt;/etc/portage/make.conf&lt;/code&gt; of my main dev machine:&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;
&lt;span class="normal"&gt;58&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;BINPKG_FORMAT="gpkg"
CCACHE_DIR="/var/cache/ccache"
EMERGE_WARNING_DELAY="0"
LC_MESSAGES="C"

PORTAGE_NICENESS="10"
PORTAGE_WORKDIR_MODE="0775"

PORTAGE_LOGDIR="${EPREFIX}/var/log/portage"
PORTAGE_ELOG_CLASSES="warn error log"
PORTAGE_ELOG_SYSTEM="save"

QUICKPKG_DEFAULT_OPTS="--include-config=y --umask=0003"
MAKEOPTS="--jobs=7 --load-average=6"

COMMON_FLAGS="
  -march=znver1 -O2 -falign-functions=32
  -fstack-clash-protection -fstack-protector-strong
  -fdiagnostics-color=always -frecord-gcc-switches -pipe"

ADAFLAGS="${COMMON_FLAGS}"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

CARGO_TERM_VERBOSE="false"
RUSTFLAGS="-C opt-level=3 -C debuginfo=0"

LDFLAGS="${LDFLAGS} -Wl,--defsym=__gentoo_check_ldflags__=0"

L10N="en de pl"
VIDEO_CARDS="amdgpu radeon radeonsi"

CPU_FLAGS_X86="
  aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt
  sha sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3"

EMERGE_DEFAULT_OPTS="
  --binpkg-changed-deps=y --binpkg-respect-use=y
  --nospinner --keep-going=y
  --jobs=3 --load-average=8"

GENTOO_MIRRORS="
  https://mirror.leaseweb.com/gentoo/
  https://gentoo.osuosl.org/
  https://distfiles.gentoo.org/"

FEATURES="
  userpriv usersandbox usersync
  downgrade-backup unmerge-backup binpkg-multi-instance buildsyspkg
  parallel-fetch parallel-install
  ccache
  -binpkg-logs -ebuild-locks"

USE="
  custom-cflags custom-optimization firmware initramfs vaapi vulkan
  -bindist -zeroconf"
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>The dilemma between Gentoo and Nixos</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/06/08/the-dilemma-between-gentoo-and-nixos/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-06-08-the-dilemma-between-gentoo-and-nixos</guid>
   <pubDate>Sat, 08 Jun 2024 10:55:18 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;The dilemma between &lt;a href="https://emacs.ch/tags/Gentoo"&gt;#Gentoo&lt;/a&gt; and &lt;a href="https://emacs.ch/tags/NixOS"&gt;#NixOS&lt;/a&gt; is this:&lt;/p&gt;

&lt;p&gt;The most important value of &lt;a href="https://emacs.ch/tags/Gentoo"&gt;#Gentoo&lt;/a&gt; is configuration/customization and reproducibility comes 2nd.&lt;/p&gt;

&lt;p&gt;In case of NixOS those value are reversed. The most important to NixOS is ability to reproduce given setup.&lt;/p&gt;

&lt;p&gt;Both of those systems will suit users that value control over their systems very highly (unlike, say, Ubuntu - where the most important value is convenience), but the tie-breaking is between what value out of those two should come 1st.&lt;/p&gt;

&lt;p&gt;
 &lt;small&gt;Imported via &lt;a href="https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost"&gt;Fedimpost&lt;/a&gt; from &lt;a href="https://emacs.ch/@xgqt/112581104037953790"&gt;emacs.ch/@xgqt/112581104037953790&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description></item>
  <item>
   <title>Installing unstable GIMP with Flatpak</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/05/17/installing-unstable-gimp-with-flatpak/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-05-17-installing-unstable-gimp-with-flatpak</guid>
   <pubDate>Fri, 17 May 2024 21:35:17 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h2 id="add-flathub-beta"&gt;Add Flathub-Beta&lt;/h2&gt;

&lt;p&gt;Add the Flathub-Beta remote repository:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;remote-add&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;flathub-beta&lt;span class="w"&gt; &lt;/span&gt;https://flathub.org/beta-repo/flathub-beta.flatpakrepo
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="install-gimp-beta"&gt;Install GIMP beta&lt;/h2&gt;

&lt;p&gt;Install &lt;code&gt;org.gimp.GIMP&lt;/code&gt; form &lt;code&gt;flathub-beta&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--assumeyes&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;flathub-beta&lt;span class="w"&gt; &lt;/span&gt;org.gimp.GIMP
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="run-gimp"&gt;Run GIMP&lt;/h2&gt;

&lt;p&gt;If you have other GIMP versions installed you will have to specify the &amp;ldquo;beta&amp;rdquo; version with &lt;code&gt;//beta&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;org.gimp.GIMP//beta
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Otherwise you can just run:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;org.gimp.GIMP
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Also, in the desktop menus (like KRunner) this version of GIMP will have &lt;code&gt;(beta)&lt;/code&gt; in its name so there is no chance to miss it.&lt;/p&gt;</description></item>
  <item>
   <title>Change location of intermediate objects in .NET</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/03/06/change-location-of-intermediate-objects-in-net/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-03-06-change-location-of-intermediate-objects-in-net</guid>
   <pubDate>Wed, 06 Mar 2024 22:32:17 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;.NET creates the so-called intermediate objects while building .NET projects, those are located in the &amp;ldquo;bin&amp;rdquo; and &amp;ldquo;obj&amp;rdquo; directories. The default is not very satisfying, primarily because if a program from a different machine or a container modifies those, then any cached file system paths that are encoded in the objects will be broken. But also it is probably mostly a legacy behavior to have them split between &amp;ldquo;bin&amp;rdquo; and &amp;ldquo;obj&amp;rdquo; directories.&lt;/p&gt;

&lt;p&gt;I prefer for them to say in one - ".cache", because that&amp;rsquo;s that they are - cache. With the following configuration objects will be stored inside the ".cache" directory. Furthermore, the objects produced by the native machine in the &amp;ldquo;native&amp;rdquo; subdirectory and the ones produced by container software in &amp;ldquo;container&amp;rdquo; subdirectory.&lt;/p&gt;

&lt;div class="brush: xml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;CachePath&amp;gt;&lt;/span&gt;.\.cache\native&lt;span class="nt"&gt;&amp;lt;/CachePath&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;CachePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;Condition=&lt;/span&gt;&lt;span class="s"&gt;"&amp;#39;$(DOTNET_RUNNING_IN_CONTAINER)&amp;#39; == &amp;#39;true&amp;#39;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;.\.cache\container&lt;span class="nt"&gt;&amp;lt;/CachePath&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;MSBUildProjectExtensionsPath&amp;gt;&lt;/span&gt;$(CachePath)\obj\&lt;span class="nt"&gt;&amp;lt;/MSBUildProjectExtensionsPath&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;BaseIntermediateOutputPath&amp;gt;&lt;/span&gt;$(CachePath)\obj\&lt;span class="nt"&gt;&amp;lt;/BaseIntermediateOutputPath&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;BaseOutputPath&amp;gt;&lt;/span&gt;$(CachePath)\bin\&lt;span class="nt"&gt;&amp;lt;/BaseOutputPath&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;If anybody want to go hardcore and cache the intermediate objects based on the &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/rid-catalog"&gt;RID&lt;/a&gt; or &lt;a href="https://wiki.osdev.org/Target_Triplet"&gt;architecture triplet&lt;/a&gt;, then this can also be done, for example, by adding environment variables to the path.&lt;/p&gt;</description></item>
  <item>
   <title>Safer Nix installation</title>
   <link>https://xgqt.gitlab.io/blog/posts/2024/02/12/safer-nix-installation/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2024-02-12-safer-nix-installation</guid>
   <pubDate>Mon, 12 Feb 2024 20:28:31 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Nix is useful for quickly testing out software and providing a strict environment that can be shared between people.&lt;/p&gt;

&lt;p&gt;Today I&amp;rsquo;m trying out Nix &lt;em&gt;again&lt;/em&gt;, this time I want to do it &lt;strong&gt;my way&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="installation-process"&gt;Installation process&lt;/h2&gt;

&lt;h3 id="nix-store"&gt;Nix store&lt;/h3&gt;

&lt;p&gt;I know Nix needs &amp;ldquo;Nix store&amp;rdquo; installation on &lt;code&gt;/&lt;/code&gt; (the system root).&lt;/p&gt;

&lt;p&gt;Create it manually to prevent the installation script from calling &lt;code&gt;sudo&lt;/code&gt;. 1st I switch to the root account, and then I run:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0755&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/nix
chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;xy:xy&lt;span class="w"&gt; &lt;/span&gt;/nix
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="running-the-install-script"&gt;Running the install script&lt;/h3&gt;

&lt;p&gt;Download the Nix install script and examine the contents.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;https://nixos.org/nix/install&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;nix_install.sh
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Then, run it with &lt;code&gt;--no-daemon&lt;/code&gt; to prevent it running as system service.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;sh&lt;span class="w"&gt; &lt;/span&gt;./nix_install.sh&lt;span class="w"&gt; &lt;/span&gt;--no-daemon
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;pre&gt;&lt;code&gt;performing a single-user installation of Nix...
copying Nix to /nix/store...
installing 'nix-2.20.1'
building '/nix/store/1ahlg3bviy174d6ig1gn393c23sqlki6-user-environment.drv'...
unpacking channels...
modifying /home/xy/.bash_profile...
modifying /home/xy/.zshenv...
placing /home/xy/.config/fish/conf.d/nix.fish...

Installation finished!  To ensure that the necessary environment
variables are set, either log in again, or type

. /home/xy/.nix-profile/etc/profile.d/nix.fish

in your shell.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wait!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;modifying /home/xy/.bash_profile...
modifying /home/xy/.zshenv...
placing /home/xy/.config/fish/conf.d/nix.fish...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;rsquo;s very rude!&lt;/p&gt;

&lt;h3 id="stopping-nix-from-making-a-mess"&gt;Stopping Nix from making a mess&lt;/h3&gt;

&lt;p&gt;I need to prevent Nix from mess up with my environment when I do not want it to. Nix puts some code into the Bash, ZSH and Fish initialization files during installation to ease it&amp;rsquo;s use. I do not want that since I do not want Nix to meddle with my environment without me knowing it.&lt;/p&gt;

&lt;p&gt;I keep my &lt;code&gt;.bash_profile&lt;/code&gt; and &lt;code&gt;.zshenv&lt;/code&gt; in a stow-managed git repo so I can just &lt;code&gt;cd&lt;/code&gt; into my repo and do &lt;code&gt;git reset --hard&lt;/code&gt;, but for you will have to revert those files to their old forms manually.&lt;/p&gt;

&lt;h2 id="playing-with-nix"&gt;Playing with Nix&lt;/h2&gt;

&lt;p&gt;We do not have &lt;code&gt;nix&lt;/code&gt; in &lt;code&gt;PATH&lt;/code&gt; but we still can launch it. Nix executables are located inside &lt;code&gt;~/.nix-profile/bin/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By invoking &lt;code&gt;nix-shell&lt;/code&gt; one can create a ephemeral environment containing only packages specified after the &lt;code&gt;-p&lt;/code&gt; flag. I always add &lt;code&gt;-p nix&lt;/code&gt; to have the Nix tools available also inside the spawned environment.&lt;/p&gt;

&lt;p&gt;I will test out &lt;code&gt;chibi&lt;/code&gt; (small Scheme interpreter) + &lt;code&gt;rlwrap&lt;/code&gt; (REPL support for software lacking it) inside a Nix ephemeral environment:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;~/.nix-profile/bin/nix-shell&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;nix&lt;span class="w"&gt; &lt;/span&gt;chibi&lt;span class="w"&gt; &lt;/span&gt;rlwrap
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Inside the spawned shell:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rlwrap&lt;span class="w"&gt; &lt;/span&gt;chibi-scheme
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;In the chibi REPL, let&amp;rsquo;s see the contents of the &lt;code&gt;PATH&lt;/code&gt; environment variable:&lt;/p&gt;

&lt;div class="brush: scheme"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-environment-variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"PATH"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And exit the Scheme REPL:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;After the playtime, run garbage collection:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;~/.nix-profile/bin/nix-collect-garbage
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>.NET in Gentoo in 2023</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/12/17/-net-in-gentoo-in-2023/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-12-17-net-in-gentoo-in-2023</guid>
   <pubDate>Sun, 17 Dec 2023 21:59:12 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h2 id="net-ecosystem-in-gentoo-in-year-2023"&gt;.NET ecosystem in Gentoo in year 2023&lt;/h2&gt;

&lt;p&gt;The Gentoo Dotnet project introduced better support for building .NET-based software using the &lt;code&gt;nuget&lt;/code&gt;, &lt;code&gt;dotnet-pkg-base&lt;/code&gt; and &lt;code&gt;dotnet-pkg&lt;/code&gt; eclasses. This opened new opportunities of bringing new packages depending on .NET ecosystem to the official Gentoo ebuild repository and helping developers that use &lt;code&gt;dotnet-sdk&lt;/code&gt; on Gentoo.&lt;/p&gt;

&lt;p&gt;New software requiring .NET is constantly being added to the main Gentoo tree, among others that is:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/app-shells/pwsh"&gt;PowerShell&lt;/a&gt;  for Linux,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/app-office/denaro"&gt;Denaro&lt;/a&gt;  &amp;mdash; finance application,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/games-emulation/ryujinx"&gt;Ryujinx&lt;/a&gt;  &amp;mdash; NS emulator,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/games-strategy/openra"&gt;OpenRA&lt;/a&gt;  &amp;mdash; RTS engine for Command &amp;amp; Conquer, Red Alert and Dune2k,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/media-gfx/pinta"&gt;Pinta&lt;/a&gt;  &amp;mdash; graphics program,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/media-gfx/pablodraw"&gt;Pablodraw&lt;/a&gt;  &amp;mdash; Ansi, Ascii and RIPscrip art editor,&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://packages.gentoo.org/packages/dev-lang/dafny"&gt;Dafny&lt;/a&gt;  &amp;mdash; verification-aware programming language&lt;/li&gt;
 &lt;li&gt;many  &lt;a href="https://packages.gentoo.org/maintainer/dotnet@gentoo.org#dev-dotnet"&gt;packages&lt;/a&gt;  aimed straight at developing .NET projects.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Dotnet project is also looking for new maintainers and users who are willing to help out here and there. Current state of .NET in Gentoo is very good but we can still do a lot better.&lt;/p&gt;

&lt;h2 id="special-thanks-to-people-who-helped-out"&gt;Special thanks to people who helped out&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://github.com/navi-desu/"&gt;Anna Figueiredo Gomes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/mid-kid/"&gt;Esteve Varela Colominas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/Tatsh/"&gt;Andrew Udvare&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="links-to-bugs-and-announcements"&gt;Links to bugs and announcements&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;Bugs
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/gentoo-dotnet-2023/-/issues/1"&gt;gentoo-dotnet&amp;ndash;2023/1&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://bugs.gentoo.org/900597"&gt;900597&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;Github PRs
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/21112/"&gt;21112&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/21451/"&gt;21451&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/29309/"&gt;29309&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/32109/"&gt;32109&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/33940/"&gt;33940&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;Active Gentoo .NET projects
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/gentoo-dotnet-guide/"&gt;gentoo-dotnet-guide&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/gentoo-dotnet-maintainer-tools/"&gt;gentoo-dotnet-maintainer-tools&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/csharp-gentoodotnetinfo/"&gt;csharp-gentoodotnetinfo&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/eselect-dotnet/"&gt;eselect-dotnet&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="https://gitlab.gentoo.org/dotnet/eselect-pwsh/"&gt;eselect-pwsh&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Portage Continuous Delivery</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/12/17/portage-continuous-delivery/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-12-17-portage-continuous-delivery</guid>
   <pubDate>Sat, 16 Dec 2023 23:50:15 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h2 id="portage-as-a-cd-system"&gt;Portage as a CD system&lt;/h2&gt;

&lt;p&gt;This is a very simple way to use any system with Portage installed as a Continuous Delivery server.&lt;/p&gt;

&lt;p&gt;I think for a testing environment this is a valid solution to consider.&lt;/p&gt;

&lt;h3 id="create-a-repository-of-software-used-in-your-organization"&gt;Create a repository of software used in your organization&lt;/h3&gt;

&lt;p&gt;Those articles from the Gentoo Wiki describe how to create a custom ebuild repository (overlay) pretty well:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://wiki.gentoo.org/wiki/Ebuild_repository"&gt;Ebuild repository&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://wiki.gentoo.org/wiki/Creating_an_ebuild_repository"&gt;Creating an ebuild repository&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h3 id="set-up-your-repo-with-eselect-repository"&gt;Set up your repo with eselect-repository&lt;/h3&gt;

&lt;p&gt;Install the &lt;code&gt;my-org&lt;/code&gt; repository:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;eselect&lt;span class="w"&gt; &lt;/span&gt;repository&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;my-org&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;https://git.my-org.local/portage/my-org.git
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Sync &lt;code&gt;my-org&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--sync&lt;span class="w"&gt; &lt;/span&gt;my-org
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="install-live-packages-of-a-your-software"&gt;Install live packages of a your software&lt;/h3&gt;

&lt;p&gt;First, enable live packages (keywordless) for your &lt;code&gt;my-org&lt;/code&gt; repo:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*/*::my-org&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/portage/package.accept_keywords/0000_repo_my-org.conf
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Install some packages from &lt;code&gt;my-org&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;-av&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"=mycategory/mysoftware-9999"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="install-smart-live-rebuild"&gt;Install smart-live-rebuild&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;smart-live-rebuild&lt;/code&gt; can automatically update live software packages that use git as their source URL.&lt;/p&gt;

&lt;h3 id="set-up-cron-to-run-smart-live-rebuild"&gt;Set up cron to run smart-live-rebuild&lt;/h3&gt;

&lt;p&gt;Refresh your &lt;code&gt;my-org&lt;/code&gt; repository every hour:&lt;/p&gt;

&lt;div class="brush: cron"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;0 */1 * * * emerge --sync my-org
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Refresh the main Gentoo tree every other 6th hour:&lt;/p&gt;

&lt;div class="brush: cron"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;0 */6 * * * emerge --sync gentoo
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;smart-live-rebuild&lt;/code&gt; every other 3rd hour:&lt;/p&gt;

&lt;div class="brush: cron"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;0 */3 * * * smart-live-rebuild
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="restarting-services-after-update"&gt;Restarting services after update&lt;/h2&gt;

&lt;h3 id="all-in-one-script"&gt;All-in-one script&lt;/h3&gt;

&lt;p&gt;You can either restart all services after successful update:&lt;/p&gt;

&lt;p&gt;File: &lt;code&gt;/opt/update.sh&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e

smart-live-rebuild

systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;my-service-1.service
systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;my-service-2.service
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Crontab:&lt;/p&gt;

&lt;div class="brush: cron"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;0 */3 * * * /opt/update.sh
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h3 id="via-ebuilds-pkg-functions"&gt;Via ebuilds pkg_ functions&lt;/h3&gt;

&lt;p&gt;File: &lt;code&gt;my-service-1.ebuild&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;pkg_postinst&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;my-service-1.service
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;More about &lt;code&gt;pkg_postinst&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://devmanual.gentoo.org/ebuild-writing/functions/pkg_postinst/"&gt;pkg_postinst&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://devmanual.gentoo.org/ebuild-writing/functions/index.html"&gt;Phase Functions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="example-gentoo-overlays"&gt;Example Gentoo overlays&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://gitlab.com/xgqt/myov/"&gt;xgqt/myov&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://gitlab.com/gentoo-racket/gentoo-racket-overlay/"&gt;gentoo-racket/gentoo-racket-overlay&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/gentoo-mirror/guru/"&gt;gentoo-mirror/guru&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Firefox is still the best browser. Deal with it Google!</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/11/22/firefox-is-still-the-best-browser-deal-with-it-google/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-11-22-firefox-is-still-the-best-browser-deal-with-it-google</guid>
   <pubDate>Tue, 21 Nov 2023 23:40:59 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Firefox began as the first open source browser to live through the browser wars, overcoming Microsoft&amp;rsquo;s Internet Explorer and continues to deliver competition-smashing technology to this day.&lt;/p&gt;

&lt;h2 id="chromium-code"&gt;Chromium code&lt;/h2&gt;

&lt;p&gt;The only advantages of Chromium are that it was adopted by Electron and spread partially because of a more liberal license and Google&amp;rsquo;s own efforts.&lt;/p&gt;

&lt;p&gt;Google will never be able to cope with the worst imaginable code base of Chromium.&lt;/p&gt;

&lt;h3 id="chromium-is-near-impossible-to-compile"&gt;Chromium is near-impossible to compile&lt;/h3&gt;

&lt;p&gt;On a 4cores/8threads Ryzen CPU Chromium compiles in ~12h and requires at least 20GB of disk space for build. At the same time Firefox compiles in ~1.5h and requires ~8GB for disk space.&lt;/p&gt;

&lt;h3 id="programming-language-adoption"&gt;Programming language adoption&lt;/h3&gt;

&lt;p&gt;Additionally Firefox team was able to rewrite a very large portion of Firefox codebase in Rust which improved the browser&amp;rsquo;s safety. There were attempts to add rust to Chromium but they all are in more of a addon-like fashion.&lt;/p&gt;

&lt;h3 id="porting-to-unixes"&gt;Porting to UNIXes&lt;/h3&gt;

&lt;p&gt;Because Chromium is extremely large it&amp;rsquo;s very hard to port and maintain for Linux and BSD based systems. There were numerous bugs with Chromium&amp;rsquo;s UI on Linux that cause crashes on pressing random controls. I believe Google has no Linux testers beside the &amp;ldquo;free software freeloaders&amp;rdquo; (wink, wink, IBM :P).&lt;/p&gt;

&lt;h2 id="anti-competition"&gt;Anti-competition&lt;/h2&gt;

&lt;p&gt;This days Google has to result to dirty tactics where certain Google-owned websites would either refuse to work on Firefox or give a fake performance hit that is entirely caused by malicious JavaScript code.&lt;/p&gt;

&lt;p&gt;Several popular FOSS-related sources have covered this news recently, check them out on the WWW.&lt;/p&gt;</description></item>
  <item>
   <title>I glued together Tramp and process sentinel and created a wr...</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/10/25/i-glued-together-tramp-and-process-sentinel-and-created-a-wr/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-10-25-i-glued-together-tramp-and-process-sentinel-and-created-a-wr</guid>
   <pubDate>Wed, 25 Oct 2023 19:45:49 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I glued together &lt;a href="https://emacs.ch/tags/GNU"&gt;#GNU&lt;/a&gt; &lt;a href="https://emacs.ch/tags/Emacs"&gt;#Emacs&lt;/a&gt; Tramp and process sentinel and created a wrapper around the (now OSS) devcontainers command.&lt;/p&gt;

&lt;p&gt;Project URL: https://gitlab.com/xgqt/xgqt-elisp-lib-devcontainer&lt;/p&gt;

&lt;p&gt;
 &lt;small&gt;Imported via &lt;a href="https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost"&gt;Fedimpost&lt;/a&gt; from &lt;a href="https://emacs.ch/@xgqt/111297845630025827"&gt;emacs.ch/@xgqt/111297845630025827&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description></item>
  <item>
   <title>Common Project Layout, version 0</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/10/17/common-project-layout-version-0/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-10-17-common-project-layout-version-0</guid>
   <pubDate>Tue, 17 Oct 2023 19:45:50 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;This is a tongue-in-cheek &amp;ldquo;draft&amp;rdquo; for Common Project Layout, version 0. It will probably never become any sort of adopted standard but I think it is good to share some ideas that I had while working on this.&lt;/p&gt;

&lt;h2 id="definition"&gt;Definition&lt;/h2&gt;

&lt;p&gt;Common Project Layout (CPL) is a set of good practices for structuring medium-to-large monorepo-like software repositories.&lt;/p&gt;

&lt;h2 id="benefits"&gt;Benefits&lt;/h2&gt;

&lt;p&gt;CPL helps with code organization. It can be a good &amp;ldquo;framework&amp;rdquo; (in a very loose meaning of this word) to modularize product components.&lt;/p&gt;

&lt;p&gt;It can make large repositories easier to work with and understand.&lt;/p&gt;

&lt;h2 id="upfront-limitations"&gt;Upfront limitations&lt;/h2&gt;

&lt;p&gt;CPL is strictly designed for &amp;ldquo;hosting&amp;rdquo; software and all the non-code assets are left up to the engineers to decide their location.&lt;/p&gt;

&lt;p&gt;For example branding assets could be put into the &lt;code&gt;Branding&lt;/code&gt; top-level directory, but on the other hand are we sure they will stay the same with major version?&lt;/p&gt;

&lt;p&gt;Since we can agree that we consider documentation &amp;ldquo;producers&amp;rdquo; (not the produced artifacts) to be code we could also acknowledge that some assets could have their own versioned subproject.&lt;/p&gt;

&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;

&lt;h3 id="versioning"&gt;Versioning&lt;/h3&gt;

&lt;p&gt;CPL requires that the software is versioned inside directories whose names include the version. Recommended pattern is to name directories &lt;code&gt;vMAJOR&lt;/code&gt; where &lt;code&gt;MAJOR&lt;/code&gt; is either the current tagged major version or one that will be if no tags exist. It is also recommended to group the &lt;code&gt;vMAJOR&lt;/code&gt; directories under one common directory, for example &lt;code&gt;Source&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="subprojects"&gt;Subprojects&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;vMAJOR&lt;/code&gt; could theoretically contain all the source code mixed together but it should be grouped and organized by their purpose.&lt;/p&gt;

&lt;p&gt;Subproject is defined as a directory inside a versioned (&lt;code&gt;vMAJOR&lt;/code&gt;) directory. &amp;ldquo;Versioned subproject&amp;rdquo; and &amp;ldquo;subproject&amp;rdquo; are synonymous to CPL.&lt;/p&gt;

&lt;p&gt;To mark the purpose of a subproject, whether it is to be used as a helper or as a &amp;ldquo;container&amp;rdquo; for source that is actually exposed (or binaries created from it), it should be adequately named.&lt;/p&gt;

&lt;p&gt;For helpers name does not matter but for source subproject it should be prefixed by project name.&lt;/p&gt;

&lt;p&gt;For example we could have this layout:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;Source/
└──&lt;span class="w"&gt; &lt;/span&gt;v1/
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;Makefile
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;VERSION
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;admin/
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;make/
&lt;span class="w"&gt;    &lt;/span&gt;├──&lt;span class="w"&gt; &lt;/span&gt;my-project-app/
&lt;span class="w"&gt;    &lt;/span&gt;└──&lt;span class="w"&gt; &lt;/span&gt;my-project-util/
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;In the above example &lt;code&gt;my-project-app&lt;/code&gt; and &lt;code&gt;my-project-lib&lt;/code&gt; are the source subproject and admin and make are subproject that are there only to help in building, managing and deploying the actual source subprojects.&lt;/p&gt;

&lt;p&gt;At the and it is up to the engineer to choose if something is considered a source subproject. For example: If we have a helper subproject that all it does is hold Docker / Podman files for creating a development container what should we name it? As of now I had named them &lt;code&gt;PROJECT-dev-container&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="recommendations"&gt;Recommendations&lt;/h2&gt;

&lt;h3 id="make-and-admin"&gt;Make and admin&lt;/h3&gt;

&lt;p&gt;I think it is a good practice for each &lt;code&gt;vMAJOR&lt;/code&gt; to have a Makefile, or equivalent in other build system, that will call scripts inside &lt;code&gt;vMAJOR/admin&lt;/code&gt; directory that each take care of some small / specific task.&lt;/p&gt;

&lt;p&gt;For example the &lt;code&gt;vMAJOR/Makefile&lt;/code&gt; recipe for &lt;code&gt;build&lt;/code&gt; can call &lt;code&gt;admin/build_my_project_app.py&lt;/code&gt; and &lt;code&gt;admin/build_my_project_lib.py&lt;/code&gt;. Each those scripts would call the &amp;ldquo;real&amp;rdquo; build system specific to the subproject they act upon.&lt;/p&gt;

&lt;h3 id="version-file"&gt;VERSION file&lt;/h3&gt;

&lt;p&gt;It is nice to have a &lt;code&gt;VERSION&lt;/code&gt; file in the &lt;code&gt;vMAJOR&lt;/code&gt; directory. It can be reused by build tools and also to show what was the last version worked upon inside &lt;code&gt;vMAJOR&lt;/code&gt;, the latest git tag can either be put on different major version or simply not be there yet.&lt;/p&gt;

&lt;h2 id="references"&gt;References&lt;/h2&gt;

&lt;p&gt;See those repositories for referencing the CPL layout:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://gitlab.com/xgqt/blog/-/tree/47c4ebf0584384b46043f2374923b9faaf4fd7da/"&gt;gitlab.com/xgqt/blog&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost/-/tree/9116ac99ffeb87b321c7cf89cdba1c0581baa773/"&gt;gitlab.com/xgqt/xgqt-csharp-app-fedimpost&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>I created a tool that allows to import Fediverse posts to bl...</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/10/08/i-created-a-tool-that-allows-to-import-fediverse-posts-to-bl/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-10-08-i-created-a-tool-that-allows-to-import-fediverse-posts-to-bl</guid>
   <pubDate>Sun, 08 Oct 2023 06:01:55 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I created a tool that allows to import Fediverse posts to blogging frameworks (currently Racket Frog). So it allows to transition selected posts from micro-blogging to real blogging :P&lt;/p&gt;

&lt;p&gt;https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s written in &lt;a href="https://emacs.ch/tags/CSharp"&gt;#CSharp&lt;/a&gt; and used &lt;a href="https://emacs.ch/tags/DotNET"&gt;#DotNET&lt;/a&gt; 6.0&lt;/p&gt;

&lt;p&gt;
 &lt;small&gt;Imported via &lt;a href="https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost"&gt;Fedimpost&lt;/a&gt; from &lt;a href="https://emacs.ch/@xgqt/111198346664102355"&gt;emacs.ch/@xgqt/111198346664102355&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description></item>
  <item>
   <title>I have nothing against people who make desktop apps as webap...</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/10/08/i-have-nothing-against-people-who-make-desktop-apps-as-webap/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-10-08-i-have-nothing-against-people-who-make-desktop-apps-as-webap</guid>
   <pubDate>Sat, 07 Oct 2023 22:54:10 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I have nothing against people who make desktop apps as webapps as long as webkitgtk or qtwebengine is used. But why the hell would you use electron in our lord&amp;rsquo;s year 2023 when in addition to webkitgtk you have libs that use it underneath and ease the dev experience.&lt;/p&gt;

&lt;p&gt;
 &lt;small&gt;Imported via &lt;a href="https://gitlab.com/xgqt/xgqt-csharp-app-fedimpost"&gt;Fedimpost&lt;/a&gt; from &lt;a href="https://emacs.ch/@xgqt/111196664631036872"&gt;emacs.ch/@xgqt/111196664631036872&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description></item>
  <item>
   <title>Using gzexe for shipping Racket executables</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/09/28/using-gzexe-for-shipping-racket-executables/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-09-28-using-gzexe-for-shipping-racket-executables</guid>
   <pubDate>Thu, 28 Sep 2023 18:18:12 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Racket executables made by &lt;code&gt;raco exe&lt;/code&gt; are known to be quite large. One of tools that can be used to help reduce the size of produced binaries is the &lt;code&gt;gzexe&lt;/code&gt; program.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gzexe&lt;/code&gt; is a tool that can compress a executable binary. It can be acquired by installing &lt;code&gt;gzip&lt;/code&gt; on most Linux distributions (included in the &lt;code&gt;app-arch/gzip&lt;/code&gt; package on Gentoo).&lt;/p&gt;

&lt;h2 id="creating-a-hello-world-executable-with-racket"&gt;Creating a hello-world executable with Racket&lt;/h2&gt;

&lt;p&gt;Write following contents to &lt;code&gt;hello-world.rkt&lt;/code&gt; file:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;#lang &lt;/span&gt;&lt;span class="nn"&gt;racket/base&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))" style="color: inherit"&gt;define&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Writing.html#(def._((lib._racket/private/misc..rkt)._displayln))" style="color: inherit"&gt;displayln&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"It REPLs. Ship it!"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/module.html#(form._((lib._racket/private/base..rkt)._module+))" style="color: inherit"&gt;module+&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;To make a binary run:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;raco&lt;span class="w"&gt; &lt;/span&gt;exe&lt;span class="w"&gt; &lt;/span&gt;--orig-exe&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;hello-world&lt;span class="w"&gt; &lt;/span&gt;hello-world.rkt
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The file &lt;code&gt;hello-world&lt;/code&gt; will be produced.&lt;/p&gt;

&lt;p&gt;This is what &lt;code&gt;file hello-world&lt;/code&gt; says about it:&lt;/p&gt;

&lt;div class="brush: text"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;hello-world: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 3.2.0, stripped
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;This &amp;ldquo;small&amp;rdquo; executable weights &lt;strong&gt;46 MB&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;In comparison &lt;code&gt;busybox&lt;/code&gt; weights around &lt;em&gt;2 MB&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id="compressing-with-gzexe"&gt;Compressing with gzexe&lt;/h2&gt;

&lt;p&gt;Keep in mind that &lt;code&gt;gzexe&lt;/code&gt; will overwrite the compressed file and create a backup with appended "~".&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;gzexe&lt;span class="w"&gt; &lt;/span&gt;hello-world
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And this gives us only &lt;strong&gt;8,5 MB&lt;/strong&gt;. Nice!&lt;/p&gt;

&lt;p&gt;In comparison &lt;code&gt;bazel&lt;/code&gt;, which is a single-binary build system written in JAVA, executable takes &lt;em&gt;33 MB&lt;/em&gt; on my Gentoo machine. I tried compressing it with &lt;code&gt;gzexe&lt;/code&gt; and it reduces it only by &lt;em&gt;10%&lt;/em&gt;, to around &lt;em&gt;29 MB&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gzexe&lt;/code&gt;is not a silver bullet but with Racket exes it works very nicely.&lt;/p&gt;</description></item>
  <item>
   <title>Using light theme in a sunny day feels a lot better than usi...</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/09/28/using-light-theme-in-a-sunny-day-feels-a-lot-better-than-usi/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-09-28-using-light-theme-in-a-sunny-day-feels-a-lot-better-than-usi</guid>
   <pubDate>Thu, 28 Sep 2023 09:14:44 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Using light theme in a sunny day feels a lot better than using a dark theme.&lt;/p&gt;

&lt;p&gt;I use &amp;ldquo;ef-day&amp;rdquo; in &lt;a href="https://emacs.ch/tags/Emacs"&gt;#Emacs&lt;/a&gt; and &amp;ldquo;Solarized Light&amp;rdquo; in other IDEs and terminals.&lt;/p&gt;

&lt;p&gt;
 &lt;small&gt;Imported via Fedimpost from &lt;a href="https://emacs.ch/@xgqt/111142481730093470"&gt;emacs.ch/@xgqt/111142481730093470&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description></item>
  <item>
   <title>Genkernel in 2023</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/07/29/genkernel-in-2023/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-07-29-genkernel-in-2023</guid>
   <pubDate>Sat, 29 Jul 2023 15:10:35 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I really wanted to look into the new kernel building solutions for Gentoo and maybe migrate to dracut, but last time I tried, ~1.5 years ago, the initreamfs was now working for me.&lt;/p&gt;

&lt;p&gt;And now in 2023 I&amp;rsquo;m still running genkernel for my personal boxes as well as other servers running Gentoo.&lt;/p&gt;

&lt;p&gt;I guess some short term solutions really become defined tools :P&lt;/p&gt;

&lt;p&gt;So this is how I rebuild my kernel nowadays:&lt;/p&gt;

&lt;ol&gt;
 &lt;li&gt;
  &lt;p&gt;Copy old config&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/src
cp&lt;span class="w"&gt; &lt;/span&gt;linux-6.1.38-gentoo/.config&lt;span class="w"&gt; &lt;/span&gt;linux-6.1.41-gentoo/
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;Remove old kernel build directories&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;linux-6.1.31-gentoo
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;Run initial preparation&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;eselect&lt;span class="w"&gt; &lt;/span&gt;kernel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/src/linux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;olddefconfig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;Call genkernel&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;genkernel&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-menuconfig&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-clean&lt;span class="w"&gt;                                                  &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-clear-cachedir&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-cleanup&lt;span class="w"&gt;                                                &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-mrproper&lt;span class="w"&gt;                                               &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--lvm&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--luks&lt;span class="w"&gt;                                                      &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mdadm&lt;span class="w"&gt;                                                     &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--nfs&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--kernel-localversion&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;hostname&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+%Y.%m.%d&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;all
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;Rebuild the modules&lt;/p&gt;
  &lt;p&gt;If in your &lt;code&gt;/etc/genkernel.conf&lt;/code&gt; you have &lt;code&gt;MODULEREBUILD&lt;/code&gt; turned off, then also call emerge:&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;-1&lt;span class="w"&gt; &lt;/span&gt;@module-rebuild
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;</description></item>
  <item>
   <title>Shell script setup</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/07/16/shell-script-setup/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-07-16-shell-script-setup</guid>
   <pubDate>Sun, 16 Jul 2023 21:12:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="good-practices"&gt;Good practices&lt;/h1&gt;

&lt;h2 id="use-sh"&gt;Use sh&lt;/h2&gt;

&lt;p&gt;If you do not need &lt;code&gt;bash&lt;/code&gt; features, then use &lt;code&gt;sh&lt;/code&gt;, it is installed on every UNIX-like system.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="exit-on-failure"&gt;Exit on failure&lt;/h2&gt;

&lt;p&gt;Shell scripts continue even if a command returns error. To fail right away use:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="trap-c-c"&gt;Trap C-c&lt;/h2&gt;

&lt;p&gt;Catch Control-c and exit.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;trap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exit 130"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;INT
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="use-script-directory"&gt;Use script directory&lt;/h1&gt;

&lt;p&gt;Assume we are executing a script from directory &lt;code&gt;/Admin&lt;/code&gt;, where &lt;code&gt;/&lt;/code&gt; is the root of a given project directory.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;script_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;script_root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;script_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;We can use &lt;code&gt;${script_root}&lt;/code&gt; to call other scripts form the &lt;code&gt;Admin&lt;/code&gt; directory, but we can also use it to relate to the &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;project_root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;realpath&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;script_root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../"&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[INFO] Entering directory: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;project_root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;project_root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;So with above we can run commands form &lt;code&gt;/&lt;/code&gt; (repository root). Like for example &lt;code&gt;make&lt;/code&gt; and other:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;make
python3&lt;span class="w"&gt; &lt;/span&gt;./Admin/serve_1.py
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="even-better"&gt;Even better&lt;/h1&gt;

&lt;p&gt;Use Python for repository maintenance scripts.&lt;/p&gt;

&lt;div class="brush: python"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chdir&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;subprocess&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;

&lt;span class="n"&gt;script_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;script_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;project_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;realpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script_root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;".."&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;" * Entering directory: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project_root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;chdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;leftover_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::]&lt;/span&gt;
&lt;span class="n"&gt;command_arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"make"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;leftover_args&lt;/span&gt;

&lt;span class="n"&gt;cmd_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command_arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;" * Executing command: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cmd_string&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command_arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>ELisp ebuilds good practices</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/07/15/elisp-ebuilds-good-practices/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-07-15-elisp-ebuilds-good-practices</guid>
   <pubDate>Sat, 15 Jul 2023 17:25:25 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="check-load-path"&gt;Check load path&lt;/h1&gt;

&lt;p&gt;Some Elisp package compilation failures are caused by not setting the loadpath correctly. It mostly happens when you compile source from a directory that is not the current working directory. For example:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;elisp-compile&lt;span class="w"&gt; &lt;/span&gt;elisp/*.el
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;In most cases you can &lt;code&gt;cd&lt;/code&gt; or override the &lt;code&gt;S&lt;/code&gt; variable to set it to location where ELisp source resides.&lt;/p&gt;

&lt;p&gt;But in other cases you can append to load path the directory with source, see:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;BYTECOMPFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BYTECOMPFLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -L elisp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;elisp-compile&lt;span class="w"&gt; &lt;/span&gt;elisp/*.el
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="do-not-rename-auto-generated-autoload-file"&gt;Do not rename auto-generated autoload file&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;elisp-make-autoload-file&lt;/code&gt; allows to name the generated autoload file. For sake of easier debugging and writing Gentoo &lt;code&gt;SITEFILE&lt;/code&gt;s, please do not rename the generated file.&lt;/p&gt;

&lt;p&gt;The name of that file should always be &lt;code&gt;${PN}-autoloads.el&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id="use-new-elisp-enable-tests-function"&gt;Use new elisp-enable-tests function&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;elisp-enable-tests&lt;/code&gt; allows to set up &lt;code&gt;IUSE&lt;/code&gt;, &lt;code&gt;RESTRICT&lt;/code&gt;, &lt;code&gt;BDEPEND&lt;/code&gt; and the test runner function for running tests with the specified test runner.&lt;/p&gt;

&lt;p&gt;The 1st (&lt;code&gt;test-runner&lt;/code&gt;) argument must be one of:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;buttercup&lt;/code&gt; &amp;mdash; for &lt;code&gt;buttercup&lt;/code&gt; provided via &lt;code&gt;app-emacs/buttercup&lt;/code&gt;,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;ert-runner&lt;/code&gt; &amp;mdash; for &lt;code&gt;ert-runner&lt;/code&gt; provided via &lt;code&gt;app-emacs/ert-runner&lt;/code&gt;,&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;ert&lt;/code&gt; &amp;mdash; for ERT, the built-in GNU Emacs test utility.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;The 2nd argument is the directory where test are located, the leftover arguments are passed to the selected test runner.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;EAPI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;

inherit&lt;span class="w"&gt; &lt;/span&gt;elisp

&lt;span class="c1"&gt;# Other package settings ...&lt;/span&gt;

&lt;span class="nv"&gt;SITEFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"50&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-gentoo.el"&lt;/span&gt;
&lt;span class="nv"&gt;DOCS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;README.md&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

elisp-enable-tests&lt;span class="w"&gt; &lt;/span&gt;buttercup&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="remove-empty-sitefiles"&gt;Remove empty SITEFILEs&lt;/h1&gt;

&lt;p&gt;Recently a feature was added to &lt;code&gt;elisp.eclass&lt;/code&gt; that will cause build process to generate the required &lt;code&gt;SITEFILE&lt;/code&gt; with boilerplate code if it does not exist.&lt;/p&gt;

&lt;p&gt;So if your &lt;code&gt;SITEFILE&lt;/code&gt; looked like this:&lt;/p&gt;

&lt;div class="brush: lisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;load-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"@SITELISP@"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&amp;hellip; then, you can just remove that file.&lt;/p&gt;

&lt;p&gt;But remember to keep the &lt;code&gt;SITEFILE&lt;/code&gt; variable inside your ebuild:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;SITEFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"50&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-gentoo.el"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="remove-pkgel-files"&gt;Remove pkg.el files&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;*-pkg.el&lt;/code&gt; files are useless to Gentoo distribution model of Emacs Lisp packages and should be removed. It is as simple as adding this line to a ebuild:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;ELISP_REMOVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-pkg.el"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Beware that some packages will try to find their &lt;code&gt;${PN}-pkg.el&lt;/code&gt; file, but in most cases this will show up in failing package tests.&lt;/p&gt;

&lt;h1 id="use-official-repository"&gt;Use official repository&lt;/h1&gt;

&lt;p&gt;It is tedious to repackage Elpa tarballs, so use the official upstream even if you have to snapshot a specific commit.&lt;/p&gt;

&lt;p&gt;To snapshot GitHub repos you would generally use this code:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# First check if we have the correct version to prevent&lt;/span&gt;
&lt;span class="c1"&gt;# autobumping package version without changing the commit.&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*_p20220325&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;COMMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;65c496d3d1d1298345beb9845840067bffb2ffd8

&lt;span class="c1"&gt;# Use correct URL that supports snapshots.&lt;/span&gt;
&lt;span class="nv"&gt;SRC_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/domtronn/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/archive/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMMIT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&lt;/span&gt;
&lt;span class="s2"&gt;    -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;P&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;

&lt;span class="c1"&gt;# Override the temporary build directory variable.&lt;/span&gt;
&lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMMIT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="include-live-version-support"&gt;Include live version support&lt;/h1&gt;

&lt;p&gt;We do not want to be worse than the &lt;a href="https://melpa.org/"&gt;Melpa unstable&lt;/a&gt; :D&lt;/p&gt;

&lt;p&gt;So, why not allow the given package to be used live?&lt;/p&gt;

&lt;p&gt;Even if you do not push the live package to the overlay, please include support for it.&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*9999*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;inherit&lt;span class="w"&gt; &lt;/span&gt;git-r3
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;EGIT_REPO_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/example/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.git"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;SRC_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/example/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/archive/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&lt;/span&gt;
&lt;span class="s2"&gt;        -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;P&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;KEYWORDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"~amd64 ~x86"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="ask-for-tags"&gt;Ask for tags&lt;/h1&gt;

&lt;p&gt;Git is good, git tags are good. In case if upstream does not tag their package or just forgets to, kindly ask them to create a git tag when bumping Emacs package versions.&lt;/p&gt;</description></item>
  <item>
   <title>Debugging Frog blog with syntax macros</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/07/15/debugging-frog-blog-with-syntax-macros/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-07-15-debugging-frog-blog-with-syntax-macros</guid>
   <pubDate>Sat, 15 Jul 2023 16:24:16 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="constructing-debugging-syntax"&gt;Constructing debugging syntax&lt;/h1&gt;

&lt;p&gt;I wanted to echo parameter values when I set them in my blog&amp;rsquo;s &lt;code&gt;frog.rkt&lt;/code&gt; config file.&lt;/p&gt;

&lt;p&gt;Nothing simpler in Racket!&lt;/p&gt;

&lt;p&gt;First I create this macro for echoing a single parameter value when it is set:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/stx-patterns.html#(form._((lib._racket/private/misc..rkt)._define-syntax-rule))" style="color: inherit"&gt;define-syntax-rule&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose-set-parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/begin.html#(form._((quote._~23~25kernel)._begin))" style="color: inherit"&gt;begin&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; Set the parameter.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameter-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; Then call the parameter and print it&amp;#39;s value.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; The "&amp;#39;parameter-id" is special syntax&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; for turning a "parameter-id" identifier to a symbol.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; We can also write it like:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; &amp;gt; (quote parameter-id)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; to be less confusing.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Writing.html#(def._((quote._~23~25kernel)._printf))" style="color: inherit"&gt;printf&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEBUG] (~a ~v)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;parameter-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameter-id&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;then, I create a wrapper for above macro that can take multiple parameter pairs:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/stx-patterns.html#(form._((lib._racket/private/misc..rkt)._define-syntax-rule))" style="color: inherit"&gt;define-syntax-rule&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose-set-parameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameter-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/stx-patterns.html#(form._((lib._racket/private/stxcase-scheme..rkt)._......))" style="color: inherit"&gt;...&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/begin.html#(form._((quote._~23~25kernel)._begin))" style="color: inherit"&gt;begin&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; Unpack a chain of "(parameter-id parameter-value)" pairs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;;; using the "..." syntax.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose-set-parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameter-value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/stx-patterns.html#(form._((lib._racket/private/stxcase-scheme..rkt)._......))" style="color: inherit"&gt;...&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="using-the-macro"&gt;Using the macro&lt;/h1&gt;

&lt;p&gt;Afterwards we can call it like so:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose-set-parameters&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"XGQT's blog"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-author&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maciej Barć"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Notice that even the form of setting a parameter, that is &lt;code&gt;(parameter-procedure "value")&lt;/code&gt;, remains the same, but in reality it is just similar to how the syntax macro pattern-matches on it.&lt;/p&gt;

&lt;h1 id="inspecting-macro-expansion"&gt;Inspecting macro expansion&lt;/h1&gt;

&lt;p&gt;In &lt;code&gt;racket-mode&lt;/code&gt; inside GNU Emacs we can inspect the macro expansion with &lt;code&gt;racket-expand-region&lt;/code&gt;. Stepping through the expansion provided this result:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/begin.html#(form._((quote._~23~25kernel)._begin))" style="color: inherit"&gt;begin&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/begin.html#(form._((quote._~23~25kernel)._begin))" style="color: inherit"&gt;begin&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"XGQT's blog"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Writing.html#(def._((quote._~23~25kernel)._printf))" style="color: inherit"&gt;printf&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEBUG] (~a ~v)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;current-title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-title&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/begin.html#(form._((quote._~23~25kernel)._begin))" style="color: inherit"&gt;begin&lt;/a&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-author&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maciej Barć"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Writing.html#(def._((quote._~23~25kernel)._printf))" style="color: inherit"&gt;printf&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEBUG] (~a ~v)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;current-author&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current-author&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Time hackery in VirtualBox</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/07/08/time-hackery-in-virtualbox/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-07-08-time-hackery-in-virtualbox</guid>
   <pubDate>Fri, 07 Jul 2023 22:39:44 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="unwanted-vdi-present"&gt;Unwanted (VDI) present&lt;/h1&gt;

&lt;p&gt;Recently I was given a task to run a outdated piece of commercial software on a very outdated (in)famous operating system. Unlucky for me on the given VDI (VirtualBox disk image) the so-called &amp;ldquo;Guests Additions&amp;rdquo; that enabled &amp;ldquo;better&amp;rdquo; time synchronization were already installed.&lt;/p&gt;

&lt;h1 id="fighting-vbox-time"&gt;Fighting VBox time&lt;/h1&gt;

&lt;p&gt;So, this is what I had to do to keep the old clock:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;turn off networking card in the virtual machine configuration,  because we do not want the system to use NTP or other newt service to get  the &amp;ldquo;new&amp;rdquo; time,&lt;/li&gt;
 &lt;li&gt;disable getting the host&amp;rsquo;s clock time:  &lt;code&gt;VBoxManage setextradata "WinXP"
      "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1&lt;/code&gt;,&lt;/li&gt;
 &lt;li&gt;and&amp;hellip; this magic:  &lt;code&gt;VBoxManage modifyvm "WinXP"
      --biossystemtimeoffset "-341597644449"&lt;/code&gt;,  this thing does the very weird thing of telling the virtual machine  BIOS how much to set it back in time,  the &lt;code&gt;offset&lt;/code&gt; here is total milliseconds  between some old date and current date.&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="getting-the-old-date"&gt;Getting the old date&lt;/h1&gt;

&lt;p&gt;With the Python script snippet below you will get the milliseconds to set back the VirtualBox clock to &lt;code&gt;01.01.2012 01:00&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: python"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"01.01.2012 01:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;.%m.%Y %H:%M"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Comparing objects in Racket</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/06/18/comparing-objects-in-racket/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-06-18-comparing-objects-in-racket</guid>
   <pubDate>Sat, 17 Jun 2023 23:39:38 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="equality-methods"&gt;Equality methods&lt;/h1&gt;

&lt;p&gt;By implementing a method for equality &lt;code&gt;equal-to?&lt;/code&gt; and two extraction methods &lt;code&gt;equal-hash-code-of&lt;/code&gt; and &lt;code&gt;equal-secondary-hash-code-of&lt;/code&gt; we can define our own object comparison rules.&lt;/p&gt;

&lt;p&gt;For more info see &lt;a href="https://docs.racket-lang.org/reference/objectequality.html"&gt;Object Equality and Hashing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Consider the following example:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))" style="color: inherit"&gt;define&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._class*))" style="color: inherit"&gt;class*&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(def._((lib._racket/private/class-internal..rkt)._object~25))" style="color: inherit"&gt;object%&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/objectequality.html#(def._((lib._racket/private/class-internal..rkt)._equal~3c~25~3e))" style="color: inherit"&gt;equal&amp;lt;%&amp;gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._super-new))" style="color: inherit"&gt;super-new&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._init-field))" style="color: inherit"&gt;init-field&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._define/public))" style="color: inherit"&gt;define/public&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equal-to?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other-object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;recur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._~3d))" style="color: inherit"&gt;=&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/ivaraccess.html#(form._((lib._racket/private/class-internal..rkt)._get-field))" style="color: inherit"&gt;get-field&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other-object&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._define/public))" style="color: inherit"&gt;define/public&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equal-hash-code-of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hash-code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash-code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._define/public))" style="color: inherit"&gt;define/public&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equal-secondary-hash-code-of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hash-code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash-code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;If we create a new &lt;code&gt;integer%&lt;/code&gt; object we can notice that it is not transparent (we can not inspect values of any of it&amp;rsquo;s fields).&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;;  =&amp;gt; (object:integer% ...)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;But if we compare two fresh &lt;code&gt;integer%&lt;/code&gt; objects they will be equal.&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Equality.html#(def._((quote._~23~25kernel)._equal~3f))" style="color: inherit"&gt;equal?&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;;;  =&amp;gt; #true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="transparent-class"&gt;Transparent class&lt;/h1&gt;

&lt;p&gt;A transparent cvlass is a class with the &lt;code&gt;inspect&lt;/code&gt; expression valuye se to &lt;code&gt;#false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From Racket documentation &lt;a href="https://docs.racket-lang.org/reference/createclass.html"&gt;Creating Classes&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
 &lt;p&gt; Just as for structure types,  an inspector controls access to the class’s fields,  including private fields, and also affects comparisons using equal?.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Consider the following example:&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/define.html#(form._((lib._racket/private/base..rkt)._define))" style="color: inherit"&gt;define&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._class))" style="color: inherit"&gt;class&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(def._((lib._racket/private/class-internal..rkt)._object~25))" style="color: inherit"&gt;object%&lt;/a&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._super-new))" style="color: inherit"&gt;super-new&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._inspect))" style="color: inherit"&gt;inspect&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/createclass.html#(form._((lib._racket/private/class-internal..rkt)._init-field))" style="color: inherit"&gt;init-field&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;If we create a new &lt;code&gt;integer%&lt;/code&gt; object we can see it&amp;rsquo;s field values.&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;;  =&amp;gt; (object:integer% 0)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And if we compare two fresh &lt;code&gt;integer%&lt;/code&gt; objects they will be equal.&lt;/p&gt;

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/Equality.html#(def._((quote._~23~25kernel)._equal~3f))" style="color: inherit"&gt;equal?&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/objcreation.html#(form._((lib._racket/private/class-internal..rkt)._new))" style="color: inherit"&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;integer%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;;;  =&amp;gt; #true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Moving my Fediverse account to emacs.ch</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/06/18/moving-my-fediverse-account-to-emacs-ch/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-06-18-moving-my-fediverse-account-to-emacs-ch</guid>
   <pubDate>Sat, 17 Jun 2023 22:02:37 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;I have moved my main Fediverse account from &lt;a href="https://fosstodon.org/@xgqt"&gt;@xgqt@fosstodon.org&lt;/a&gt; to &lt;a href="https://emacs.ch/@xgqt"&gt;@xgqt@emacs.ch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new account&amp;rsquo;s RSS feed can be found at &lt;a href="https://emacs.ch/users/xgqt.rss"&gt;emacs.ch/users/xgqt.rss&lt;/a&gt;.&lt;/p&gt;</description></item>
  <item>
   <title>Running nginx under a local user</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/05/19/running-nginx-under-a-local-user/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-05-19-running-nginx-under-a-local-user</guid>
   <pubDate>Thu, 18 May 2023 23:17:24 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="config"&gt;Config&lt;/h1&gt;

&lt;p&gt;First let&amp;rsquo;s prepare a suitable nginx configuration file.&lt;/p&gt;

&lt;p&gt;This one is pretty bare but it works well for our case:&lt;/p&gt;

&lt;div class="brush: nginx"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;daemon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;pid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/nginx.pid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;error_log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/dev/stdout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;worker_connections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;client_body_temp_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_temp_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/proxy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;fastcgi_temp_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/fastcgi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;uwsgi_temp_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/uwsgi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;scgi_temp_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./nginx/temp/scgi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;access_log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/dev/stdout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;error_log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/dev/stdout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;autoindex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Server config is set up for serving &lt;strong&gt;all&lt;/strong&gt; static files from the current directory.&lt;/p&gt;

&lt;h1 id="startup"&gt;Startup&lt;/h1&gt;

&lt;h2 id="preparation"&gt;Preparation&lt;/h2&gt;

&lt;p&gt;Based on how you want to store &lt;code&gt;_temp_path&lt;/code&gt; files it might be necessary to create (or clean up) additional directories, for example:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;./nginx/temp
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;./nginx/temp
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="run-in-current-directory"&gt;Run in current directory&lt;/h2&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;./nginx.conf&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;./
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;BTW, you may want to replace &lt;code&gt;./&lt;/code&gt; with &lt;code&gt;"$(pwd)"&lt;/code&gt; and occurrences in the config with static paths.&lt;/p&gt;

&lt;h1 id="bonus-other-simple-servers"&gt;Bonus: other simple servers&lt;/h1&gt;

&lt;p&gt;Some of no-dependency-except-itself http servers it&amp;rsquo;s good to know about:&lt;/p&gt;

&lt;h2 id="python-httpserver"&gt;Python http.server&lt;/h2&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;http.server&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="busybox"&gt;Busybox&lt;/h2&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;busybox&lt;span class="w"&gt; &lt;/span&gt;httpd&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:8080&lt;span class="w"&gt; &lt;/span&gt;-v
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;You can read more about configuring busybox&amp;rsquo;s httpd on &lt;a href="https://openwrt.org/docs/guide-user/services/webserver/http.httpd"&gt;OpenWRT docs&lt;/a&gt;.&lt;/p&gt;</description></item>
  <item>
   <title>Bubblewrap cross-architecture chroot</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/04/28/bubblewrap-cross-architecture-chroot/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-04-28-bubblewrap-cross-architecture-chroot</guid>
   <pubDate>Fri, 28 Apr 2023 15:06:33 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="system-preparation"&gt;System preparation&lt;/h1&gt;

&lt;h2 id="qemu"&gt;Qemu&lt;/h2&gt;

&lt;p&gt;Emerge &lt;code&gt;qemu&lt;/code&gt; with &lt;code&gt;static-user&lt;/code&gt; USE enabled and your wanted architectures.&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;app-emulation/qemu      QEMU_SOFTMMU_TARGETS: aarch64 arm x86_64
app-emulation/qemu      QEMU_USER_TARGETS: aarch64 arm x86_64

app-emulation/qemu      static-user
dev-libs/glib           static-libs
sys-apps/attr           static-libs
sys-libs/zlib           static-libs
dev-libs/libpcre2       static-libs
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="openrc"&gt;OpenRC&lt;/h2&gt;

&lt;p&gt;Enable &lt;code&gt;qemu-binfmt&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;qemu-binfmt&lt;span class="w"&gt; &lt;/span&gt;default
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Start &lt;code&gt;qemu-binfmt&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rc-service&lt;span class="w"&gt; &lt;/span&gt;qemu-binfmt&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="chrooting"&gt;Chrooting&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;select chroot location  (eg &lt;code&gt;/chroots/gentoo-arm64-musl-stable&lt;/code&gt;)&lt;/li&gt;
 &lt;li&gt;unpack the desired rootfs&lt;/li&gt;
 &lt;li&gt;create needed directories
  &lt;ul&gt;
   &lt;li&gt;&lt;code&gt;mkdir -p /chroots/gentoo-arm64-musl-stable/var/cache/distfiles&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;execute &lt;code&gt;bwrap&lt;/code&gt;
  &lt;ul&gt;
   &lt;li&gt;with last &lt;code&gt;ro-bind&lt;/code&gt; mount the qemu emulator binary  (eg &lt;code&gt;qemu-aarch64&lt;/code&gt;)&lt;/li&gt;
   &lt;li&gt;execute the mounted emulator binary giving it a shell program  (eg &lt;code&gt;bash&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Chroot with &lt;code&gt;bwrap&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;bwrap&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--bind&lt;span class="w"&gt; &lt;/span&gt;/chroots/gentoo-arm64-musl-stable&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--dev&lt;span class="w"&gt; &lt;/span&gt;/dev&lt;span class="w"&gt;                                              &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--proc&lt;span class="w"&gt; &lt;/span&gt;/proc&lt;span class="w"&gt;                                            &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--perms&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1777&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/dev/shm&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/run&lt;span class="w"&gt;                                            &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--ro-bind&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--bind&lt;span class="w"&gt; &lt;/span&gt;/var/cache/distfiles&lt;span class="w"&gt; &lt;/span&gt;/var/cache/distfiles&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--ro-bind&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/qemu-aarch64&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/qemu-aarch64&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/usr/bin/qemu-aarch64&lt;span class="w"&gt; &lt;/span&gt;/bin/bash&lt;span class="w"&gt; &lt;/span&gt;-l
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Libvirt with bridge network</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/04/09/libvirt-with-bridge-network/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-04-09-libvirt-with-bridge-network</guid>
   <pubDate>Sun, 09 Apr 2023 20:28:38 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="user-mode"&gt;User-mode&lt;/h1&gt;

&lt;p&gt;By default you would probably have something like this, the user-mode network:&lt;/p&gt;

&lt;div class="brush: xml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"user"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;mac&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;address=&lt;/span&gt;&lt;span class="s"&gt;"00:00:00:00:00:00"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"virtio"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"pci"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;domain=&lt;/span&gt;&lt;span class="s"&gt;"0x0000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;bus=&lt;/span&gt;&lt;span class="s"&gt;"0x01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"0x00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;function=&lt;/span&gt;&lt;span class="s"&gt;"0x0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="bridge"&gt;Bridge&lt;/h1&gt;

&lt;p&gt;Bridges can be easily created using the NetworkManager&amp;rsquo;s TUI tool called &lt;code&gt;nmtui&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="bridge-xml-configuration-for-libvirt"&gt;Bridge XML configuration for Libvirt&lt;/h2&gt;

&lt;div class="brush: xml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"bridge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;mac&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;address=&lt;/span&gt;&lt;span class="s"&gt;"00:00:00:00:00:00"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;bridge=&lt;/span&gt;&lt;span class="s"&gt;"br1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;dev=&lt;/span&gt;&lt;span class="s"&gt;"vnet2"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"virtio"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"net0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"pci"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;domain=&lt;/span&gt;&lt;span class="s"&gt;"0x0000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;bus=&lt;/span&gt;&lt;span class="s"&gt;"0x06"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"0x00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;function=&lt;/span&gt;&lt;span class="s"&gt;"0x0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="sysctl-options"&gt;Sysctl options&lt;/h1&gt;

&lt;p&gt;Be sure the following options are enabled (&lt;code&gt;1&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;net.ipv4.ip_forward&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;net.ipv4.conf.all.send_redirects&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;and the following options are disabled (&lt;code&gt;0&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;net.bridge.bridge-nf-call-iptables&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Installing PowerShell modules via Portage</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/04/07/installing-powershell-modules-via-portage/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-04-07-installing-powershell-modules-via-portage</guid>
   <pubDate>Fri, 07 Apr 2023 00:26:43 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="building-powershell"&gt;Building PowerShell&lt;/h1&gt;

&lt;p&gt;As a part of my work of modernizing the way .NET SDK packages are distributed in Gentoo I delved into packaging a from-source build of PowerShell for Gentoo using the &lt;a href="https://gitlab.com/xgqt/gentoo-dotnet-2023/-/blob/master/eclass/dotnet-pkg.eclass"&gt;dotnet-pkg eclass&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Packaging &lt;code&gt;pwsh&lt;/code&gt; was a little tricky but I got a lot of help from reading the Alpine Linux&amp;rsquo;s &lt;a href="https://git.alpinelinux.org/aports/tree/community/powershell/APKBUILD?id=26cea8a350cfadb92820b471d11e9d00d4e020a6"&gt;APKBUILD&lt;/a&gt;. I had to generate special C# code bindings with &lt;code&gt;ResGen&lt;/code&gt; and repackage the PowerShell tarball. Other than this trick, restoring and building PowerShell was pretty straight forward with the NuGet package management support from the &lt;code&gt;dotnet-pkg.eclass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Alternatively if you do not want to build PowerShell you can install the binary package, I have in plans to keep that package around even after we get the non-binary &lt;a href="https://gitlab.com/xgqt/gentoo-dotnet-2023/-/tree/master/app-shells/pwsh"&gt;app-shells/pwsh&lt;/a&gt; into the official Gentoo ebuild repository.&lt;/p&gt;

&lt;h1 id="why-install-modules-via-portage"&gt;Why install modules via Portage?&lt;/h1&gt;

&lt;p&gt;But why stop on PowerShell when we can also package multiple PS modules?&lt;/p&gt;

&lt;p&gt;Installing modules via Portage has many benefits:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;better version control,&lt;/li&gt;
 &lt;li&gt;more control over global install,&lt;/li&gt;
 &lt;li&gt;no need to enable PS Gallery,&lt;/li&gt;
 &lt;li&gt;sandboxed builds,&lt;/li&gt;
 &lt;li&gt;using system .NET runtime.&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="merging-the-modules"&gt;Merging the modules&lt;/h1&gt;

&lt;p&gt;PowerShell&amp;rsquo;s method of finding modules is at follows: check paths from the &lt;code&gt;PSModulePath&lt;/code&gt; environment variable for directories containing valid &lt;code&gt;.psd1&lt;/code&gt; files which define the PS modules.&lt;/p&gt;

&lt;p&gt;By default &lt;code&gt;pwsh&lt;/code&gt; tries to find modules in paths:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;user&amp;rsquo;s modules directory  &amp;mdash; &lt;code&gt;~/.local/share/powershell/Modules&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;system modules directory in &lt;code&gt;/usr/local&lt;/code&gt;  &amp;mdash; &lt;code&gt;/usr/local/share/powershell/Modules&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;Modules&lt;/code&gt; directory inside the &lt;code&gt;pwsh&lt;/code&gt; home  &amp;mdash; for example &lt;code&gt;/usr/share/pwsh-7.3/Modules&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Because we do not want to touch either &lt;code&gt;/usr/local&lt;/code&gt; nor &lt;code&gt;pwsh&lt;/code&gt; home, we embed a special environment variable inside the &lt;code&gt;pwsh&lt;/code&gt; launcher script to extend the path where &lt;code&gt;pwsh&lt;/code&gt; looks for PS modules. The new module directory is located at &lt;code&gt;/usr/share/GentooPowerShell/Modules&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dotnet-pkg-utils_append_launchervar&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PSModulePath="${PSModulePath}:/usr/share/GentooPowerShell/Modules:"&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;So every PowerShell module will install it&amp;rsquo;s files inside &lt;code&gt;/usr/share/GentooPowerShell/Modules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To follow PS module location convention we add to that path a segment for the real module name and a segment for module version. This also enables us to have proper multi-slotting because most of the time the modules will not block installing other versions.&lt;/p&gt;

&lt;p&gt;Take a look at this example from the &lt;a href="https://gitlab.com/xgqt/gentoo-dotnet-2023/-/blob/cfcb425e097a3782d067d4abaca2ec06be3f4fde/app-pwsh/posh-dotnet/posh-dotnet-1.2.3.ebuild"&gt;app-pwsh/posh-dotnet&amp;ndash;1.2.3&lt;/a&gt; ebuild:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;src_install&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;insinto&lt;span class="w"&gt; &lt;/span&gt;/usr/share/GentooPowerShell/Modules/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;doins&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.psd1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.psm1

&lt;span class="w"&gt;    &lt;/span&gt;einstalldocs
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And that is it. Some packages do not even need to be compiled, they just need files placed into specific location. But when compilation of C# code is needed we have &lt;code&gt;dotnet-pkg&lt;/code&gt; to help.&lt;/p&gt;</description></item>
  <item>
   <title>Binary packages in Gentoo</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/03/23/binary-packages-in-gentoo/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-03-23-binary-packages-in-gentoo</guid>
   <pubDate>Thu, 23 Mar 2023 08:01:04 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="binpkgs-generated-by-user"&gt;Binpkgs generated by user&lt;/h1&gt;

&lt;p&gt;The binary packages generated by user can have architecture-specific optimizations because they are generated after they were compiled by the host Portage installation.&lt;/p&gt;

&lt;p&gt;In addition binpkgs are generated from ebuilds so if there is a 
 &lt;u&gt;USE&lt;/u&gt; flag incompatibility on the consumer system then the binpkg will not be installed on the host and Portage will fall back to 
 &lt;u&gt;from-source&lt;/u&gt; compilation.&lt;/p&gt;

&lt;p&gt;Those binary packages can use two formats: &lt;a href="https://wiki.gentoo.org/wiki/Binary_package_guide#XPAK_format"&gt;XPAK&lt;/a&gt; and &lt;a href="https://www.gentoo.org/glep/glep-0078.html"&gt;GPKG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;XPAK had many issues and is getting superseded by the GPKG format. Beware of upcoming GPKG transition and if you &lt;strong&gt;must&lt;/strong&gt; use XPAKs then you should explicitly enable it in your system&amp;rsquo;s Portage configuration.&lt;/p&gt;

&lt;p&gt;To host a binary package distribution server see the &lt;a href="https://wiki.gentoo.org/wiki/Binary_package_guide"&gt;Binary package guide&lt;/a&gt; on the Gentoo wiki.&lt;/p&gt;

&lt;h1 id="bin-packages-in-a-repository"&gt;Bin packages in a repository&lt;/h1&gt;

&lt;p&gt;Binary packages in &lt;code&gt;::gentoo&lt;/code&gt; (the official Gentoo repository) have the 
 &lt;u&gt;-bin&lt;/u&gt; suffix.&lt;/p&gt;

&lt;p&gt;Those packages might have USE flags but generally they are very limited in case of customizations or code optimizations because they were compiled either by a Gentoo developer or by a given package 
 &lt;u&gt;upstream&lt;/u&gt; maintainer (or their CI/CD system).&lt;/p&gt;

&lt;p&gt;Those packages land in &lt;code&gt;::gentoo&lt;/code&gt; mostly because it is too hard (or even impossible) to compile them natively by Portage. Most of the time those packages use very complicated build systems or do not play nice with network sandbox like (e.g. Scala-based projects) or use very large frameworks/libraries like (e.g. 
 &lt;u&gt;Electron&lt;/u&gt;).&lt;/p&gt;

&lt;p&gt;They can also be added to the repository because they are very 
 &lt;u&gt;desirable&lt;/u&gt; either by normal users (e.g. &lt;a href="https://packages.gentoo.org/packages/www-client/firefox-bin"&gt;www-client/firefox-bin&lt;/a&gt;) or for (from-source) package 
 &lt;u&gt;bootstrapping&lt;/u&gt; purposes (e.g. &lt;a href="https://packages.gentoo.org/packages/dev-java/openjdk-bin"&gt;dev-java/openjdk-bin&lt;/a&gt;). Such packages are sometimes generated from the regular source packages inside &lt;code&gt;::gentoo&lt;/code&gt; and later repackaged.&lt;/p&gt;</description></item>
  <item>
   <title>Ebuild lit tests</title>
   <link>https://xgqt.gitlab.io/blog/posts/2023/02/24/ebuild-lit-tests/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2023-02-24-ebuild-lit-tests</guid>
   <pubDate>Thu, 23 Feb 2023 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="patching"&gt;Patching&lt;/h1&gt;

&lt;p&gt;The file &lt;code&gt;lit.site.cfg&lt;/code&gt; has to be inspected for any incorrect calls to executables. For example see &lt;code&gt;src_prepare&lt;/code&gt; function form &lt;a href="https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-lang/boogie"&gt;dev-lang/boogie&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id="eclasses"&gt;Eclasses&lt;/h1&gt;

&lt;p&gt;Because we will need to specify how many threads should &lt;code&gt;lit&lt;/code&gt; run we need to inherit &lt;code&gt;multiprocessing&lt;/code&gt; to detect how many parallel jobs the portage config sets.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;inherit&lt;span class="w"&gt; &lt;/span&gt;multiprocessing
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="dependencies"&gt;Dependencies&lt;/h1&gt;

&lt;p&gt;Ensure that &lt;code&gt;dev-python/lit&lt;/code&gt; is in &lt;code&gt;BDEPEND&lt;/code&gt;, but also additional packages may be needed, for example &lt;code&gt;dev-python/OutputCheck&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;BDEPEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;    &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RDEPEND&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;    test? (&lt;/span&gt;
&lt;span class="s2"&gt;        dev-python/lit&lt;/span&gt;
&lt;span class="s2"&gt;        dev-python/OutputCheck&lt;/span&gt;
&lt;span class="s2"&gt;    )&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="bad-tests"&gt;Bad tests&lt;/h1&gt;

&lt;p&gt;To deal with bad test you can simply remove the files causing the failures.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;
&lt;span class="normal"&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bad_tests&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;civl/inductive-sequentialization/BroadcastConsensus.bpl
&lt;span class="w"&gt;    &lt;/span&gt;civl/inductive-sequentialization/PingPong.bpl
&lt;span class="w"&gt;    &lt;/span&gt;livevars/bla1.bpl
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bad_test
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bad_test&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bad_tests&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/Test/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bad_test&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;die
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="test-phase"&gt;Test phase&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;--threads $(makeopts_jobs)&lt;/code&gt; specifies how many parallel tests to run.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--verbose&lt;/code&gt; option will show output of failed tests.&lt;/p&gt;

&lt;p&gt;Last &lt;code&gt;lit&lt;/code&gt; argument specifies where &lt;code&gt;lit&lt;/code&gt; should look for &lt;code&gt;lit.site.cfg&lt;/code&gt; and tests.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;src_test&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;lit&lt;span class="w"&gt; &lt;/span&gt;--threads&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;makeopts_jobs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/Test&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;die
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>src_snapshot</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/12/30/src-snapshot/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-12-30-src-snapshot</guid>
   <pubDate>Thu, 29 Dec 2022 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="prototype"&gt;Prototype&lt;/h1&gt;

&lt;p&gt;Recently while browsing the Alpine git repo I noticed they have a function called &lt;code&gt;snapshot&lt;/code&gt;, see: &lt;a href="https://git.alpinelinux.org/aports/tree/testing/dart/APKBUILD#n45"&gt;https://git.alpinelinux.org/aports/tree/testing/dart/APKBUILD#n45&lt;/a&gt; I am not 100% sure about how that works but a wild guess is that the developers can run that function to fetch the sources and maybe later upload them to the Alpine repo or some sort of (cloud?) storage.&lt;/p&gt;

&lt;p&gt;In Portage there exists a &lt;code&gt;pkg_config&lt;/code&gt; function used to run miscellaneous configuration for packages. The only major difference between &lt;code&gt;src_snapshot&lt;/code&gt; and that would of course be that users would never run &lt;code&gt;snapshot&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="sandbox"&gt;Sandbox&lt;/h2&gt;

&lt;p&gt;Probably only the &lt;code&gt;network sandbox&lt;/code&gt; would have to be lifted out&amp;hellip; to fetch the sources of course.&lt;/p&gt;

&lt;p&gt;But also a few (at least one?) special directories and variables would be useful.&lt;/p&gt;</description></item>
  <item>
   <title>Ebuild-mode</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/12/30/ebuild-mode/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-12-30-ebuild-mode</guid>
   <pubDate>Thu, 29 Dec 2022 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="portage"&gt;Portage&lt;/h1&gt;

&lt;p&gt;Configure the following for Portage.&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dev-util/pkgcheck emacs
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="emerge"&gt;Emerge&lt;/h2&gt;

&lt;p&gt;Emerge the following packages:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;code&gt;app-emacs/company-ebuild&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;&lt;code&gt;dev-util/pkgcheck&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Company-Ebuild should pull in &lt;code&gt;app-emacs/ebuild-mode&lt;/code&gt;, if that does not happen, then report a bug ;-D&lt;/p&gt;

&lt;h1 id="standard"&gt;Standard&lt;/h1&gt;

&lt;p&gt;Add the following to your user's Emacs initialization file. The initialization file is either &lt;code&gt;~/.emacs.d/init.el&lt;/code&gt; or &lt;code&gt;~/.config/emacs/init.el&lt;/code&gt; for newer versions of GNU Emacs.&lt;/p&gt;

&lt;div class="brush: elisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;company-ebuild&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-pkgcheck&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;company-ebuild-setup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-pkgcheck-setup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="use-package"&gt;Use-Package&lt;/h1&gt;

&lt;p&gt;We can also configure our environment using a &lt;code&gt;use-package&lt;/code&gt; macro that simplifies the setup a little bit.&lt;/p&gt;

&lt;p&gt;To use the below configuration the &lt;code&gt;app-emacs/use-package&lt;/code&gt; package will have to be installed.&lt;/p&gt;

&lt;div class="brush: elisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;
&lt;span class="normal"&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;use-package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"\\.\\(ebuild\\|eclass\\)\\&amp;#39;"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:hook&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;company-ebuild-setup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-pkgcheck-setup&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;:defer t&lt;/code&gt; and &lt;code&gt;:mode "..."&lt;/code&gt; enable deferred loading which theoretically speeds up GNU Emacs initialization time at the cost of running the whole &lt;code&gt;use-package&lt;/code&gt; block of &lt;code&gt;ebuild-mode&lt;/code&gt; configuration when the &lt;code&gt;:mode&lt;/code&gt; condition is met.&lt;/p&gt;</description></item>
  <item>
   <title>Fediverse RSS</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/11/16/fediverse-rss/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-11-16-fediverse-rss</guid>
   <pubDate>Tue, 15 Nov 2022 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="fosstodon"&gt;Fosstodon&lt;/h1&gt;

&lt;p&gt;If you prefer to follow my posts on &lt;a href="https://fosstodon.org/@xgqt"&gt;Fosstodon&lt;/a&gt; via RSS, then here is the link: &lt;a href="https://fosstodon.org/users/xgqt.rss"&gt;fosstodon.org/users/xgqt.rss&lt;/a&gt;.&lt;/p&gt;</description></item>
  <item>
   <title>Chromium</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/09/02/chromium/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-09-02-chromium</guid>
   <pubDate>Thu, 01 Sep 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="dark-interface"&gt;Dark interface&lt;/h1&gt;

&lt;p&gt;Force web UI dark mode&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;--enable-features&lt;span class="o"&gt;=&lt;/span&gt;WebUIDarkMode&lt;span class="w"&gt; &lt;/span&gt;--force-dark-mode
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="hardware-acceleration"&gt;Hardware acceleration&lt;/h1&gt;

&lt;p&gt;Accelerated video decoding and GPU support&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;--enable-accelerated-video-decode&lt;span class="w"&gt; &lt;/span&gt;--enable-gpu
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="reader-mode"&gt;Reader mode&lt;/h1&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;--enable-reader-mode
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="runtime-cache"&gt;Runtime cache&lt;/h1&gt;

&lt;p&gt;Use the cache directory /run/user/1000/chrome/cache&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;--disk-cache-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/chrome/cache
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="window-size"&gt;Window size&lt;/h1&gt;

&lt;p&gt;Sawn a window of size 1200x900&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;--window-size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1200&lt;/span&gt;,900
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="full-config"&gt;Full config&lt;/h1&gt;

&lt;p&gt;The file &lt;code&gt;/etc/chromium/default&lt;/code&gt; is sourced by the Chromium launcher, that's why we can sue bash syntax here.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="c1"&gt;# Dark interface&lt;/span&gt;
&lt;span class="c1"&gt;# Force web UI dark mode&lt;/span&gt;
&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --enable-features=WebUIDarkMode --force-dark-mode"&lt;/span&gt;

&lt;span class="c1"&gt;# Hardware acceleration&lt;/span&gt;
&lt;span class="c1"&gt;# Accelerated video decoding and GPU support&lt;/span&gt;
&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --enable-accelerated-video-decode --enable-gpu"&lt;/span&gt;

&lt;span class="c1"&gt;# Reader mode&lt;/span&gt;
&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --enable-reader-mode"&lt;/span&gt;

&lt;span class="c1"&gt;# Runtime cache&lt;/span&gt;
&lt;span class="c1"&gt;# Use the cache directory /run/user/1000/chrome/cache&lt;/span&gt;
&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --disk-cache-dir=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/chrome/cache"&lt;/span&gt;

&lt;span class="c1"&gt;# Window size&lt;/span&gt;
&lt;span class="c1"&gt;# Sawn a window of size 1200x900&lt;/span&gt;
&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CHROMIUM_FLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --window-size=1200,900"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="binary"&gt;Binary&lt;/h1&gt;

&lt;p&gt;If you use &lt;code&gt;www-client/chromium-bin&lt;/code&gt;, then the config is located at &lt;code&gt;/etc/chromium/default&lt;/code&gt; and &lt;code&gt;CHROMIUM_FLAGS&lt;/code&gt; is &lt;code&gt;CHROMIUM_BIN_FLAGS&lt;/code&gt;.&lt;/p&gt;</description></item>
  <item>
   <title>KDE Emacs</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/08/26/kde-emacs/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-08-26-kde-emacs</guid>
   <pubDate>Thu, 25 Aug 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="proper-window-size"&gt;Proper window size&lt;/h1&gt;

&lt;p&gt;Sometimes while the Emacs GUI window is tiled to a side or maximized small gaps may appear around the window. This "bug" can be worked around by:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;right-click on the title bar,&lt;/li&gt;
 &lt;li&gt;"More Actions",&lt;/li&gt;
 &lt;li&gt;"Configure Special Window Settings&amp;hellip;",&lt;/li&gt;
 &lt;li&gt;"Add Property",&lt;/li&gt;
 &lt;li&gt;"Obey Geometry Restrictions",&lt;/li&gt;
 &lt;li&gt;Select "Force" form the combo box,&lt;/li&gt;
 &lt;li&gt;Select "No" from the radio buttons.&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="opening-files-from-dolphin-in-one-emacs-instance"&gt;Opening files from Dolphin in one Emacs instance&lt;/h1&gt;

&lt;p&gt;Emacs daemon can help with that. But before you run &lt;code&gt;emacs --daemon&lt;/code&gt;, I need You to know that there might be a better way:&lt;/p&gt;

&lt;div class="brush: elisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;noninteractive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;server-running-p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;server-start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Adding the above to Your Emacs config will cause Emacs to start a daemon after it is opened (and no other Emacs servers are running), this also does not require &lt;code&gt;--daemon&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;After the daemon is started You can open files by right-clicking on them and selecting to open them in "Emacsclient".&lt;/p&gt;

&lt;p&gt;Furthermore: You also utilize &lt;code&gt;--iconic&lt;/code&gt; and add &lt;code&gt;emacs --iconic&lt;/code&gt; to your Plasma startup. This is way better than using &lt;code&gt;emacs --daemon&lt;/code&gt; because you can just click on your taskbar to open the minimized Emacs window. Also, Emacs will load all Your graphical libraries and configurations so Your theme will look properly and not as if Emacs was being used on the console.&lt;/p&gt;

&lt;h1 id="breeze-theme"&gt;Breeze theme&lt;/h1&gt;

&lt;p&gt;Sadly I have not found any theme that would look like Plasma. I use the &lt;a href="https://github.com/nashamri/spacemacs-theme/"&gt;spacemacs theme&lt;/a&gt; which looks a little bit similar, especially the background color comes close to Breeze's dark background color.&lt;/p&gt;

&lt;p&gt;Note that the theme which You load with the function &lt;code&gt;load-theme&lt;/code&gt; is a different thing that the GTK theme Emacs uses.&lt;/p&gt;

&lt;p&gt;The GTK theme should be enabled if Your Emacs version is built with GTK support. On Gentoo this setting is controlled with the &lt;code&gt;gtk&lt;/code&gt; USE flag. Also the flag &lt;code&gt;toolkit-scroll-bars&lt;/code&gt; can be enabled for a look of scroll-bars consistent with the selected toolkit.&lt;/p&gt;

&lt;h2 id="xresources"&gt;Xresources&lt;/h2&gt;

&lt;p&gt;There is a different approach to theming Your Emacs that loading a theme defined in ELisp - You can use a &lt;code&gt;~/.Xresource&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;If you do not load any theme in your configuration Emacs will by default read the .Xresources file, unless the &lt;code&gt;--no-x-resources&lt;/code&gt; flag is used.&lt;/p&gt;

&lt;p&gt;Here are a few Xresources config files that come close to the default Breeze theme:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://github.com/kuriot/xresources-breeze-theme/blob/master/.Xresources"&gt;https://github.com/kuriot/xresources-breeze-theme/blob/master/.Xresources&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://gitcode.net/mirrors/mbadolato/iTerm2-Color-Schemes/-/blob/master/Xresources/Breeze"&gt;https://gitcode.net/mirrors/mbadolato/iTerm2-Color-Schemes/-/blob/master/Xresources/Breeze&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="dbus-integration"&gt;Dbus integration&lt;/h1&gt;

&lt;p&gt;Emacs can be built with &lt;a href="https://www.freedesktop.org/wiki/Software/dbus/"&gt;FreeDesktop's D-Bus&lt;/a&gt; support to communicate over the dbus protocol. This can come handy when using ERC as it has a setting to enable desktop notifications on mentions (&lt;a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/erc/erc-desktop-notifications.el"&gt;erc-desktop-notifications.el&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The dbus interface can also be utilized to query desktop-oriented daemons, for example &lt;a href="https://github.com/emacsmirror/bluetooth/"&gt;this library&lt;/a&gt; talks to the Bluetooth daemon.&lt;/p&gt;

&lt;h1 id="kde-development"&gt;KDE development&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/KDE/kde-dev-scripts/tree/master/kde-emacs/"&gt;Those&lt;/a&gt; are some ELisp libraries that I found while browsing GitHub, they might be useful for somebody who delves into KDE app development.&lt;/p&gt;

&lt;h1 id="opening-files-in-different-applications"&gt;Opening files in different applications&lt;/h1&gt;

&lt;p&gt;In addition to &lt;code&gt;async-shell-command&lt;/code&gt; and &lt;code&gt;start-process-shell-command&lt;/code&gt; I wrote &lt;a href="https://gitlab.com/xgqt/mydot/-/raw/186da73f9e6f88978320cfb3d791ccbc8efcbe70/src/emacs/.config/emacs/assets/site-lisp/open-with.el"&gt;this&lt;/a&gt; small library that may come handy.&lt;/p&gt;

&lt;h1 id="outside-emacs-inside-plasma"&gt;Outside Emacs, inside Plasma&lt;/h1&gt;

&lt;p&gt;Sadly the KDE team did not add support to emulate Emacs-like keys in Plasma itself, but some applications like, for example &lt;a href="https://kate-editor.org/"&gt;Kate&lt;/a&gt; have configuration options to customize the key bindings. &lt;a href="https://github.com/evanpeterjones/kate-macs/"&gt;This&lt;/a&gt; is a repository explaining how to setup Kate's bindings.&lt;/p&gt;</description></item>
  <item>
   <title>Pkgcheck-Flycheck</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/08/06/pkgcheck-flycheck/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-08-06-pkgcheck-flycheck</guid>
   <pubDate>Fri, 05 Aug 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="news"&gt;News&lt;/h1&gt;

&lt;h2 id="repository"&gt;Repository&lt;/h2&gt;

&lt;p&gt;With &lt;a href="https://github.com/pkgcore/pkgcheck/commit/9089bd15a89db904e62a2b1a5db6c24b281676a0/"&gt;this commit&lt;/a&gt; first &lt;a href="https://www.gnu.org/software/emacs/"&gt;GNU Emacs&lt;/a&gt; integration was merged into the &lt;a href="https://pkgcore.github.io/pkgcheck/"&gt;pkgcheck&lt;/a&gt; repository.&lt;/p&gt;

&lt;h2 id="history"&gt;History&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://github.com/pkgcore/pkgcheck/issues/417"&gt;https://github.com/pkgcore/pkgcheck/issues/417&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/pkgcore/pkgcheck/pull/420"&gt;https://github.com/pkgcore/pkgcheck/pull/420&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/gentoo/gentoo/pull/26700"&gt;https://github.com/gentoo/gentoo/pull/26700&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="thanks"&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Huge thanks to &lt;a href="https://github.com/thesamesam/"&gt;Sam James&lt;/a&gt; and &lt;a href="https://github.com/arthurzam/"&gt;Arthur Zamarin&lt;/a&gt; for support and interest in getting this feature done.&lt;/p&gt;

&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;

&lt;h2 id="unmasking"&gt;Unmasking&lt;/h2&gt;

&lt;p&gt;The Flycheck integration is unreleased as of now, this will (hopefully) change in the future, but for now You need live versions of &lt;code&gt;snakeoil&lt;/code&gt;, &lt;code&gt;pkgcore&lt;/code&gt; and &lt;code&gt;pkgcheck&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;File: &lt;code&gt;/etc/portage/package.accept_keywords/pkgcore.conf&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dev-python/snakeoil  **
sys-apps/pkgcore     **
dev-util/pkgcheck    **
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Also You will need to unmask &lt;code&gt;app-emacs/flycheck&lt;/code&gt; and its dependencies.&lt;/p&gt;

&lt;p&gt;File: &lt;code&gt;/etc/portage/package.accept_keywords/emacs.conf&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;app-emacs/epl
app-emacs/pkg-info
app-emacs/flycheck
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="emerging"&gt;Emerging&lt;/h2&gt;

&lt;p&gt;Install pkgcheck with the &lt;code&gt;emacs&lt;/code&gt; USE flag enabled.&lt;/p&gt;

&lt;p&gt;File: &lt;code&gt;/etc/portage/package.use/pkgcore.conf&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;dev-util/pkgcheck    emacs
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Afterwards run:&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;-1av&lt;span class="w"&gt; &lt;/span&gt;dev-python/snakeoil&lt;span class="w"&gt; &lt;/span&gt;sys-apps/pkgcore&lt;span class="w"&gt; &lt;/span&gt;dev-util/pkgcheck
emerge&lt;span class="w"&gt; &lt;/span&gt;-av&lt;span class="w"&gt; &lt;/span&gt;--noreplace&lt;span class="w"&gt; &lt;/span&gt;dev-util/pkgcheck
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="configuration"&gt;Configuration&lt;/h1&gt;

&lt;p&gt;Following is what I would suggest to put into your Emacs config file:&lt;/p&gt;

&lt;div class="brush: elisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-pkgcheck&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-pkgcheck-enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ebuild-mode-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;flycheck-pkgcheck-setup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;If You are using &lt;code&gt;use-package&lt;/code&gt;:&lt;/p&gt;

&lt;div class="brush: elisp"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-mode&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-pkgcheck&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;flycheck-pkgcheck-enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;ebuild-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flycheck-pkgcheck-setup&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The lines with &lt;code&gt;:ensure nil&lt;/code&gt; are there to prevent &lt;code&gt;use-package&lt;/code&gt; from trying to download the particular package from Elpa (because we use system packages for this configuration).&lt;/p&gt;</description></item>
  <item>
   <title>Mkdocs with Scribble</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/07/12/mkdocs-with-scribble/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-07-12-mkdocs-with-scribble</guid>
   <pubDate>Mon, 11 Jul 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;

&lt;p&gt;Instead of changing CSS style for Your &lt;a href="https://racket-lang.org/"&gt;Racket&lt;/a&gt; projects documentation, You may be interested in compiling &lt;a href="https://en.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; files generated form &lt;a href="https://docs.racket-lang.org/scribble/"&gt;Scribble&lt;/a&gt; source into HTML documentation website.&lt;/p&gt;

&lt;h1 id="creating-mkdocs-project"&gt;Creating MkDocs project&lt;/h1&gt;

&lt;ol&gt;
 &lt;li&gt;
  &lt;p&gt;Create &lt;code&gt;docs&lt;/code&gt; directory and &lt;code&gt;mkdocs.yml&lt;/code&gt;  config file in current directory, along with a dummy  &lt;code&gt;index.md&lt;/code&gt; file in &lt;code&gt;docs&lt;/code&gt; folder.&lt;/p&gt;
  &lt;div class="brush: shell"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdocs&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;Edit the name of the project.&lt;/p&gt;
  &lt;p&gt;&lt;em&gt;Replace &lt;code&gt;Racket-Project&lt;/code&gt; with your project name.&lt;/em&gt;&lt;/p&gt;
  &lt;div class="brush: yaml"&gt;
   &lt;div class="source"&gt;
    &lt;table class="sourcetable"&gt;
     &lt;tbody&gt;
      &lt;tr&gt;
       &lt;td class="linenos"&gt;
        &lt;div class="linenodiv"&gt;
         &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
       &lt;td class="code"&gt;
        &lt;div&gt;
         &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;site_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Racket-Project&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;h1 id="building-scribble"&gt;Building Scribble&lt;/h1&gt;

&lt;p&gt;Generate markdown files form scribble documentation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Replace &lt;code&gt;Racket-Project.scrbl&lt;/code&gt; with path to your scribble documentation main source file.&lt;/em&gt;&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;scribble&lt;span class="w"&gt; &lt;/span&gt;--markdown&lt;span class="w"&gt; &lt;/span&gt;--dest&lt;span class="w"&gt; &lt;/span&gt;./docs&lt;span class="w"&gt; &lt;/span&gt;--dest-name&lt;span class="w"&gt; &lt;/span&gt;index.md&lt;span class="w"&gt; &lt;/span&gt;Racket-Project.scrbl
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="building-markdown"&gt;Building Markdown&lt;/h1&gt;

&lt;p&gt;Compile HTML documentation from the markdown source.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdocs&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;HTML files should appear in the &lt;code&gt;site&lt;/code&gt; directory.&lt;/p&gt;

&lt;h1 id="running-the-server"&gt;Running the server&lt;/h1&gt;

&lt;p&gt;Some features, like search for example are only available when running the mkdocs server.&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdocs&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="caveats"&gt;Caveats&lt;/h1&gt;

&lt;p&gt;Some scribble functions do not look good or work correctly for markdown-to-HTML compilation by MkDocs.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;
  &lt;p&gt;&lt;code&gt;table-of-contents&lt;/code&gt; - looks like a source block&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;&lt;code&gt;index-section&lt;/code&gt; - letter links do not work&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="example-configuration"&gt;Example configuration&lt;/h1&gt;

&lt;div class="brush: yaml"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;site_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Racket-Ebuild&lt;/span&gt;
&lt;span class="nt"&gt;site_author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;xgqt@riseup.net&lt;/span&gt;
&lt;span class="nt"&gt;site_description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;library to ease ebuild creation&lt;/span&gt;
&lt;span class="nt"&gt;site_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://gitlab.com/gentoo-racket/racket-ebuild&lt;/span&gt;

&lt;span class="nt"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gentoo-racket/racket-ebuild&lt;/span&gt;
&lt;span class="nt"&gt;repo_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://gitlab.com/gentoo-racket/racket-ebuild&lt;/span&gt;

&lt;span class="nt"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;search&lt;/span&gt;

&lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;material&lt;/span&gt;

&lt;span class="nt"&gt;extra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;social&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;fontawesome/brands/gitlab&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://gitlab.com/gentoo-racket/racket-ebuild&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Lenovo 81nc advanced bios options</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/04/25/lenovo-81nc-advanced-bios-options/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-04-25-lenovo-81nc-advanced-bios-options</guid>
   <pubDate>Sun, 24 Apr 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="accessing-advanced-bios-menu"&gt;Accessing advanced BIOS menu&lt;/h1&gt;

&lt;h2 id="preparation"&gt;Preparation&lt;/h2&gt;

&lt;p&gt;First using a needle or a toothpick click a button on the right side of the laptop (indicated by a bent arrow), this will start the machine up in BIOS selection menu where you choose the BIOS setup option.&lt;/p&gt;

&lt;p&gt;Then, in the BIOS menu disable option to check laptop charge level while it is shut down. If not disabled it will interfere with key combination that has to be pressed while laptop is shut down. This can be turned back after the advanced BIOS menu is enabled.&lt;/p&gt;

&lt;p&gt;After that "Exit saving changes" and shutdown.&lt;/p&gt;

&lt;h2 id="keys"&gt;Keys&lt;/h2&gt;

&lt;p&gt;I thought it was a joke at first but it really is true that a special combination of keys has to be pressed depending on the laptop model (while it is shut down).&lt;/p&gt;

&lt;p&gt;For my laptop it is as follows:&lt;/p&gt;

&lt;div class="brush: fundamental"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;F4 4 r f v
F5 5 t g b
F6 6 y h n
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

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

&lt;ul&gt;
 &lt;li&gt;Lenovo product page:  &lt;a href="https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/ideapad-s-series-netbooks/s340-15api/81nc"&gt;https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/ideapad-s-series-netbooks/s340-15api/81nc&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://www.reddit.com/r/Fedora/comments/r2m6my/comment/hm9dddn/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3"&gt;https://www.reddit.com/r/Fedora/comments/r2m6my/comment/hm9dddn/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>systemd-custom-unit</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/04/08/systemd-custom-unit/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-04-08-systemd-custom-unit</guid>
   <pubDate>Thu, 07 Apr 2022 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="template"&gt;Template&lt;/h1&gt;

&lt;p&gt;File: &lt;code&gt;/etc/systemd/system/APP.service&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Unit]
Description=Run APP application

[Service]
Type=simple
ExecStart=/usr/bin/LANG APP_DIR/APP APP_ARGS
Restart=on-failure
User=root
WorkingDirectory=APP_DIR

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Also, the application might need to reference a PID file, let systemD know abut it via &lt;code&gt;PIDFile&lt;/code&gt;.&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;PIDFile=/tmp/APP.pid
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

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

&lt;p&gt;File: &lt;code&gt;/etc/systemd/system/julia_dash_app.service&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Unit]
Description=Run Julia Dash application

[Service]
Type=simple
ExecStart=/usr/bin/julia /root/julia_dash_app/main.jl
Restart=on-failure
User=root
WorkingDirectory=/root/julia_dash_app

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Portage CI</title>
   <link>https://xgqt.gitlab.io/blog/posts/2022/03/08/portage-ci/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2022-03-08-portage-ci</guid>
   <pubDate>Mon, 07 Mar 2022 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="potential-benefits"&gt;Potential benefits&lt;/h1&gt;

&lt;h2 id="running-tests"&gt;Running tests&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;test BEFORE (&lt;code&gt;src_test&lt;/code&gt;) and AFTER  (&lt;code&gt;pkg_postinst&lt;/code&gt;) installation&lt;/li&gt;
 &lt;li&gt;test if and how services break if they are not reloaded&lt;/li&gt;
 &lt;li&gt;test buildsystem configuration&lt;/li&gt;
 &lt;li&gt;sandbox enforces strict and consistent build rules&lt;/li&gt;
 &lt;li&gt;benchmarking with different compilation flags and libraries  versions/releases&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="configuration-matrix"&gt;Configuration matrix&lt;/h2&gt;

&lt;p&gt;We can test across Cartesian product of different configuration settings, like:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://wiki.gentoo.org/wiki/USE_flag"&gt;USE flags&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;MAKEOPTS&lt;/li&gt;
 &lt;li&gt;CFLAGS, CXXFLAGS, CPPFLAGS, LDFAGS, RUSTFLAGS, etc.&lt;/li&gt;
 &lt;li&gt;arches (cross-compilation or run in qemu)&lt;/li&gt;
 &lt;li&gt;static linking&lt;/li&gt;
 &lt;li&gt;supported releases &amp;amp; versions of libraries (eg. glibc &amp;amp; musl)&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Also, we could create diffs of installed files across different merges.&lt;/p&gt;

&lt;h2 id="reproducibility"&gt;Reproducibility&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;mini &lt;a href="https://wiki.gentoo.org/wiki/Ebuild_repository"&gt;overlay&lt;/a&gt; with  ::gentoo or any other (eg. company's own) as master&lt;/li&gt;
 &lt;li&gt;record VCS (eg. git) hash of the dependent overlays&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="binaries"&gt;Binaries&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;grab dependencies from  &lt;a href="https://wiki.gentoo.org/wiki/Binary_package_guide#Setting_up_a_binary_package_host"&gt;binhosts&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;distribute built binaries (maybe upload to a company's own  artifacts server)&lt;/li&gt;
 &lt;li&gt;make &lt;a href="https://appimage.org/"&gt;AppImage&lt;/a&gt;s&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="getting-there"&gt;Getting there&lt;/h1&gt;

&lt;h2 id="how-do-we-run-this"&gt;How do we run this?&lt;/h2&gt;

&lt;p&gt;Do we want to write a proper tool, which we probably do or do we just run Portage + shells scripts?&lt;/p&gt;

&lt;p&gt;Do we want to run under root, user, in &lt;a href="https://wiki.gentoo.org/wiki/Project:Prefix"&gt;eprefix&lt;/a&gt;, maybe all in docker?&lt;/p&gt;

&lt;h2 id="configuration-files"&gt;Configuration files&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;.portci&lt;/code&gt; directory contains the configuration.&lt;/p&gt;

&lt;h2 id="bug-799626"&gt;Bug 799626&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://bugs.gentoo.org/799626"&gt;bugs.gentoo.org/799626&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of using Ansible, Python, Yaml or Scheme we might use something similar to this for simple configuration, or if gets merged to upstream Portage the better.&lt;/p&gt;

&lt;p&gt;Worth mentioning is the idea from Michał Górny who proposes to configure portage with toml files, like the example given in the bug report.&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;[package.unmask]
~virtual/libcrypt-2

[package.use.mask]
sys-libs/libxcrypt -system -split-usr

[package.use.force]
sys-libs/glibc -crypt
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Also, &lt;code&gt;package.x&lt;/code&gt; + Toml == a match made in heaven, it looks very nice!&lt;/p&gt;</description></item>
  <item>
   <title>Make gallery-dl work like youtube-dl</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/09/26/make-gallery-dl-work-like-youtube-dl/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-09-26-make-gallery-dl-work-like-youtube-dl</guid>
   <pubDate>Sat, 25 Sep 2021 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="make-gallery-dl-work-like-youtube-dl"&gt;Make gallery-dl work like youtube-dl&lt;/h1&gt;

&lt;p&gt;A configuration file to download everything into current directory, like yotube-dl does.&lt;/p&gt;

&lt;p&gt;File: &lt;code&gt;~/.config/gallery-dl/config.json&lt;/code&gt;&lt;/p&gt;

&lt;div class="brush: json"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"directory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"base-directory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Portage</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/09/26/portage/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-09-26-portage</guid>
   <pubDate>Sat, 25 Sep 2021 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="switching-from-a-git-repository-hosting"&gt;Switching from a git repository hosting&lt;/h1&gt;

&lt;p&gt;For nearly 2 years I have been synchronizing settings between my Gentoo machines &lt;a href="https://gitlab.com/xgqt/genlica"&gt;via a git repository&lt;/a&gt; that is installed system-wide via portage itself.&lt;/p&gt;

&lt;p&gt;This actually gets a little tiresome and slow as the package that installs the configuration has to be re-installed each time we want to update the settings.&lt;/p&gt;

&lt;p&gt;So I thought it could be cool if I can just push files around between my machines with one command. Now: we can use &lt;code&gt;rsync&lt;/code&gt; or &lt;code&gt;scp&lt;/code&gt; but &lt;code&gt;/etc/portage&lt;/code&gt; is owned by root so we either have to change the permissions to a user we use to ssh or a group that user is in.&lt;/p&gt;

&lt;h1 id="portage-users"&gt;Portage users&lt;/h1&gt;

&lt;p&gt;First change portage permissions of &lt;code&gt;/etc/portage&lt;/code&gt;, now all users in the &lt;code&gt;portage&lt;/code&gt; group will be able to modify the configuration&lt;/p&gt;

&lt;div class="brush: {.bash org-language=&amp;quot;sh&amp;quot;}"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;chown -R root:portage /etc/portage
chmod -R g+w /etc/portage
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="synchronizing"&gt;Synchronizing&lt;/h1&gt;

&lt;p&gt;We can do a &lt;code&gt;rsync&lt;/code&gt; from different machine with:&lt;/p&gt;

&lt;div class="brush: {.bash org-language=&amp;quot;sh&amp;quot;}"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;rsync -r /etc/portage REMOTEHOST:/etc --exclude=".git" --exclude="make.profile" --copy-unsafe-links
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Reminder that this can also be done as a &lt;code&gt;cron&lt;/code&gt; job!&lt;/p&gt;

&lt;h1 id="portage-snapshots-with-git"&gt;Portage snapshots with git&lt;/h1&gt;

&lt;p&gt;Probably the best thing I got out of genlica is that I engineered a script to automatically do a git commit of the changes to the portage configuration.&lt;/p&gt;

&lt;p&gt;Emerge git&lt;/p&gt;

&lt;div class="brush: {.bash org-language=&amp;quot;sh&amp;quot;}"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge --noreplace --verbose dev-vcs/git
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Copy the file that does the snapshots&lt;/p&gt;

&lt;div class="brush: {.bash org-language=&amp;quot;sh&amp;quot;}"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir -p /etc/portage/postsync.d
curl -o /etc/portage/postsync.d/99-degitmerge.sh "https://gitlab.com/xgqt/genlica/-/raw/master/portage/postsync.d/99-degitmerge.sh"
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>HTML Renderers</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/05/04/html-renderers/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-05-04-html-renderers</guid>
   <pubDate>Mon, 03 May 2021 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="how-it-should-be"&gt;How it should be?&lt;/h1&gt;

&lt;p&gt;I imagine that a web browser should have been a "window" to the Internet world that provides easy and efficient way to graphically access resources exposed by multiple protocols: HTTP(S), (S)FTP, Gopher, Gemini, etc&amp;hellip;&lt;/p&gt;

&lt;h1 id="how-it-is"&gt;How it is?&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Only few protocols are supported!&lt;/strong&gt;&lt;/p&gt;
Recently FTP support got "deprecated" in Firefox. It can still be enabled in 

&lt;about:config&gt;by setting &lt;code&gt;network.ftp.enabled&lt;/code&gt; to &lt;strong&gt;true&lt;/strong&gt;. FTP support is announced to be completely gone in FF 90. Chrome dropped FTP some time ago. # BUT! Luckily we have &lt;strong&gt;Emacs&lt;/strong&gt;! GNU Emacs has packages to support all kinds of protocols. - &lt;code&gt;eww&lt;/code&gt; which is a simple HTTP(S) browser like w3m (also renders images) - &lt;code&gt;tramp&lt;/code&gt; allows you to access files by SSH - &lt;code&gt;elpher&lt;/code&gt; allows you to access Gemini and Gopher sites (graphically) - &lt;code&gt;ange-ftp&lt;/code&gt; allows you to connect to FTP servers - and finally &lt;code&gt;net-utils&lt;/code&gt; which &lt;strong&gt;wraps&lt;/strong&gt; around &lt;strong&gt;system&lt;/strong&gt; utilities to provide interactive mode for many protocols, ie.: gopher, irc, ntp, pop3, www&lt;/about:config&gt;</description></item>
  <item>
   <title>Awesome Racket language features</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/05/03/awesome-racket-language-features/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-05-03-awesome-racket-language-features</guid>
   <pubDate>Sun, 02 May 2021 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;p&gt;Also see: &lt;a href="https://github.com/racket/racket/wiki/Fast-Racket"&gt;Fast-Racket at Racket's GitHub Wiki&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="creating-binaries"&gt;Creating binaries&lt;/h1&gt;

&lt;p&gt;You can create &lt;strong&gt;portable&lt;/strong&gt; binaries with Racket's &lt;code&gt;raco&lt;/code&gt; command! Use &lt;code&gt;raco exe&lt;/code&gt; and &lt;code&gt;raco distribute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;More -&amp;gt; &lt;a href="https://docs.racket-lang.org/raco/exe.html"&gt;https://docs.racket-lang.org/raco/exe.html&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="sample-games"&gt;Sample games&lt;/h1&gt;

&lt;p&gt;Racket provides a executable &lt;code&gt;plt-games&lt;/code&gt;, when ran (from console) it opens a menu of miscellaneous games, among them: jewel, minesweeper, aces, spider, checkers. &amp;amp; more (20 games total).&lt;/p&gt;

&lt;h1 id="plots"&gt;Plots&lt;/h1&gt;

&lt;p&gt;You can &lt;a href="https://docs.racket-lang.org/plot/index.html"&gt;plot&lt;/a&gt; data in &lt;a href="https://docs.racket-lang.org/plot/intro.html#%28part._.Plotting_2.D_.Graphs%29"&gt;2d&lt;/a&gt; &amp;amp; &lt;a href="https://docs.racket-lang.org/plot/intro.html#%28part._.Plotting_3.D_.Graphs%29"&gt;3d&lt;/a&gt; forms.&lt;/p&gt;

&lt;h2 id="2d"&gt;2D&lt;/h2&gt;

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

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;#lang &lt;/span&gt;&lt;span class="nn"&gt;racket/base&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/require.html#(form._((lib._racket/private/base..rkt)._require))" style="color: inherit"&gt;require&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;racket/gui/base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;racket/math&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot-new-window?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._sin))" style="color: inherit"&gt;sin&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._-))" style="color: inherit"&gt;-&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"y &lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._~3d))" style="color: inherit"&gt;=&lt;/a&gt; sin(x)"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id="3d"&gt;3D&lt;/h2&gt;

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

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;#lang &lt;/span&gt;&lt;span class="nn"&gt;racket/base&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/require.html#(form._((lib._racket/private/base..rkt)._require))" style="color: inherit"&gt;require&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;racket/gui/base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;racket/math&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot-new-window?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;#true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plot3d&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surface3d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/lambda.html#(form._((lib._racket/private/base..rkt)._lambda))" style="color: inherit"&gt;lambda&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._*))" style="color: inherit"&gt;*&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._cos))" style="color: inherit"&gt;cos&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._sin))" style="color: inherit"&gt;sin&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._-))" style="color: inherit"&gt;-&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((quote._~23~25kernel)._-))" style="color: inherit"&gt;-&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;&lt;a href="http://docs.racket-lang.org/reference/generic-numbers.html#(def._((lib._racket/math..rkt)._pi))" style="color: inherit"&gt;pi&lt;/a&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"An R × R &lt;a href="http://docs.racket-lang.org/ts-reference/type-ref.html#(form._((lib._typed-racket/base-env/base-types-extra..rkt)._~e2~86~92))" style="color: inherit"&gt;→&lt;/a&gt; R function"&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:x-label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:y-label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"y"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;#:z-label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cos(x) sin(y)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="browser"&gt;Browser&lt;/h1&gt;

&lt;p&gt;There's a included library to render web pages, just "&lt;a href="https://docs.racket-lang.org/browser/index.html"&gt;(require browser)&lt;/a&gt;".&lt;/p&gt;

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

&lt;div class="brush: racket"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;#lang &lt;/span&gt;&lt;span class="nn"&gt;racket&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;&lt;a href="http://docs.racket-lang.org/reference/require.html#(form._((lib._racket/private/base..rkt)._require))" style="color: inherit"&gt;require&lt;/a&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;open-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://xgqt.gitlab.io/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="ffi"&gt;FFI&lt;/h1&gt;

&lt;p&gt;You can use Racket's Foreign Function Interface to interact with non-Racket libraries to make use of very fast libraries written in (mainly) FORTRAN &amp;amp; C.&lt;/p&gt;

&lt;p&gt;For example &lt;a href="https://github.com/soegaard/sci"&gt;sci&lt;/a&gt; uses FFI for &lt;a href="http://www.netlib.org/blas/"&gt;CBLAS &amp;amp; LAPACK&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id="parallelism"&gt;Parallelism&lt;/h1&gt;

&lt;p&gt;For greater speed up with parallel execution there are &lt;a href="https://docs.racket-lang.org/reference/futures.html"&gt;futures&lt;/a&gt;, &lt;a href="https://docs.racket-lang.org/reference/places.html"&gt;places&lt;/a&gt; and &lt;a href="https://docs.racket-lang.org/distributed-places/index.html"&gt;distributed places&lt;/a&gt; (for distributed programming).&lt;/p&gt;</description></item>
  <item>
   <title>Sage Math on Gentoo</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/03/23/sage-math-on-gentoo/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-03-23-sage-math-on-gentoo</guid>
   <pubDate>Mon, 22 Mar 2021 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.sagemath.org/"&gt;Sage&lt;/a&gt; may be available on your distro but on Gentoo such frivolities for students are not there yet, so I had to install it the manual way.&lt;/p&gt;

&lt;h1 id="user"&gt;User&lt;/h1&gt;

&lt;p&gt;I went to the Sage website, to the &lt;a href="https://www.sagemath.org/download-source.html"&gt;"download-source"&lt;/a&gt; link. The source mirror I picked was &lt;a href="http://www-ftp.lip6.fr/pub/math/sagemath/src/sage-9.2.tar.gz"&gt;France&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ok, so let's follow Sage Math build instructions and get it going&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;www-ftp.lip6.fr/pub/math/sagemath/src/sage-9.2.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;xvf&lt;span class="w"&gt; &lt;/span&gt;sage-9.2.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sage-9.2
./configure
make
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And now, let's wait&amp;hellip;&lt;/p&gt;

&lt;h1 id="portage"&gt;Portage&lt;/h1&gt;

&lt;p&gt;After a long, long, long time waiting I remembered that there existed a &lt;a href="https://github.com/cschwan/sage-on-gentoo"&gt;Gentoo overlay for Sage&lt;/a&gt;. And in the meantime I thought I'd try that solution instead since some good Gentoo people already did most of the effort.&lt;/p&gt;

&lt;p&gt;Just a few files to edit&amp;hellip;&lt;/p&gt;

&lt;p&gt;File: /etc/portage/repos.conf/sage-on-gentoo.conf&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;# -*- conf -*-


[sage-on-gentoo]

auto-sync = yes
location = /var/db/repos/sage-on-gentoo
priority = 999
sync-git-clone-extra-opts = --depth=999999999 --no-shallow-submodules --verbose
sync-git-pull-extra-opts = --verbose
sync-type = git
sync-umask = 022
sync-uri = https://github.com/cschwan/sage-on-gentoo.git
sync-user = root:portage
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;File: /etc/portage/package.accept~keywords~/zz-sage&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;# -*- conf -*-


sci-mathematics/sage                    **

*/*::sage-on-gentoo

dev-python/cvxopt

media-gfx/tachyon

sci-libs/bliss
sci-libs/dsdp
sci-libs/fflas-ffpack
sci-libs/fplll
sci-libs/libhomfly
sci-libs/linbox
sci-libs/m4rie

sci-mathematics/glpk
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;File: /etc/portage/package.use/zz-sage&lt;/p&gt;

&lt;div class="brush: conf"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;# -*- conf -*-


sci-mathematics/sage                    -doc-html -doc-html-bin
sci-mathematics/sage                    -doc-pdf -doc-pdf-bin
sci-mathematics/sage                    -jmol
sci-mathematics/sage                    X bliss meataxe

dev-python/pplpy                        doc

sci-libs/cddlib                         tools
sci-libs/pynac                          -giac

sci-mathematics/eclib                   flint
sci-mathematics/flint                   ntl
sci-mathematics/glpk                    gmp
sci-mathematics/gmp-ecm                 -openmp
sci-mathematics/lcalc                   pari
sci-mathematics/maxima                  ecls
sci-mathematics/pari                    gmp doc
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Now - let's build Sage with Portage!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fosstodon.org/@xgqt/105940287356177246"&gt;&amp;gt;&amp;gt;&amp;gt; Emerging (1 of 100) sci-mathematics/cliquer&amp;ndash;1.21::gentoo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At least I know more or less how long I'm going to wait and know what exactly fails to build, if anything does.&lt;/p&gt;

&lt;h1 id="final"&gt;Final&lt;/h1&gt;

&lt;h2 id="build"&gt;Build&lt;/h2&gt;

&lt;blockquote&gt;
 &lt;p&gt;$ qlop -tv sage&lt;/p&gt;
 &lt;p&gt;&amp;gt; 2021&amp;ndash;03&amp;ndash;23T20:49:12 &amp;gt;&amp;gt;&amp;gt; sci-mathematics/sage&amp;ndash;9999: 55′04″&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2 id="git-stats"&gt;Git stats&lt;/h2&gt;

&lt;h3 id="overlays"&gt;Overlays&lt;/h3&gt;

&lt;p&gt;This info we can easily gather with executing:&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--info
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Gentoo' HEAD: &lt;code&gt;33f2d770c28307b1e9a1199c681e1c543602c6d4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sage-on-Gentoo's HEAD: &lt;code&gt;f7eac5b7e1a844132164b7593dab85cd87918664&lt;/code&gt;&lt;/p&gt;

&lt;h3 id="sage"&gt;Sage&lt;/h3&gt;

&lt;p&gt;Sage repository's HEAD (because we are using the live (9999) ebuild):&lt;/p&gt;

&lt;div class="brush: bash"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/var/cache/distfiles/git3-src/sagemath_sage.git/refs/heads/develop
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Which returns: &lt;code&gt;5cb72aade9b297c10bb0f1ae8529466e5b5eb41d&lt;/code&gt;&lt;/p&gt;</description></item>
  <item>
   <title>MTG alter-art collection</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/01/15/mtg-alter-art-collection/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-01-15-mtg-alter-art-collection</guid>
   <pubDate>Thu, 14 Jan 2021 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="story"&gt;Story&lt;/h1&gt;

&lt;p&gt;In 2013&amp;ndash;2017 I was very interested in Trading card game &amp;ldquo;Magic: the Gathering&amp;rdquo;. I started playing during the release of &lt;a href="https://mtg.fandom.com/wiki/Theros"&gt;Theros&lt;/a&gt; and quit somewhere during &lt;a href="https://mtg.fandom.com/wiki/Shadows_over_Innistrad"&gt;Shadows over Innistrad&lt;/a&gt;. I still keep a small collection of alternative artwork that I have painted on the cards.&lt;/p&gt;

&lt;h1 id="binder"&gt;Binder&lt;/h1&gt;

&lt;p&gt;Those are pages from the binder I store the card in. Also a lone &amp;ldquo;Obsession&amp;rdquo; resource card from The Spoils.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/binder/1.jpg"&gt;Page 1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/binder/1.jpg" alt="Page 1" width="100" /&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/binder/2.jpg"&gt;Page 2&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/binder/2.jpg" alt="Page 1" width="100" /&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/binder/3.jpg"&gt;Page 3&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/binder/3.jpg" alt="Page 1" width="100" /&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="cards"&gt;Cards&lt;/h1&gt;

&lt;p&gt;This list is sorted by the time I created the alter-art. I do this from memory so it&amp;rsquo;s probably not accurate.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/swamp-1.jpg"&gt;Swamp v1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/swamp-1.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;spider over card, the first alter I&amp;rsquo;ve made&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/swamp-2.jpg"&gt;Swamp v2&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/swamp-2.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;re-imagining of  &lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=131005"&gt;Urborg, Tomb of Yawgmoth&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/force-1.jpg"&gt;Force Spike v1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/force-1.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended cape, head explosion&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/lava.jpg"&gt;Lava Axe&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/lava.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by Football game from the Room&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/force-2.jpg"&gt;Force Spike v1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/force-2.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;blood fountain from head&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/forest-1.jpg"&gt;Forest v1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/forest-1.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;rose&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/balustrade.jpg"&gt;Balustrade Spy&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/balustrade.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by Romeo &amp;amp; Juliet&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/duress-1.jpg"&gt;Duress v1&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/duress-1.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by the Passion of Jesus Christ&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/gray.jpg"&gt;Gray Merchant of Asphodel&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/gray.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;re-imagination as Zombie servant&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/sign.jpg"&gt;Sign in Blood&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/sign.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=15193"&gt;Yawgmoth&amp;rsquo;s Bargain&lt;/a&gt;  pastiche&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/unsummon.jpg"&gt;Unsummon&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/unsummon.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended art&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/assassinate.jpg"&gt;Assassinate&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/assassinate.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by  &lt;a href="https://mtg.fandom.com/wiki/Time_Spiral_block"&gt;Time Spiral block&lt;/a&gt; block  style, e.g.  &lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=130702"&gt;Yixlid Jailer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/worst.jpg"&gt;Worst Fears&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/worst.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by  &lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=86"&gt;Terror&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/duress-2.jpg"&gt;Duress v2&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/duress-2.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended art&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/duress-3.jpg"&gt;Duress v3&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/duress-3.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by  &lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=2497"&gt;Brainstorm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/swamp-3.jpg"&gt;Swamp v3&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/swamp-3.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=33"&gt;Mox Jet&lt;/a&gt;  pastiche&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/forest-2.jpg"&gt;Forest v2&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/forest-2.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=32"&gt;Mox Emerald&lt;/a&gt;  pastiche&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/plains.jpg"&gt;Plains&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/plains.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=34"&gt;Mox Pearl&lt;/a&gt;  pastiche&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/negate.jpg"&gt;Negate&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/negate.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended art, melting person&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/consume.jpg"&gt;Consume Spirit&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/consume.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended art&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/merciless.jpg"&gt;Merciless Resolve&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/merciless.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;extended art with sharpie&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="/blog/images/mtg-alt/cards/duress-4.jpg"&gt;Duress v4&lt;/a&gt;  
  &lt;br /&gt;  &lt;img src="/blog/images/mtg-alt/cards/duress-4.jpg" width="100" /&gt;
  &lt;ul&gt;
   &lt;li&gt;inspired by  &lt;a href="https://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=233056"&gt;Gitaxian Probe&lt;/a&gt;,  the last alter I&amp;rsquo;ve made&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Mastodon</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/01/14/mastodon/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-01-14-mastodon</guid>
   <pubDate>Wed, 13 Jan 2021 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="i-has-decentralization"&gt;I has decentralization&lt;/h1&gt;

&lt;p&gt;So, yea, I&amp;rsquo;m on &lt;a href="https://fosstodon.org"&gt;Fosstodon&lt;/a&gt;. &lt;a href="https://fosstodon.org/@xgqt"&gt;https://fosstodon.org/@xgqt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope I don&amp;rsquo;t get banned ;^)&lt;/p&gt;

&lt;p&gt;But in all seriousness, it&amp;rsquo;s been pretty great. My colleagues warned me that there&amp;rsquo;s a lot of SJWs but only one person I spoke with wanted to be addressed &amp;ldquo;differently&amp;rdquo; + didn&amp;rsquo;t express that aggressively, so whatever.&lt;/p&gt;

&lt;p&gt;Se yall on mastodon ;D&lt;/p&gt;</description></item>
  <item>
   <title>How to read this blog</title>
   <link>https://xgqt.gitlab.io/blog/posts/2021/01/02/how-to-read-this-blog/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2021-01-02-how-to-read-this-blog</guid>
   <pubDate>Fri, 01 Jan 2021 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="git"&gt;Git&lt;/h1&gt;

&lt;p&gt;Because contents of this blog are stored in a git repository you can just&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;https://gitlab.com/xgqt/blog
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;then, read the "raw" ORG files in 'posts' directory or make the HTML version executing the 'dev.sh' script (remember that you will need GNU Emacs to render the posts into HTML files).&lt;/p&gt;

&lt;p&gt;Then, you can just git pull to read the news whenever you wish, maybe do it with cron or a script that will pull many repos at once, for example with &lt;a href="https://gitlab.com/xgqt/mydot/-/blob/master/scripts/.local/share/bin/git-mass"&gt;this script&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id="rss"&gt;RSS&lt;/h1&gt;

&lt;p&gt;Org-Static-Blog creates a RSS Feed file &lt;code&gt;rss.xml&lt;/code&gt;, so to subscribe add the link &lt;a href="https://xgqt.gitlab.io/blog/rss.xml"&gt;https://xgqt.gitlab.io/blog/rss.xml&lt;/a&gt; to your favorite RSS reader.&lt;/p&gt;

&lt;p&gt;You can also subscribe to the &lt;a href="https://gitlab.com/xgqt/blog/commits/master.atom"&gt;GitLab repository Atom&lt;/a&gt; feed.&lt;/p&gt;</description></item>
  <item>
   <title>EmojiD</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/12/21/emojid/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-12-21-emojid</guid>
   <pubDate>Sun, 20 Dec 2020 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="short-story-long"&gt;Short story long&lt;/h1&gt;

&lt;p&gt;We were discussing some vulnerabilities on the src~prepare~ group's [matrix] channel and when we're talking about systemd errors. I just felt like opening their GitHub and browsing the code. I was just reading the comments&amp;hellip; and I saw &lt;a href="https://github.com/systemd/systemd/commit/a8b627aaed409a15260c25988970c795bf963812#diff-03b3e8b6554bb8ccd539ad2e547d9ef13f80428101bdc01b4d6e9ea5f685fe7cR1204"&gt;a comment about kernel APIs&lt;/a&gt; and there a emoji. My feeling is probably best expressed my common &lt;a href="https://www.urbandictionary.com/define.php?term=kek"&gt;"KEK"&lt;/a&gt;. I chuckled. The "Abstract" in &lt;a href="https://gitlab.com/xgqt/emojid/-/tree/0.0.1#abstract"&gt;0.0.1&lt;/a&gt; is the original idea I typed on [matrix]. The funniest part of this "development" for me is probably that Emacs on my system doesn't display properly ANY of the emojis in emojid. I had to go back and forth between the source and log files opened in FF (because it renders the emojis properly), &lt;a href="https://emojipedia.org/"&gt;emojipedia&lt;/a&gt; and "broken" Emacs.&lt;/p&gt;

&lt;h1 id="001---------"&gt;0.0.1 "😃 ️ 🌍 🍞 🚗 📞 🎉 ♥️ 🏁"&lt;/h1&gt;

&lt;p&gt;What you do is clone the repository, execute &lt;code&gt;make&lt;/code&gt; and run the binary. Read your log and see if your system is "affected" :P.&lt;/p&gt;

&lt;h1 id=""&gt;👋&lt;/h1&gt;

&lt;p&gt;And remember emoticons made of the symbols found on the keyboard will always look better ;)&lt;/p&gt;</description></item>
  <item>
   <title>2020 recap</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/12/18/2020-recap/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-12-18-2020-recap</guid>
   <pubDate>Thu, 17 Dec 2020 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="recap"&gt;Recap&lt;/h1&gt;

&lt;p&gt;What I did this year:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;began studying at &lt;a href="https://wsiz.edu.pl/"&gt;WSIiZ&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;drank a lot of alcohol with friends&lt;/li&gt;
 &lt;li&gt;installed NetBSD ;)&lt;/li&gt;
 &lt;li&gt;learned Nginx and Ansible&lt;/li&gt;
 &lt;li&gt;recruited new people to &lt;a href="https://src_prepare.gitlab.io/"&gt;the src_prepare group&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;struck a nerve with some commies&lt;/li&gt;
 &lt;li&gt;took maintainership of  &lt;a href="https://packages.gentoo.org/packages/net-misc/gallery-dl"&gt;gallery-dl&lt;/a&gt;  and  &lt;a href="https://packages.gentoo.org/packages/games-emulation/ppsspp"&gt;PPSSPP&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;tweaked my configs&lt;/li&gt;
 &lt;li&gt;went back to KDE and Firefox (missed them)&lt;/li&gt;
 &lt;li&gt;worked with Zigbee (probably not doing that again)&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="wishes"&gt;Wishes&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xt--Hh7S0I8"&gt;What do you wish in new year?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wish you all merry Christmas and happy new year. Less bugs, more resolved issues, no wontfixes, better compatibility. Faster compilation, less failures. And of course no lawsuits, no copyright infringements and better government.&lt;/p&gt;</description></item>
  <item>
   <title>Portage system replication</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/11/14/portage-system-replication/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-11-14-portage-system-replication</guid>
   <pubDate>Fri, 13 Nov 2020 23:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;

&lt;p&gt;Backing up using this method takes a lot less space - ~60MB (without distfiles) and can be restored on almost any system (running portage) and tweaked afterwards for, say, CPU architecture. I've created a a short script with similar method in &lt;a href="https://gitlab.com/xgqt/mydot/-/blob/master/scripts/.local/share/bin/bak-portage"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id="what-we-need"&gt;What we need&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;ebuild repositories are installed with git&lt;/li&gt;
 &lt;li&gt;distfiles (those might be gone when we want to replicate)&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="backup"&gt;Backup&lt;/h1&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# System info&lt;/span&gt;
emerge&lt;span class="w"&gt; &lt;/span&gt;--info&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;info.txt

&lt;span class="c1"&gt;# Portage tree&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;-Lr&lt;span class="w"&gt; &lt;/span&gt;/etc/portage&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# Portage layout&lt;/span&gt;
tree&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/portage&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;layout.txt

&lt;span class="c1"&gt;# Packages in @world&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;/var/lib/portage/world&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# Installed sets&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;/var/lib/portage/world_sets&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# Installed packages (with versions)&lt;/span&gt;
qlist&lt;span class="w"&gt; &lt;/span&gt;--installed&lt;span class="w"&gt; &lt;/span&gt;--nocolor&lt;span class="w"&gt; &lt;/span&gt;--umap&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;qlist-use.txt
qlist&lt;span class="w"&gt; &lt;/span&gt;--installed&lt;span class="w"&gt; &lt;/span&gt;--nocolor&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;qlist-ver.txt

&lt;span class="c1"&gt;# Distfiles&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;-rv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;portageq&lt;span class="w"&gt; &lt;/span&gt;envvar&lt;span class="w"&gt; &lt;/span&gt;DISTDIR&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;distfiles

&lt;span class="c1"&gt;# Ebuild database&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/var/db/pkg&lt;span class="w"&gt; &lt;/span&gt;pkgdb
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;h1 id="restoration"&gt;Restoration&lt;/h1&gt;

&lt;p&gt;To faithfully restore the system perform those actions as root&lt;/p&gt;

&lt;div class="brush: shell"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Copy the portage tree to /etc&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-dr&lt;span class="w"&gt; &lt;/span&gt;/etc/portage
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;portage&lt;span class="w"&gt; &lt;/span&gt;/etc/portage

&lt;span class="c1"&gt;# Checkout the gentoo repo to a commit specified in info.txt&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;portageq&lt;span class="w"&gt; &lt;/span&gt;get_repo_path&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;gentoo&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;checkout&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# &amp;lt;commit ID&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Copy distfiles&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;distfiles/*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;portageq&lt;span class="w"&gt; &lt;/span&gt;envvar&lt;span class="w"&gt; &lt;/span&gt;DISTDIR&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/

&lt;span class="c1"&gt;# Fake-install @world and sets&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;world&lt;span class="w"&gt; &lt;/span&gt;/var/lib/portage/world
cp&lt;span class="w"&gt; &lt;/span&gt;world_sets&lt;span class="w"&gt; &lt;/span&gt;/var/lib/portage/world_sets

&lt;span class="c1"&gt;# Emerge the exact packages from qlist-ver.txt&lt;/span&gt;
emerge&lt;span class="w"&gt; &lt;/span&gt;--keep-going&lt;span class="o"&gt;=&lt;/span&gt;y&lt;span class="w"&gt; &lt;/span&gt;-1Oav&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/^/=/&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qlist-ver.txt&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;</description></item>
  <item>
   <title>Old Access Point</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/09/02/old-access-point/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-09-02-old-access-point</guid>
   <pubDate>Tue, 01 Sep 2020 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;

&lt;p&gt;On some old routers, namely TP-Link's TL-WR840N version 2, there may not be a option to switch to access point mode. This is what you have to do to access that mode indirectly.&lt;/p&gt;

&lt;h1 id="steps"&gt;Steps&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;Power off the router&lt;/li&gt;
 &lt;li&gt;Unplug RJ cable from the WAN port&lt;/li&gt;
 &lt;li&gt;Connect the router to a PC (using one of the LAN ports)&lt;/li&gt;
 &lt;li&gt;Power on the router&lt;/li&gt;
 &lt;li&gt;Log it to the web console entering your router's IP, you can find  out the IP by executing &lt;code&gt;ip --color a&lt;/code&gt; (on a Linux box)  if the router's DHCP server is still active&lt;/li&gt;
 &lt;li&gt;In LAN settings give your router a static client IP that fits into a  network you want to connect it to; example: 192.168.100.100/24 (make  sure no other hosts are associated with that IP in the target  network)&lt;/li&gt;
 &lt;li&gt;Restart the router&lt;/li&gt;
 &lt;li&gt;Log in to the web console entering the IP you have set&lt;/li&gt;
 &lt;li&gt;Turn off the DHCP server (DHCP -&amp;gt; DHCP Settings -&amp;gt; DHCP Server:  Disable &amp;amp; Save)&lt;/li&gt;
 &lt;li&gt;Power off the router&lt;/li&gt;
 &lt;li&gt;Plug the cable from a network you want the router connected to to  one of the LAN ports&lt;/li&gt;
 &lt;li&gt;Power on the router&lt;/li&gt;
 &lt;li&gt;Log in to the web console entering the IP you have set&lt;/li&gt;
 &lt;li&gt;Turn on the wireless network and set it up (SSID, password, etc.)&lt;/li&gt;
 &lt;li&gt;Done! :D&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="sources"&gt;Sources&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://www.tp-link.com/in/support/download/tl-wr840n/v2/"&gt;https://www.tp-link.com/in/support/download/tl-wr840n/v2/&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Cg_gGECGLiY"&gt;https://www.youtube.com/watch?v=Cg_gGECGLiY&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Internet EU</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/07/05/internet-eu/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-07-05-internet-eu</guid>
   <pubDate>Sat, 04 Jul 2020 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;ul&gt;
 &lt;li&gt;I think this is quite important and wanted to share it.&lt;/li&gt;
 &lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=WdwegN7u6x8"&gt;https://www.youtube.com/watch?v=WdwegN7u6x8&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;Invidio link: &lt;a href="https://invidio.us/watch?v=WdwegN7u6x8"&gt;https://invidio.us/watch?v=WdwegN7u6x8&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="polish-original"&gt;Polish original&lt;/h1&gt;

&lt;blockquote&gt;
 &lt;p&gt;Internet stał się tym czym jest, stał się takim światem w miniaturze dzięki dobrowolnemu zaangażowaniu zwykłych ludzi, dzięki brakowi regulacji. I to was boli, bo rozwój internatu jest przykładem tego, jak mógłby się rozwijać nasz świat, gdyby nie te wszystkie wasze regulacje, gdyby nie ten ciężki plecak przepisów i podatków który każdy z nas musi na co dzień dźwigać. Internet to jest po prostu ostatni bastion wolności i to wam nie daje spać, bo to jest dowód na to, że wszystkie wasze regulacje i te rozporządzenia, dyrektywy, są tak naprawdę zbędne i szkodliwe i świat bez tego rozwijałby się lepiej, rozwijałby się dokładnie tak jak Internet, że gdyby nie te wasze właśnie ambitne plany, wartości dodane, efekty dźwigni, wysyłanie silnych sygnałów, to wszystko, żyłoby się nam po prostu lepiej i prościej. Dlatego próbujecie to zniszczyć, dlatego próbujecie wsadzić stopę w drzwi za każdym razem kiedy pojawia się okazja. Ale my nie chcemy waszej nogi w tych drzwiach. Teraz cofacie się o parę centymetrów, bo ludzie protestują, ale my nie chcemy was tam w ogóle, nie chcemy waszych regulacji, nie chcemy waszych łap w Internacie. To działa dobrze, twórczość rozwija się w Internecie bez żadnych waszych regulacji.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h1 id="english-translation"&gt;English translation&lt;/h1&gt;

&lt;blockquote&gt;
 &lt;p&gt;Interent has become what it is, it has become a miniature world due to the voluntary involvement of ordinary people, thanks to the lack of regulation. And this hurts you, because the development of the Intenet is an example of how our world could develop, without all your regulations, without this heavy backpack of regulations and taxes that each of us must carry on a daily basis. The internet is simply the last bastion of freedom and this is the thing that doesn't let you sleep, because it is proof that all your regulations and those ordinances, directives, they are really unnecessary and harmful and the world would develop better without it, it would develop exactly like the Internet, that if it weren't for your ambitious plans, added values, leverage effects, sending strong signals, then everyone would have lived just better and simpler. That's why you try to destroy it, that's why you try to stick your foot in the door whenever there is an opportunity. But we don't want your leg in our door. Now you are retreating a few centimeters because people are protesting, but we don't want you there at all, we don't want your regulations, we don&amp;rsquo;t want your hands in the Internet. It works well, creativity develops on the Internet without any of your regulations.&lt;/p&gt;&lt;/blockquote&gt;</description></item>
  <item>
   <title>waterfox</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/05/25/waterfox/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-05-25-waterfox</guid>
   <pubDate>Sun, 24 May 2020 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="time-in-firefox"&gt;Time in Firefox&lt;/h1&gt;

&lt;p&gt;I love Firefox, it's reasonably secure, private, customizable, and most importantly it's different. In the world of Google's reign this is a big plus. You can be sure that the one spying on you will be at most Mozilla "anonymous data collection" ;P Recently with upgrade to version 68.8.0 I have experienced weird image artifacts: some favicons on tabs were replaced with white squares and random images would have artifacts on them. The whole YouTube website had pink &amp;amp; green distorted thumbnails. I have experienced this behavior on my T440 Thinkpad (Intel GPU) laptop and my desktop with Nvidia. I had posted this under a bug report of another user who experienced weird behavior on some websites with the 68.8.0 version of Firefox &lt;a href="https://bugs.gentoo.org/725266"&gt;here&lt;/a&gt;. With update to 76.0.1 I was logged off from all the websites and my stylus themes got deleted (luckily i had a backup). The 76.0.1 searchabr is absolutely hideous, it feels like something made for a Windows tablet. The artifacts still remained on 76.0.1. So i decided to give Waterfox a shot.&lt;/p&gt;

&lt;h1 id="experience-part-0"&gt;Experience part 0&lt;/h1&gt;

&lt;p&gt;Lest talk about pre-experience; keep in mind that this is really not a good comparison. Waterfox in not available in the main gentoo repository, but using "eix -R Waterfox" I was able to find it in the poly-c overlay (overlays are similar to AUR in Arch). The only hiccup i had during compilation was to be expected. There is a problem with the "-fno-common" flag being turned on by default in GCC 10, so for some builds you have to turn "-fcommon" on. Other than that the compilation went smoothly, it took 37 minutes 43 seconds on first run which is ridiculous compared to Firefox which takes approximately 1 hour on my 4-core development machine.&lt;/p&gt;

&lt;h1 id="spyware"&gt;Spyware?&lt;/h1&gt;

&lt;p&gt;I only want you to think of Chrome or Chromium - they are produced by the biggest advertising company in the world. So yes, Waterfox seems like a lesser evil, but you can always dive in &amp;lt;about:config&amp;gt; and block any or all malicious connections with /etc/hosts and packet filters (yes i know this is not ideal). Lets confront some statements on spyware watchdog&lt;/p&gt;

&lt;h2 id="waterfox-connects-to-spyware-services-when-it-is-first-run"&gt;Waterfox connects to spyware services when it is first run&lt;/h2&gt;

&lt;p&gt;Same as Firefox. It may not do that if you import your own profile (haven't tested that though).&lt;/p&gt;

&lt;h2 id="waterfox-has-a-communication-problem"&gt;Waterfox has a communication problem&lt;/h2&gt;

&lt;p&gt;I wanted to read the "policy" - link doesn't work - &lt;a href="https://www.waterfox.net/en-US/privacy/waterfox/"&gt;https://www.waterfox.net/en-US/privacy/waterfox/&lt;/a&gt; Contents of the linked webpage:&lt;/p&gt;

&lt;div class="brush: html"&gt;
 &lt;div class="source"&gt;
  &lt;table class="sourcetable"&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;td class="linenos"&gt;
      &lt;div class="linenodiv"&gt;
       &lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
     &lt;td class="code"&gt;
      &lt;div&gt;
       &lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;updates&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;updates&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Cool.&lt;/p&gt;

&lt;h2 id="waterfox-phones-home-with-information-about-your-computer-whenever-you-start-it-up"&gt;Waterfox "phones home" with information about your computer whenever you start it up&lt;/h2&gt;

&lt;p&gt;Quoting: "According to its privacy policy, Waterfox collects the following information by default:" "by default" is a important wording here.&lt;/p&gt;

&lt;h2 id="waterfox-offers-spyware-search-engines-to-its-users-and-uses-bing-as-its-default-search-engine"&gt;Waterfox offers spyware search engines to its users and uses Bing as its default search engine&lt;/h2&gt;

&lt;p&gt;That is literally the first change I do on my browsers.&lt;/p&gt;

&lt;h2 id="waterfox-sends-all-website-notifications-through-mozillas-servers"&gt;Waterfox sends all website notifications through Mozilla's servers&lt;/h2&gt;

&lt;p&gt;So does Firefox&amp;hellip;&lt;/p&gt;

&lt;h2 id="waterfox-is-integrated-into-the-firefox-accounts-spyware-platform"&gt;Waterfox is integrated into the "Firefox Accounts" spyware platform&lt;/h2&gt;

&lt;p&gt;You don't have to use it. With Waterfox I stopped to.&lt;/p&gt;

&lt;h2 id="waterfox-is-self-updating-software"&gt;Waterfox is self updating software&lt;/h2&gt;

&lt;p&gt;It is not as much as Discord is. Discord as a example will refuse to connect to the server if its version is too low. You can still run outdated Waterfox if you wish to. Also those updates will be disabled if you use the ebuilds. This is mostly used only on Windows&amp;hellip; and if you use your Windows you probably know what you signed up for.&lt;/p&gt;

&lt;h2 id="so-what"&gt;So what?&lt;/h2&gt;

&lt;p&gt;I do not question the legitimacy of Spyware Watchdog's statements. I just compare them with my own habits and thoughts. For me Waterfox == Firefox spyware level. Keep in mind that Firefox introduced more questionable integrated services in new releases.&lt;/p&gt;

&lt;h1 id="small-things-that-make-me-happy"&gt;Small things that make me happy&lt;/h1&gt;

&lt;p&gt;I was very impressed to find some cool features in Waterfox:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;it's menu is compatible "global menu" on KDE Plasma - i was very  surprised by this; this thing is mostly sound on chromium-based  applications (the damned electron) and QT applications&lt;/li&gt;
 &lt;li&gt;better theming - Waterfox uses the old Firefox theme by default with  "smooth" tabs&lt;/li&gt;
 &lt;li&gt;most addons just work - uBlock Origin, Decentraleyes, Plasma  Integration, Smart HTTPS, SpanTree - GitLab Tree and Stylus work  fine&lt;/li&gt;
 &lt;li&gt;it's Firefox as you knew it; I missed the good old Firefox ;)&lt;/li&gt;
 &lt;li&gt;back-ported security settings - container tabs work!&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="is-this-worth-it"&gt;Is this worth it?&lt;/h1&gt;

&lt;p&gt;Absolutely. In my opinion Waterfox is a great browser that I can live in. Maybe consider giving Waterfox a shot if you are not as much into security as Spyware Watchdog people are and want reasonable compromise.&lt;/p&gt;

&lt;h1 id="sources"&gt;Sources&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://www.mozilla.org/en-US/firefox/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://www.waterfox.net/"&gt;Waterfox&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/gentoo-mirror/poly-c"&gt;Poly-C's overlay&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://spyware.neocities.org/articles/waterfox.html"&gt;Spyware Watchdog on  Waterfox&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=FWxp7-9yn88"&gt;Quidsup on Waterfox&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>systemd</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/05/23/systemd/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-05-23-systemd</guid>
   <pubDate>Fri, 22 May 2020 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="init-basic-functions"&gt;Init basic functions&lt;/h1&gt;

&lt;p&gt;Init should:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;be the first started process - PID 1&lt;/li&gt;
 &lt;li&gt;continue running until the system is shut down&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="why-systemd-is-more-than-init"&gt;Why systemd is more than init&lt;/h1&gt;

&lt;h2 id="full-system-management"&gt;Full system management&lt;/h2&gt;

&lt;p&gt;systemd needs to run as PID 1 to parenthood other services and&amp;hellip; other parts of itself (listed below).&lt;/p&gt;

&lt;h2 id="systemd-absorbed"&gt;systemd absorbed&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;cron -&amp;gt; timers&lt;/li&gt;
 &lt;li&gt;seat tracker -&amp;gt; systemd-logind&lt;/li&gt;
 &lt;li&gt;service manager -&amp;gt; systemd-systemctl&lt;/li&gt;
 &lt;li&gt;udev -&amp;gt; systemd-udevd&lt;/li&gt;
 &lt;li&gt;system logger -&amp;gt; systemd-journald&lt;/li&gt;
 &lt;li&gt;network manager -&amp;gt; systemd-networkd&lt;/li&gt;
 &lt;li&gt;bootloader -&amp;gt; systemd-boot&lt;/li&gt;
 &lt;li&gt;hostname -&amp;gt; systemd-hostnamed&lt;/li&gt;
 &lt;li&gt;chroot -&amp;gt; systemd-nspawn&lt;/li&gt;
 &lt;li&gt;resolv.conf generator -&amp;gt; systemd-resolved&lt;/li&gt;&lt;/ul&gt;

&lt;h2 id="additionally-systemd-is-also"&gt;Additionally systemd is also&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;QR code generator&lt;/li&gt;
 &lt;li&gt;http server (cockpit)&lt;/li&gt;
 &lt;li&gt;home manager -&amp;gt; systemd-homed&lt;/li&gt;
 &lt;li&gt;tmp manager -&amp;gt; systemd-tmpfiles&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="why-its-bad"&gt;Why it's bad&lt;/h1&gt;

&lt;p&gt;systemd growth to cover more and more of other services capabilities is dangerous. It can mean that if we find a exploit in one part of systemd it will be easy to compromise the whole system. Actually, there is a even bigger problem - most of the time a user would like to run a standalone service covering one of the uses already covered by systemd - like cronie or rsyslog.&lt;/p&gt;

&lt;h1 id="but-what-about-cgroups"&gt;But what about cgroups&lt;/h1&gt;

&lt;p&gt;Cgroups are nothing new, they are available in other service managers too. &lt;a href="https://wiki.gentoo.org/wiki/OpenRC/CGroups"&gt;Check out cgroups in OpenRC.&lt;/a&gt;&lt;/p&gt;

&lt;h1 id="alternatives"&gt;Alternatives&lt;/h1&gt;

&lt;h2 id="openrc"&gt;OpenRC&lt;/h2&gt;

&lt;p&gt;Primarily used by Gentoo based systems. Was adopted to Devuan and Artix. Alpine Linux uses it probably because it started out as a Gentoo-based system. Is also available in Debian - though that will still use some systemd services, notably systemd-udevd.&lt;/p&gt;

&lt;h2 id="runit"&gt;Runit&lt;/h2&gt;

&lt;p&gt;Available in Void Linux - the recommended init for that system.&lt;/p&gt;

&lt;h2 id="pure-system-v-init"&gt;Pure System V init&lt;/h2&gt;

&lt;p&gt;Most popular use of this is found in old CentOS, Slackware, Antix and MX Linux.&lt;/p&gt;

&lt;h2 id="s6"&gt;S6&lt;/h2&gt;

&lt;p&gt;Check out Devuan if you want to dive into this topic.&lt;/p&gt;

&lt;h1 id="systemd--emacs"&gt;systemd + Emacs&lt;/h1&gt;

&lt;p&gt;One could think that because systemd and Emacs cover a lot of things - systemd - system management and emacs - user utilities - a fusion of two would be very good and will lack so-called bloat. There is one "problem" however - Emacs can be used also as a init! And that doesn't necessarily mean a lot more code being added. So i guess Emacs + Linux (kernel) is the way to go ;P&lt;/p&gt;

&lt;h1 id="was-systemd-a-inside-job"&gt;Was systemd a inside job?&lt;/h1&gt;

&lt;p&gt;Probably not - Microsoft made their own init for Azure because&amp;hellip; systemd was to big&amp;hellip; systemd is a history of what happens when everybody wants to be like the rest - &lt;a href="https://en.wikipedia.org/wiki/Systemd#Adoption"&gt;adoption of systemd&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id="is-systemd-the-new-busybox"&gt;Is systemd the new busybox?&lt;/h1&gt;

&lt;p&gt;This is an interesting concept. There is one bad thing however - you can compile bysybox with any of its utilities and it will work - you can't do that with systemd, you will have to modify and fork it - like &lt;a href="https://wiki.gentoo.org/wiki/Eudev"&gt;eudev&lt;/a&gt; and &lt;a href="https://wiki.gentoo.org/wiki/Elogind"&gt;elogind&lt;/a&gt; projects&lt;/p&gt;

&lt;h1 id="openrc-prejudice"&gt;OpenRC prejudice&lt;/h1&gt;

&lt;p&gt;Many people think of OpenRC as a old SysVinit. I encourage you to check it out and see that most stuff you probably do with systemd you can get from OpenRC (service manager) + cronie (cron/timers) + htop/pstree (full description of system as opposed to "systemctl status")&lt;/p&gt;

&lt;h2 id="basic-openrc-vs-systemd-commands"&gt;Basic OpenRC vs systemd commands&lt;/h2&gt;

&lt;p&gt;OpenRC systemd  &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash; &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;  rc-status -a systemctl status  rc-service SERVICE start systemctl start SERVICE  rc-service SERVICE stop systemctl stop SERVICE  rc-update add SERVICE systemctl enable SERVICE  rc-update del SERVICE systemctl disable SERVICE&lt;/p&gt;

&lt;h1 id="sources"&gt;Sources&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://ewontfix.com/14/"&gt;Ewontfix&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Init"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://github.com/a-schaefers/systemE"&gt;SystemE - Emacs as init&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h1 id="honorable-mentions"&gt;Honorable Mentions&lt;/h1&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://forums.gentoo.org/viewtopic-t-1105854.html"&gt;https://forums.gentoo.org/viewtopic-t-1105854.html&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://unixsheikh.com/articles/the-real-motivation-behind-systemd.html"&gt;https://unixsheikh.com/articles/the-real-motivation-behind-systemd.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description></item>
  <item>
   <title>Test</title>
   <link>https://xgqt.gitlab.io/blog/posts/2020/05/18/test/?utm_source=all&amp;utm_medium=RSS</link>
   <guid isPermaLink="false">urn:https-xgqt-gitlab-io:-blog-posts-2020-05-18-test</guid>
   <pubDate>Sun, 17 May 2020 22:00:00 UT</pubDate>
   <author>Maciej Barć</author>
   <description>
&lt;h1 id="test"&gt;Test&lt;/h1&gt;

&lt;p&gt;It is by will alone I set my mind in motion.&lt;/p&gt;</description></item></channel></rss>