<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>/home/lucio.albenga.es</title><link>https://lucio.albenga.es/web-en/</link><description></description><lastBuildDate>Mon, 01 Dec 2025 00:00:00 +0000</lastBuildDate><item><title>Setting Up a GCC Toolchain For Programming Arduino In Plain C</title><link>https://lucio.albenga.es/web-en/posts/2025/setting-up-a-gcc-toolchain-for-programming-arduino-in-plain-c.html</link><description>&lt;p&gt;
I'm not an Arduino power user but when I decided to start with it
I knew I wanted to program it in plain C and I knew I would buy a
compatible board instead of the real thing just to take the feel of
it. Probably because I'm a programmer, I found much more interesting
to go down the rabbit hole of low-level details, datasheets&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;,
etc., instead of letting the Arduino IDE and libs to hide things from
me. I also didn't find of any use to learn a pseudo C++ when I already
knew C.
&lt;/p&gt;

&lt;p&gt;
During these past weeks, since Qualcomm acquired Arduino, there was a
lot of talking about if they will enshittify Arduino, etc. Right now it
seems I was right from the start about doing things in pure C and not
using Arduino's software because right now it doesn't affect me at all
whatever Qualcomm does.
&lt;/p&gt;

&lt;p&gt;
In this howto I will explain to you how to set up a GCC based toolchain
so that you can also program your Arduino in C, or if you prefer it in C++,
and I will show you all the steps from typing a program all the way to
loading it on your board without using Arduino's official software.
&lt;/p&gt;

&lt;p&gt;
The first thing you should do is to install the required sofware and it's quite
likely that your POSIX compatible OS already have packages for it. In this howto
we will see how to do it on FreeBSD and Devuan GNU + Linux.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;avr-gcc&lt;span class="w"&gt; &lt;/span&gt;avr-binutils&lt;span class="w"&gt; &lt;/span&gt;avr-libc&lt;span class="w"&gt; &lt;/span&gt;avrdude&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# FreeBSD&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;gcc-avr&lt;span class="w"&gt; &lt;/span&gt;binutils-avr&lt;span class="w"&gt; &lt;/span&gt;avr-libc&lt;span class="w"&gt; &lt;/span&gt;avrdude&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Devuan&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Once the programs are installed, open your preferred editor and type the
program below. This program is the typical one that blinks the light of your
Arduino, and you'll use it for testing the toolchain and see how everything fits
together. For the purposes of this howto this file is called &lt;b&gt;&lt;i&gt;blink.c&lt;/i&gt;&lt;/b&gt;.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;avr/io.h&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;#define F_CPU 16000000UL &lt;/span&gt;&lt;span class="cm"&gt;/* required by &amp;lt;util/delay.h&amp;gt; */&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;util/delay.h&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;#define DELAY 1500 &lt;/span&gt;&lt;span class="cm"&gt;/* milliseconds */&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&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="n"&gt;DDRB&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;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DDB5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&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="n"&gt;PORTB&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;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PORTB5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;_delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;PORTB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PORTB5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;_delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DELAY&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;p&gt;
&lt;b&gt;The &lt;i&gt;F_CPU&lt;/i&gt; constant should reflect the CPU frequency (the clock speed) of your Arduino
model. I have an Arduino UNO compatible board and in my case this value is 16MHz&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Now it's time to compile the program. Type the following command on your terminal:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;avr-gcc&lt;span class="w"&gt; &lt;/span&gt;-Os&lt;span class="w"&gt; &lt;/span&gt;-mmcu&lt;span class="o"&gt;=&lt;/span&gt;atmega328p&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;blink&lt;span class="w"&gt; &lt;/span&gt;blink.c
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
Once you have the compiled binary file &lt;i&gt;blink&lt;/i&gt; you should convert it to a valid
Arduino *.hex binary:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;avr-objcopy&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;ihex&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;.eeprom&lt;span class="w"&gt; &lt;/span&gt;blink&lt;span class="w"&gt; &lt;/span&gt;blink.hex
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Now it's time to connect your Arduino to one of the USB ports of your computer. Check out
the port it's connected. You can use the command &lt;i&gt;dmesg&lt;/i&gt; to do this. On Devuan the output
of &lt;i&gt;dmesg&lt;/i&gt;, once connected my Arduino compatible board, looks like the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[3975174.307519] usb 2-1: new full-speed USB device number 79 using xhci_hcd
[3975174.456593] usb 2-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[3975174.456606] usb 2-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[3975174.456612] usb 2-1: Product: USB2.0-Serial
[3975174.458699] ch341 2-1:1.0: ch341-uart converter detected
[3975174.459258] usb 2-1: ch341-uart converter now attached to ttyUSB0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
This means that, in my case, it is connected to /dev/ttyUSB0 (/dev/ttyU0 on my FreeBSD).
To load the program into your Arduino type the following command (replace /dev/ttyU0 or
/dev/ttyUSB0 with your device):
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;avrdude&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;-V&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;arduino&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;m328p&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;/dev/ttyU0&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;flash:w:blink.hex&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# FreeBSD&lt;/span&gt;
avrdude&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;-V&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;arduino&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;m328p&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;/dev/ttyUSB0&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;flash:w:blink.hex&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Devuan&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The output will be something like the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e950f (probably m328p)
avrdude: Note: flash memory has been specified, an erase cycle will be performed.
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file blink.hex for flash
         with 176 bytes in 1 section within [0, 0xaf]
         using 2 pages and 80 pad bytes
avrdude: writing 176 bytes flash ...

Writing | ################################################## | 100% 0.06 s 

avrdude: 176 bytes of flash written
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
As I said before, the program blinks the Arduino light so you can take a look at your
Arduino and if its light is blinking it means everything worked fine. Congratulations!
You already have a working toolchain and you know the basics to create and load your
programs on your Arduino board.
&lt;/p&gt;

&lt;p&gt;
I hope you find this howto useful and that it helps you to start programming your Arduino
board with C. This is only a starting point and I recommend you to read the help and/or docs
of all these programs, that's where the magic happens.
&lt;/p&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://docs.arduino.cc/resources/datasheets/ATmega328P-datasheet.pdf" target="_blank"&gt;ATmega328P Datasheet at Arduino Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-12-01:/web-en/posts/2025/setting-up-a-gcc-toolchain-for-programming-arduino-in-plain-c.html</guid><category>Software</category><category>gcc</category><category>programming</category><category>c</category><category>arduino</category><category>tools</category></item><item><title>100% "Free as in Freedom" Versions of Devuan and Debian</title><link>https://lucio.albenga.es/web-en/posts/2025/free-as-in-freedom-versions-of-devuan-and-debian.html</link><description>&lt;p&gt;
I had seen in Simon Joseffsson's blog that he released the project
"Debian Libre Live". A project that aims to release Debian GNU/Linux
Live images with only free software, i.e. what Debian was before
taking the decision to include non-free things inside the main distro
Live images. Simon talks about this project in his blog&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; and you
can check out his Gitlab repository&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; too.
&lt;/p&gt;

&lt;p&gt;
At the same time, via Simon himself, I learned about the existence
of a similar project that targets Devuan GNU+Linux, the distro I use,
which is a fork of Debian without SystemD and other aberrations. This
project is Gnuinos Linux-Libre&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; and it uses the Linux-libre
kernel&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;. We could say that, at least in theory, Gnuinos could be
what Debian should be if they weren't taking so many bad decisions
during so many years.
&lt;/p&gt;

&lt;p&gt;
If you use Debian or Devuan and you care more about free as in
freedom software than open source software, here you have two 100%
"free as in freedom" GNU/Linux distros that you may find interesting.
&lt;/p&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://blog.josefsson.org/2025/11/13/introducing-the-debian-libre-live-images/" target="_blank"&gt;Simon Joseffson: Introducing The Debian Libre Live Images&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://gitlab.com/debdistutils/debian-libre/debian-libre-live" target="_blank"&gt;https://gitlab.com/debdistutils/debian-libre/debian-libre-live&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.gnuinos.org/" target="_blank"&gt;https://www.gnuinos.org/&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.fsfla.org/ikiwiki/selibre/linux-libre/" target="_blank"&gt;https://www.fsfla.org/ikiwiki/selibre/linux-libre/&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-11-16:/web-en/posts/2025/free-as-in-freedom-versions-of-devuan-and-debian.html</guid><category>Free Software</category><category>howto</category><category>free-software</category><category>devuan</category><category>debian</category><category>gnulinux</category></item><item><title>Mark McCahill &amp; Farhad Anklesaria video interview on Gopher</title><link>https://lucio.albenga.es/web-en/posts/2025/mark-mccahill-and-farhad-anklesaria-video-interview-on-gopher.html</link><description>&lt;p&gt;
I found at the Internet Archive a file by John Goerzen&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;: "2007 Gopherspace Mirror"&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;
and inside it there is a rare interview with Mark McCahill and Farhad Anklesaria,
part of the team who created the Gopher protocol. I decided to upload it to my
PeerTube&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;, in fact is the very first video I publish on PeerTube, because I think
it's a great part of the history of Gopher and the Internet. You can watch it here
and I hope you'll enjoy it as much as I did.
&lt;/p&gt;

&lt;div style="position: relative; padding-top: 75%;"&gt;
  &lt;iframe title="Mark McCahill &amp;amp; Farhad Anklesaria video interview on Gopher"
          width="100%" height="100%"
          src="https://peertube.anduin.net/videos/embed/8iuH7rtKGPJggGuKX6Wx96"
          frameborder="0" allowfullscreen=""
          sandbox="allow-same-origin allow-scripts allow-popups allow-forms"
          style="position: absolute; inset: 0px;"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.complete.org/" target="_blank"&gt;John Goerzen's Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://archive.org/details/2007-gopher-mirror" target="_blank"&gt;2007 Gopherspace Mirror at the Internet Archive&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://peertube.anduin.net/w/8iuH7rtKGPJggGuKX6Wx96" target="_blank"&gt;Video at LFA's PeerTube&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-11-15:/web-en/posts/2025/mark-mccahill-and-farhad-anklesaria-video-interview-on-gopher.html</guid><category>Video</category><category>gopher</category><category>video</category><category>internet</category></item><item><title>From Git to Fossil</title><link>https://lucio.albenga.es/web-en/posts/2025/from-git-to-fossil.html</link><description>&lt;p&gt;
People at Git has started to work on a proposal to make the Rust&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
programming language mandatory. I don't like Rust and, above all,
I don't like its community of little extremist characters who are
trying to make everyone swallow their crap by rewriting projects that
have been working for decades, doing social media brigading, and other
nice little gems worthy of any tiny group with totalitarian delusions.
That's why when I see that a project aims to "force" the use of or the
switch from C to Rust, to the extent of my possibilities, I flee
from it as if I were pursued by the Balrog of the Lord of the Rings
with his whip.
&lt;/p&gt;

&lt;p&gt;
I'm old enough to have used (or tested) many version control systems:
RCS (Revision Control System), CVS (Concurrent Version System),
SVN (Subversion), HG (Mercurial), BZR (Bazaar), and the aforementioned
Git, which means I have no problem in switching again, so I started to
think about a Git substitute for my personal projects.
&lt;/p&gt;

&lt;p&gt;
The options were to go back to one of the already known or look at
something else, and I remembered Fossil. I started looking over the
source code and reading the official documentation&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; to learn its
features, its dependencies, how to install and configure it, etc., and
I noticed it had many things I like:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;It's made in C&lt;/b&gt; (although it uses some js and tcl for its web
functionality) and is a small and efficient program that consumes
few hardware resources.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;It's simpler to use and it feels more natural&lt;/b&gt; (at least for someone
who knows other systems such as Subversion) because it does not
contain overkill functionalities such as the staging area, which may be
useful in large and complex projects such as the Linux kernel, but
for me they have no practical use.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;It allows you to self-host a server on your own quickly and easily&lt;/b&gt;
because it is already prepared for it. In fact it has a web server and
a web interface with version control views, wiki, tickets, etc. On the
other hand, with Git you have to use an external software such as
GitLab, Gitea or Forgejo, and each one of them is at least one extra software
dependency.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Commit messages don't use email addresses&lt;/b&gt;, they use user names so if you
have a public repository you don't have to be worried about spam and
you don't need a specific email address for this use only.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;It's interoperable with Git&lt;/b&gt; in the sense that if there is a need to
change a repository back to Git you can do it and it also supports
two-way synchronization between a Fossil repository and a Git&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;
one (this is the functionality used by Fossil and Sqlite projects to
manage their GitHub mirrors).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Taking all this into account, I decided to install Fossil and switch my
projects from Git. Below you'll see how to do it.
&lt;/p&gt;

