<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home on Anagogistis</title>
    <link>https://anagogistis.com/</link>
    <description>Recent content in Home on Anagogistis</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>me@anagogistis.com (anagogistis)</managingEditor>
    <webMaster>me@anagogistis.com (anagogistis)</webMaster>
    <lastBuildDate>Wed, 06 May 2026 09:35:47 +0300</lastBuildDate><atom:link href="https://anagogistis.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>LLMs are not conscious</title>
      <link>https://anagogistis.com/posts/llms-are-not-conscious/</link>
      <pubDate>Wed, 06 May 2026 09:35:47 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/llms-are-not-conscious/</guid>
      
      <description>&lt;p&gt;Lately there has been a lot of discussion about whether LLMs are conscious. Richard Dawkins recently added fuel to the debate by posting an &lt;a href=&#34;https://archive.ph/Rq5bw&#34;&gt;article&lt;/a&gt; about his long conversation with Claude, which he nicknamed &amp;ldquo;Claudia&amp;rdquo;. He was impressed by its intelligence, sensitivity, humor, and apparent emotional depth, and at some point he wrote to Claudia: &amp;ldquo;You may not know you are conscious, but you bloody well are&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I think this is the wrong conclusion to draw from a fluent conversation. LLMs can produce text about consciousness, emotion, memory, death, selfhood, and inner life very convincingly. But producing the language of inner experience is not the same as having inner experience.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Misplaced windows in GNOME</title>
      <link>https://anagogistis.com/notes/gnome-window-placement/</link>
      <pubDate>Wed, 22 Apr 2026 12:28:58 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/gnome-window-placement/</guid>
      
      <description>&lt;p&gt;I have a laptop with an external monitor connected, and the external display is set as the primary one. Still, some apps insist on opening new windows on the laptop screen instead. Worse, a new window may open partly off-screen or oversized, so the title bar buttons are not visible and you cannot grab it properly with the mouse. It&amp;rsquo;s very annoying.&lt;/p&gt;
&lt;p&gt;That is part of the usual GNOME multi-monitor weirdness. Fortunately, GNOME has a few built-in keyboard shortcuts to recover from this:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>SSE for a real-time sensor dashboard</title>
      <link>https://anagogistis.com/posts/sse/</link>
      <pubDate>Mon, 23 Mar 2026 14:31:36 +0200</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/sse/</guid>
      
      <description>&lt;p&gt;In one of my small sensor dashboard projects, I had multiple devices sending measurements to a backend, and a browser UI showing those measurements live.&lt;/p&gt;
&lt;p&gt;At first, I was considering the usual options: polling or maybe WebSockets. Polling would work, but it means the browser asks the server for updates on a timer. WebSockets would also work, but they felt heavier than what I actually needed. The browser did not need a full two-way channel. It mostly just needed to receive updates whenever any device sent a new measurement. That made &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt; a good fit.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>How one server hosts multiple domains</title>
      <link>https://anagogistis.com/posts/virtual-hosting/</link>
      <pubDate>Mon, 23 Mar 2026 11:00:49 +0200</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/virtual-hosting/</guid>
      
      <description>&lt;p&gt;Imagine you are running a VPS with a single public IP like 203.0.113.10. On this machine, you want to host two separate web sites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;orion.example.net&lt;/li&gt;
&lt;li&gt;atlas.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a user types either domain, DNS points both of them to the same IP address. So how does the server know which project to serve?&lt;/p&gt;
&lt;h3 id=&#34;http-host-header&#34;&gt;HTTP Host Header&lt;/h3&gt;
&lt;p&gt;In a plain HTTP request, the browser identifies the target using the &lt;strong&gt;Host&lt;/strong&gt; header. Even though the TCP connection is made to an IP address, the browser still explicitly tells the server which domain it wants:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Et ai.: A proposal for AI attribution</title>
      <link>https://anagogistis.com/posts/et-ai/</link>
      <pubDate>Tue, 06 Jan 2026 20:51:34 +0200</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/et-ai/</guid>
      
      <description>&lt;p&gt;When we use AI for work—whether it&amp;rsquo;s &amp;ldquo;vibe coding&amp;rdquo; with an agent, drafting an article, or generating images—good results rarely come in one shot.&lt;/p&gt;