&lt;div id="outline-container-orgd4abe28" class="outline-2"&gt;
&lt;h2 id="orgd4abe28"&gt;Installing Fossil&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgd4abe28"&gt;
&lt;p&gt;
The first step is to install Fossil and it's quite likely that the
package manager of your operating system already has it available:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Devuan GNU+Linux&lt;/span&gt;
pkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fossil&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# FreeBSD&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Once your package manager ends the installation you can check its
availability with the following command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;version
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The command above should return something like the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;This&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.21&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;3c53b6364e&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2023&lt;/span&gt;-02-26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:24:24&lt;span class="w"&gt; &lt;/span&gt;UTC
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org8ca142c" class="outline-2"&gt;
&lt;h2 id="org8ca142c"&gt;Importing Git repositories&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org8ca142c"&gt;
&lt;p&gt;
Fossil's documentation&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; has the following example to export a Git
repository and import it as a Fossil repository:
&lt;/p&gt;
&lt;div class="highlight"&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;repository
git&lt;span class="w"&gt; &lt;/span&gt;fast-export&lt;span class="w"&gt; &lt;/span&gt;--all&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;--git&lt;span class="w"&gt; &lt;/span&gt;repository.fossil
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
I did it differently because I wanted to adjust some things to have
the imported repositories "right". As I have several repositories I
created two different folders, one, &lt;i&gt;git-exported&lt;/i&gt;, to store the exported
repositories and another one, &lt;i&gt;fossils&lt;/i&gt;, to store the new Fossil repositories:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;~/git-exported
mkdir&lt;span class="w"&gt; &lt;/span&gt;~/fossils
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Now you can get into each Git repository folder and export it:
&lt;/p&gt;
&lt;div class="highlight"&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;repository
git&lt;span class="w"&gt; &lt;/span&gt;fast-export&lt;span class="w"&gt; &lt;/span&gt;--all&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/git-exported/repository.export
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Once you have exported all your Git repositories you should go
inside the ~/fossils folder and import them one by one with the command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;--git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--rename-master&lt;span class="w"&gt; &lt;/span&gt;trunk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--attribute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;your@mail.com your_username&amp;quot;&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;repository.fossil&lt;span class="w"&gt; &lt;/span&gt;~/git-exported/repository.export
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The &lt;code&gt;--rename-master trunk&lt;/code&gt; option renames your Git &lt;i&gt;master&lt;/i&gt; branch as
&lt;i&gt;trunk&lt;/i&gt; in your new Fossil repository. Fossil, like other version control
systems such as Subversion, uses &lt;i&gt;trunk&lt;/i&gt; as the name of the master branch.
If you are among the unfortunate ones who have their master branch named
as "main" this option is not for you and you should check Fossil's
documentation if you want to rename it.
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;--attribute "your@mail.com your_username"&lt;/code&gt; option changes the
email address "your@mail.com" from Git commits to "your_username" in
the imported Fossil commits. In Fossil the default username is the same
as the one you're currently using in you operating system. Obviously
the given email address should exist in one or more commit messages.
&lt;/p&gt;

&lt;p&gt;
If you want to change more than one email address you can do it
using several &lt;code&gt;--attribute&lt;/code&gt; options:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;--git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--rename-master&lt;span class="w"&gt; &lt;/span&gt;trunk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--attribute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;your@mail.com your_username&amp;quot;&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;--attribute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rms@gnu.org rms&amp;quot;&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;--attribute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;linus@kernel.org torvalds&amp;quot;&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;repository.fossil&lt;span class="w"&gt; &lt;/span&gt;~/git-exported/repository.export
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The output of the import command looks like the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;repository&lt;span class="w"&gt; &lt;/span&gt;meta-data...
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;.0%&lt;span class="w"&gt; &lt;/span&gt;complete...
Vacuuming...&lt;span class="w"&gt; &lt;/span&gt;ok
project-id:&lt;span class="w"&gt; &lt;/span&gt;e64b112b40eb3db188060ddb8deeaa96a6ad3b71
server-id:&lt;span class="w"&gt;  &lt;/span&gt;bfbcd4bf8f0f64eaa2d832ddc3b4af00639624a6
admin-user:&lt;span class="w"&gt; &lt;/span&gt;your_user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;XAxPVZcNQ6&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you look closely, the output gives you the repository
administrator's user and password. Keep it because you'll
need it to do certain things on your repository.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org5f81cbf" class="outline-2"&gt;
&lt;h2 id="org5f81cbf"&gt;Setting Up a Fossil Server&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org5f81cbf"&gt;
&lt;p&gt;
Fossil has an embedded web server so you can take advantage of it to
create a self-hosted server quickly and easily. The following method
is enough for a system with few users, in a private network that
cannot be accessed from the outside. There are different ways to set up
a Fossil server and some are better than others depending on your
needs, so I recommend you to check out the official documentation.
&lt;/p&gt;

&lt;p&gt;
First you should create a folder to store the Fossil repositories on the server:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/path/to/your/fossils
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Next copy your "fossils" to the folder on the server:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;scp&lt;span class="w"&gt; &lt;/span&gt;*.fossil&lt;span class="w"&gt; &lt;/span&gt;user@your_server:/path/to/your/fossils/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Now you can start the server with the following command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8043&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;--cert&lt;span class="w"&gt; &lt;/span&gt;/path/to/your_cert.pem&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--pkey&lt;span class="w"&gt; &lt;/span&gt;/path/to/cert/key.pem&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--repolist&lt;span class="w"&gt; &lt;/span&gt;/path/to/your/fossils/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you don't have a valid certificate you can use the follwing
command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8043&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;--cert&lt;span class="w"&gt; &lt;/span&gt;unsafe-builtin
&lt;span class="w"&gt;       &lt;/span&gt;--repolist&lt;span class="w"&gt; &lt;/span&gt;/path/to/your/fossils/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Once the server is running, if you put the following url
&lt;code&gt;https://server_address_or_hostname:8043/&lt;/code&gt; in your browser
you'll access a web page with the list of your repositories.
If you click on one of the repositories listed, you'll see the
repository web page. In the navigation menu you should see a
"login" option. Click on it and use the repository administrator's
username and password. Now you can configure the repository to your
liking. Check out Fossil's documentation to learn more.
&lt;/p&gt;

&lt;p&gt;
If you lost your Fossil repository administrator's password, you can
recover it by following these steps:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Go to the repositories folder in your server&lt;/li&gt;
&lt;li&gt;If you don't have Sqlite installed, install it following
the usual method of your operating system.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
Open &lt;i&gt;repository.fossil&lt;/i&gt; with Sqlite:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;sqlite3&lt;span class="w"&gt; &lt;/span&gt;repository.fossil
&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
Once inside sqlite execute the following query:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The query above will return something like:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;your_user&lt;span class="p"&gt;|&lt;/span&gt;My3w2jRxt1
&lt;span class="w"&gt;   &lt;/span&gt;anonymous&lt;span class="p"&gt;|&lt;/span&gt;57EBCBD1AAE663B4
&lt;span class="w"&gt;   &lt;/span&gt;nobody&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;developer&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;reader&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The password is the value on the second column
(in this example the string &lt;i&gt;My3w2jRxt1&lt;/i&gt;).
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
Exit Sqlite with the following command
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;.quit
&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id="outline-container-org8aa28d8" class="outline-2"&gt;
&lt;h2 id="org8aa28d8"&gt;Using Fossil&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org8aa28d8"&gt;
&lt;p&gt;
Here is a very brief guide on how to start working with Fossil.
This guide assumes that you know how to use Git, at a very basic
level, and it's just a starting point, so I recommend you
to read Fossil's documentation and the Fossil Book&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgc3ce6a3" class="outline-3"&gt;
&lt;h3 id="orgc3ce6a3"&gt;Getting Help&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgc3ce6a3"&gt;
&lt;p&gt;
The help command is essential to see which commands are available and
the uses and options of each one of these commands. The help command
works just like Git:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;--help
fossil&lt;span class="w"&gt; &lt;/span&gt;command_name&lt;span class="w"&gt; &lt;/span&gt;--help
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org30695b3" class="outline-3"&gt;
&lt;h3 id="org30695b3"&gt;Creating and cloning repositories&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org30695b3"&gt;
&lt;p&gt;
These are similar to Git's but with differences. In Git it's usual that
the repository matches the current working folder. In Fossil this is not
so, there is a clear separation between the repository, file
&lt;i&gt;repository.fossil&lt;/i&gt;, and the working (check-out) folder &lt;i&gt;repository_folder&lt;/i&gt;.
&lt;/p&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgbbb89af" class="outline-4"&gt;
&lt;h4 id="orgbbb89af"&gt;Creating a repository&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgbbb89af"&gt;
&lt;p&gt;
You can create a new repository with the command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;repository.fossil
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
This command will create only the repository, i.e. the file &lt;i&gt;repository.fossil&lt;/i&gt;.
To start working with it you have to "open it". Create a folder, move inside it,
and open the repository:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;my_working_folder
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;my_working_folder
fossil&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;/path/to/repository.fossil
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
You can also tell Fossil the name of the working folder and if it does not
exist Fossil will try to create it:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;--workdir&lt;span class="w"&gt; &lt;/span&gt;my_working_folder&lt;span class="w"&gt; &lt;/span&gt;/path/to/repository.fossil
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org17c82ad" class="outline-4"&gt;
&lt;h4 id="org17c82ad"&gt;Cloning a repository&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org17c82ad"&gt;
&lt;p&gt;
You can clone a repository using the command &lt;code&gt;fossil clone&lt;/code&gt; followed by the
repository url. The url can be a web url, a ssh url, a file path, etc.:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://host/repository
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
This command will automatically download the file &lt;i&gt;repository.fossil&lt;/i&gt;
and it will create, at the same level, the working folder &lt;i&gt;repository_folder&lt;/i&gt;.
If you don't want it to create the working folder you can do it by using the
command like:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;--no-open&lt;span class="w"&gt;  &lt;/span&gt;https://host/repository
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Once the repository is cloned, if you want to send your commits to the
remote repository (and you have permissions for it), you should configure
inside the working folder the remote fossil repository:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;https://user@host/repository
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The command above will asks you for your user's password and it will
also asks if you want to save it for future use.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;TIP&lt;/b&gt;: Because Fossil has this clear separation between the repository file
on one hand and the working folders on the other, I keep all the
*.fossil files inside a folder named &lt;i&gt;fossils&lt;/i&gt; in my /home and
I have the working folders where is most appropiate in each case.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org81fbf37" class="outline-3"&gt;
&lt;h3 id="org81fbf37"&gt;Getting Info&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org81fbf37"&gt;
&lt;p&gt;
For getting the information about the working folder and repository status
there are some differences compared to Git, especially in the name and use
of the commands.
&lt;/p&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgc24b0f0" class="outline-4"&gt;
&lt;h4 id="orgc24b0f0"&gt;Viewing the timeline&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgc24b0f0"&gt;
&lt;p&gt;
In Fossil the &lt;code&gt;fossil time&lt;/code&gt; and &lt;code&gt;fossil timeline&lt;/code&gt; commands are the
equivalent of Git's &lt;i&gt;git log&lt;/i&gt; command. Here are some examples from
the one that provides less information to the one that provides more:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--oneline&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# similar to git log --oneline&lt;/span&gt;
fossil&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;
fossil&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--medium
fossil&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# similar to git log&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org5f495ec" class="outline-4"&gt;
&lt;h4 id="org5f495ec"&gt;Viewing changes in your working folder&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org5f495ec"&gt;
&lt;p&gt;
To see the changes in your working folder compared to the repository
there are several commands and each one of them has different options.
&lt;/p&gt;

&lt;p&gt;
To see which files and folders are not under version control:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;extras
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To see files that are under version control and have been modified:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil changes
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To see a combination of the two previous commands:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil changes --differ
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To see the working folder and repository status in a way more closely
to the output of Git's &lt;i&gt;git status&lt;/i&gt; command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil status --differ 
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org4e30760" class="outline-4"&gt;
&lt;h4 id="org4e30760"&gt;Viewing the Diff(erences)&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org4e30760"&gt;
&lt;p&gt;
To see the differences between the contents of our files in the working
folder and what is in the repository, Fossil, like Git, has a &lt;i&gt;diff&lt;/i&gt; command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;diff
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To see the differences between a specific commit and the working folder:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="w"&gt; &lt;/span&gt;2c26dd6b69&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 2c26dd6b69 is the hashtag of the commit&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To see the differences between two specific commits:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="w"&gt; &lt;/span&gt;2c26dd6b69&lt;span class="w"&gt; &lt;/span&gt;--to&lt;span class="w"&gt; &lt;/span&gt;cd086a1045
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Fossil's &lt;i&gt;diff&lt;/i&gt; command doesn't show colorized diffs. Check out
the Wiki if you want colorized diffs&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgeae9d1f" class="outline-3"&gt;
&lt;h3 id="orgeae9d1f"&gt;Getting changes&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgeae9d1f"&gt;
&lt;p&gt;
Fossil has an option called &lt;i&gt;autosync&lt;/i&gt; that is enabled by default. This
option keeps your local repository synchronized with the remote repository.
If you have the &lt;i&gt;autosync&lt;/i&gt; option enabled, you can get all the changes from the
remote repository (if any) with the command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Otherwise it would be more similar to Git's. You have to do
first a &lt;i&gt;pull&lt;/i&gt; to get the changes and then an &lt;i&gt;update&lt;/i&gt; for
these to appear in your working folder:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;pull
fossil&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org2e491f3" class="outline-3"&gt;
&lt;h3 id="org2e491f3"&gt;Commiting changes&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org2e491f3"&gt;
&lt;p&gt;
As Fossil does not have the &lt;i&gt;staging area&lt;/i&gt;, the commit is much more
likely to version control systems like Subversion than Git.
&lt;/p&gt;