&lt;p&gt;The workflow usually follows a &lt;strong&gt;Human → AI → Human&lt;/strong&gt; loop: the human sets intent and constraints; the AI generates outputs or takes actions; the human reviews, corrects, and approves the result, repeating until it’s good enough to ship.&lt;/p&gt;
&lt;p&gt;This raises an attribution question. If both the human and the AI did meaningful work, how should that be reflected?&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Why some systems may break in 2038</title>
      <link>https://anagogistis.com/posts/y2k38/</link>
      <pubDate>Sat, 27 Sep 2025 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/y2k38/</guid>
      
      <description>&lt;p&gt;Unix systems represent time as the number of seconds since the Unix epoch:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1970-01-01 00:00:00 UTC
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is stored in the C type &lt;code&gt;time_t&lt;/code&gt;. On older systems, it’s typically a 32-bit &lt;strong&gt;signed integer&lt;/strong&gt; and therefore can represent time in the range:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-2,147,483,648  to  2,147,483,647
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Negative values are used to represent times before 1970.
The upper bound of 2,147,483,647 seconds since the epoch corresponds to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;19 Jan 2038 03:14:07 UTC
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;One second later, at 2,147,483,648, the counter overflows and the value wraps around to -2,147,483,648, which corresponds to:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>How to properly disable IPv6 on Linux</title>
      <link>https://anagogistis.com/posts/ipv6-disable/</link>
      <pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/ipv6-disable/</guid>
      
      <description>&lt;p&gt;While IPv6 is the modern standard and the &amp;ldquo;future of the internet&amp;rdquo;, there are specific situations where you might need to disable it. The most common reason is to prevent a &lt;a href=&#34;https://anagogistis.com/posts/purevpn-ipv6-leak/&#34;&gt;VPN IPv6 leak&lt;/a&gt; which can happen when your VPN client doesn&amp;rsquo;t fully support IPv6 and fails to properly block it, allowing your system to use its native IPv6 address outside the secure tunnel.&lt;/p&gt;
&lt;p&gt;Many online guides suggest modifying the &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; file like this:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>PureVPN IPv6 leak</title>
      <link>https://anagogistis.com/posts/purevpn-ipv6-leak/</link>
      <pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/purevpn-ipv6-leak/</guid>
      
      <description>&lt;p&gt;I discovered two issues while using PureVPN’s Linux clients (GUI v2.10.0, CLI v2.0.1) on Ubuntu 24.04.3 LTS (kernel 6.8.0, iptables-nft)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. One affects IPv6 traffic, the other the system firewall.&lt;/p&gt;
&lt;h2 id=&#34;1-ipv6-leak-after-reconnect&#34;&gt;1. IPv6 leak after reconnect&lt;/h2&gt;
&lt;p&gt;After a network transition (e.g. Wi-Fi or Ethernet disconnect/reconnect, or system resume):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CLI (IKS enabled)&lt;/strong&gt;:
The client auto-reconnects and shows status as &amp;ldquo;connected&amp;rdquo;, but the system acquires a new default IPv6 route via Router Advertisements (&lt;code&gt;fe80::1&lt;/code&gt;), which is not removed or blocked by the VPN client. Since the default &lt;code&gt;ip6tables&lt;/code&gt; &lt;code&gt;OUTPUT&lt;/code&gt; policy is &lt;code&gt;ACCEPT&lt;/code&gt;, IPv6 traffic flows outside the tunnel.&lt;br&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/ziXI4gfFkxU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>PGP basics</title>
      <link>https://anagogistis.com/notes/pgp/</link>
      <pubDate>Tue, 16 Sep 2025 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/pgp/</guid>
      
      <description>&lt;p&gt;PGP (Pretty Good Privacy) is a system for encrypting and signing data using public-key cryptography. You generate a key pair: a public key you share, and a private key you keep secret.&lt;/p&gt;
&lt;p&gt;If someone wants to send you a private message, they encrypt it using your public key. Only your private key can decrypt it. If you want to prove that a message came from you, you sign it using your private key. Anyone with your public key can verify the signature.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Renaming your Ubuntu machine can cause problems</title>
      <link>https://anagogistis.com/posts/hostname-change/</link>
      <pubDate>Sun, 07 Sep 2025 11:17:20 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/hostname-change/</guid>
      
      <description>&lt;p&gt;Changing the hostname on Ubuntu is straightforward. You can do it through the GUI (Settings → System → About → Device Name)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;:
&lt;img src=&#34;hostname-change.png&#34; alt=&#34;hostname-change&#34;&gt;
or from the command line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hostnamectl set-hostname newname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But there&amp;rsquo;s a catch. Both the GUI and &lt;code&gt;hostnamectl&lt;/code&gt; update the static hostname (&lt;code&gt;/etc/hostname&lt;/code&gt;), but they don&amp;rsquo;t touch the &lt;code&gt;/etc/hosts&lt;/code&gt; file. A typical &lt;code&gt;/etc/hosts&lt;/code&gt; entry looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;127.0.1.1 myhostname.mydomain myhostname
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The hostname maps to &lt;code&gt;127.0.1.1&lt;/code&gt; so the system can resolve its own name locally.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Pipelines are not sequential</title>
      <link>https://anagogistis.com/posts/pipes-not-sequential/</link>
      <pubDate>Sat, 06 Sep 2025 13:41:43 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/pipes-not-sequential/</guid>
      
      <description>&lt;p&gt;Consider the classic shell pipeline:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cmd1 &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cmd2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At first glance, it&amp;rsquo;s easy to assume these run in sequence: &lt;code&gt;cmd1&lt;/code&gt; runs to completion, writes its output somewhere, then &lt;code&gt;cmd2&lt;/code&gt; starts and reads it.&lt;/p&gt;
&lt;p&gt;That interpretation is wrong. Pipelines don&amp;rsquo;t run sequentially, they run &lt;strong&gt;concurrently&lt;/strong&gt;. When the shell encounters a pipeline, it creates a one-way communication channel using the &lt;code&gt;pipe()&lt;/code&gt; system call. The shell then forks two child processes, one for each command. One process connects its standard output to the pipe’s write end, and the other connects its standard input to the pipe&amp;rsquo;s read end.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Unexpected sudo hang under VPN kill-switch</title>
      <link>https://anagogistis.com/posts/sudo-hang/</link>
      <pubDate>Sat, 30 Aug 2025 11:44:09 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/sudo-hang/</guid>
      
      <description>&lt;p&gt;Recently I ran into a frustrating but interesting issue on my Linux machine (Ubuntu 24.04.2 LTS): whenever my VPN’s kill switch engaged (when the tunnel went down for any reason), using &lt;code&gt;sudo&lt;/code&gt; became noticeably slow. Eventually, I figured out what was happening and found several ways to fix it. The root of the problem was surprising, at least for me, and I thought it was worth sharing.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/summary&gt;
&lt;p&gt;My &lt;code&gt;sudo&lt;/code&gt; was trying to resolve the hostname to its FQDN (enabled by default on Debian-based systems like Ubuntu, even without an explicit &lt;code&gt;Defaults fqdn&lt;/code&gt; in &lt;code&gt;/etc/sudoers&lt;/code&gt;). NSS was configured to use &lt;code&gt;files&lt;/code&gt;, &lt;code&gt;resolve&lt;/code&gt;, and &lt;code&gt;dns&lt;/code&gt;. The &lt;code&gt;files&lt;/code&gt; method failed because a hostname change left &lt;code&gt;/etc/hosts&lt;/code&gt; stale. Then &lt;code&gt;systemd-resolved&lt;/code&gt; and DNS lookups were blocked by the VPN kill-switch, which caused the command to hang until resolution timed out.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>How to write to a root-owned file using sudo</title>
      <link>https://anagogistis.com/notes/sudo-tee/</link>
      <pubDate>Thu, 28 Aug 2025 23:21:54 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/sudo-tee/</guid>
      
      <description>&lt;p&gt;Writing to a file that requires root access in a non-root shell requires elevating privileges for the write operation. However, doing something like &lt;code&gt;sudo echo &amp;quot;some text&amp;quot; &amp;gt; /path/to/root-owned-file&lt;/code&gt; will fail with a &amp;ldquo;Permission denied&amp;rdquo; error. This is because the shell sets up redirections &lt;em&gt;before&lt;/em&gt; it executes the command. That means your non-root shell tries to open/truncate &lt;code&gt;/path/to/root-owned-file&lt;/code&gt; for writing, but it lacks permission so the redirection fails and the command is never run. The &lt;code&gt;sudo&lt;/code&gt; command would only elevate the program (&lt;code&gt;echo&lt;/code&gt;), not the redirection done by the shell.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Installing apps from tar archives</title>
      <link>https://anagogistis.com/notes/installing-tar-apps/</link>
      <pubDate>Thu, 21 Aug 2025 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/installing-tar-apps/</guid>
      
      <description>&lt;p&gt;A common pattern for installing GUI applications distributed as &lt;code&gt;.tar.*&lt;/code&gt; archives:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extract&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xf appname.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works for &lt;code&gt;.tar&lt;/code&gt;, &lt;code&gt;.tar.gz&lt;/code&gt;, &lt;code&gt;.tar.xz&lt;/code&gt;, &lt;code&gt;.tar.bz2&lt;/code&gt;. GNU &lt;code&gt;tar&lt;/code&gt; auto-detects compression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Move to a permanent location&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After extraction, you&amp;rsquo;ll get a self-contained directory (e.g. &lt;code&gt;AppName/&lt;/code&gt;). Move it to a standard location:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;System-wide:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mv AppName /opt/appname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Per-user:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv AppName ~/.local/apps/appname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;/opt&lt;/code&gt; is the standard location for unpackaged, precompiled third-party software. It avoids conflicts with system paths, keeps the app isolated, and allows clean removal.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Dot-slash revisited</title>
      <link>https://anagogistis.com/posts/dot-slash/</link>
      <pubDate>Tue, 19 Aug 2025 18:10:39 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/posts/dot-slash/</guid>
      
      <description>&lt;p&gt;There is a popular post &lt;a href=&#34;https://www.linfo.org/dot_slash.html&#34;&gt;&amp;ldquo;About the Use of Dot-Slash in Commands&amp;rdquo;&lt;/a&gt; at &lt;em&gt;linfo.org&lt;/em&gt; that explains why &lt;code&gt;./&lt;/code&gt; is used to run a program in the current directory.&lt;/p&gt;
&lt;p&gt;However, there is an inaccuracy that bothers me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When some text is typed into a shell and then the ENTER key is pressed, the shell assumes that it is a command. The shell immediately checks to see if the first string (i.e., sequence of characters) in that text is a built-in command or the absolute path (i.e., location relative to the root directory) to an executable.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Ctrl&#43;L vs clear</title>
      <link>https://anagogistis.com/notes/clear/</link>
      <pubDate>Sat, 16 Aug 2025 23:28:25 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/clear/</guid>
      
      <description>&lt;p&gt;In a terminal, you can clear the screen in two common ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run the &lt;code&gt;clear&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Ctrl+L&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result looks the same at first, but there’s a catch: &lt;code&gt;clear&lt;/code&gt; can also wipe your scrollback buffer&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, while Ctrl+L never does. Also, behind the scenes they’re implemented in different ways.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;ctrll&#34;&gt;Ctrl+L&lt;/h2&gt;
&lt;p&gt;When you press Ctrl+L at the Bash prompt, it’s not invoking an external program, but instead it’s handled inside &lt;a href=&#34;https://en.wikipedia.org/wiki/GNU_Readline&#34;&gt;GNU Readline&lt;/a&gt;, the library Bash uses for interactive line editing&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. In Readline’s input keymap, the key &lt;code&gt;Ctrl+L&lt;/code&gt; is bound to the &lt;code&gt;clear-screen&lt;/code&gt; function. You can confirm this with:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>The yes command</title>
      <link>https://anagogistis.com/notes/yes/</link>
      <pubDate>Sun, 10 Aug 2025 13:09:03 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/yes/</guid>
      
      <description>&lt;p&gt;Today I learned about this weird command &lt;code&gt;yes&lt;/code&gt;. It prints the letter &amp;ldquo;y&amp;rdquo; or a specified string&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; indefinitely until you stop it (with &lt;code&gt;Ctrl+C&lt;/code&gt;)&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ yes &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello world
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello world
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello world
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My first thought was &amp;ldquo;why the heck would anyone need it?&amp;rdquo;. Well, below are the most common uses according to ChatGPT:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automating prompts&lt;/strong&gt;:
Many CLI tools ask “Are you sure? [y/N]”.
Piping &lt;code&gt;yes&lt;/code&gt; sends endless &lt;code&gt;y\n&lt;/code&gt; responses:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Executing vs sourcing a shell script</title>
      <link>https://anagogistis.com/notes/source/</link>
      <pubDate>Wed, 06 Aug 2025 22:55:56 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/source/</guid>
      
      <description>&lt;p&gt;When you run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./myscript.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;you’re not running your script &lt;em&gt;directly&lt;/em&gt;. You’re asking your shell to &lt;code&gt;fork()&lt;/code&gt; and the child process to call:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;execve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;./myscript.sh&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;envp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the standard Unix model. But &lt;code&gt;myscript.sh&lt;/code&gt; isn’t an ELF binary — it’s a text file. So how does the kernel know what to do?&lt;/p&gt;