&lt;p&gt;
If you want to make a commit with all the pending changes:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;commit
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The command above will open an editor for you to enter the commit
message, but you can also provide the commit message as an option:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;My commit message&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
You can commit specific files with:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;file1&lt;span class="w"&gt; &lt;/span&gt;file2
fossil&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;file1&lt;span class="w"&gt; &lt;/span&gt;file2&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;My commit message&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you have the &lt;i&gt;autosync&lt;/i&gt; option enabled, the commit command will also
send your changes to the remote server (if any). Otherwise you'll have
to send the changes to the remote server with the command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;push
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org7253705" class="outline-3"&gt;
&lt;h3 id="org7253705"&gt;Adding and deleting files&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org7253705"&gt;
&lt;p&gt;
When you need to put new files under version control you can do it with:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;filename
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you want to remove a file from the version control you can do it with:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;filename
fossil&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;filename
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
By default the &lt;i&gt;rm&lt;/i&gt; and &lt;i&gt;delete&lt;/i&gt; commands do not physically delete the file
from the file system, they simply mark it as no longer under version control.
&lt;/p&gt;

&lt;p&gt;
There's also a command &lt;code&gt;fossil addremove&lt;/code&gt; which adds to the repository all the
files in the working folder that are not under version control and removes
from the repository all the files that are under version control but that
no longer exist in the working folder.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org27a64ad" class="outline-3"&gt;
&lt;h3 id="org27a64ad"&gt;Ignoring files&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org27a64ad"&gt;
&lt;p&gt;
Configuration is one of the points where there are several important
differences between Fossil and Git, so I recommend you to check out
Fossil's documentation. To ignore files and folder you have to create
the file &lt;code&gt;.fossil-settings/ignore-glob&lt;/code&gt; inside the working folder:
&lt;/p&gt;
&lt;div class="highlight"&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;working_folder/
mkdir&lt;span class="w"&gt; &lt;/span&gt;.fossil-settings
touch&lt;span class="w"&gt; &lt;/span&gt;.fossil-settings/ignore-glob
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then edit it using glob patterns&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;build/
3rdparty/
*.o
*/a.out
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org1d2b77c" class="outline-3"&gt;
&lt;h3 id="org1d2b77c"&gt;Branches and Tags&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org1d2b77c"&gt;
&lt;p&gt;
Git's paradigm encourages an intensive use of branches and tags but
Fossil's paradigm and features are different so the workflows are
different too.
&lt;/p&gt;

&lt;p&gt;
As I don't make much use of branches in my personal projects, I
think that in order for you to get an idea of the differences so that
you can adapt Fossil's features to your workflow, or your workflow to
Fossil's features, you better read the following links from the Fossil Wiki:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://www.fossil-scm.org/home/doc/trunk/www/ckout-workflows.md" target="_blank"&gt;Fossil Check-Out Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fossil-scm.org/home/doc/trunk/www/branching.wiki" target="_blank"&gt;Fossil Branching, Forking, Merging, and Tagging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fossil-scm.org/home/doc/trunk/www/private.wiki" target="_blank"&gt;Fossil Private Branches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org4e7cc7b" class="outline-3"&gt;
&lt;h3 id="org4e7cc7b"&gt;Local web interface&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org4e7cc7b"&gt;
&lt;p&gt;
I don't want to finish this little Fossil guide without making it
clear that you can access and use the web interface without having
a Fossil server. To do it, run the following command from within
the working folder:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil&lt;span class="w"&gt; &lt;/span&gt;ui
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org044c8fd" class="outline-2"&gt;
&lt;h2 id="org044c8fd"&gt;Final Thoughts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org044c8fd"&gt;
&lt;p&gt;
I like Fossil very much and, in my opinion, it's an almost perfect mix
between a centralized version control system like Subversion and a
distributed one like Git. I like how easy is to put it in server mode,
its web interface and, above all, the simplicity of its command line and
of the most common tasks.
&lt;/p&gt;

&lt;p&gt;
I think it's a great program that has a lot to offer, especially to
indie programmers and small groups who are interested in self-hosting
solutions. If you are looking for a simple and effective alternative to
Git do not hesitate to take a look at Fossil because it may be exactly
what you are looking for.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://lore.kernel.org/git/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@pks.im/" target="_blank"&gt;Git Mailinglist [PATCH RFC 0/3] Introduce Rust and announce that it will become mandatorty&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/home/doc/trunk/www/permutedindex.html" target="_blank"&gt;Fossil's Wiki&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/home/doc/trunk/www/mirrortogithub.md" target="_blank"&gt;How To Mirror A Fossil Repository On GitHub&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/home/doc/trunk/www/inout.wiki" target="_blank"&gt;Import And Export To And From Git&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/schimpf-book/index" target="_blank"&gt;Fossil Book&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/home/doc/trunk/www/colordiff.md" target="_blank"&gt;Fossil Colorized Diffs&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://fossil-scm.org/home/doc/trunk/www/globs.md" target="_blank"&gt;Fossil File Name Glob Patterns&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-11-12:/web-en/posts/2025/from-git-to-fossil.html</guid><category>Software</category><category>git</category><category>fossil</category><category>programming</category><category>software</category><category>tools</category></item><item><title>Gopher.fr</title><link>https://lucio.albenga.es/web-en/posts/2025/gopherfr.html</link><description>&lt;p&gt;
A friend has started a website to advocate for &lt;a href="https://lucio.albenga.es/web-en/posts/2025/gopher-a-simple-alternative-to-the-bloatware-of-the-web.html"&gt;Gopher&lt;/a&gt;. Currently the site
is a starting point for newcomers. Originally the website was in English and
French, someone did the German translation, and yours truly did the Spanish and
the Italian translations, so, little by little, the site is taking on an European
feel, i.e multilingual ;-)
&lt;/p&gt;

&lt;p&gt;
Without further ado, here's the link for you to check it out and share: &lt;a href="https://gopher.fr/" target="_blank"&gt;https://gopher.fr/&lt;/a&gt;
&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-11-08:/web-en/posts/2025/gopherfr.html</guid><category>Gopher</category><category>gopher</category><category>smolweb</category><category>internet</category></item><item><title>From The Printing Press to The Internet And Back Again</title><link>https://lucio.albenga.es/web-en/posts/2025/from-the-printing-press-to-the-internet-and-back-again.html</link><description>&lt;p&gt;
The need of expressing ourselves freely and to share our things with
fellow human beings is something that has always been there. In
ancient times people did it with rock paintings and stories were
shared through oral tradition. Later humans started to write on
different media and, finally, the invention of the printing press made
it possible to share information on a large scale. The miracle of the
printing press not only made possible to share books but it also gave
people the chance to publish and share their opinions and creations.
&lt;/p&gt;

&lt;div id="outline-container-org2862a3f" class="outline-2"&gt;
&lt;h2 id="org2862a3f"&gt;Chapbooks&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org2862a3f"&gt;
&lt;p&gt;
Thanks to the printing press, during the 16th century, a type of
publication known as chapbooks started to proliferate. Different names
were used in different countries: "pliego suelto" in Spain, "livre
bleu" in France, "volksbuch" in Germany, "libri da risma" in Italy,
and so on. This publications ranged from a folded loose sheet to books
composed of several printed, folded and unbounded pages.
&lt;/p&gt;

&lt;p&gt;
This street literature was a mean of information, entertainment and
outreach among ordinary people. The contents were varied and ranged
from a song or poem to the account of curreant events. There were
general publications and more specialized publications aimed at
certain sectors.
&lt;/p&gt;

&lt;p&gt;
Contrary to what we can think, chapbooks were produced on a non
negligible scale in view of the resources of the time as well as the
literacy of the people, which was not as large as nowadays. In 1520s
the Oxford bookseller John Dorne recorded in his day-book the sale of
up to 190 ballads a day, the inventory of the stock of The Sign of
the Three Bibles on London Bridge in 1664, included books and printed
sheets to make approximately 90,000 chapbooks and 37,500 ballads
sheets. The inventory of The Sign of the Looking Glass, also on the
London Bridge in 1707, recorded 31,000 books, in addition to 257 reams
of printed sheets. A conservative estimate of sales in Scotland in the
second half of the 18th century was over 200,000 per year&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgaca50c5" class="outline-2"&gt;
&lt;h2 id="orgaca50c5"&gt;Fanzines And Ezines&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgaca50c5"&gt;
&lt;p&gt;
During the 20th century, and especially throughout its lastest three
decades thanks to the invention of the Xerox machine, the fanzines
made their appearance, which are, as a general rule, a group of
xeroxed sheets of paper, folded in half with a cardboard cover and
binded with stapels. Fanzines were essential to disseminate what was
known as counterculture.
&lt;/p&gt;

&lt;p&gt;
Although there are cases of fanzines that were so successful that they
ended up becoming magazines&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; and that the fanzine phenomenon was so
large that there were some of them created and managed by large
corporations (such as the well-known fanzine "U Don't Stop" that was
part of a Nike advertising campaign), commonly these publications were
a one person (or a very small group) operations, with a  more or less
short lifespan.
&lt;/p&gt;

&lt;p&gt;
As the Chapbooks of the previous centuries, fanzines were about many
different things: literature, comics, music, politics, etc. Some were
more specialized than others and there were even fanzines about only
one band or musician like the fanzine "exclusively Elvis".
&lt;/p&gt;

&lt;p&gt;
Later, with the coming of BBS, the first ezines appeared. Usually,
they were files in plain ASCII text format. One of the oldest and
still alive is Phrack&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;. The coming of the Internet continued to
drive the ezine phenomenon and a little later, with the coming of
blogs first and "social" networks later, people had the potential
chance to publish and share their things on an unprecedented scale.
During this time some fanzines became digital and many others simply
disappeared (as it happened to many magazines and newspapers).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org3230c05" class="outline-2"&gt;
&lt;h2 id="org3230c05"&gt;Past And Present&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org3230c05"&gt;
&lt;p&gt;
As we've seen technological progress such as the printing press and
the Xerox machines made it easier for people to publish their own
things and avoid all kinds of censorship. At the very end of the last
century and the very beginning of the current one, with the coming of
the Internet, there was an optimism for all things digital, the
revolution that would be the Internet for regular people.
&lt;/p&gt;

&lt;p&gt;
Three decades later all that's left of that promise of the Internet,
of that utopia, are shattered pieces. From the technological progress
has emerged a terrifying reality of corporations and corrupt
governments willing to destroy  everything just to increase their
benefits, and increasingly confident in creating a new totalitarian
and dystopic world order, in which they can keep doing what they like
by subjugating the masses without any interference or resistance. The
technology that had to make us free has turned out to be the one that
is being used to put chains on us.
&lt;/p&gt;

&lt;p&gt;
We can see every day how the Internet, and especially the web, has
become a hostile place where private groups of unpresentable people
can block web pages at their will&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;, where publications and ebooks
are removed, written and rewritten according to the tastes, affinities
and purposes of certain groups and organized interests&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;, where the
cancellation culture used by the Nazis and the communists one hundred
years ago is the norm, and where the so-called AI scans the entire web
24 hours a day, 7 days a week, stealing everything from everyone
without paying a dime&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
People are starting to react to all this nonsense. The physical&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;
and offline&lt;sup&gt;&lt;a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; is back in fashion and is valued because it really
has value. A physical object will always generate a better experience
than a virtual one because we humans have multiple senses. A physical
object has a lot more options to survive and endure in time than a
virtual one, proof of this are all those previous centuries chapbooks
that are still with us, while we've already lost forever a large
amount of digital content of a few years ago despite the efforts to
preserve it. A physical and/or offline object is not as likely to be
blocked, interfered, spied, stolen and manipulated as a virtual or
online one. You can rewrite the text of an amazon kindle ebook and
reupload it silently, but you can't rewrite my physical copy of George
Orwell's 1984 published more than 30 years ago. It is and will be here,
unchanged and unalterable, for current and future generations.n
&lt;/p&gt;