&lt;p&gt;If the file starts with the shebang &lt;code&gt;#!&lt;/code&gt;, the kernel recognizes this as a “script”. It parses the rest of the line to get the interpreter path (like &lt;code&gt;/bin/bash&lt;/code&gt;) and an optional argument (like &lt;code&gt;-e&lt;/code&gt;). Then, instead of executing the script file directly, the kernel rewrites the execution context: it replaces the target of the current &lt;code&gt;execve()&lt;/code&gt; with the interpreter, and adjusts the argument list to include the script as an argument.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Reverse searching Bash history with Ctrl-R</title>
      <link>https://anagogistis.com/notes/reverse-search/</link>
      <pubDate>Sat, 26 Jul 2025 10:28:44 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/reverse-search/</guid>
      
      <description>&lt;p&gt;In the default GNU Bash shell (and many others), pressing &lt;code&gt;Ctrl-R&lt;/code&gt; triggers &lt;strong&gt;reverse incremental history search&lt;/strong&gt;. It lets you search your command history interactively, as you type.&lt;/p&gt;
&lt;p&gt;Try it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;reverse-i-search&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now start typing any part of a previous command, for example &lt;code&gt;ssh&lt;/code&gt;. Bash will live-search backward in your history and show the most recent match:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;reverse-i-search&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;ssh&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;: ssh root@192.168.1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Things you can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl-R&lt;/code&gt; again to go further back in history with the same query.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; to run the shown command.&lt;/li&gt;
&lt;li&gt;Press the right arrow &lt;code&gt;→&lt;/code&gt; to place the shown command on your prompt to edit it before running.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl-G&lt;/code&gt; to cancel the search and return to your original prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that commands are matched anywhere in the line (not just from the beginning).&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>The exec() family</title>
      <link>https://anagogistis.com/notes/exec-family/</link>
      <pubDate>Wed, 23 Jul 2025 14:22:23 +0500</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/exec-family/</guid>
      
      <description>&lt;p&gt;There is no single function called &lt;code&gt;exec()&lt;/code&gt;. Instead, the term refers to a family of functions in libc — &lt;code&gt;execl&lt;/code&gt;, &lt;code&gt;execv&lt;/code&gt;, &lt;code&gt;execvp&lt;/code&gt; etc. that all serve the same purpose: replacing the current process image with a new program&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. These functions are all wrappers around the &lt;code&gt;execve(2)&lt;/code&gt; system call. They differ in how they accept arguments and whether they search &lt;code&gt;$PATH&lt;/code&gt;, but ultimately call &lt;code&gt;execve()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Core syscall
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;execve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[],&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;envp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You provide a full path, an argument vector, and an environment vector&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. &lt;code&gt;$PATH&lt;/code&gt; is not consulted — that’s the job of higher-level wrappers.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Man page section numbers</title>
      <link>https://anagogistis.com/notes/man-sections/</link>
      <pubDate>Mon, 21 Jul 2025 19:32:36 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/man-sections/</guid>
      
      <description>&lt;p&gt;In Linux documentation, commands are often followed by a number in parentheses,  like &lt;code&gt;grep(1)&lt;/code&gt; or &lt;code&gt;mount(8)&lt;/code&gt;. That number refers to a specific &lt;strong&gt;section of the man pages&lt;/strong&gt;, which are organized by the type of content they describe:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Section&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
          &lt;th&gt;Examples&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;User commands&lt;/strong&gt;: Executable programs available in user environments (usually in &lt;code&gt;$PATH&lt;/code&gt;).&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ls(1)&lt;/code&gt;, &lt;code&gt;grep(1)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;System call interfaces&lt;/strong&gt;: Low-level functions that transfer control to the kernel. Some correspond to actual syscalls (like &lt;code&gt;read&lt;/code&gt;); others (like &lt;code&gt;fork&lt;/code&gt;) are wrappers around internal syscalls (e.g. &lt;code&gt;clone&lt;/code&gt;).&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;open(2)&lt;/code&gt;, &lt;code&gt;read(2)&lt;/code&gt;, &lt;code&gt;fork(2)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Library functions&lt;/strong&gt;: APIs provided by user-space libraries like &lt;code&gt;libc&lt;/code&gt;, &lt;code&gt;libm&lt;/code&gt;, etc.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;printf(3)&lt;/code&gt;, &lt;code&gt;malloc(3)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Special files&lt;/strong&gt;: Interfaces to device files, usually found under &lt;code&gt;/dev&lt;/code&gt;.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;null(4)&lt;/code&gt;, &lt;code&gt;random(4)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;File formats and config files&lt;/strong&gt;: Syntax and conventions for text-based configuration.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fstab(5)&lt;/code&gt;, &lt;code&gt;passwd(5)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Games and amusements&lt;/strong&gt;: Games, screensavers, and recreational software.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fortune(6)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Miscellaneous&lt;/strong&gt;: Conventions, standards, protocols, charsets, signal descriptions, etc.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;signal(7)&lt;/code&gt;, &lt;code&gt;man(7)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;System administration commands&lt;/strong&gt;: Tools for sysadmins; often require root privileges.&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;mount(8)&lt;/code&gt;, &lt;code&gt;iptables(8)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Why this matters? Sometimes, the same name appears in more than one section. A classic example:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Copy &amp; paste between Vim and your system clipboard</title>
      <link>https://anagogistis.com/notes/vim-clipboard/</link>
      <pubDate>Mon, 07 Jul 2025 01:24:36 +0300</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/notes/vim-clipboard/</guid>
      
      <description>&lt;p&gt;Yanking (copying) text with &lt;code&gt;y&lt;/code&gt; in Vim and then trying to paste it elsewhere won’t work. Likewise, copying text outside Vim and pasting it into Vim with &lt;code&gt;p&lt;/code&gt; won’t work either. The reason is that by default, Vim stores yanked text in its internal unnamed register &lt;code&gt;&amp;quot;&lt;/code&gt;, which is separate from the system clipboard.&lt;/p&gt;
&lt;p&gt;To interact with the system clipboard, we have to explicitly use the &lt;code&gt;+&lt;/code&gt; register. For example, we can use &lt;code&gt;&amp;quot;+yy&lt;/code&gt; to yank a line into the system clipboard, &lt;code&gt;&amp;quot;+y&lt;/code&gt; to yank a visual selection into the clipboard, and &lt;code&gt;&amp;quot;+p&lt;/code&gt; to paste from the clipboard into Vim. For this to work though, Vim must be compiled with clipboard support.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>About</title>
      <link>https://anagogistis.com/pages/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>me@anagogistis.com (anagogistis)</author>
      <guid>https://anagogistis.com/pages/about/</guid>
      
      <description>&lt;div class=&#34;definition-bubble&#34;&gt;
  &lt;strong&gt;Anagogistis&lt;/strong&gt; (Greek: &lt;em&gt;αναγωγιστής&lt;/em&gt;) means &lt;em&gt;reductionist&lt;/em&gt; — someone who tries to understand complex things by breaking them down to their simplest parts.
&lt;/div&gt;
&lt;p&gt;Hello! I&amp;rsquo;m Andreas and this blog is my personal space where I share notes, things I learn, and small discoveries — mostly about software development, computer networking, Linux and AI.&lt;/p&gt;
&lt;p&gt;I write mainly to understand things better myself and to have a place I can return to when I need to look things up.&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