&lt;p&gt;
In view of all this and taking into account how easy is to have access
to a printer nowadays, it is not surprising that people are gradually
returning to the dissemination of their thoughts, crafts and arts in
the good old printed form, in chapbooks&lt;sup&gt;&lt;a id="fnr.9" class="footref" href="#fn.9" role="doc-backlink"&gt;9&lt;/a&gt;&lt;/sup&gt; and fanzines&lt;sup&gt;&lt;a id="fnr.10" class="footref" href="#fn.10" role="doc-backlink"&gt;10&lt;/a&gt;&lt;/sup&gt;, because
sharing our thoughts, our opinions and our creations freely is an
inherent need of human beings and not a thing for machines.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Chapbook#Production_and_distribution" target="_blank"&gt;Wikipedia Chapbook: Production and Distribution&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.fashionmodeldirectory.com/magazines/id/" target="_blank"&gt;I-D Magazine&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://phrack.org/" target="_blank"&gt;https://phrack.org/&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://bandaancha.eu/bloqueos-futbol" target="_blank"&gt;Bandaancha.eu: Bloqueos del fútbol&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://web.archive.org/web/20250927203246/https://carrow.substack.com/p/amazon-deleted-orwells-books" target="_blank"&gt;Amazon Deleted Orwell's Books&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.salon.com/2024/01/09/impossible-openai-admits-chatgpt-cant-exist-without-pinching-copyrighted-work/" target="_blank"&gt;Salon.com "Impossible": OpenAI admits ChatGPT can’t exist without pinching copyrighted work&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.rollingstone.com/culture/culture-features/physical-media-collectors-trend-viral-streamers-1235387314/" target="_blank"&gt;Rolling Stone: Physical Media Is Cool Again. Streaming Services Have Themselves to Blame&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://medium.com/@greufeinvestments/why-im-done-with-streaming-and-returning-to-physical-media-28bb77580b04" target="_blank"&gt;Why I'm Done With Streaming and Returning to Physical Media&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.9" class="footnum" href="#fnr.9" role="doc-backlink"&gt;9&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://nullpointerpress.blogspot.com/" target="_blank"&gt;Null Pointer Press&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.10" class="footnum" href="#fnr.10" role="doc-backlink"&gt;10&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.wired.com/story/zines-social-media-power/" target="_blank"&gt;Wired: Social Media Replaced Zines. Now Zines Are Taking the Power Back&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Mon, 20 Oct 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-10-20:/web-en/posts/2025/from-the-printing-press-to-the-internet-and-back-again.html</guid><category>Essay</category><category>literature</category><category>self publishing</category><category>fanzines</category><category>chapbooks</category></item><item><title>Gopher, A Simple Alternative To The Bloatware Of The Web</title><link>https://lucio.albenga.es/web-en/posts/2025/gopher-a-simple-alternative-to-the-bloatware-of-the-web.html</link><description>&lt;small&gt;
&lt;hr&gt;
&lt;a href="https://lucio.albenga.es/web/posts/2025/gopher-una-respuesta-sencilla-a-los-excesos-de-la-web.html"
&gt;Español&lt;/a&gt; en este sitio.&lt;br&gt;
&lt;a href="https://linuxfr.org/users/bublbobl/journaux/gopher-une-alternative-simple-aux-bloatwares-du-web%E2%80%8C"
  target="_blank"&gt;Français&lt;/a&gt; sur linuxfr.org&lt;br&gt;
&lt;hr&gt;
&lt;/small&gt;

&lt;p&gt;
Nowadays more and more people are tired of suffering the bloatware
and threats of the World Wide Web. When the web was released to the
public in 1993 it was just a system for sharing files and documents
with hyperlinks. Thirty years later it has become a minefield of bots,
spyware, tracking systems, invasive advertising, unwanted
notifications, and other bad stuff.
&lt;/p&gt;

&lt;p&gt;
Actually &lt;b&gt;we have normalized that for reading a post, a recipe, or
seeing a timetable on the web, we have to download a huge amount of
data&lt;/b&gt; distributed among an invasive pop-up with a privacy / cookie
policy notice requesting us to authorize them to share our data and
browsing habits with them and their 7126 partners, a lot of ads we
don't want to see, a suscription pop-up for something we don't want
to subscribe to, images and videos we don't care about, and finally,
in the middle of all this crazyness and with a bit of luck, we can
see the content we wanted to see in the first place, mixed with more
ads.
&lt;/p&gt;

&lt;p&gt;
It has also been normalized the fact that to see something as simple
as a cooking recipe we have to have javascript enabled in our browser.
For those who don't know, javascript is an environment that lives
in your browser and run on your machine whatever javascript program
the web page you're visiting is sending to you. This delivers a lot
of security problems, privacy issues, misappropriation of data,
and so on.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;To give us an idea, if we want to see a cooking recipe on a website
it's not at all uncommon that we have to download from 2 to 10
megabytes of data with an average of 50 requests to (down)load
everything&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/b&gt;. If we make the numbers we will see that a plain text
recipe is about 2 kilobytes. Adding to it html formatting and css styles
to make it look neat will increase the size to about 3 kilobytes, let's
be generous and put 4 kilobytes. &lt;b&gt;So, how is it possible that to see
something that is 4kB we have to download 500 to 2500 times more
data?&lt;/b&gt; Because of all the bloatware: ads, videos, images,
trackers, javascript, and the rest of things that you're forced
to download want it or not.
&lt;/p&gt;

&lt;p&gt;
Even though we are told to believe that this is inevitbale or even
that it is fair by "put here the reasons that are good for the
lobby, company or government of the moment", reality is that this
is not so. The web was not this way and other options are available.
One of those options is Gopher.
&lt;/p&gt;

&lt;div id="outline-container-orgdf05a04" class="outline-2"&gt;
&lt;h2 id="orgdf05a04"&gt;What is Gopher?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgdf05a04"&gt;
&lt;p&gt;
Gopher, like the WWW, is a protocol to share and access documents and
files on the Internet that was published in 1991, two years before the
World Wide Web. It was developed at the University of Minessota, hence
its name because the mascot of the university and of the sports teams
is Goldy Gopher&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
Gopher has a navigation system, more structured than the web,
based on menus commonly known as gophermaps. This menus contain
links to files and other menus and it is a plain text interface so
it is very fast and requires very few resources. It's also a single
request protocol, one request delivers only one resource and closes
the connection.
&lt;/p&gt;

&lt;p&gt;
It's a protocol from a time in which bandwith was tight, slow and
expensive, and computers were not as powerful as today, so the aim was
to share as much relevant information as possible with the
least possible resources.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgbf2ee7d" class="outline-2"&gt;
&lt;h2 id="orgbf2ee7d"&gt;Gopher Is Bloatware Free&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgbf2ee7d"&gt;
&lt;p&gt;
The simplicity of Gopher makes impossible or very difficult the abuses
and bloat so common on the web for several reasons, including:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Gopher has no sessions or cookies&lt;/b&gt; so it is impossible to track
people&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; and unnecessary to show a privacy and/or cookie's policy.&lt;/li&gt;
&lt;li&gt;The simplicity of the single request plus tha fact that you only
get a file &lt;b&gt;avoids the scenario where in turn other requests
are automatically made to simultaneously get images, videos, or other
files&lt;/b&gt; whether from the same server or from different ones.&lt;/li&gt;
&lt;li&gt;Because it is a protocol that only shares files it doesn't
support javascript or any other similar things so &lt;b&gt;it can not
load and run directly a program on the user's computer&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;By having only a textual interface and lacking a content
design system, the information is lighter because it is commonly
presented as plain text. If you want something that looks pretty
you can always share files in formats like ODF, PDF, PS, etc.,
and the user can always decide whether he wants, and can,
download them or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Taken together, &lt;b&gt;this means that Gopher is a very light system
that doesn't require too much bandwith to work&lt;/b&gt;. Here content is
king because it lacks all the bells and whistles so common on the
web, and it also provides peace of mind because there is no
tracking, ads, and all the nowadays web abusive behaviours&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgb29c585" class="outline-2"&gt;
&lt;h2 id="orgb29c585"&gt;Gopher Is Not For Everyone (And That's Ok)&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgb29c585"&gt;
&lt;p&gt;
Although many people don't like ads, being tracked, cookies, pop-up
windows, etc., it's also true that they think they can't live
without much of that same blotware that makes possible all the
things they dislike.
&lt;/p&gt;

&lt;p&gt;
The web is like a bustling market while Gopher is more like a library.
They're are two different things for different people and/or for
different moments. &lt;b&gt;If on the WWW everyone yells at us selling
their goods, on Gopher we are in the coffee shop talking with friends
and like minded people&lt;/b&gt;. Sometimes we like one thing and other times
we like (or need) the other, and it's okay.
&lt;/p&gt;

&lt;p&gt;
The use of Gopher declined in favour of the WWW in the late 90s
but &lt;b&gt;this protocol has survived to this day mainly thanks to small
communities known as Pubnixes&lt;/b&gt; (Public Unix Access Systems) and
tildes. Although in these communities  there are many people with
a technical profile and/or interests, there is a variety of people
with different profiles, interests and hobbies.
&lt;/p&gt;

&lt;p&gt;
Pubnixes are usually machines with few resources funded by a single
person and some donations, so each pubnix has a limited number of
users and this fosters the creation of more small communities as
the number of people increases. Small communities favour people to
interact more with each other and to get to know each other better
promoting more genuine and relevant interactions.
&lt;/p&gt;

&lt;p&gt;
People in some communities interact with people in others, which helps
building and sustaining a social fabric connecting all the
communities. Usually someone who is part of a community, at a given
time, decides to create his own pubnix to accommodate new people so
there are always intercommunal exchanges and people who belong to
more than one community.
&lt;/p&gt;

&lt;p&gt;
This whole ecosystem is an important part of the beauty of Gopherspace.
&lt;b&gt;Here people write and share because they have something to say or
because they feel the need or the desire to do so. No one publishes
twenty daily banalities to improve their SEO and those who read do so
because they care and/or are interested, not because of the "Fear Of
Missing Out"&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
On the other hand, people who need or want to interact almost in real
time with a lot of multimedia content that is updated every single
second, and people who want to create a personal brand to sell things,
get thousands of followers and get tens of thousands of likes, are
likely to feel out of place on the Gopherspace.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org88c3fb7" class="outline-2"&gt;
&lt;h2 id="org88c3fb7"&gt;What I Should Do To Browse The Gopherspace?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org88c3fb7"&gt;
&lt;p&gt;
Now that we already have an idea of what Gopher is and what it's not,
chances are we'll want to take a look. As with for browsing
the WWW we need a web browser, &lt;b&gt;to explore the Gopherspace we need a
Gopher client&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Years ago many web browsers supported both the WWW and Gopher but
as times went on they decided to drop Gopher. One of the browsers
that continues to support it is Lynx. &lt;b&gt;Below there is a list&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; of
Gopher clients and extensions to activate Gopher support on
Firefox-based browsers and Chromium-based browsers&lt;/b&gt;:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://gmi.skyjake.fi/lagrange/" target="_blank"&gt;Lagrange&lt;/a&gt;: is a graphical client available for GNU/Linux, BSDs,
Macos, Windows and it also has beta versions for iOS and Android.
In its web you'll see that is a client for Gemini but it also
supports Gopher and other similar protocols.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bombadillo.colorfield.space/" target="_blank"&gt;Bombadillo&lt;/a&gt;: is a TUI client for GNU/Linux, BSDs and Macos.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thelambdalab.xyz/elpher/" target="_blank"&gt;Elpher&lt;/a&gt;: is a client for GNU Emacs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/overbitewx/" target="_blank"&gt;OverbiteWX&lt;/a&gt;: is an add-on for Firefox-based browsers.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chromewebstore.google.com/detail/burrow-gopherspace-explor/plhaaggiajlcjclagmjnjmaonhkdhhji" target="_blank"&gt;Burrow Gopherspace Explorer&lt;/a&gt;: is an add-on for Chromium-based browsers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Once you have the client installed, Gopher works with URIs of type gopher://
You can start visiting some gopher holes&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; like the following:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;b&gt;FloodGap Gopher Docs&lt;/b&gt;: gopher://gopher.floodgap.com/&lt;br&gt;
    Here you'll find lots of information and resources about Gopher.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;b&gt;SDF Public Access UNIX System&lt;/b&gt;: gopher://sdf.org/&lt;br&gt;
    One of the oldest and largest pubnixes.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;b&gt;Bongusta!&lt;/b&gt;: gopher://i-logout.cz/1/bongusta&lt;br&gt;
    A phlog aggregator.
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
If you feel like it you can visit my gopher hole at
gopher://lucio.albenga.es/. I have a links section with these
and other links to phlog aggregators, pubnix communities,
and more Gopher resources like search engines.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id="outline-container-org3248ae1" class="outline-2"&gt;
&lt;h2 id="org3248ae1"&gt;Final Thoughts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org3248ae1"&gt;
&lt;p&gt;
&lt;b&gt;Probably most people will discard Gopher claiming that it's an
"obsolete technology"&lt;/b&gt; or other similar arguments, others
will be curious to see what goes on and will be visiting it
sporadically, a smaller number will continue to visit their favourite
gopher holes and a few will end up creating their own gopher holes
or even a pubnix server. All that is fine, Gopher does not intend
to sell anything to anyone or to solve the problems of the world.
&lt;/p&gt;

&lt;p&gt;
As I said before, Gopher is one of the alternatives to the bloat and
abuses of the web. There are others like Spartan or Gemini, but &lt;b&gt;the
important thing is to know that at a time when many people are
complaining about the bloatware on the WWW, are talkink about
&lt;i&gt;the indie web&lt;/i&gt;, &lt;i&gt;the small web&lt;/i&gt; and &lt;i&gt;the smolweb&lt;/i&gt;, permacomputing,
small online communities, and other similar things, Gopher has been
providing a lot of it since 1991&lt;/b&gt; and here it is, waiting for us
to decide to meet it and give it a chance like a veteran craftsman
who may not look as good as when he was young, but whose ability and
precision are able to create a tool that lasts us a lifetime.
&lt;/p&gt;

&lt;p&gt;
See you on the Gopherspace (or not).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
I tried different websites from among the first search results.
Take into account that I have some blockers so the real numbers
could be higher.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Goldy_Gopher" target="_blank"&gt;Wikipeda Goldy Gopher&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Some people has developed primitive session systems by
autogenerating unique links "per session". These systems
only work on single gopherholes and in no case something
gets stored on the user's computer that allows to track him
in the entire network or over time.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
Keep in mind that Gopher is not an encrypted communication so
if someone monitors you, he can see the contents you access,
but that monitoring would have to be a man in the middle or
your own Internet service provider. Although there are ways
to have the Gopher equivalent of the WWW https, this is not
part of the protocol specification.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Fear_of_missing_out" target="_blank"&gt;Wikipedia FOMO&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
The proposed list contains only a few options, there are a lot
more. Unlike the WWW that only has 2-3 main browsers, making a
Gopher client is simple so there are many, which is another
advantage because it avoids factual monopolies.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
A gopher hole on Gopher is the same as a web page on the WWW,
and a phlog (Gopher Log) is the the same as a blog on the WWW.
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sat, 30 Aug 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-08-30:/web-en/posts/2025/gopher-a-simple-alternative-to-the-bloatware-of-the-web.html</guid><category>Essay</category><category>essay</category><category>gopher</category><category>gemini</category><category>spartan</category><category>small web</category><category>smolweb</category><category>internet</category><category>www</category></item><item><title>Why I Don't Use Creative Commons Licenses?</title><link>https://lucio.albenga.es/web-en/posts/2025/why-i-dont-use-creative-commons-licenses.html</link><description>&lt;p&gt;
From almost two decades it's pretty common that the majority of
content published on the Internet is done under some sort of Creative
Commons license. In the past I did it too, but recent (or recent to
me) events made me change my mind.
&lt;/p&gt;

&lt;p&gt;
Many years ago I had a problem where part of my content was used
on a website trying to impersonate me and I had many problems with
their hosting company because they didn't want to remove those
contents because they were released under Creative Commons. Anyway
that didn't change my mind about CC, &lt;b&gt;my mind changed because of the
following two recent events&lt;/b&gt;:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;The Creative Commons Signal proposal&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;. You should see the
discussions on GitHub&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; where you can see how CC turns a deaf
ear to people's comments against the proposal.&lt;/li&gt;

&lt;li&gt;A blog post&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; that IMHO is too much in favour of the so-called AI.
The post is from 2021 but I noticed it recently because someone
shared it on Mastodon.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
If we take into account that a great number of content released under
a Creative Commons license is done under the CC BY-NC-SA&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; and the
CC BY-NC-ND&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; licenses, that both licenses require that if you use a
work under them you should attribute the original author and also
forbid you to use the work for commercial use, we will see that
&lt;b&gt;Creative Commons has passed from being an organization that was
allegedly in favor of artists and creators to one that seems to have
ultimately sided with companies and organizations that to a great
extent breach the terms of their licenses&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
So, given this scenario and for ethical reasons, I can't keep using
Creative Commons licenses nor support and/or encourage its use.
&lt;/p&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://creativecommons.org/ai-and-the-commons/cc-signals/" target="_blank"&gt;Creative Commons Signal Proposal&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/creativecommons/cc-signals/discussions/categories/open-feedback-suggestions-and-ideas" target="_blank"&gt;CC Signals Open Feedback, Suggestions and Ideas&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://creativecommons.org/2021/03/04/should-cc-licensed-content-be-used-to-train-ai-it-depends/" target="_blank"&gt;Should CC-Licensed Content be Used to Train AI? It Depends.&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"&gt;Creative Commons BY-NC-SA Deed&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank"&gt;Creative Commons BY-NC-ND Deed&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Fri, 29 Aug 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-08-29:/web-en/posts/2025/why-i-dont-use-creative-commons-licenses.html</guid><category>Opinion</category><category>licencias</category><category>blog</category></item><item><title>On Software, Licenses, Morals and Ethics</title><link>https://lucio.albenga.es/web-en/posts/2025/on-software-licenses-morals-and-ethics.html</link><description>&lt;p&gt;
From time a discussion takes place on issues related to
free software vs open source licenses. In this type of discussion, there
are always free software advocates who defend the GPL and the AGPL and
open source advocates and detractors of the free software movement (and more
specifically of Richard Stallman and the Free Software Foundation), who
defend the use of more permissive licenses such as MIT and the various BSD.
&lt;/p&gt;

&lt;p&gt;
Generally speaking &lt;b&gt;when people talks about open source software they
focus on the technical side of things&lt;/b&gt;: collaborative development, better
software quality by being developed by more people, greater security by
having more eyes to review it, etc. Others focus more on the economic side
which is mainly that they don't have to pay for the software. On the other
hand when people talk about free software, they inevitably talk about concepts
of a more humanist nature: ethics and morality, what is just and unjust for people,
the greater good to say it in some way.
&lt;/p&gt;

&lt;div id="outline-container-orgdca3e39" class="outline-2"&gt;
&lt;h2 id="orgdca3e39"&gt;More or Less Free (As In Freedom) Licenses&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgdca3e39"&gt;
&lt;p&gt;
The classic argument against the GPL and the AGPLv3 is that these licenses enforce
certain restrictions so they are not really free while other most permissive
licenses are. &lt;b&gt;In short, these people complain about the fact that the GPL and, especially,
the AGPLv3 doesn't allow someone to take a free software program and make a
proprietary version of it&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Another argument that comes up from time to time is that, because of these
"restrictions", if you license your project under the terms of the GPLv3 or the AGPLv3
no one is going to use it, so why do you want to do something no one will use? This
is nonsense because many people use software under both licenses every single day,
very likely even those who make such ridiculous comments.
&lt;/p&gt;

&lt;p&gt;
When the free software movement talks about freedom, it talks about freedom for the
users, understanding as a user someone who uses a program and / or the source code
of a program, so the freedom to protect is mainly the freedom of individuals.
Therefore both, &lt;b&gt;the GPLv3 and the AGPLv3 seek to give a number of rights while ensuring
no one can take them away&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
This is why these licenses contain terms that allow users to redistribute the software
with or without changes, free of charge or charging an amount, but with the obligation to
do so under the same license. On the other hand &lt;b&gt;the most permissive licenses do not include
such  "restrictive" terms, so in practice they allow anyone to deprive others from the same
rights he is enjoying&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Both the GPL and the AGPL give these rights when the program is distributed, that is, a copy
of it is given to the user. According to the GPL, the distribution occurs when the user receives
a copy of the program to run it on his or her device, either by an online download of a file or
set of files, or by distribution on a physical support: diskette, data tape, pendrive, cdrom, etc.
As the saying goes, "where there's a law, there's a loophole" and certain actors found a way to
take advantage of free software, make a profit from it and give nothing back. Thus Software as
a Service (Saas) was born.
&lt;/p&gt;

&lt;p&gt;
Those who offer software as a service, according to the terms of the GPL don't give a copy of the
software, so they have no obligation to give back the changes they made to the software. &lt;b&gt;The AGPLv3
comes to solve this loophole by adding the following in Section 13&lt;/b&gt;:
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
&amp;#x2026; if you modify the Program, your modified version must prominently
offer all users interacting with it remotely through a computer
network (if your version supports such interaction) an opportunity to
receive the Corresponding Source&amp;#x2026;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
This renders nearly impossible to offer the software without giving the source code to the user.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgf7304d7" class="outline-2"&gt;
&lt;h2 id="orgf7304d7"&gt;Who Profits From What?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgf7304d7"&gt;
&lt;p&gt;
Taking into account all of the above, it is quite easy to realize that &lt;b&gt;a
program under a more permissive open source license is interesting for
companies of a certain size&lt;/b&gt; that have the means to capitalize this
software either by selling it as a service, or by making some changes
to it and by reselling it as proprietary software. The typical cases are, of
course, those companies known as big tech. Apple took permissively
licensed software under BSD licenses, modified it and made their propietary OSes
Mac OS X and iOS. Microsoft and Amazon with their cloud computing services are
another example of how to profit from GPL-licensed software without having to give
anything back.
&lt;/p&gt;

&lt;p&gt;
Regarding the argument of "why do you do something if no one is going
to use it", I think that "no one" mainly refers to this type of companies.
One example is &lt;b&gt;Google prohibits its engineers to use any code licensed under
the AGPLv3&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Among the affected there are many cases to choose from, individuals and,
not so big, tech companies alike. Some famous ones are the case of javascript
colors and faker packages&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; (licensed under the MIT license), Log4j&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;
(licensed under Apache APL 2.0) and Redis&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; (originally licensed under BSD-3 clause),
MongoDB&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; (originally licensed under AGPLv3) and ElasticSearch&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; (originally
licensed under Apache APL 2.0).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org845fb71" class="outline-2"&gt;
&lt;h2 id="org845fb71"&gt;Anyway, Software Has To Be Open Source, Right?&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org845fb71"&gt;
&lt;p&gt;
Taking into account the criticism made by members of the open source
community to Redis, MongoDB, ElasticSearch and even to the colors and
faker developer, Marak Squires, anyone could think that the only thing
everyone agrees with is that software has to be open source. However, some
facts seem to indicate that it depends.
&lt;/p&gt;

&lt;p&gt;
If you are a small actor like an indie developer, a small development team
or a company that is not extremely large, it matters a lot that your
software is not proprietay. On the contrary, much less importance is given
when the proprietary software turns out to be the MacOS operating system running
on the MacBooks used by many open source developers, or if the proprietary software
makes nVidia graphics cards and Qualcomm WiFi chipsets work properly on Linux kernel
based systems.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;No surprises here given that an important number of those who give ethical and moral lessons,
and advise on software licenses, do so as they are on their way to the bank in order to cash their
checks&lt;/b&gt; signed by RedHat (IBM), Google, Meta, or Microsoft, among others. In this charming panorama,
you'll find all sorts of gems, from the open source community leader who get mad because someone tries
to reverse engineer a proprietary program to make a free version of it&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;, to the open source
flagship company that takes all the free software it wants and make a &lt;i&gt;de facto&lt;/i&gt; proprietary
product out of it&lt;sup&gt;&lt;a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org872c5ef" class="outline-2"&gt;
&lt;h2 id="org872c5ef"&gt;Final Thoughts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org872c5ef"&gt;
&lt;p&gt;
Time and experience taught me that free and open source programs can be made and used for
abusive purposes, the very same way that I have also seen indie developers and small
development teams make proprietary programs that provide them with a decent income
without exploiting, extorting or taking advantage of anyone. I think everyone can do with
their time and money whatever they want and like, as long as they don't harm anyone.
&lt;/p&gt;

&lt;p&gt;
I'm ok with people who make free software under whatever license they like, even though I
always recommend the AGPLv3, because they want to contribute altruistically to society and/or
make a living out of it, and I'm also ok with people who make an honest living by doing proprietary
software. On the other hand &lt;b&gt;I'm absolutely not ok with people who act in bad faith, who say one
thing while they're doing the opposite, who are trying to give an appearance of commitment to
society when they actually manipulate things&lt;/b&gt; so that the coporations that sign their checks get
outrageous earnings by deceiving and exploiting everyone else.
&lt;/p&gt;

&lt;p&gt;
The bad is not in licenses or programs. The bad is not in whether you do free software,
open source software, or proprietary software. The bad lies in the lack of critical thinkng
and the lack of honesty. &lt;b&gt;The bad is in people's egos and sick ambitions&lt;/b&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://opensource.google/documentation/reference/using/agpl-policy/" target="_blank"&gt;Google Open Source AGPL Policy&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/" target="_blank"&gt;Bleeping Computer: Dev Corrupts NPM libs Colors and Faker Breaking Thousands of Apps&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.theregister.com/2021/12/14/log4j_vulnerability_open_source_funding/" target="_blank"&gt;The Register: Log4j doesn't just blow a hole in your servers, it's reopening that can of worms: Is Big Biz exploiting open source?&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://redis.io/blog/redis-adopts-dual-source-available-licensing/" target="_blank"&gt;Redis Adopts Dual Source-Available Licensing&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.theregister.com/2018/10/16/mongodb_licensning_change/" target="_blank"&gt;The Register: Fed up with cloud giants ripping off its database, MongoDB forks new 'open-source license'&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.geekersdigest.com/elastic-elasticsearch-open-source-license-change/" target="_blank"&gt;Geeker's Digest: Elastic changes its open source license, becomes "less open"&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.theregister.com/2005/04/14/torvalds_attacks_tridgell/" target="_blank"&gt;Torvalds knifes Tridgell&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://www.theregister.com/2023/06/23/red_hat_centos_move/" target="_blank"&gt;Red Hat strikes a crushing blow against RHEL downstreams&lt;/a&gt; 
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sun, 20 Jul 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-07-20:/web-en/posts/2025/on-software-licenses-morals-and-ethics.html</guid><category>Essay</category><category>essay</category><category>free-software</category><category>ethics</category></item><item><title>Mega65 a modern retromachine: first contact through the emulator</title><link>https://lucio.albenga.es/web-en/posts/2025/mega65-a-modern-retromachine-first-contact-throught-the-emulator.html</link><description>
&lt;figure id="org8edefe5"&gt;
&lt;img src="../../images/mega65-1/mega65-official-web.png" alt="mega65-official-web.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;Image of the Mega65 from the official website.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;
Some years ago I found by accident the Mega65&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, a new 8-bit computer, the succesor
of the never released Commodore C65. In fact this machine is based on Commodore C65 prototypes
and its ROM was based on that of the original C65, which logically contained many bugs yet to
be fixed, as it was only a prototype still in development.
&lt;/p&gt;

&lt;p&gt;
This computer uses an FPGA and, besides being an enhanced Commodore C65, it offers C64
compatibility both through the Mega65's own core, which replicates the compatibility layer
the Commodore engineers originally planned to include in the C65, and through a dedicated
core that fully emulates the C64. Currently there are other cores too like one of a ZX
Spectrum and another of a Gameboy.
&lt;/p&gt;

&lt;p&gt;
A few days ago, I remebred this project and I wanted to take another look at it to see how
it had evolved. I found out that besides BASIC and Assembler, now it could be programmed
with C and there is also a PASCAL environment available. I also noticed there was an emulator called
Xemu&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; so I decided to install it and check out the Mega65.
&lt;/p&gt;


&lt;div id="outline-container-org543593f" class="outline-2"&gt;
&lt;h2 id="org543593f"&gt;Installing and setting up Xemu&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org543593f"&gt;
&lt;p&gt;
You can find the source code of Xemu on GitHub&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;, but the developer provides several
packages&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;, including one for Ubuntu that works perfectly on my Devuan GNU+Linux
system. I downloaded and installed it.
&lt;/p&gt;

&lt;p&gt;
As usual, the emulator requires the system ROM. I followed Xemu's official docs&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; 
and everything worked flawlessly. The process is not difficult but it does require
some work on our part. First I obtained the Commodore C65 ROM searching for &lt;i&gt;910828.bin&lt;/i&gt;
on the internet. Then I downloaded the Mega65's ROM changes from the official files
site&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; (search for BDF).
&lt;/p&gt;

&lt;p&gt;
Once I had all the files I patched the C65 ROM with Mega65's changes. I installed
&lt;i&gt;bsdiff&lt;/i&gt; and then I used the command &lt;i&gt;bspatch&lt;/i&gt; which is part of &lt;i&gt;bsdiff&lt;/i&gt;.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo apt install bsdiff
bspatch 910828.bin new-920364.bin 920413/920413.bdf
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;910828&lt;/code&gt; is the C65's original ROM&lt;/li&gt;
&lt;li&gt;&lt;code&gt;new-920364.bin&lt;/code&gt; is the name of the patched ROM&lt;/li&gt;
&lt;li&gt;&lt;code&gt;920413/920413.bdf&lt;/code&gt; are the Mega65's changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
With the ROM and the emulator installed I launched the emulator and said YES when the
program asked if it should generate the initial virtual SD Card, etc. You can launch it
from your DE menu or from your cli with the command:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;xemu-xmega65
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To load the ROM I right clicked on Xemu's screen and then I chose
"Disks" -&amp;gt; "SD-card" -&amp;gt; "Update files on SD image". Then right clicked
again on Xemu's window and I chose "Reset/ROM Switching" -&amp;gt; "Reset". After
that I got the emulator working.
&lt;/p&gt;


&lt;figure id="org9f1f68e"&gt;
&lt;img src="../../images/mega65-1/mega65-basic2.png" alt="mega65-basic2.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 2: &lt;/span&gt;Image of the Mega65 system running under Xemu.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgc6e2380" class="outline-2"&gt;
&lt;h2 id="orgc6e2380"&gt;Checking out and enjoying the Mega65&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgc6e2380"&gt;
&lt;p&gt;
Next thing I did was to get the offical docs in order to see how to do
basic tasks on the system. I also did a few BASIC, basic tests ;), and
I downloaded and played the game "Meteor Defense" to check out if
the emulator was working. You can get the official docs, games and more
from the official Mega65 files site (check out the footnotes).
&lt;/p&gt;


&lt;figure id="org6c363b0"&gt;
&lt;img src="../../images/mega65-1/mega65-meteor.png" alt="mega65-meteor.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 3: &lt;/span&gt;Screenshot of Meteor Defense running on Xemu.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;
After playing with the game I decided to write a bigger program in BASIC, so I
typed the program "Monster Chase" from the book Stimulating Simulations by
C. William Engel&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt;. I run the program, saved it to a virtual disk image,
reload it from the virtual disk and run it again.
&lt;/p&gt;

&lt;p&gt;
The game worked flawlessly and I must confess I really enjoyed the experience of
typing a game in BASIC from a book to play with it. Although this might seem like
a joke nowadays, back when I started with computers in the 80s it was very common,
and I doubt anyone who hasn't gone through this ritual can truly understand or
appreciate it.
&lt;/p&gt;


&lt;figure id="orgd1cb1ed"&gt;
&lt;img src="../../images/mega65-1/mega65-basic3.png" alt="mega65-basic3.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 4: &lt;/span&gt;Screenshot of Monster Chase running on the Mega65 emulator.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;
After checking everything out with BASIC, I installed the llv-mos&lt;sup&gt;&lt;a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; compiler
on my system to cross-compile a C program for the Mega65. llvm-mos has a target
for the C64, mos-c64-clang, but it also has a specific target for the Mega65,
mos-mega65-clang. Sadly things didn't work out as expected.
&lt;/p&gt;

&lt;p&gt;
Compiling the program for the C64 and runnig it on the emulator using the Mega65's
compatibility layer for the C64 worked like a charm, but compiling the program
for the Mega65 and running it under the Mega65 regular mode it crashed. I didn't
know if it was something related to the compiler or the emulator.
&lt;/p&gt;


&lt;figure id="org802a81b"&gt;
&lt;img src="../../images/mega65-1/mega65-cprog64.png" alt="mega65-cprog64.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 5: &lt;/span&gt;C program runnig on Xemu under the Mega65's compatibility layer for C64.&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;figure id="org702cc66"&gt;
&lt;img src="../../images/mega65-1/mega65-cprog-fail.png" alt="mega65-cprog-fail.png"&gt;

&lt;figcaption&gt;&lt;span class="figure-number"&gt;Figure 6: &lt;/span&gt;The same C program running on Xemu under the Mega65's main mode.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id="outline-container-orgab26cce" class="outline-2"&gt;
&lt;h2 id="orgab26cce"&gt;Final thoughts&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgab26cce"&gt;
&lt;p&gt;
I have mixed feelings about this machine since the price isn't exactly
low, and the fact that such a simple program written in C didn't work
discouraged me quite a bit. However, I'll keep an eye on the project's
progress. In the meantime, I will continue enjoying it through the
emulator.
&lt;/p&gt;

&lt;p&gt;
Who knows what surprises this machine might hold in the future!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://mega65.org" target="_blank"&gt;Mega65 Official Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.lgb.hu/xemu/" target="_blank"&gt;Xemu's Official Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/lgblgblgb/xemu" target="_blank"&gt;Xemu on GitHub&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.lgb.hu/xemu/" target="_blank"&gt;Xemu's Packages Download Page&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/lgblgblgb/xemu/wiki/MEGA65-ROM-%22how-to-get-it%22-tutorial-for-Xemu" target="_blank"&gt;MEGA65 ROM "how to get it" tutorial for Xemu&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://files.mega65.org/html/main.php" target="_blank"&gt;Mega65 Files&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://archive.org/details/Stimulating_Simulations_1977_C_William_Engel" target="_blank"&gt;Stimulating Simulations at Archive.org&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://llvm-mos.org/wiki/Welcome" target="_blank"&gt;llvm-mos Official Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sat, 14 Jun 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-06-14:/web-en/posts/2025/mega65-a-modern-retromachine-first-contact-throught-the-emulator.html</guid><category>Retrocomputing</category><category>commodore</category><category>mega65</category><category>retrobytes</category></item><item><title>How To Create and Publish Your Website With Emacs and Org Mode</title><link>https://lucio.albenga.es/web-en/posts/2025/howto-create-and-publish-your-website-with-emacs-and-org-mode.html</link><description>&lt;p&gt;
This howto is a translation of the &lt;a href="https://lucio.albenga.es/web/posts/2024/como-crear-y-publicar-tu-sitio-web-con-emacs-y-org-mode.html"&gt;original one in Spanish&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Static site generators have been quite popular for some time now as a
way to create websites and most of them use Markdown as the markup
language to generate the site's HTML content. Org Mode is part of many Emacs
users daily routines, and once you are comfortable with it, it becomes a
real pleasure to use, so why not leverage it for website content creation as well?
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;In this howto we will see how to use Pelican static site generator to create a
website using Emacs Org Mode&lt;/b&gt;. This howto is not intended to cover all
of Pelican's features, capabilities, or configuration options. For a
complete reference, you should use the official documentation&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, which is
actually quite good and comprehensive.
&lt;/p&gt;

&lt;p&gt;
I'm assuming you already know what Emacs and Org Mode are, and that
you know how to use both. In fact, if you are reading this, chances are
you are a regular Org Mode user.
&lt;/p&gt;

&lt;div id="outline-container-org2084e61" class="outline-2"&gt;
&lt;h2 id="org2084e61"&gt;Installing Pelican and Setting Up The Base Website&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org2084e61"&gt;
&lt;p&gt;
&lt;b&gt;First step is to download and install Pelican&lt;/b&gt;. I do it with virtualenv
but you can check out other alternatives at Pelican's website&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;. I open a
terminal, navigate to the directory where I keep my virtual environments,
and then execute the following commands:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;virtualenv&lt;span class="w"&gt; &lt;/span&gt;pelican&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# creates the virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pelican/bin/activate&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# activates the virtual environment&lt;/span&gt;
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pelican&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# get and install Pelican&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you don't have &lt;i&gt;virtualenv&lt;/i&gt; already installed, probably you can find it
on your GNU/Linux distribution packages. If your system does not provide
the package check out Virtualenv's official docs&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
The virtual environment stays active in this terminal session until you run
&lt;code&gt;deactivate&lt;/code&gt;. &lt;b&gt;Don't do that yet, you still need it for the upcoming steps&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
Once you have Pelican installed you should follow the quickstart steps to create
the web site:
&lt;/p&gt;
&lt;div class="highlight"&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;/local/path/to/your/website/project/folder&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# create a folder for your web project&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/local/path/to/your/website/project/folder&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# mone inside the folder&lt;/span&gt;
pelican-quickstart&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="c1"&gt;# execute quickstart&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
As part of the quickstart process, Pelican will prompt you with a set of
questions to configure your website project. The answers will vary
depending on your needs, but here are the prompts with sample
responses to guide you:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Where&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;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;site?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;.&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;title&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;site?&lt;span class="w"&gt; &lt;/span&gt;My&lt;span class="w"&gt; &lt;/span&gt;Web&lt;span class="w"&gt; &lt;/span&gt;Site
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Who&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;author&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;site?&lt;span class="w"&gt; &lt;/span&gt;myself
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;language&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;site?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;en&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;specify&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;URL&lt;span class="w"&gt; &lt;/span&gt;prefix?&lt;span class="w"&gt; &lt;/span&gt;e.g.,&lt;span class="w"&gt; &lt;/span&gt;https://example.com&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Y
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;URL&lt;span class="w"&gt; &lt;/span&gt;prefix?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;see&lt;span class="w"&gt; &lt;/span&gt;above&lt;span class="w"&gt; &lt;/span&gt;example&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;trailing&lt;span class="w"&gt; &lt;/span&gt;slash&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://mysite.com
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&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;article&lt;span class="w"&gt; &lt;/span&gt;pagination?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Y
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;How&lt;span class="w"&gt; &lt;/span&gt;many&lt;span class="w"&gt; &lt;/span&gt;articles&lt;span class="w"&gt; &lt;/span&gt;per&lt;span class="w"&gt; &lt;/span&gt;page&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;you&lt;span class="w"&gt; &lt;/span&gt;want?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zone?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Europe/Rome&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;generate&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;tasks.py/Makefile&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;automate&lt;span class="w"&gt; &lt;/span&gt;generation&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;publishing?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Y
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;FTP?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;N
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;SSH?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;y
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;hostname&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;SSH&lt;span class="w"&gt; &lt;/span&gt;server?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;localhost&lt;span class="o"&gt;]&lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;SSH&lt;span class="w"&gt; &lt;/span&gt;server?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;What&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;username&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;server?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;root&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;user
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Where&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;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;put&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;that&lt;span class="w"&gt; &lt;/span&gt;server?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;/var/www&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;Dropbox?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;N
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;S3?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;N
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;Rackspace&lt;span class="w"&gt; &lt;/span&gt;Cloud&lt;span class="w"&gt; &lt;/span&gt;Files?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;N
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;you&lt;span class="w"&gt; &lt;/span&gt;want&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upload&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;website&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;GitHub&lt;span class="w"&gt; &lt;/span&gt;Pages?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;N
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
At this point, you can execute &lt;code&gt;deactivate&lt;/code&gt; on the terminal to leave the virtual
environment, we have a few things to take care of before we need it again.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org1c090b0" class="outline-2"&gt;
&lt;h2 id="org1c090b0"&gt;Setting Up Pelican for Org Mode&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org1c090b0"&gt;
&lt;p&gt;
&lt;b&gt;To accomplish our goal we will need the org_reader plugin&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/b&gt;. Let's get Pelican's
plugins. The quickest way to get the plugins is by cloning the GitHub
repo&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; and put them inside a folder. Navigate to the folder where you
want to store the plugins and clone the repo:
&lt;/p&gt;
&lt;div class="highlight"&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;/path/to/folder/where/plugins/will/be/stored
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;https://github.com/getpelican/pelican-plugins
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Now open the file &lt;b&gt;&lt;i&gt;pelicanconf.py&lt;/i&gt;&lt;/b&gt; and add the following right at the beginning:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="c1"&gt;# this line shold be already inside the file&lt;/span&gt;

&lt;span class="n"&gt;PLUGIN_PATHS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/path/to/pelican/plugins/folder&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;PLUGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;org_reader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you have an Emacs installation in a non-standard location, add the following line:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ORG_READER_EMACS_LOCATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/path/to/emacs/bin/emacs&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orge718975" class="outline-3"&gt;
&lt;h3 id="orge718975"&gt;Adding Syntax Highlighting&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orge718975"&gt;
&lt;p&gt;
&lt;b&gt;One thing I was missing on my website was syntax highlighting for
posts with source code&lt;/b&gt; like this one. After a bit of searching, I
found Anten Linevich's site&lt;sup&gt;&lt;a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt;, where he fixed it by creating a
&lt;i&gt;custom export backend&lt;/i&gt;. In order to do this let's open &lt;b&gt;&lt;i&gt;pelicanconf.py&lt;/i&gt;&lt;/b&gt;
again and add the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ORG_READER_EMACS_SETTINGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&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;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lisp/pelican-html.el&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ORG_READER_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;pelican-html&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;b&gt;Now you should create the custom export backend &lt;i&gt;pelican-html&lt;/i&gt;. Just
follow these steps&lt;/b&gt;:
&lt;/p&gt;
&lt;ol class="org-ol"&gt;
&lt;li&gt;Add inside your site's root folder a new folder named &lt;b&gt;lisp/&lt;/b&gt;. You can name
the folder whathever you want but the name has to match the path defined
on &lt;i&gt;ORG_READER_EMACS_SETTINGS&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
Inside the lisp/ folder, add a file named &lt;b&gt;&lt;i&gt;pelican-html.el&lt;/i&gt;&lt;/b&gt; and put the
following inside it:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;;; This code is (c) 2017 Anten Linevich and is released under&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;;; Creative Commons Attribution 4.0 Internacional License&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;;; https://linevi.ch/en/org-pygments.html&lt;/span&gt;

&lt;span class="w"&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;org&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;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ox&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;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;ox-html&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;org-export-define-derived-backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;pelican-html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;html&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;:translate-alist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;src-block&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;pelican/pygments-org-html-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="nv"&gt;example-block&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;pelican/pygments-org-html-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="k"&gt;defvar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pygments-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pygmentize&amp;quot;&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;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pelican/pygments-org-html-code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;contents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Process code block with Pygments See http://pygments.org/ for details&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;;; Generate temp file path by hashing current time and date.&lt;/span&gt;
&lt;span class="w"&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;temp-source-file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/tmp/pygmentize-%s.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;current-time-string&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="c1"&gt;;; Writing temp file&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-temp-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;temp-source-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-element-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;;; Processing&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command-to-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s -l \&amp;quot;%s\&amp;quot; -f html %s&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="nv"&gt;pygments-path&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="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-element-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;:language&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="nv"&gt;temp-source-file&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;provide&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;pelican-html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;Save the file and syntax highlighting will be ready to go.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgbc451c9" class="outline-2"&gt;
&lt;h2 id="orgbc451c9"&gt;Writing Your First Post&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgbc451c9"&gt;
&lt;p&gt;
Let's write a first post in order to see a basic template you can reuse
when writing new posts.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;There are a lot of properties (metadata in Pelican's jargon) which you can use to
set up a post. Here I'm only including the ones I consider most common
and/or important. You can check out Pelican's and org_reader's docs&lt;/b&gt; (see footnotes)
to get the full list.
&lt;/p&gt;

&lt;p&gt;
Inside the &lt;b&gt;content/&lt;/b&gt; folder of your Pelican website create a file &lt;b&gt;&lt;i&gt;hello-world.org&lt;/i&gt;&lt;/b&gt;
with the following content:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nn"&gt;#+TITLE:&lt;/span&gt; Hello World!
&lt;span class="nn"&gt;#+DATE:&lt;/span&gt; 2024-05-24
&lt;span class="nn"&gt;#+AUTHOR:&lt;/span&gt; admin
&lt;span class="nn"&gt;#+LANGUAGE:&lt;/span&gt; en
&lt;span class="nn"&gt;#+CATEGORY:&lt;/span&gt; Programming
&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; LANGUAGE en
&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; SLUG hello-world
&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; SUMMARY This is the post summary
&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; SUMMARY+ and it can have multiple lines
&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; TAGS programming, clang

Next we will see Hello World source code in C.
&lt;span class="ow"&gt;#+BEGIN_SRC c&lt;/span&gt;
  #include &amp;lt;stdio.h&amp;gt;
  int main(void)
  {
          printf(&amp;quot;Hello World!&amp;quot;);
          return 0;
  }
&lt;span class="ow"&gt;#+END_SRC&lt;/span&gt;


#+BEGIN_EXPORT html
&lt;span class="ld"&gt;&amp;lt;hr&amp;gt;&lt;/span&gt;
&lt;span class="ld"&gt;&amp;lt;center&amp;gt;&amp;lt;small&amp;gt;&lt;/span&gt;
And this is a HTML block.
&lt;span class="ld"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;span class="ld"&gt;&amp;lt;a href=&amp;quot;https://creativecommons.org/licenses/by-nd/4.0/&amp;quot;&amp;gt;&lt;/span&gt;Creative Commons Attribution-NoDerivs 4.0 International (CC BY-ND 4.0)&lt;span class="ld"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="ld"&gt;&amp;lt;/p&amp;gt;&amp;lt;/small&amp;gt;&lt;/span&gt;
&lt;span class="ld"&gt;&amp;lt;/center&amp;gt;&lt;/span&gt;
&lt;span class="ld"&gt;&amp;lt;hr&amp;gt;&lt;/span&gt;
#+END_EXPORT
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Let's see the meaning of all these properties:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;#+TITLE: Hello World!&lt;/b&gt; this is the only mandatory property.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+DATE: 2024-05-24&lt;/b&gt; the date of the document. It could be an iso format date or an Org Mode timestamp.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+AUTHOR: admin&lt;/b&gt; author name&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+LANGUAGE: en&lt;/b&gt; document language for Org Mode&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+CATEGORY: Programación&lt;/b&gt; post category&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+PROPERTY: LANGUAGE es&lt;/b&gt; document language for Pelican&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+PROPERTY: SLUG hello-world&lt;/b&gt; if you don't use this property, Pelican will use file_name.org&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+PROPERTY: SUMMARY&lt;/b&gt; post summary&lt;/li&gt;
&lt;li&gt;&lt;b&gt;#+PROPERTY: TAGS programming, clang&lt;/b&gt; all the tags you want to use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;b&gt;Apart from the properties shown in the example, there is one I find essential: #+PROPERTY: STATUS&lt;/b&gt;.
This property can have the following values:
&lt;/p&gt;
&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;b&gt;published&lt;/b&gt;: this is the default status&lt;/li&gt;
&lt;li&gt;&lt;b&gt;draft&lt;/b&gt;: post will be stored inside the &lt;b&gt;drafts/&lt;/b&gt; folder, inside the website, and it will not be linked anywhere.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hidden&lt;/b&gt;: post is not linked anywhere, so you should know the exact URL to get to it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Therefore, if you want to have a hidden post, you should add this property:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nn"&gt;#+PROPERTY:&lt;/span&gt; STATUS hidden
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org918ed83" class="outline-2"&gt;
&lt;h2 id="org918ed83"&gt;Previewing and Publishing Your Website&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org918ed83"&gt;
&lt;p&gt;
The moment of truth has arrived, time to see the results of all the
work you have done, check that everything works, and find out how to
generate and publish your new website
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;From inside your site's root folder follow these steps&lt;/b&gt;:
&lt;/p&gt;
&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;p&gt;
Activate the virtual environment
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/path/to/pelican/virtualenv/bin/activate
&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
Start the site preview in your local system by running:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;devserver
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
If you look closely, the previous command will return, among other things, the following:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;Serving&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;at:&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:8000&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Tap&lt;span class="w"&gt; &lt;/span&gt;CTRL-C&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;b&gt;Copy &amp;amp; paste the url &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt; in your favourite web browser in order
to see your website&lt;/b&gt;. The &lt;i&gt;devserver&lt;/i&gt; mode automatically rebuilds the website whenever
changes are saved in the *.org file, allowing you to view the updates instantly by refreshing
the browser.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
You can quit the &lt;i&gt;devserver&lt;/i&gt; mode by pressing the keys &lt;b&gt;CTRL-C&lt;/b&gt;. Now you can publish your
website by running:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;rsync_upload
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Executing this command will rebuild the whole site and deploy it to
the destination configured during the quickstart setup. &lt;b&gt;If this
doesn't work or isn't available, open the Makefile located in the
root directory of your website, where you will find all the possible
deployment options&lt;/b&gt; (ssh_upload, sftp_upload,&amp;#x2026;).
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org22e482d" class="outline-2"&gt;
&lt;h2 id="org22e482d"&gt;Next Steps&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org22e482d"&gt;
&lt;p&gt;
This howto has introduced the basics of creating a website using
Pelican and managing content with Emacs and Org Mode. The next step is
to explore Pelican in more depth to customize your site. Consult the
Pelican documentation, choose a theme&lt;sup&gt;&lt;a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; you like, or make a custom one.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgb8a38a1" class="outline-2"&gt;
&lt;h2 id="orgb8a38a1"&gt;Acknowledgements&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgb8a38a1"&gt;
&lt;p&gt;
I want to thank BxCx from #emacs-es channel on Libera.chat&lt;sup&gt;&lt;a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; because the idea
for this howto originated when he started talking about creating a static site
with Emacs, and he asked me about how I built my site.
&lt;/p&gt;

&lt;p&gt;
I want to thank Anten Linevich because without his post I wouldn't have
figured out how to enable syntax highlighting.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgfddb1a4" class="outline-2"&gt;
&lt;h2 id="orgfddb1a4"&gt;Copyright&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgfddb1a4"&gt;
&lt;p&gt;
This howto is Copyright © 2024-2025 Lucio F. Albenga and is released
under the terms of the &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank"&gt;Creative Commons Attribution-ShareAlike 4.0
International (CC BY-SA 4.0)&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Source code of pelican-html.el file is Copyright © 2017-2024 Anten
Linevich &lt;a href="https://creativecommons.org/licenses/by/4.0/" target="_blank"&gt;Creative Commons Attribution 4.0 International (CC BY 4.0)&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://docs.getpelican.com/en/latest/index.html" target="_blank"&gt;Pelican Official Documentation&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://docs.getpelican.com/en/latest/install.html" target="_blank"&gt;Pelican Official Documentation: Installing Pelican&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://virtualenv.pypa.io/en/latest/installation.html" target="_blank"&gt;Virtualenv Official Documentation&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/org_reader" target="_blank"&gt;Org-reader Plugin&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/getpelican/pelican-plugins" target="_blank"&gt;Pelican Plugins on GitHub&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://linevi.ch/en/category/emacs.html" target="_blank"&gt;Anten Linevich's Website&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://github.com/getpelican/pelican-themes" target="_blank"&gt;Pelican Themes on GitHub&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink"&gt;8&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://libera.chat/" target="_blank"&gt;Libera.chat&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Sun, 01 Jun 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-06-01:/web-en/posts/2025/howto-create-and-publish-your-website-with-emacs-and-org-mode.html</guid><category>Emacs</category></item><item><title>FreeBSD: KLD i915kms.ko depends on kernel - not available or version mismatch</title><link>https://lucio.albenga.es/web-en/posts/2025/2025-04-17_KLD-i915kms-ko-depends-on-kernel-not-available-or-version-mismatch.html</link><description>&lt;p&gt;
After upgrading from FreeBSD 14.1 to FreeBSD 14.2 some people like
me had some problems because the graphics modules were built for 14.1
only. One of the drawbacks was loosing access to virtual terminals.
Let's see how I solved that problem and I got rid of the: "KLD i915kms.ko
depends on kernel - not available or version mismatch", error.
&lt;/p&gt;

&lt;div id="outline-container-org58dad81" class="outline-2"&gt;
&lt;h2 id="org58dad81"&gt;First attempt&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org58dad81"&gt;
&lt;p&gt;
At first, I checked out the internet and it seems it was a
documented problem. Many people were telling to rebuild
the &lt;i&gt;drm-61-kmod&lt;/i&gt; package from &lt;i&gt;ports tree&lt;/i&gt;, so I tried that
approach first.
&lt;/p&gt;

&lt;p&gt;
Following The FreeBSD Handbook&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt;, I cloned the &lt;i&gt;ports tree&lt;/i&gt; from git:
&lt;/p&gt;
&lt;div class="highlight"&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;--depth&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;https://git.FreeBSD.org/ports.git&lt;span class="w"&gt; &lt;/span&gt;/usr/ports
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then I built the &lt;i&gt;drm-61-kmod&lt;/i&gt;:
&lt;/p&gt;
&lt;div class="highlight"&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/ports/graphics/drm-61-kmod/
make
make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
I got a message about that I already have that module installed followed
by the instructions to reinstall it, so I executed &lt;code&gt;make reinstall&lt;/code&gt; on my
console, restarted the system, and hoped for the best. It didn't work.
&lt;/p&gt;

&lt;p&gt;
I kept searching for my problem and I found another thread about rebuilding
&lt;i&gt;drm-kmod&lt;/i&gt; too. I did it:
&lt;/p&gt;
&lt;div class="highlight"&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/ports/graphics/drm-kmod/
make
make&lt;span class="w"&gt; &lt;/span&gt;reinstall
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
But it didn't work. I noticed that I got the following error on &lt;i&gt;dmesg&lt;/i&gt;:
&lt;b&gt;KLD i915kms.ko depends on kernel - not available or version mismatch.&lt;/b&gt;
I know I have the module loaded, so I started to look for other modules that maybe
I need to build in &lt;i&gt;ports&lt;/i&gt;, especially things related to i915. I found the port
&lt;i&gt;/usr/ports/graphics/gpu-firmware-kmod&lt;/i&gt;, so I built it:
&lt;/p&gt;
&lt;div class="highlight"&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/ports/graphics/gpu-firmware-kmod/
make
make&lt;span class="w"&gt; &lt;/span&gt;reinstall
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Restarted the system only to find out that the very same error was still there.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgdb16340" class="outline-2"&gt;
&lt;h2 id="orgdb16340"&gt;Second attempt&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgdb16340"&gt;
&lt;p&gt;
At that point I thought: "ok, maybe I messed up by building the modules
in a wrong order or something. Let's redo it". First, I uninstalled and
cleaned the build of all those modules:
&lt;/p&gt;
&lt;div class="highlight"&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/ports/graphics/gpu-firmware-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../drm-61-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../drm-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then I rebuilt the modules. This time I started by building
&lt;i&gt;drm-kmod&lt;/i&gt;. Doing this I discovered that  &lt;i&gt;drm-kmod&lt;/i&gt; automatically
builds also &lt;i&gt;drm-61-kmod&lt;/i&gt;. I built also the &lt;i&gt;gpu-firmware-kmod&lt;/i&gt;, installed
the modules and restarted the system. This time for sure things are going
to work&amp;#x2026; Nope! After rebooting the system, &lt;i&gt;dmesg&lt;/i&gt; was still showing
that damn message.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org783a980" class="outline-2"&gt;
&lt;h2 id="org783a980"&gt;Final solution&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org783a980"&gt;
&lt;p&gt;
I'm new to FreeBSD, but I was using, setting up, and administering
GNU/Linux systems since the 90s, thus I thought the solution to that pesky
&lt;b&gt;KLD i915kms.ko depends on kernel - not available or version mismatch&lt;/b&gt; error,
could be solved by building a new kernel and the modules, to have everything
in sync.
&lt;/p&gt;

&lt;p&gt;
I cloned the kernel sources from FreeBSD's git&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt;
&lt;/p&gt;
&lt;div class="highlight"&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;https://git.FreeBSD.org/src.git
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then I checked out the sources for the kernel version for FreeBSD 14.2
(at the moment of this writing they are under the tag &lt;i&gt;release/14.2.0-p3&lt;/i&gt;):
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;--all&lt;span class="w"&gt; &lt;/span&gt;--tags&lt;span class="w"&gt; &lt;/span&gt;--prune
git&lt;span class="w"&gt; &lt;/span&gt;checkout&lt;span class="w"&gt; &lt;/span&gt;release/14.2.0-p3
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then I rebuilt the GENERIC kernel because I don't use a custom one. If
you use a custom kernel, you already know the steps you should take to
build it.
&lt;/p&gt;
&lt;div class="highlight"&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
make&lt;span class="w"&gt; &lt;/span&gt;buildkernel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KERNCONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;GENERIC
make&lt;span class="w"&gt; &lt;/span&gt;installkernel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KERNCONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;GENERIC
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
With the new kernel, I rebuilt and reinstalled the modules:
&lt;/p&gt;
&lt;div class="highlight"&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/ports/graphics/gpu-firmware-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/ports/graphics/drm-61-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/ports/graphics/drm-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;deinstall
make&lt;span class="w"&gt; &lt;/span&gt;clean
make
make&lt;span class="w"&gt; &lt;/span&gt;install

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../drm-61-kmod/
make&lt;span class="w"&gt; &lt;/span&gt;install

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;../gpu-firmware-kmod/
make
make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Then I restarted the system and now everything works as expected.
Mission accomplished!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org3490d74" class="outline-2"&gt;
&lt;h2 id="org3490d74"&gt;Final words&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org3490d74"&gt;
&lt;p&gt;
I have to say that it was really fun because it took me back to the good old
days when you had to compile the Linux kernel in order to make your hardware
work. I haven't compiled a kernel in about 20 years or so. Probably there is
a better approach but this one worked for me and maybe it will work for others
too.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://docs.freebsd.org/en/books/handbook/" target="_blank"&gt;FreeBSD Handbook&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://cgit.freebsd.org/" target="_blank"&gt;FreeBSD Git&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Thu, 17 Apr 2025 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2025-04-17:/web-en/posts/2025/2025-04-17_KLD-i915kms-ko-depends-on-kernel-not-available-or-version-mismatch.html</guid><category>Systems</category><category>FreeBSD</category><category>graphics</category><category>sysops</category></item><item><title>Quasijarus2Gzip: How A Program Starts By Accident</title><link>https://lucio.albenga.es/web-en/posts/2024/quasijarus2gzip-how-a-program-starts-by-accident.html</link><description>&lt;p&gt;
It turns out that recently I got an old *.tar.Z file with source code of
various very old Unix programs. I was curious about some of them
like a very old version of sendmail, but when I tried to decompress
one of the files I found out that I couldn't.
&lt;/p&gt;

&lt;p&gt;
Previously I had already decompressed *.tar.Z files with gzip so the
next thing I did was to see exactly what that *.tar.Z file was. To do
this I used the &lt;code&gt;file&lt;/code&gt; command and found out that it was a Quasijarus
Strong Compression Data file. I didn't know what it was so I kept 
investigating.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;My next step was to find out exactly what the Quasijarus Strong Compression
Data format was&lt;/b&gt;. First I found a brief description of the format&lt;sup&gt;&lt;a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; which
contained links to the Quasijarus project website. These links are no
longer online, but thanks to archive.org&lt;sup&gt;&lt;a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; I was able to see the
Quasijarus project website&lt;sup&gt;&lt;a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; and specifically the information on
the compression format&lt;sup&gt;&lt;a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt;.
&lt;/p&gt;

&lt;p&gt;
After reading it all, the main points for me were:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;The file format is based on Gzip and both formats only differ in
their headers.&lt;/li&gt;
&lt;li&gt;The header of the Quasijarus Strong Compression Data format is
only composed by the 0x1f 0xa1 bytes (magic number).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
So I decided to make a Quasijarus Strong Compression Data to Gzip
converter as it couldn't be very complicated. It also provided to me
an excuse to have some fun ;p.
&lt;/p&gt;

&lt;p&gt;
The last step was to find out the format of the header of the Gzip file
format. According to its specification&lt;sup&gt;&lt;a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt;, it has a header of 10 bytes
distributed as follows:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;2 bytes for the magic number 0x1f 0x8b&lt;/li&gt;
&lt;li&gt;1 byte for the compression algorithm (08 for DEFLATE).&lt;/li&gt;
&lt;li&gt;1 byte for headers flags that could be set to 0.&lt;/li&gt;
&lt;li&gt;4 bytes for the file timestamp that can also be set to 0.&lt;/li&gt;
&lt;li&gt;1 byte for compression flags that can be set to 0 too.&lt;/li&gt;
&lt;li&gt;1 byte for the operating system identifier (3 for Unix)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;b&gt;With all this information I made my Quasijarus Strong Compression Data
to Gzip converter. You can download it &lt;a href="../../projects/quasijarus-2-gzip.html"&gt;here&lt;/a&gt;&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
(This post is a translation of the &lt;a href="https://lucio.albenga.es/web/posts/2023/quasijarus2gzip-como-se-empieza-un-programa-por-casualidad.html"&gt;original one in Spanish&lt;/a&gt;).
&lt;/p&gt;
&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;Footnotes: &lt;/h2&gt;
&lt;div id="text-footnotes"&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="http://justsolve.archiveteam.org/wiki/Quasijarus_Strong_Compression" target="_blank"&gt;Quasijarus Strong Compression&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://web.archive.org/%20" target="_blank"&gt;Wayback machine at archive.org&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://web.archive.org/web/20210918003410/https://ifctfvax.superglobalmegacorp.com/" target="_blank"&gt;Quasijarus Project&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink"&gt;4&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://web.archive.org/web/20210816085748/https://ifctfvax.superglobalmegacorp.com/compress.html" target="_blank"&gt;Quasijarus Compress&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footdef"&gt;&lt;sup&gt;&lt;a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;div class="footpara" role="doc-footnote"&gt;&lt;p class="footpara"&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc1952" target="_blank"&gt;RFC1952&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2024-10-30:/web-en/posts/2024/quasijarus2gzip-how-a-program-starts-by-accident.html</guid><category>Programming</category><category>programming</category><category>projects</category><category>C</category></item><item><title>Hello World!</title><link>https://lucio.albenga.es/web-en/posts/2024/hello-world.html</link><description>&lt;p&gt;
When you learn a new programming language it is customary to do the program Hello World!.
My first programming language was &lt;i&gt;BASIC&lt;/i&gt; and I didn't do the classic Hello World!, I did a program
that displayed my name on screen.
&lt;/p&gt;

&lt;p&gt;
My first &lt;i&gt;Hello World!&lt;/i&gt;, like that of many other programmers, was the one from the book: The C Programming Language,
also known as K&amp;amp;R, by Brian W. Kernigham and Dennis M. Ritchie.
&lt;/p&gt;

&lt;p&gt;
I think it is quite appropriate to follow tradition and start with a Hello World!, and nothing better than making it in C.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lfa</dc:creator><pubDate>Wed, 15 May 2024 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:lucio.albenga.es,2024-05-15:/web-en/posts/2024/hello-world.html</guid><category>Blog</category><category>blog</category></item></channel></rss>