{"title":"The Code Wanderer","subtitle":"Wandering through OpenBSD, privacy, security, programming, and data science. Powered by open source.","link":[{"@attributes":{"rel":"self","type":"application\/atom+xml","href":"https:\/\/hervyqa.srht.site\/atom.xml"}},{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site"}}],"generator":"Zola","updated":"2026-07-30T00:00:00+00:00","id":"https:\/\/hervyqa.srht.site\/atom.xml","entry":[{"title":"Switching to OpenBSD as the Primary Operating System","published":"2026-07-29T00:00:00+00:00","updated":"2026-07-30T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/switch-from-linux-based-to-openbsd\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/switch-from-linux-based-to-openbsd\/","content":"<h2 id=\"complete-operating-system\">Complete operating system<a class=\"post-anchor\" href=\"#complete-operating-system\" aria-label=\"Anchor link for: complete-operating-system\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>This is a solid reason why I left linux-based systems. \n\n<a href=\"https:\/\/www.openbsd.org\">OpenBSD<\/a> is an operating system which includes kernel, userland,\ndocumentation, init, utilities, configuration tools, display servers,\naudio support, and core components developed by OpenBSD teams. \n\n<a href=\"https:\/\/www.kernel.org\">Linux<\/a> is different, linux just a kernel, a piece software\nmanages hardware, memories, processes, and system calls. Linux does not\nprovide the userland tools, libraries, shells, or utilities necessary\nto make a computer usable for everyday tasks, wether for server, desktop\nor workstation. Linux is not complete operating system without GNU\nutilities, init system, display managers and others. That is why Linux\nkernel cannot stand alone without userland software.<\/p>\n<p>OpenBSD functions as a singular, cohesive operating system project.\nThe Linux kernel on the other hand is merely a component, it is not\nan operating system in itself. What we commonly refer to as \u201cLinux\u201d\nare actually distributions like Debian, Arch, or Fedora, which take\nthe Linux kernel and bundle it with their own specific choices and\nconfiguration.<\/p>\n<h2 id=\"secure-by-default\">Secure by default<a class=\"post-anchor\" href=\"#secure-by-default\" aria-label=\"Anchor link for: secure-by-default\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>OpenBSD carries minimal services by default, only the essential services\nare enabled. Other services, such as telnet and FTP, are disabled by\ndefault to significantly reduce the attack surface. OpenBSD has only two\nremote access points by default installation, which sets it distinctly\napart from Linux-based operating systems. When comparing CVE databases,\nOpenBSD has approximately \n\n<a href=\"https:\/\/app.opencve.io\/cve\/?vendor=openbsd&product=openbsd\">200<\/a> known\nCVEs, whereas Linux has \n\n<a href=\"https:\/\/app.opencve.io\/cve\/?vendor=linux&product=linux\">20.000<\/a> CVEs.\nThis disparity highlights the extensive security vulnerabilities within\nthe Linux kernel.<\/p>\n<p>The OpenBSD source code has undergone rigorous auditing by developers.\nAll base components have been strictly audited manually, including\nthe kernel, libc, init, and utilities. Furthermore, all source code is\naccessible via \n\n<a href=\"https:\/\/www.openbsd.org\/anoncvs.html\">AnonCVS<\/a> or \n\n<a href=\"https:\/\/cvsweb.openbsd.org\">CVSWeb<\/a>.<\/p>\n<p>OpenBSD also serves as the upstream origin for several widely\nused pieces of software, such as OpenSSH, OpenBGPF, PF, OpenSMTPd,\nLibreSSL, iked, mandoc, and numerous others <span class=\"ref-placeholder\" data-ref=\"hansteen2021\">(<a href=\"#ref-hansteen2021\">Hansteen, Peter<\/a>)<\/span>. Moreover, OpenBSD boasts many other \n\n<a href=\"https:\/\/www.openbsd.org\/innovations.html\">Innovations<\/a> available on its official website.<\/p>\n<h2 id=\"unix-philosophy\">UNIX philosophy<a class=\"post-anchor\" href=\"#unix-philosophy\" aria-label=\"Anchor link for: unix-philosophy\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>The OpenBSD community adheres strongly to core UNIX principles.\nParticularly <strong>code correctness<\/strong> which is minimizing unnecessary\ncode is paramount as it directly mitigates vulnerabilities. OpenBSD\u2019s\ncodebase is characterized by minimalism and simplicity, making it\nexceptionally easy to audit and maintain. Furthermore, the design\nphilosophy emphasizes that each program should do one thing well. This\ncontrasts sharply with many Linux-based systems, where the system,\ninit process handles numerous tasks, leading to complexity that is much\nharder to audit and prone to excessive, unnecessary features.<\/p>\n<p>OpenBSD\u2019s commitment to hardware is also tight, focusing only on\nhardware with full compatibility. As a result, every hardware component\nbenefits from high quality and thorough documentation. This approach\nprioritizes strong, secure code correctness over sheer feature quantity.\nConsequently, some modern hardware, like Wi-Fi cards, OpenBSD may\ncurrently not support.<\/p>\n<h2 id=\"the-documentation\">The documentation<a class=\"post-anchor\" href=\"#the-documentation\" aria-label=\"Anchor link for: the-documentation\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Every program on OpenBSD comes with excellent documentation. Users\ncan search and read the \n\n<a href=\"https:\/\/man.openbsd.org\">Manual<\/a> page easily. Probably\nno operating system documentation in the world are better or more\ncomprehensive than OpenBSD\u2019s. Every binary, library, driver, or\nscript delivered in the base system includes its own <code>manpage<\/code> <span class=\"ref-placeholder\" data-ref=\"baumann2019\">(<a href=\"#ref-baumann2019\">Baumann, Florian<\/a>)<\/span>. For example, you can consult\nthe manuals for commands like \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/mount.8\">mount(8)<\/a>, \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/rcctl.8\">rcctl(8)<\/a>, and \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/sysupgrade.8\">sysupgrade(8)<\/a>. The documentation is complete,\naccurate, and consistent. Even every new OpenBSD releases, the\ndocumentation and changelogs are excellent.<\/p>\n<p>As an OpenBSD user, you must be comfortable using \n\n<a href=\"https:\/\/man.openbsd.org\/man1\/man.1\">man(1)<\/a>\nand \n\n<a href=\"https:\/\/man.openbsd.org\/man1\/help.1\">help(1)<\/a> commands to grasp system functionality. Reading\nman pages is superior to browsing external resources.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>man man<\/span><\/span>\n<span class=\"giallo-l\"><span>man rcctl<\/span><\/span>\n<span class=\"giallo-l\"><span>man afterboot<\/span><\/span>\n<span class=\"giallo-l\"><span>man sysupgrade<\/span><\/span><\/code><\/pre>\n<p>Man pages are categorized into several types:<\/p>\n<ol>\n<li>General commands (tools and utilities).<\/li>\n<li>System calls and error numbers.<\/li>\n<li>Library functions.<\/li>\n<li>Programmer\u2019s reference guide.<\/li>\n<li>Device drivers.<\/li>\n<li>File formats.<\/li>\n<li>Games.<\/li>\n<li>Miscellaneous information.<\/li>\n<li>System maintenance and operation commands.<\/li>\n<li>Kernel internals.<\/li>\n<\/ol>\n<p>OpenBSD also features comprehensive \n\n<a href=\"https:\/\/www.openbsd.org\/faq\/index.html\">FAQ<\/a> pages\nthat provide technical explanations like covering hardware support,\ninstallation, verification, partitioning, disk encryption, package\nmanagement, networking, multimedia, virtualization, and deep-dive\ntutorials to help users understand any complex topic.<\/p>\n<h2 id=\"the-installer-experience\">The installer experience<a class=\"post-anchor\" href=\"#the-installer-experience\" aria-label=\"Anchor link for: the-installer-experience\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>The initial installation is straightforward. It uses a text-based\ninterface, which might confuse users accustomed to a GUI, but is\neasy to understand, covering only basic questions. The installer\nsupports \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/autoinstall.8\">autoinstall(8)<\/a>, to upgrade to a release version\nuse \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/sysupgrade.8\">sysupgrade(8)<\/a>. Linux users, users should note that\nsome initial configurations differ slightly. The default OpenBSD\nfilesystem is <code>FFS2<\/code>, and the disk scheme similar to <code>\/dev\/sdXN<\/code>\n(e.g., <code>\/dev\/sd01<\/code>). However, OpenBSD surprisingly creates an automatic\npartition alongside \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/fdisk.8\">fdisk(8)<\/a> to manage all partitions.<\/p>\n<p>The installer defaults to encrypting the disk using \n\n<a href=\"https:\/\/man.openbsd.org\/man4\/softraid.4\">softraid(4)<\/a> and \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/bioctl.8\">bioctl(8)<\/a>. Unlocking requires\na passphrase. For Linux-based distributions, this full-disk encryption\nfeature is not enabled by default.<\/p>\n<p>The installer does not ship with non-free firmware, especially for Wi-Fi\ncards <span class=\"ref-placeholder\" data-ref=\"strus2021\">(<a href=\"#ref-strus2021\">Stru\u015b, Marcin<\/a>)<\/span>. However, after the first\nreboot, the system automatically executes \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/fw_update.8\">fw_update(8)<\/a> to\ndownload and install the required non-free firmware for all detected\ndevices. For new users, I highly recommend reading the useful manuals \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/afterboot.8\">afterboot(8)<\/a> after installation.<\/p>\n<h2 id=\"simple-init-system\">Simple init system<a class=\"post-anchor\" href=\"#simple-init-system\" aria-label=\"Anchor link for: simple-init-system\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>OpenBSD uses \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/rc.8\">rc(8)<\/a> (init daemon) and \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/rcctl.8\">rcctl(8)<\/a> for control services. This init system is simple, script-driven, and\nminimal in functionality. There is no bloat, every service is managed\nby a traditional shell script stored in <code>\/etc\/rc.d\/*<\/code> and run by <code>rc<\/code>\ninit. Using this init improves trust and security by reducing the attack\nsurface.<\/p>\n<p>OpenBSD\u2019s init follows KISS (Keep It Simple Stupid) principles. There\nare no complex daemons, no hidden background processes, no device\nmanagers, no login managers, no network managers, no binary output. The\nsystem is running as it should.<\/p>\n<p>This init has high auditability because each service is a transparent\nshell script, making it easier to audit for security. This approach is\nimportant for the OpenBSD project.<\/p>\n<h2 id=\"clear-license\">Clear license<a class=\"post-anchor\" href=\"#clear-license\" aria-label=\"Anchor link for: clear-license\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Sometimes people ask or complain that OpenBSD does not support specific\nsoftware or hardware. The issue is that not every software license\nallows for free redistribution or recompilation from source. OpenBSD\nonly accepts the ISC or Berkeley style license for software, the GPL\nis not acceptable. This is not a drawback to supporting all software\nor hardware, but rather <strong>a consequence and a choice<\/strong>. It is amusing\nif people accuse OpenBSD of not supporting a particular software and\nconsider it a drawback without knowing the actual license terms. OpenBSD\nfreely allows redistribution of both binary and source code, and remains\nusable by anyone for any purpose.<\/p>\n<p>Basically, OpenBSD carries free drivers and firmware on the system base.\nAfter installation, it automatically executes \n\n<a href=\"https:\/\/man.openbsd.org\/man8\/fw_update.8\">fw_update(8)<\/a>,\nwhich downloads and installs non-free firmware, including <code>vmm-firmware<\/code>\nfor virtualization.<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"post-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>There are several benefits to using OpenBSD as a daily driver. Users\ncan learn about the UNIX style as a platform. It has tidy and complete\ndocumentation \n\n<a href=\"https:\/\/man.openbsd.org\/man1\/man.1\">man(1)<\/a> and \n\n<a href=\"https:\/\/man.openbsd.org\/man1\/help.1\">help(1)<\/a> (pages for\neach kernel, library, script, daemon, utility, and single binary).\nCoding style is with \n\n<a href=\"https:\/\/man.openbsd.org\/man9\/style.9\">style(9)<\/a>, allowing users to write\nmodular code and easily to read. Scripting uses \n\n<a href=\"https:\/\/man.openbsd.org\/man1\/ksh.1\">ksh(1)<\/a>\nas a default shell. Bugs are mitigated with \n\n<a href=\"https:\/\/man.openbsd.org\/man2\/pledge.2\">pledge(2)<\/a>, \n\n<a href=\"https:\/\/man.openbsd.org\/man2\/unveil.2\">unveil(2)<\/a>, KARL (Kernel Address Randomized Link), W^X memory\nprotections, and other \n\n<a href=\"https:\/\/www.openbsd.org\/security.html\">Security<\/a> features. Firewall\nrules are set with \n\n<a href=\"https:\/\/man.openbsd.org\/man4\/pf.4\">pf(4)<\/a>. Server setups such as web, mail,\nDNS, WireGuard, virtualization, and others.<\/p>\n<p>Users adopt a security-first mindset from the beginning, do one thing\nand do it well. OpenBSD has a permissive license, allowing every user\nto freely to modify, redistribute, and learn from the code without\nrestriction from complex GPL.<\/p>\n<p>Furthermore, users acquire deeper technical knowledge and cultivate\na security-conscious, responsible mindset. An assets highly valued in\noperating-system development and cyber security practice.<\/p>\n"},{"title":"How I Wrote an Article with Markdown and Zola","published":"2026-07-22T00:00:00+00:00","updated":"2026-07-25T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/how-i-wrote-an-article\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/how-i-wrote-an-article\/","content":"<p>Actually my initial idea is to create a guide to explain how to write\narticles on Markdown. But, let me explain alongside a more specific\nstatic site generator with custom shortcodes. I used \n\n<a href=\"https:\/\/www.getzola.org\">Zola<\/a> a static site generator <span class=\"ref-placeholder\" data-ref=\"prouillet2018\">(<a href=\"#ref-prouillet2018\">Prouillet, Vincent<\/a>)<\/span> to\nproduce website, previously my website was built with a different static\nweb generator. This seems difficult to optimize. At other times I will\nexplain why I migrate in-deep.<\/p>\n<p>Markdown is everywhere, also plays a critical role in the world of\nopen source software and web development <span class=\"ref-placeholder\" data-ref=\"donwatkins2025\">(<a href=\"#ref-donwatkins2025\">Watkins, Don<\/a>)<\/span>. The documentation I read is always written in\nMarkdown.<\/p>\n<h2 id=\"document-settings\">Document settings<a class=\"post-anchor\" href=\"#document-settings\" aria-label=\"Anchor link for: document-settings\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>There are several settings before writing an article. Create a user\nprofile, manage the zola config, create a post directory and front\nmatter.<\/p>\n<h3 id=\"user-profile\">User profile<a class=\"post-anchor\" href=\"#user-profile\" aria-label=\"Anchor link for: user-profile\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Before I write an article, I have to create a user file in the data\ndirectory. The user retrieves the data from the <code>toml<\/code> file. For\nexample, my current user identifier is <code>hervyqa<\/code>. I made <code>hervyqa.toml<\/code>\nand saved to <code>data\/authors\/hervyqa.toml<\/code>. Users can use any user\nidentification they want.<\/p>\n<p>For instance, <code>hervyqa.toml<\/code> is my user data:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"data\/authors\/hervyqa.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-variable\">name<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Hervy Qurrotul<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">email<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">hervyqa@disroot.org<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">3<\/span><span class=\"z-variable\">sourcehut<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">4<\/span><span class=\"z-variable\">codeberg<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">5<\/span><span class=\"z-variable\">mastodon<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">datasci.social\/@hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span><\/code><\/pre><h3 id=\"zola-configuration\">Zola configuration<a class=\"post-anchor\" href=\"#zola-configuration\" aria-label=\"Anchor link for: zola-configuration\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Zola configuration is available in <code>zola.toml<\/code> or <code>config.toml<\/code> file.\nBelow is \n\n<a href=\"https:\/\/git.sr.ht\/~hervyqa\/termivy\">Termivy<\/a> theme configuration. I enable the table\nof content (toc), license, citation, bibtex, attribution, and additional\nnotes.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"zola.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span class=\"z-punctuation\">[<\/span><span>extra<\/span><span>.<\/span><span>toc<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span class=\"z-variable\">enable<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-punctuation\">[<\/span><span>extra<\/span><span>.<\/span><span>content<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-variable\">license<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-variable\">license_type<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">cc-by<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-variable\">citation<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><span class=\"z-variable\">citation_bibtex<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-variable\">citation_attribution<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-variable\">note<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span><\/code><\/pre><h3 id=\"new-post\">New post<a class=\"post-anchor\" href=\"#new-post\" aria-label=\"Anchor link for: new-post\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>After that, create a new directory as a blog title, and files as content\nof the blog. For instance, the structure as below:<\/p>\n<ul>\n<li>Directory: <code>markdown-introduction<\/code><\/li>\n<li>English (en): <code>index.md<\/code><\/li>\n<li>Indonesia (id): <code>index.id.md<\/code><\/li>\n<\/ul>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>content\/<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2514\u2500\u2500 blog\/<\/span><\/span>\n<span class=\"giallo-l\"><span> \u00a0\u00a0 \u2514\u2500\u2500 markdown-introduction\/<\/span><\/span>\n<span class=\"giallo-l\"><span> \u00a0\u00a0  \u00a0\u00a0 \u251c\u2500\u2500 index.md<\/span><\/span>\n<span class=\"giallo-l\"><span> \u00a0\u00a0  \u00a0\u00a0 \u2514\u2500\u2500 index.id.md<\/span><\/span><\/code><\/pre>\n<p>I use multi-language for this site, so I need create two index markdown\nfiles, <code>index.md<\/code> and <code>index.id.md<\/code>.<\/p>\n<h3 id=\"setting-up-front-matter\">Setting up front matter<a class=\"post-anchor\" href=\"#setting-up-front-matter\" aria-label=\"Anchor link for: setting-up-front-matter\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Every blog post requires a front matter for blog metadata. For\nexample, create a simple front matter.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"index.md\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span>+++<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span class=\"z-variable\">title<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Markdown Introduction<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-variable\">authors<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-punctuation z-definition z-string z-begin\">&quot;<\/span><span class=\"z-string\">hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-variable\">description<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">How to learn Markdown, a lightweight markup language.<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-variable\">date<\/span><span class=\"z-punctuation\"> =<\/span><span> 2026-07-22<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-variable\">updated<\/span><span class=\"z-punctuation\"> =<\/span><span> 2026-07-22<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-variable\">draft<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> false<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-punctuation\">[<\/span><span>taxonomies<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-variable\">tags<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-punctuation z-definition z-string z-begin\">&quot;<\/span><span class=\"z-string\">tag-1<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">,<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">another-tag-2<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">11<\/span><span class=\"z-variable\">categories<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">category-1<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">12<\/span><span>+++<\/span><\/span><\/code><\/pre>\n<p>The author fills in with a user-identifier. If there are some writers,\nuser can write like an array.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation z-definition z-comment\">#<\/span><span class=\"z-comment\"> single author<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">authors<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-punctuation z-definition z-string z-begin\">&quot;<\/span><span class=\"z-string\">hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">]<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation z-definition z-comment\">#<\/span><span class=\"z-comment\"> multiple author<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">authors<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-punctuation z-definition z-string z-begin\">&quot;<\/span><span class=\"z-string\">hervyqa<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">,<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">anonuser<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">]<\/span><\/span><\/code><\/pre><h2 id=\"markdown-basic\">Markdown basic<a class=\"post-anchor\" href=\"#markdown-basic\" aria-label=\"Anchor link for: markdown-basic\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Markdown is a set of markup language rules. Users can add italic, bold,\ncode text, numbered lists, list points, and so on to plain text.<\/p>\n<h3 id=\"heading-levels\">Heading levels<a class=\"post-anchor\" href=\"#heading-levels\" aria-label=\"Anchor link for: heading-levels\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Like heading in general, but my article writes starting from <code>##<\/code> H2,\nbecause H1 for blog titles.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-heading z-markdown\">##<\/span><span class=\"z-heading z-\\32  z-markdown\"> H2 Heading<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-heading z-markdown\">###<\/span><span class=\"z-heading z-\\33  z-markdown\"> H3 Heading<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-heading z-markdown\">####<\/span><span class=\"z-heading z-\\34  z-markdown\"> H4 Heading<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-heading z-markdown\">#####<\/span><span class=\"z-heading z-\\35  z-markdown\"> H5 Heading<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-heading z-markdown\">######<\/span><span class=\"z-heading z-\\36  z-markdown\"> H6 Heading<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Paragraph. How to learn Markdown,<\/span><\/span>\n<span class=\"giallo-l\"><span>a lightweight markup language.<\/span><\/span><\/code><\/pre><h3 id=\"formating\">Formating<a class=\"post-anchor\" href=\"#formating\" aria-label=\"Anchor link for: formating\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<h4 id=\"text-formating\">Text formating<a class=\"post-anchor\" href=\"#text-formating\" aria-label=\"Anchor link for: text-formating\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Text formatting for normal, italic, bold, and code format.<\/p>\n<table><thead><tr><th>Markdown<\/th><th>Preview<\/th><\/tr><\/thead><tbody>\n<tr><td><code>Normal text<\/code><\/td><td>Normal Text<\/td><\/tr>\n<tr><td><code>_Italic text_<\/code><\/td><td><em>Italic Text<\/em><\/td><\/tr>\n<tr><td><code>**Bold text**<\/code><\/td><td><strong>Bold Text<\/strong><\/td><\/tr>\n<tr><td><code>`Code format`<\/code><\/td><td><code>Code format<\/code><\/td><\/tr>\n<\/tbody><\/table>\n<h4 id=\"hyperlink\">Hyperlink<a class=\"post-anchor\" href=\"#hyperlink\" aria-label=\"Anchor link for: hyperlink\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<h5 id=\"redirect-hyperlink\">Redirect hyperlink<a class=\"post-anchor\" href=\"#redirect-hyperlink\" aria-label=\"Anchor link for: redirect-hyperlink\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h5>\n<table><thead><tr><th>Markdown<\/th><th>Preview<\/th><\/tr><\/thead><tbody>\n<tr><td><code>Text with [openbsd](https:\/\/openbsd.org).<\/code><\/td><td>Text with <a rel=\"nofollow noreferrer external\" href=\"https:\/\/openbsd.org\">openbsd<\/a>.<\/td><\/tr>\n<tr><td><code>Go to [blog](\/blog) section.<\/code><\/td><td>Go to <a href=\"\/blog\">blog<\/a> section.<\/td><\/tr>\n<\/tbody><\/table>\n<h5 id=\"reuse-hyperlink\">Reuse hyperlink<a class=\"post-anchor\" href=\"#reuse-hyperlink\" aria-label=\"Anchor link for: reuse-hyperlink\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h5>\n<table><thead><tr><th>Markdown<\/th><th>Preview<\/th><\/tr><\/thead><tbody>\n<tr><td><code>Text with [openbsd].<\/code><\/td><td>Text with <a rel=\"nofollow noreferrer external\" href=\"https:\/\/openbsd.org\">openbsd<\/a>.<\/td><\/tr>\n<tr><td><code>Go to [blog] section.<\/code><\/td><td>Go to <a href=\"\/blog\">blog<\/a> section.<\/td><\/tr>\n<\/tbody><\/table>\n<p>At the end of the document, add this line.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-constant z-markdown\">[<\/span><span class=\"z-constant z-other z-reference z-link z-markdown\">openbsd<\/span><span class=\"z-punctuation z-definition z-constant z-markdown\">]<\/span><span class=\"z-punctuation z-separator z-key-value z-markdown\">:<\/span><span> <\/span><span class=\"z-markup z-underline z-link z-markdown\">https:\/\/openbsd.org<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-constant z-markdown\">[<\/span><span class=\"z-constant z-other z-reference z-link z-markdown\">blog<\/span><span class=\"z-punctuation z-definition z-constant z-markdown\">]<\/span><span class=\"z-punctuation z-separator z-key-value z-markdown\">:<\/span><span> <\/span><span class=\"z-markup z-underline z-link z-markdown\">\/blog<\/span><\/span><\/code><\/pre><h4 id=\"other-element\">Other element<a class=\"post-anchor\" href=\"#other-element\" aria-label=\"Anchor link for: other-element\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Subscript, superscript and mark.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> H<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">sub<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>2<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">sub<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>O<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> CO<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">sub<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>2<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">sub<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> X<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>n<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span> + Y<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>n<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span> = Z<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>n<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">sup<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Internet standard <\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">mark<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>File Transfer Protocol<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">mark<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span> (FTP).<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<ul>\n<li>H<sub>2<\/sub>O<\/li>\n<li>CO<sub>2<\/sub><\/li>\n<li>X<sup>n<\/sup> + Y<sup>n<\/sup> = Z<sup>n<\/sup><\/li>\n<li>Internet standard <mark>File Transfer Protocol<\/mark> (FTP).<\/li>\n<\/ul>\n<h3 id=\"tables\">Tables<a class=\"post-anchor\" href=\"#tables\" aria-label=\"Anchor link for: tables\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation\">|<\/span><span> Fruits<\/span><span class=\"z-punctuation\">    |<\/span><span> Color<\/span><span class=\"z-punctuation\">  |<\/span><span> Total<\/span><span class=\"z-punctuation\">  |<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">-----------<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">--------<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">--------<\/span><span class=\"z-punctuation\">|<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">|<\/span><span> Mango<\/span><span class=\"z-punctuation\">     |<\/span><span> Green<\/span><span class=\"z-punctuation\">  |<\/span><span> 10<\/span><span class=\"z-punctuation\">     |<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">|<\/span><span> Apple<\/span><span class=\"z-punctuation\">     |<\/span><span> Red<\/span><span class=\"z-punctuation\">    |<\/span><span> 20<\/span><span class=\"z-punctuation\">     |<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">|<\/span><span> Pineapple<\/span><span class=\"z-punctuation\"> |<\/span><span> Yellow<\/span><span class=\"z-punctuation\"> |<\/span><span> 30<\/span><span class=\"z-punctuation\">     |<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<table><thead><tr><th>Fruits<\/th><th>Color<\/th><th>Total<\/th><\/tr><\/thead><tbody>\n<tr><td>Mango<\/td><td>Green<\/td><td>10<\/td><\/tr>\n<tr><td>Apple<\/td><td>Red<\/td><td>20<\/td><\/tr>\n<tr><td>Pineapple<\/td><td>Yellow<\/td><td>30<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"figures\">Figures<a class=\"post-anchor\" href=\"#figures\" aria-label=\"Anchor link for: figures\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Add images using this syntax:<\/p>\n<p><code>![alternative image text](filename or url)<\/code><\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation\">![<\/span><span class=\"z-string z-other z-link z-description z-markdown\">Plants<\/span><span class=\"z-punctuation\">]<\/span><span class=\"z-punctuation z-definition z-metadata z-markdown\">(<\/span><span class=\"z-markup z-underline z-link z-image z-markdown\">plants.jpg<\/span><span class=\"z-punctuation z-definition z-metadata z-markdown\">)<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n\n<figure\n  \n  class=\"ref-placeholder figure-center\"\n  \n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/processed_images\/plants.57173b9f03aaea92.jpg\" alt=\"Plants\" width=\"1280\" height=\"720\" srcset=\"https:\/\/hervyqa.srht.site\/processed_images\/plants.2d61980e4214fbde.jpg 640w, https:\/\/hervyqa.srht.site\/processed_images\/plants.04c77c045ffb8a58.jpg 784w, https:\/\/hervyqa.srht.site\/processed_images\/plants.acd918418070f62d.jpg 1280w, https:\/\/hervyqa.srht.site\/processed_images\/plants.d6bc4f794f138c3f.jpg 1920w, https:\/\/hervyqa.srht.site\/processed_images\/plants.43f880e4ec81d6f9.jpg 2560w\" sizes=\"(min-width: 920px) 784px, (min-width: 700px) calc(82vw + 46px), calc(100vw - 40px)\" loading=\"lazy\">\n  <\/picture>\n<\/figure>\n\n<h3 id=\"lists\">Lists<a class=\"post-anchor\" href=\"#lists\" aria-label=\"Anchor link for: lists\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Markdown list has several types. Unorderd list (bullet point), ordered\nlist, and task list.<\/p>\n<h4 id=\"unordered-lists\">Unordered lists<a class=\"post-anchor\" href=\"#unordered-lists\" aria-label=\"Anchor link for: unordered-lists\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Unordered list with nesting lists. Use <code>4 spaces<\/code> or <code>1 tab<\/code> for nesting\nlists.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Operating system<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> OpenBSD<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> FreeBSD<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> NetBSD<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Display server<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> Xenoxara<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> Wayland<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<ul>\n<li>Operating system\n<ul>\n<li>OpenBSD<\/li>\n<li>FreeBSD<\/li>\n<li>NetBSD<\/li>\n<\/ul>\n<\/li>\n<li>Display server\n<ul>\n<li>Xenoxara<\/li>\n<li>Wayland<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4 id=\"ordered-lists\">Ordered lists<a class=\"post-anchor\" href=\"#ordered-lists\" aria-label=\"Anchor link for: ordered-lists\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Ordered list with nesting lists. Use <code>4 spaces<\/code> or <code>1 tab<\/code> for nesting\nlists.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">1.<\/span><span> Features<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    1.<\/span><span> Multiplatform<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    1.<\/span><span> Firewall<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">        1.<\/span><span> Packet filter<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    1.<\/span><span> Security<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">        1.<\/span><span> unveil()<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">        1.<\/span><span> pledge()<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">1.<\/span><span> Documentation<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    1.<\/span><span> man pages<\/span><\/span><\/code><\/pre>\n<p>Already an automatic number. No need to write a manual number like 1, 2,\n3, etc.<\/p>\n<p>Render output:<\/p>\n<ol>\n<li>Features\n<ol>\n<li>Multiplatform<\/li>\n<li>Firewall\n<ol>\n<li>Packet filter<\/li>\n<\/ol>\n<\/li>\n<li>Security\n<ol>\n<li>unveil()<\/li>\n<li>pledge()<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Documentation\n<ol>\n<li>man pages<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4 id=\"task-lists\">Task lists<a class=\"post-anchor\" href=\"#task-lists\" aria-label=\"Anchor link for: task-lists\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">x<\/span><span class=\"z-punctuation\">]<\/span><span> Create bootable.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">x<\/span><span class=\"z-punctuation\">]<\/span><span> Install ports.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">x<\/span><span class=\"z-punctuation\">]<\/span><span> Install cde.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> [ ] Install dmenu.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">    -<\/span><span> [ ] Install gnupg.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<ul>\n<li><input disabled=\"\" type=\"checkbox\" checked=\"\"\/>\nCreate USB bootable.<\/li>\n<li><input disabled=\"\" type=\"checkbox\" checked=\"\"\/>\nInstall ports.\n<ul>\n<li><input disabled=\"\" type=\"checkbox\" checked=\"\"\/>\nInstall cde.<\/li>\n<li><input disabled=\"\" type=\"checkbox\"\/>\nInstall dmenu.<\/li>\n<li><input disabled=\"\" type=\"checkbox\"\/>\nInstall gnupg.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 id=\"preformatted-text\">Preformatted Text<a class=\"post-anchor\" href=\"#preformatted-text\" aria-label=\"Anchor link for: preformatted-text\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-markdown\">```<\/span><span class=\"z-fenced_code z-block z-language\">plain<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-markup z-fenced_code z-block z-markdown\">ftp is the user interface to the Internet standard File Transfer<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-markup z-fenced_code z-block z-markdown\">Protocol (FTP). The program allows a user to transfer files to and from<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-markup z-fenced_code z-block z-markdown\">a remote network site.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-markdown\">```<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>ftp is the user interface to the Internet standard File Transfer<\/span><\/span>\n<span class=\"giallo-l\"><span>Protocol (FTP). The program allows a user to transfer files to and from<\/span><\/span>\n<span class=\"giallo-l\"><span>a remote network site.<\/span><\/span><\/code><\/pre><h3 id=\"code-blocks\">Code blocks<a class=\"post-anchor\" href=\"#code-blocks\" aria-label=\"Anchor link for: code-blocks\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Code block to display lines of code. Usually shows programming\nlanguages. Codes block are identical to preformatted text, but generally\nhave markdown highlighting to make the syntax easier to understand.<\/p>\n<p>Zola configuration in <code>zola.toml<\/code><\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"zola.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation\">[<\/span><span>markdown<\/span><span>.<\/span><span>highlighting<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">style<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">class<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">3<\/span><span class=\"z-variable\">dark_theme<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">dark-theme<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">4<\/span><span class=\"z-variable\">light_theme<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">light-theme<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span><\/code><\/pre>\n<p>Importing giallo style in <code>style.scss<\/code><\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"scss\" data-name=\"style.scss\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation\">@<\/span><span class=\"z-keyword z-control z-at-rule z-use z-scss\">use<\/span><span class=\"z-punctuation z-definition z-string z-begin z-scss\"> &#39;<\/span><span class=\"z-string z-quoted z-single z-scss\">giallo<\/span><span class=\"z-punctuation z-definition z-string z-end z-scss\">&#39;<\/span><span class=\"z-punctuation z-terminator z-rule z-css\">;<\/span><\/span><\/code><\/pre>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>```c,linenos,name=src\/main.c<\/span><\/span>\n<span class=\"giallo-l\"><span>#include &lt;stdio.h&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>int main() {<\/span><\/span>\n<span class=\"giallo-l\"><span>  printf(&quot;Hello world!&quot;);<\/span><\/span>\n<span class=\"giallo-l\"><span>  return 0;<\/span><\/span>\n<span class=\"giallo-l\"><span>}<\/span><\/span>\n<span class=\"giallo-l\"><span>```<\/span><\/span><\/code><\/pre>\n<p>Key points:<\/p>\n<ul>\n<li><code>language<\/code>: Default <code>plain<\/code>. Other languages such as <code>c<\/code>, <code>cpp<\/code>,\n<code>bash<\/code>, <code>python<\/code>, <code>rust<\/code>, etc.<\/li>\n<li><code>linenos<\/code>: Enable line numbers.<\/li>\n<li><code>name<\/code>: Enable file name.<\/li>\n<\/ul>\n<p>Render output:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"c\" data-name=\"src\/main.c\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation z-definition z-directive z-c\">#<\/span><span class=\"z-keyword z-control z-directive z-include z-c\">include<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &lt;<\/span><span class=\"z-string\">stdio.h<\/span><span class=\"z-punctuation z-definition z-string z-end\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">3<\/span><span class=\"z-storage z-type\">int<\/span><span class=\"z-entity z-name z-function\"> main<\/span><span class=\"z-punctuation\">(<\/span><span class=\"z-punctuation\">)<\/span><span class=\"z-punctuation\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">4<\/span><span class=\"z-entity z-name z-function\">  printf<\/span><span class=\"z-punctuation\">(<\/span><span class=\"z-punctuation z-definition z-string z-begin\">&quot;<\/span><span class=\"z-string\">Hello world!<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><span class=\"z-punctuation\">)<\/span><span class=\"z-punctuation\">;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">5<\/span><span class=\"z-keyword\">  return<\/span><span class=\"z-constant z-numeric\"> 0<\/span><span class=\"z-punctuation\">;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">6<\/span><span class=\"z-punctuation\">}<\/span><\/span><\/code><\/pre><h3 id=\"blockquote\">Blockquote<a class=\"post-anchor\" href=\"#blockquote\" aria-label=\"Anchor link for: blockquote\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Blockquote used to define a section of content that is quoted from\nanother source.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> The first call to unveil() removes visibility of the entire filesystem<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> from all other filesystem-related system calls (such as open(2),<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> chmod(2) and rename(2)), except for the specified path and<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> permissions.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\"> &lt;<\/span><span class=\"z-entity z-name z-tag z-html\">cite<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><span>\u2014 OpenBSD 6.4.<\/span><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">cite<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<blockquote>\n<p>The first call to unveil() removes visibility of the entire filesystem\nfrom all other filesystem-related system calls (such as open(2),\nchmod(2) and rename(2)), except for the specified path and\npermissions.<\/p>\n<p><cite>\u2014 OpenBSD 6.4.<\/cite><\/p>\n<\/blockquote>\n<h3 id=\"footnotes\">Footnotes<a class=\"post-anchor\" href=\"#footnotes\" aria-label=\"Anchor link for: footnotes\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Footnotes provide superscript hyperlink marks to explain more specific.\nGenerally, footnotes write with hyphens and labels <code>[^label]<\/code>, or\nhyphens and number <code>[^1]<\/code>.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-italic z-markdown\">_<\/span><span>unveil()<\/span><span class=\"z-punctuation z-definition z-italic z-markdown\">_<\/span><span class=\"z-punctuation\">[<\/span><span class=\"z-string z-other z-link z-title z-markdown\">^1<\/span><span class=\"z-punctuation\">]<\/span><span> use can be tricky because programs<\/span><\/span>\n<span class=\"giallo-l\"><span>misbehave badly when their files unexpectedly<\/span><\/span>\n<span class=\"giallo-l\"><span>disappear. In many cases it is easier to unveil<\/span><\/span>\n<span class=\"giallo-l\"><span>the directories in which an application makes<\/span><\/span>\n<span class=\"giallo-l\"><span>use of files.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">[<\/span><span class=\"z-string z-other z-link z-title z-markdown\">^1<\/span><span class=\"z-punctuation\">]<\/span><span>: The unveil() system call first appeared<\/span><\/span>\n<span class=\"giallo-l\"><span>      in OpenBSD 6.4.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<p><em>unveil()<\/em><sup class=\"footnote-reference\" id=\"fr-1-1\"><a href=\"#fn-1\">1<\/a><\/sup> use can be tricky because programs\nmisbehave badly when their files unexpectedly\ndisappear. In many cases it is easier to unveil\nthe directories in which an application makes\nuse of files.<\/p>\n<blockquote>\n<p>User can click on the <sup>1<\/sup> sign to jump to the bottom of page\nfor extra details.<\/p>\n<\/blockquote>\n<h2 id=\"shortcodes\">Shortcodes<a class=\"post-anchor\" href=\"#shortcodes\" aria-label=\"Anchor link for: shortcodes\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>A shortcode is a template invoked within markup, accepting any key,\nvalue, or arguments. Shortcode can be used with format to insert\nelements such as videos, images, and social media embeds into user\ncontent.<\/p>\n<h3 id=\"alert\">Alert<a class=\"post-anchor\" href=\"#alert\" aria-label=\"Anchor link for: alert\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>The basic function is to emphasize critical information. They are\ndisplayed with distinctive colors and icons to indicate the importance\nof the content.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">!NOTE<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> The man utility displays the manual page entitled name.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">!TIP<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> ftp is the user interface to the Internet standard File Transfer Protocol (FTP).<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">!IMPORTANT<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> The df utility displays statistics about the amount of free disk space on the specified file_system.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">!WARNING<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> The rm utility attempts to remove the non-directory type files specified on the command line.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span class=\"z-punctuation\"> [<\/span><span class=\"z-string z-other z-link z-title z-markdown\">!CAUTION<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-quote z-begin z-markdown\">&gt;<\/span><span> chown sets the user ID and\/or the group ID of the specified files.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<blockquote class=\"markdown-alert-note\">\n<p>The man utility displays the manual page entitled name.<\/p>\n<\/blockquote>\n<blockquote class=\"markdown-alert-tip\">\n<p>ftp is the user interface to the Internet standard File Transfer Protocol (FTP).<\/p>\n<\/blockquote>\n<blockquote class=\"markdown-alert-important\">\n<p>The df utility displays statistics about the amount of free disk space on the specified file_system.<\/p>\n<\/blockquote>\n<blockquote class=\"markdown-alert-warning\">\n<p>The rm utility attempts to remove the non-directory type files specified on the command line.<\/p>\n<\/blockquote>\n<blockquote class=\"markdown-alert-caution\">\n<p>chown sets the user ID and\/or the group ID of the specified files.<\/p>\n<\/blockquote>\n<h3 id=\"hyperlink-management\">Hyperlink management<a class=\"post-anchor\" href=\"#hyperlink-management\" aria-label=\"Anchor link for: hyperlink-management\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Use <code>go<\/code> shortcodes to manage hyperlinks in each <code>section<\/code> or <code>page<\/code>. Basic shortcode:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ go(id=&quot;link-id&quot;, title=&quot;Title&quot;, external=&quot;false&quot;) }}<\/span><\/span><\/code><\/pre>\n<ul>\n<li><code>id<\/code> = Hyperlink identifier.<\/li>\n<li><code>title<\/code> = Title of link (optional).<\/li>\n<li><code>external<\/code> = Open the link with a new tab or <code>target=\"_blank\"<\/code>. The\ndefault value is <code>false<\/code> (optional).<\/li>\n<\/ul>\n<p>Hyperlink data stored in <code>data\/link.toml<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"data\/link.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span class=\"z-punctuation\">[<\/span><span>obsd<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span class=\"z-variable\">title<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">OpenBSD<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-variable\">url<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/www.openbsd.org<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-punctuation\">[<\/span><span>sway<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-variable\">title<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Swaywm<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-variable\">url<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/swaywm.org<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-punctuation\">[<\/span><span>hx<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-variable\">title<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Helix<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">11<\/span><span class=\"z-variable\">url<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/helix-editor.com<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">12<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">13<\/span><span class=\"z-punctuation\">[<\/span><span>obsdc<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">14<\/span><span class=\"z-variable\">title<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">OBSDc<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">15<\/span><span class=\"z-variable\">url<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/git.sr.ht\/~hervyqa\/obsdc<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span><\/code><\/pre>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>I use {{ go(id=&quot;obsd&quot;) }} operating system because it fits my needs.<\/span><\/span>\n<span class=\"giallo-l\"><span>My window manager is {{ go(id=&quot;sway&quot;) }}. I use {{ go(id=&quot;hx&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}} as the text editor. My current setup at {{ go(id=&quot;obsdc&quot;) }}.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<p>I use \n\n<a href=\"https:\/\/www.openbsd.org\">OpenBSD<\/a> operating system because it fits my needs. My\nwindow manager is \n\n<a href=\"https:\/\/swaywm.org\">Swaywm<\/a>. I use \n\n<a href=\"https:\/\/helix-editor.com\">Helix<\/a> as the\ntext editor. My current setup at \n\n<a href=\"https:\/\/git.sr.ht\/~hervyqa\/obsdc\">OBSDc<\/a>.<\/p>\n<h3 id=\"keyboard\">Keyboard<a class=\"post-anchor\" href=\"#keyboard\" aria-label=\"Anchor link for: keyboard\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Use a <code>kbd<\/code> shortcode to display typing keys. Available with different\noperating systems and formats.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ kbd(key=&quot;ctrl alt h&quot;, os=&quot;bsd&quot;, format=&quot;lower&quot;) }}<\/span><\/span><\/code><\/pre>\n<p>Key points:<\/p>\n<ul>\n<li><code>key<\/code> = Values are <code>meta<\/code>, <code>mod<\/code>, <code>cmd<\/code>, <code>win<\/code>, <code>ctrl<\/code>, <code>shift<\/code>,\n<code>alt<\/code>, <code>esc<\/code>, and any letter key. Separated with space.<\/li>\n<li><code>os<\/code> = Operating system. Values are <code>bsd<\/code> (default), <code>linux<\/code>, <code>mac<\/code>,\nand <code>win<\/code>. (optional)<\/li>\n<li><code>format<\/code> = Text formatiing, available values are <code>lower<\/code> (default),\n<code>upper<\/code>, <code>capitalize<\/code>, and <code>none<\/code>. (optional)<\/li>\n<\/ul>\n<p>Global setting is in <code>zola.toml<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"zola.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation\">[<\/span><span>extra<\/span><span>.<\/span><span>kbd<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">os<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">bsd<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">3<\/span><span class=\"z-variable\">format<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">lower<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span><\/code><\/pre>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> {{ kbd(key=&quot;h&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> {{ kbd(key=&quot;shift i&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> {{ kbd(key=&quot;meta ctrl j&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> {{ kbd(key=&quot;meta ctrl shift alt k&quot;) }}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<ul>\n<li><kbd>h<\/kbd><\/li>\n<li><kbd>shift<\/kbd>+<kbd>i<\/kbd><\/li>\n<li><kbd>meta<\/kbd>+<kbd>ctrl<\/kbd>+<kbd>j<\/kbd><\/li>\n<li><kbd>meta<\/kbd>+<kbd>ctrl<\/kbd>+<kbd>shift<\/kbd>+<kbd>alt<\/kbd>+<kbd>k<\/kbd><\/li>\n<\/ul>\n<h3 id=\"accordion\">Accordion<a class=\"post-anchor\" href=\"#accordion\" aria-label=\"Anchor link for: accordion\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Shortcodes that display element which information in it visible only\nwhen the widget is toggled to an open state.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{% detail(open=false, title=&quot;Title&quot;) %}<\/span><\/span>\n<span class=\"giallo-l\"><span>  Content<\/span><\/span>\n<span class=\"giallo-l\"><span>{% end %}<\/span><\/span><\/code><\/pre>\n<p>Key points:<\/p>\n<ul>\n<li><code>open<\/code> = <code>false<\/code> (default).<\/li>\n<li><code>title<\/code> = Summary desciption.<\/li>\n<\/ul>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{% detail(title=&quot;Mount file system&quot;) %}<\/span><\/span>\n<span class=\"giallo-l\"><span>  The mount command invokes a file system specific program to prepare and<\/span><\/span>\n<span class=\"giallo-l\"><span>  graft the special device or remote node (rhost:path) on to the file<\/span><\/span>\n<span class=\"giallo-l\"><span>  system tree at the point node.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">  -<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\"> `<\/span><span class=\"z-markup z-inline z-raw z-string z-markdown\">async<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\">`<\/span><span> I\/O to the file system should be done asynchronously.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">  -<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\"> `<\/span><span class=\"z-markup z-inline z-raw z-string z-markdown\">noexec<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\">`<\/span><span> Do not allow execution of any binaries.<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">  -<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\"> `<\/span><span class=\"z-markup z-inline z-raw z-string z-markdown\">nodev<\/span><span class=\"z-punctuation z-definition z-raw z-markdown\">`<\/span><span> Do not interpret character.<\/span><\/span>\n<span class=\"giallo-l\"><span>{% end %}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<details>\n  <summary>Mount file system<\/summary>\n  <p>The mount command invokes a file system specific program to prepare and\ngraft the special device or remote node (rhost:path) on to the file\nsystem tree at the point node.<\/p>\n<ul>\n<li><code>async<\/code> I\/O to the file system should be done asynchronously.<\/li>\n<li><code>noexec<\/code> Do not allow execution of any binaries.<\/li>\n<li><code>nodev<\/code> Do not interpret character.<\/li>\n<\/ul>\n\n<\/details>\n\n<h3 id=\"mastodon\">Mastodon<a class=\"post-anchor\" href=\"#mastodon\" aria-label=\"Anchor link for: mastodon\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Support decentralized social platforms such as mastodon. This shortcode\nhas only one input <code>url<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ mastodon(url=&quot;https:\/\/datasci.social\/@hervyqa\/116725797459737335&quot;) }}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<figure class=\"mastodon-post\">\n    <blockquote cite=\"https:\/\/datasci.social\/@hervyqa\/116725797459737335\">\n        <p>I switched from linux-based to OpenBSD a month ago. I loved it. <\/p><p>Dotfiles: <a href=\"https:\/\/git.sr.ht\/~hervyqa\/obsdc\" target=\"_blank\" rel=\"nofollow noopener\" translate=\"no\"><span class=\"invisible\">https:\/\/<\/span><span class=\"\">git.sr.ht\/~hervyqa\/obsdc<\/span><span class=\"invisible\"><\/span><\/a><\/p><p><a href=\"https:\/\/datasci.social\/tags\/openbsd\" class=\"mention hashtag\" rel=\"tag\">#<span>openbsd<\/span><\/a> <a href=\"https:\/\/datasci.social\/tags\/sway\" class=\"mention hashtag\" rel=\"tag\">#<span>sway<\/span><\/a> <a href=\"https:\/\/datasci.social\/tags\/wayland\" class=\"mention hashtag\" rel=\"tag\">#<span>wayland<\/span><\/a><\/p>\n    <\/blockquote>\n    <figcaption>\n        \u2014 Hervy Qurrotul (<a href=\"https:\/\/datasci.social\/@hervyqa\">@hervyqa@datasci.social<\/a>),\n        <a href=\"https:\/\/datasci.social\/@hervyqa\/116725797459737335\">\n            <time datetime=\"2026-06-10T12:25:21.591Z\">June 10, 2026<\/time>\n        <\/a>\n    <\/figcaption>\n<\/figure>\n<h3 id=\"table\">Table<a class=\"post-anchor\" href=\"#table\" aria-label=\"Anchor link for: table\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Tables shortcode seems regular table markdown, but has custom options\nsuch as identifier as tag, caption and align.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span>{% table(<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span>  id=&quot;table_id&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span>  caption=&quot;Caption&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span>  align=&quot;center&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span>%}<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-punctuation\">|<\/span><span> X<\/span><span class=\"z-punctuation\">    |<\/span><span> Y<\/span><span class=\"z-punctuation\">    |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">------<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">------<\/span><span class=\"z-punctuation\">|<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-punctuation\">|<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-punctuation\">|<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">11<\/span><span class=\"z-punctuation\">|<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><span> list<\/span><span class=\"z-punctuation\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">12<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">13<\/span><span>{% end %}<\/span><\/span><\/code><\/pre>\n<p>Text align value has only two options, <code>center<\/code> (default) and <code>start<\/code>\n(left for LTR and right for RTL).<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span>{% table(id=&quot;fruit&quot;, caption=&quot;List of fruits&quot;) %}<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-punctuation\">|<\/span><span> Fruits<\/span><span class=\"z-punctuation\">    |<\/span><span> Color<\/span><span class=\"z-punctuation\">  |<\/span><span> Total<\/span><span class=\"z-punctuation\">  |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">-----------<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">--------<\/span><span class=\"z-punctuation\">|<\/span><span class=\"z-punctuation\">--------<\/span><span class=\"z-punctuation\">|<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-punctuation\">|<\/span><span> Mango<\/span><span class=\"z-punctuation\">     |<\/span><span> Green<\/span><span class=\"z-punctuation\">  |<\/span><span> 10<\/span><span class=\"z-punctuation\">     |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-punctuation\">|<\/span><span> Apple<\/span><span class=\"z-punctuation\">     |<\/span><span> Red<\/span><span class=\"z-punctuation\">    |<\/span><span> 20<\/span><span class=\"z-punctuation\">     |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-punctuation\">|<\/span><span> Pineapple<\/span><span class=\"z-punctuation\"> |<\/span><span> Yellow<\/span><span class=\"z-punctuation\"> |<\/span><span> 30<\/span><span class=\"z-punctuation\">     |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span>{% end %}<\/span><\/span><\/code><\/pre>\n<p>Result output:<\/p>\n<figure\n   id=\"tbl-fruit\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"fruit\"\n>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Table: List of fruits<\/figcaption><div class=\"table-wrapper\">\n  <table><thead><tr><th>Fruits<\/th><th>Color<\/th><th>Total<\/th><\/tr><\/thead><tbody>\n<tr><td>Mango<\/td><td>Green<\/td><td>10<\/td><\/tr>\n<tr><td>Apple<\/td><td>Red<\/td><td>20<\/td><\/tr>\n<tr><td>Pineapple<\/td><td>Yellow<\/td><td>30<\/td><\/tr>\n<\/tbody><\/table>\n\n<\/div>\n\n<\/figure>\n<h4 id=\"mention-table\">Mention table<a class=\"post-anchor\" href=\"#mention-table\" aria-label=\"Anchor link for: mention-table\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention {{ tbl(id=&quot;fruit&quot;) }} table.<\/span><\/span><\/code><\/pre>\n<ul>\n<li>Mention <a href=\"#tbl-fruit\" class=\"table-ref\" data-fig=\"fruit\">tbl-fruit<\/a> table.<\/li>\n<\/ul>\n<h3 id=\"figure\">Figure<a class=\"post-anchor\" href=\"#figure\" aria-label=\"Anchor link for: figure\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>A figure shortcode has several features such as support inline images,\nimage for dark mode, captions, and custom positions.<\/p>\n<p>Basic shortcode:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;image_id&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  inline=false,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;images.png&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src_dark=&quot;images_dark.png&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  alt=&quot;alternative text&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Image Caption&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  align=&quot;center&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  style=&quot;color: black;&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  lazy=true)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<p>Text align value has only two options, <code>center<\/code> (default) and <code>start<\/code>\n(left for LTR and right for RTL).<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;plants&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;plants.jpg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  alt=&quot;Plants and tree&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Plants and Tree&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n\n<figure\n   id=\"fig-plants\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"plants\"\n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/processed_images\/plants.57173b9f03aaea92.jpg\" alt=\"Plants and tree\" width=\"1280\" height=\"720\" srcset=\"https:\/\/hervyqa.srht.site\/processed_images\/plants.2d61980e4214fbde.jpg 640w, https:\/\/hervyqa.srht.site\/processed_images\/plants.04c77c045ffb8a58.jpg 784w, https:\/\/hervyqa.srht.site\/processed_images\/plants.acd918418070f62d.jpg 1280w, https:\/\/hervyqa.srht.site\/processed_images\/plants.d6bc4f794f138c3f.jpg 1920w, https:\/\/hervyqa.srht.site\/processed_images\/plants.43f880e4ec81d6f9.jpg 2560w\" sizes=\"(min-width: 920px) 784px, (min-width: 700px) calc(82vw + 46px), calc(100vw - 40px)\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Plants and Tree<\/figcaption>\n<\/figure>\n\n<h4 id=\"multi-column\">Multi column<a class=\"post-anchor\" href=\"#multi-column\" aria-label=\"Anchor link for: multi-column\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Shortcode figure with a grid that supports multi columns.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;<\/span><span class=\"z-entity z-name z-tag z-html\">div<\/span><span class=\"z-entity z-other z-attribute-name z-html\"> class<\/span><span class=\"z-punctuation z-separator z-key-value z-html\">=<\/span><span class=\"z-punctuation z-definition z-string z-begin z-html\">&quot;<\/span><span class=\"z-string z-quoted z-double z-html\">grid cols-2<\/span><span class=\"z-punctuation z-definition z-string z-end z-html\">&quot;<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>    {{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>      id=&quot;nature&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      src=&quot;nature.jpg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      alt=&quot;Nature&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      caption=&quot;Nature&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>    }}<\/span><\/span>\n<span class=\"giallo-l\"><span>    {{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>      id=&quot;garden&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      src=&quot;garden.jpg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      alt=&quot;Garden&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>      caption=&quot;Garden&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>    }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-tag z-begin z-html\">&lt;\/<\/span><span class=\"z-entity z-name z-tag z-html\">div<\/span><span class=\"z-punctuation z-definition z-tag z-end z-html\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<div class=\"grid cols-2\">\n    \n<figure\n   id=\"fig-nature\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"nature\"\n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/processed_images\/nature.a340b87f33e490f2.jpg\" alt=\"Nature\" width=\"1280\" height=\"720\" srcset=\"https:\/\/hervyqa.srht.site\/processed_images\/nature.11e750e25080dfda.jpg 640w, https:\/\/hervyqa.srht.site\/processed_images\/nature.86045ed1dc123588.jpg 784w, https:\/\/hervyqa.srht.site\/processed_images\/nature.d149472a25ab4310.jpg 1280w, https:\/\/hervyqa.srht.site\/processed_images\/nature.b64dadf5c7e6c2c9.jpg 1920w, https:\/\/hervyqa.srht.site\/processed_images\/nature.e6c3dfcd42ba27b8.jpg 2560w\" sizes=\"(min-width: 920px) 784px, (min-width: 700px) calc(82vw + 46px), calc(100vw - 40px)\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Nature<\/figcaption>\n<\/figure>\n\n\n    \n<figure\n   id=\"fig-garden\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"garden\"\n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/processed_images\/garden.af492804b0c46b8b.jpg\" alt=\"Garden\" width=\"1280\" height=\"720\" srcset=\"https:\/\/hervyqa.srht.site\/processed_images\/garden.2ccad4d46a0f6e1c.jpg 640w, https:\/\/hervyqa.srht.site\/processed_images\/garden.f4fc83f8c0eda0f3.jpg 784w, https:\/\/hervyqa.srht.site\/processed_images\/garden.57119c2c1b6b7a52.jpg 1280w, https:\/\/hervyqa.srht.site\/processed_images\/garden.1034f48c0fe28fe4.jpg 1920w, https:\/\/hervyqa.srht.site\/processed_images\/garden.f289dbbfe8292cec.jpg 2560w\" sizes=\"(min-width: 920px) 784px, (min-width: 700px) calc(82vw + 46px), calc(100vw - 40px)\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Garden<\/figcaption>\n<\/figure>\n\n\n<\/div>\n<blockquote>\n<p>For mobile (max-width: 684px), it only support one column.<\/p>\n<\/blockquote>\n<h4 id=\"mathematical\">Mathematical<a class=\"post-anchor\" href=\"#mathematical\" aria-label=\"Anchor link for: mathematical\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>For create math or formula images, I use <code>typst<\/code> to generate <code>svg<\/code> and\nthen invoke shortcode from within markup. If figure need to be inline,\nenable inline format with <code>inline = true<\/code>. I prefer to use <code>svg<\/code> format\ninstead of png or jpg if possible.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;inline&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  inline=true,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;inline-light.svg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src_dark=&quot;inline-dark.svg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  alt=&quot;Inline image&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<p>Inline formula:\n\n<span\n   id=\"fig-inline\"\n  class=\"inline ref-placeholder figure-center\"\n   data-ref=\"inline\"\n>\n\n  <picture>\n    \n    <source\n      \n        srcset=\"https:&#x2F;&#x2F;hervyqa.srht.site&#x2F;blog&#x2F;how-i-wrote-an-article&#x2F;inline-dark.svg\"\n      \n      media=\"(prefers-color-scheme: dark)\"\n    \/>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/blog\/how-i-wrote-an-article\/inline-light.svg\" alt=\"Inline image\" loading=\"lazy\">\n  <\/picture>\n<\/span>\n\n<\/p>\n<p>Mathematical formula with caption.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;math&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  math=true,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;math-light.svg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src_dark=&quot;math-dark.svg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  alt=&quot;Math formula&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Math formula&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<figure\n   id=\"fig-math\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"math\"\n>\n\n  <picture>\n    \n    <source\n      \n        srcset=\"https:&#x2F;&#x2F;hervyqa.srht.site&#x2F;blog&#x2F;how-i-wrote-an-article&#x2F;math-dark.svg\"\n      \n      media=\"(prefers-color-scheme: dark)\"\n    \/>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/blog\/how-i-wrote-an-article\/math-light.svg\" alt=\"Math formula\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Math formula<\/figcaption>\n<\/figure>\n\n<h4 id=\"graph\">Graph<a class=\"post-anchor\" href=\"#graph\" aria-label=\"Anchor link for: graph\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>For the chart I do not use \n\n<a href=\"https:\/\/mermaid.js.org\">Mermaid JS<\/a> (size: 6MB+) or\nsimilar JavaScript. I used <code>dot<\/code> from \n\n<a href=\"https:\/\/graphviz.org\">Graphviz<\/a> to create\na graph <code>svg<\/code> and then invoke it from the shortcode within the markup.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ figure(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;graph&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;graph.svg&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  alt=&quot;Dot graph image&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Dot graph image&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<figure\n   id=\"fig-graph\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"graph\"\n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/blog\/how-i-wrote-an-article\/graph.svg\" alt=\"Dot graph image\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Dot graph image<\/figcaption>\n<\/figure>\n\n<h4 id=\"mention-figure\">Mention figure<a class=\"post-anchor\" href=\"#mention-figure\" aria-label=\"Anchor link for: mention-figure\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>Each figure with a shortcode produces a different identifier in which it\ncan be tagged or mentioned.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;plants&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;nature&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;garden&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;inline&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;math&quot;) }}<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation z-definition z-list z-begin z-markdown\">-<\/span><span> Mention image: {{ fig(id=&quot;graph&quot;) }}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<ul>\n<li>Mention image: <a href=\"#fig-plants\" class=\"figure-ref\" data-fig=\"plants\">fig-plants<\/a><\/li>\n<li>Mention image: <a href=\"#fig-nature\" class=\"figure-ref\" data-fig=\"nature\">fig-nature<\/a><\/li>\n<li>Mention image: <a href=\"#fig-garden\" class=\"figure-ref\" data-fig=\"garden\">fig-garden<\/a><\/li>\n<li>Mention image: <a href=\"#fig-inline\" class=\"figure-ref\" data-fig=\"inline\">fig-inline<\/a><\/li>\n<li>Mention image: <a href=\"#fig-math\" class=\"figure-ref\" data-fig=\"math\">fig-math<\/a><\/li>\n<li>Mention image: <a href=\"#fig-graph\" class=\"figure-ref\" data-fig=\"graph\">fig-graph<\/a><\/li>\n<\/ul>\n<h3 id=\"video\">Video<a class=\"post-anchor\" href=\"#video\" aria-label=\"Anchor link for: video\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>There is a shortcode for invoking videos, almost same as figure\nshortcodes.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>{{ video(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;video-id&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;video.mp4&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  img=&quot;cover.png&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Video caption&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  align=&quot;center&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  style=&quot;color: black;&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<p>Text align value has only two options, <code>center<\/code> (default) and <code>start<\/code>\n(left for LTR and right for RTL).<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>{{ video(<\/span><\/span>\n<span class=\"giallo-l\"><span>  id=&quot;writing&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  src=&quot;writing.webm&quot;,<\/span><\/span>\n<span class=\"giallo-l\"><span>  caption=&quot;Writing an article&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>}}<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n\n  <figure\n     id=\"vid-writing\"\n    class=\"ref-placeholder figure-center\"\n     data-ref=\"writing\"\n  >\n    <video\n        src=\"writing.webm\"\n        preload=\"metadata\"\n        playsinline\n        controls\n    >\n      Your browser does not support the video tag.\n    <\/video>\n    \n    <figcaption\n      class=\"\n        \n          caption-center\n        \"\n        >Video: Writing an article<\/figcaption>\n    \n  <\/figure>\n\n<h4 id=\"mention-video\">Mention video<a class=\"post-anchor\" href=\"#mention-video\" aria-label=\"Anchor link for: mention-video\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>This shortcode is very simple to mention video with an identifier.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>For demos, check out {{ vid(id=&quot;writing&quot;) }} for more details.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<p>For demos, check out <a href=\"#vid-writing\" class=\"video-ref\" data-vid=\"writing\">vid-writing<\/a> for more details.<\/p>\n<h3 id=\"reference-and-bibliography\">Reference and Bibliography<a class=\"post-anchor\" href=\"#reference-and-bibliography\" aria-label=\"Anchor link for: reference-and-bibliography\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>This shortcode is important for cite references or bibliography, any\nreference data is taken from the <code>toml<\/code> file. Bibliographical data is\nstored in <code>data\/references.toml<\/code>.<\/p>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"data\/references.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span class=\"z-punctuation\">[<\/span><span>online<\/span><span>.<\/span><span>strus2021<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span class=\"z-variable\">  title<\/span><span class=\"z-punctuation\">         =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Going SourceHut<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-variable\">  author<\/span><span class=\"z-punctuation\">        =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Marcin Stru\u015b<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-variable\">  url<\/span><span class=\"z-punctuation\">           =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/blog.strus.guru\/2022\/04\/going-sourcehut\/<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-variable\">  urldate<\/span><span class=\"z-punctuation\">       =<\/span><span> 2024-04-01<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-variable\">  date<\/span><span class=\"z-punctuation\">          =<\/span><span> 2022-04-25<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><span class=\"z-punctuation\">[<\/span><span>online<\/span><span>.<\/span><span>parasrah2022<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-variable\">  author<\/span><span class=\"z-punctuation\">        =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Parasrah<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-variable\">  title<\/span><span class=\"z-punctuation\">         =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">Why Use SourceHut<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">11<\/span><span class=\"z-variable\">  url<\/span><span class=\"z-punctuation\">           =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">https:\/\/blog.parasrah.com\/posts\/why-use-sourcehut\/<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">12<\/span><span class=\"z-variable\">  urldate<\/span><span class=\"z-punctuation\">       =<\/span><span> 2024-04-01<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">13<\/span><span class=\"z-variable\">  date<\/span><span class=\"z-punctuation\">          =<\/span><span> 2022-02-05<\/span><\/span><\/code><\/pre><h4 id=\"mention-reference\">Mention reference<a class=\"post-anchor\" href=\"#mention-reference\" aria-label=\"Anchor link for: mention-reference\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<p>After having a <code>reference.toml<\/code>, in articles can be cited with <code>ref<\/code>\nshortcodes. This is how to mention reference from shortcode within\nmarkup.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>{{ ref(id=&quot;ref-id&quot;, type=&quot;online&quot;) }}<\/span><\/span><\/code><\/pre>\n<ul>\n<li><code>id<\/code> = Reference identifier.<\/li>\n<li><code>type<\/code> = Available values are <code>online<\/code> (default), <code>manual<\/code>, <code>book<\/code>,\nand <code>journal<\/code>.<\/li>\n<\/ul>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"markdown\"><span class=\"giallo-l\"><span>Anyone can also contribute to sourcehut for service<\/span><\/span>\n<span class=\"giallo-l\"><span>development {{ ref(id=&quot;strus2022&quot;, type=&quot;online&quot;) }}.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Since the sourcehut source code is open, it can be installed<\/span><\/span>\n<span class=\"giallo-l\"><span>as long as user have the infrastructure for CI and CD<\/span><\/span>\n<span class=\"giallo-l\"><span>{{ ref(id=&quot;parasrah2022&quot;, type=&quot;online&quot;) }}.<\/span><\/span><\/code><\/pre>\n<p>Render output:<\/p>\n<p>Anyone can also contribute to sourcehut for service development\n<span class=\"ref-placeholder\" data-ref=\"strus2022\">(<a href=\"#ref-strus2022\">Stru\u015b, Marcin<\/a>)<\/span>.<\/p>\n<p>Since the sourcehut source code is open, it can be installed as long\nas user have the infrastructure for CI and CD <span class=\"ref-placeholder\" data-ref=\"parasrah2022\">(<a href=\"#ref-parasrah2022\">Parasrah<\/a>)<\/span>.<\/p>\n<blockquote>\n<p>There\u2019s list of reference in the page info section.<\/p>\n<\/blockquote>\n<h2 id=\"what-the-different\">What the different<a class=\"post-anchor\" href=\"#what-the-different\" aria-label=\"Anchor link for: what-the-different\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Basically, this article is about the general Markdown guide. So, what\u2019s\ndifferent. I have some principles.<\/p>\n<h3 id=\"less-is-more\">Less is more<a class=\"post-anchor\" href=\"#less-is-more\" aria-label=\"Anchor link for: less-is-more\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>No bring tons of JavaScript. Not using \n\n<a href=\"https:\/\/mermaid.js.org\">Mermaid JS<\/a> for\nshowing charts, not using \n\n<a href=\"https:\/\/leafletjs.com\">Leaflet JS<\/a> for showing map,\nnot using \n\n<a href=\"https:\/\/katex.org\">KaTex<\/a> or \n\n<a href=\"https:\/\/www.mathjax.org\">MathJax<\/a> for display\nmathematical images, no comment feature where JavaScript carries. Even\nbasic feature like article search with \n\n<a href=\"http:\/\/elasticlunr.com\">ElasticLunr<\/a> or \n\n<a href=\"https:\/\/www.fusejs.io\">Fuse JS<\/a> is not there. There is no JavaScript at all.<\/p>\n<p>Many people disable JavaScript for privacy and security reasons, both\nprofessional and personal. No JavaScript means no malicious JavaScript\ntoo <span class=\"ref-placeholder\" data-ref=\"nathaniel2021\">(<a href=\"#ref-nathaniel2021\">Nathaniel<\/a>)<\/span>.<\/p>\n<h3 id=\"choose-performance-over-comfort\">Choose performance over comfort<a class=\"post-anchor\" href=\"#choose-performance-over-comfort\" aria-label=\"Anchor link for: choose-performance-over-comfort\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>I choose performance over comfort. Using <code>dot<\/code> from \n\n<a href=\"https:\/\/graphviz.org\">Graphviz<\/a> to generate graph images. Using <code>typst<\/code> to generate mathematical\nimages. Using <code>typst<\/code> to generate PDF slides. Using <code>svgo<\/code> to reduce\nSVG sizes. Using <code>minify<\/code> to minify CSS or HTML. Using <code>ffmpeg<\/code> to\ncompress or convert videos. All of these packages are available at \n\n<a href=\"https:\/\/www.openbsd.org\">OpenBSD<\/a>, my current operating system. Previously, I\u2019ve tried\nto using third JavaScript but it reduced performance. Now, without third\nparty features it can improve website performance even though it is\nmostly built with HTML and CSS alone.<\/p>\n<h3 id=\"academic-writing-purpose\">Academic writing purpose<a class=\"post-anchor\" href=\"#academic-writing-purpose\" aria-label=\"Anchor link for: academic-writing-purpose\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Bring custom shortcodes to facilitate academic writing. Manage the\nhyperlink with <code>go()<\/code> shortcode and stored in toml file, and then invoke\nfrom the shortcode within markup. There are references and bibliography\nwith <code>ref()<\/code> shortcode, it generates an automatic list and shows\nbibliography at the end of the page if tagged. Display the typing button\nwith <code>key()<\/code> shortcode to show the key for tutorial purposes with a\nspecific operating system.<\/p>\n<p>Markdown is pretty easy to understand for beginners. Markdown as an\ninstant note, task, article, or other need. With custom shortcode\nsupport, \n\n<a href=\"https:\/\/www.getzola.org\">Zola<\/a> user has the potential to expand features.<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-1\">\n<p>The unveil() system call first appeared\nin OpenBSD 6.4. <a href=\"#fr-1-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"Configuring GPG & OpenSSH for Git on OpenBSD","published":"2024-06-19T00:00:00+00:00","updated":"2026-06-09T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/","content":"<p>\n\n<a href=\"https:\/\/gnupg.org\">GnuPG<\/a> (The GNU Privacy Guard) is one of the standards that\nimplements OpenPGP as defined by \n\n<a href=\"https:\/\/www.ietf.org\/rfc\/rfc4880.txt\">rfc4880<\/a>. The purpose of\nGnuPG is to encrypt and sign data and communications, as well as manage\nsystem keys. \n\n<a href=\"https:\/\/gnupg.org\">GnuPG<\/a> is also known as GPG, which refers to\n<code>gpg<\/code> as a CLI tool that facilitates integration with other applications\nand supports <em>Secure Socket Shell (SSH)<\/em>.<\/p>\n<p>Since 1997, GnuPG has been one of the free software programs that\ncares about user data privacy. GnuPG can be used freely, modified, and\ndistributed under the GPL license.<\/p>\n<h2 id=\"benefits-of-using-gnupg-keys\">Benefits of using GnuPG keys<a class=\"post-anchor\" href=\"#benefits-of-using-gnupg-keys\" aria-label=\"Anchor link for: benefits-of-using-gnupg-keys\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>By using GnuPG keys, users will get the following three benefits.<\/p>\n<ul>\n<li><strong>Data integrity<\/strong>: GnuPG keys ensure the integrity of digital content\nby creating digital signatures. This allows users to verify that the\ncontent has not been tampered with during transit or delivery.<\/li>\n<li><strong>Authentication<\/strong>: GnuPG keys provide a mechanism for authenticating\nthe source of digital content. Users can verify that the content\noriginates from a trusted and verified entity.<\/li>\n<li><strong>Secure communication<\/strong>: GnuPG keys facilitate secure communication\nby enabling encryption. This ensures that only authorized parties can\naccess encrypted data.<\/li>\n<\/ul>\n<p>In addition, GnuPG is very useful when working with Git. To implement\nit, users will enter a password into the pinentry or cli dialog for the\npurpose of providing authentic authentication. Then the username will\nappear in each commit with this command, which will show the digital\nsignature validation in each marker with <code>--gpg-sign<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git commit --gpg-sign -m &quot;sign with gpg key&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">#<\/span><span> or<\/span><\/span>\n<span class=\"giallo-l\"><span>git commit -S -m &quot;sign with gpg key&quot;<\/span><\/span><\/code><\/pre>\n<p>Once successful, users can view the digital signature on each commit\nwith the <code>--show-signature<\/code> parameter.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git show 1af04a6001 --show-signature<\/span><\/span>\n<span class=\"giallo-l\"><span>         # ^ hash code<\/span><\/span><\/code><\/pre>\n<p>It will look like this.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>commit 1af04a60013c8df1b0107ef29755b70feca402da (HEAD -&gt; main, sh\/main)<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg: Signature made Fri 14 Jun 2024 07:44:44 PM WIB<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg:                using EDDSA key 5A131FCDDAC2876802F631D1D7B52C04D9B41849<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg: Good signature from &quot;Hervy Work Email (Test) &lt;work@mail.org&gt;&quot; [ultimate]<\/span><\/span>\n<span class=\"giallo-l\"><span>Primary key fingerprint: 5A13 1FCD DAC2 8768 02F6  31D1 D7B5 2C04 D9B4 1849<\/span><\/span>\n<span class=\"giallo-l\"><span>Author: Hervy Work Email &lt;work@mail.org&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>Date:   Fri Jun 14 19:44:44 2024 +0700<\/span><\/span><\/code><\/pre>\n<p>Written <code>Good signature from<\/code> the original marker in the log header.\nUsing GnuPG, Git, and OpenSSH is highly recommended because they can\nprovide a written validation trail.<\/p>\n<p>This article explains:<\/p>\n<ul>\n<li><a href=\"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/.\/#gnupg-key-configuration\">GnuPG Key Configuration<\/a>.<\/li>\n<li><a href=\"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/.\/#ssh-key-configuration\">SSH Key Configuration<\/a>.<\/li>\n<li><a href=\"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/.\/#git-configuration\">Git Configuration<\/a>.<\/li>\n<\/ul>\n<p>This article was written using OpenBSD operating system, as the aim is\nto narrow the scope of the discussion so that it does not spread to all\noperating systems (the article could become pages long if written for\nmultiple OS). The second reason is that currently, no operating system\nother than OpenBSD is installed.<\/p>\n<p>However, please note that all the tools used in this article, including\nGnuPG, OpenSSH, and Git, are <em>Open Source<\/em> and can therefore be used on\nother operating systems such as Linux-based, Windows or MacOS. In this\nexplanation, you can skip to the steps you need.<\/p>\n<h2 id=\"gnupg-key-configuration\">GnuPG Key Configuration<a class=\"post-anchor\" href=\"#gnupg-key-configuration\" aria-label=\"Anchor link for: gnupg-key-configuration\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<h3 id=\"installing-gnupg\">Installing GnuPG<a class=\"post-anchor\" href=\"#installing-gnupg\" aria-label=\"Anchor link for: installing-gnupg\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>GnuPG can be installed on various operating systems. Users can choose\nthe guide based on the operating system they are currently using.<\/p>\n<h4 id=\"openbsd\">OpenBSD<a class=\"post-anchor\" href=\"#openbsd\" aria-label=\"Anchor link for: openbsd\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg_add gnupg<\/span><\/span><\/code><\/pre><h4 id=\"freebsd\">FreeBSD<a class=\"post-anchor\" href=\"#freebsd\" aria-label=\"Anchor link for: freebsd\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg install gnupg<\/span><\/span><\/code><\/pre><h3 id=\"checking-the-gnupg-version\">Checking the GnuPG version<a class=\"post-anchor\" href=\"#checking-the-gnupg-version\" aria-label=\"Anchor link for: checking-the-gnupg-version\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>The first thing to do after installing GnuPG is to check its version\nwith <code>gpg<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>gpg --version<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>gpg (GnuPG) 2.4.5<\/span><\/span>\n<span class=\"giallo-l\"><span>libgcrypt 1.10.3<\/span><\/span>\n<span class=\"giallo-l\"><span>Copyright (C) 2024 g10 Code GmbH<\/span><\/span>\n<span class=\"giallo-l\"><span>License GNU GPL-3.0-or-later &lt;https:\/\/gnu.org\/licenses\/gpl.html&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>This is free software: you are free to change and redistribute it.<\/span><\/span>\n<span class=\"giallo-l\"><span>There is NO WARRANTY, to the extent permitted by law.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Home: \/home\/hervyqa\/.gnupg<\/span><\/span>\n<span class=\"giallo-l\"><span>Supported algorithms:<\/span><\/span>\n<span class=\"giallo-l\"><span>Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA<\/span><\/span>\n<span class=\"giallo-l\"><span>Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,<\/span><\/span>\n<span class=\"giallo-l\"><span>        CAMELLIA128, CAMELLIA192, CAMELLIA256<\/span><\/span>\n<span class=\"giallo-l\"><span>Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224<\/span><\/span>\n<span class=\"giallo-l\"><span>Compression: Uncompressed, ZIP, ZLIB, BZIP2<\/span><\/span><\/code><\/pre>\n<p>For example, the version above uses version <code>2.4.5<\/code>.<\/p>\n<h3 id=\"creating-a-new-gnupg-key\">Creating a new GnuPG key<a class=\"post-anchor\" href=\"#creating-a-new-gnupg-key\" aria-label=\"Anchor link for: creating-a-new-gnupg-key\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>If the version you are using is <code>2.1.17<\/code> or above, it is recommended to\nuse this terminal command.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>gpg --full-generate-key<\/span><\/span><\/code><\/pre>\n<p>Meanwhile, if the version is below <code>2.1.17<\/code>, use <code>--gen-key<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>gpg --default-new-key-algo rsa4096 --gen-key<\/span><\/span><\/code><\/pre><h3 id=\"selecting-a-key-algorithm\">Selecting a key algorithm<a class=\"post-anchor\" href=\"#selecting-a-key-algorithm\" aria-label=\"Anchor link for: selecting-a-key-algorithm\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>After running the command, a selection of key algorithm types to use\nwill appear.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH<\/span><\/span>\n<span class=\"giallo-l\"><span>This is free software: you are free to change and redistribute it.<\/span><\/span>\n<span class=\"giallo-l\"><span>There is NO WARRANTY, to the extent permitted by law.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>gpg: directory &#39;\/home\/hervyqa\/.gnupg&#39; created<\/span><\/span>\n<span class=\"giallo-l\"><span>Please select what kind of key you want:<\/span><\/span>\n<span class=\"giallo-l\"><span>   (1) RSA and RSA<\/span><\/span>\n<span class=\"giallo-l\"><span>   (2) DSA and Elgamal<\/span><\/span>\n<span class=\"giallo-l\"><span>   (3) DSA (sign only)<\/span><\/span>\n<span class=\"giallo-l\"><span>   (4) RSA (sign only)<\/span><\/span>\n<span class=\"giallo-l\"><span>   (9) ECC (sign and encrypt) *default*<\/span><\/span>\n<span class=\"giallo-l\"><span>  (10) ECC (sign only)<\/span><\/span>\n<span class=\"giallo-l\"><span>  (14) Existing key from card<\/span><\/span>\n<span class=\"giallo-l\"><span>Your selection?<\/span><\/span><\/code><\/pre>\n<p>There are several options: 1, 2, 3, 4, 9, 10, 14. Just press {{&lt; kbd\nEnter &gt;}} to select number 9 <code>ECC (sign and encrypt)<\/code> as the default.<\/p>\n<p>Next, select the type of elliptic curve to use.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Please select which elliptic curve you want:<\/span><\/span>\n<span class=\"giallo-l\"><span>   (1) Curve 25519 *default*<\/span><\/span>\n<span class=\"giallo-l\"><span>   (4) NIST P-384<\/span><\/span>\n<span class=\"giallo-l\"><span>   (6) Brainpool P-256<\/span><\/span>\n<span class=\"giallo-l\"><span>Your selection?<\/span><\/span><\/code><\/pre>\n<p>Press <kbd>enter<\/kbd> to select number 1 <code>Curve 25519<\/code> as the\ndefault.<\/p>\n<h3 id=\"selecting-the-gnupg-key-expiration-time-limit\">Selecting the GnuPG key expiration time limit<a class=\"post-anchor\" href=\"#selecting-the-gnupg-key-expiration-time-limit\" aria-label=\"Anchor link for: selecting-the-gnupg-key-expiration-time-limit\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Next, select the key expiration time. It is recommended to select 0 to\nchoose no expiration time.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Please specify how long the key should be valid.<\/span><\/span>\n<span class=\"giallo-l\"><span>         0 = key does not expire<\/span><\/span>\n<span class=\"giallo-l\"><span>      &lt;n&gt;  = key expires in n days<\/span><\/span>\n<span class=\"giallo-l\"><span>      &lt;n&gt;w = key expires in n weeks<\/span><\/span>\n<span class=\"giallo-l\"><span>      &lt;n&gt;m = key expires in n months<\/span><\/span>\n<span class=\"giallo-l\"><span>      &lt;n&gt;y = key expires in n years<\/span><\/span><\/code><\/pre>\n<p>Select <kbd>0<\/kbd> to choose number 0 <code>key does not expire<\/code> and\nselect <kbd>y<\/kbd> to confirm.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Key is valid for? (0)<\/span><\/span>\n<span class=\"giallo-l\"><span>Key does not expire at all<\/span><\/span>\n<span class=\"giallo-l\"><span>Is this correct? (y\/N)<\/span><\/span><\/code><\/pre><h3 id=\"enter-gnupg-user-data\">Enter GnuPG user data<a class=\"post-anchor\" href=\"#enter-gnupg-user-data\" aria-label=\"Anchor link for: enter-gnupg-user-data\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Next, enter the user\u2019s GnuPG data. Enter the name, email address, and\ncomments. For example:<\/p>\n<ul>\n<li>Real name: Hervy Work Email<\/li>\n<li>Email address: <a href=\"mailto:work@mail.org\">work@mail.org<\/a><\/li>\n<li>Comments: Test<\/li>\n<\/ul>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Real name: Hervy Work Email<\/span><\/span>\n<span class=\"giallo-l\"><span>Email address: worka@mail.org<\/span><\/span>\n<span class=\"giallo-l\"><span>Comment: Test<\/span><\/span><\/code><\/pre>\n<p>The result of the GnuPG key user data will look like this.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>You selected this USER-ID:<\/span><\/span>\n<span class=\"giallo-l\"><span>    &quot;Hervy Work Email (Test) &lt;work@mail.org&gt;&quot;<\/span><\/span><\/code><\/pre>\n<p>If you want to confirm, select <kbd>o<\/kbd> (okay).<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Change (N)ame, (C)omment, (E)mail or (O)kay\/(Q)uit? o<\/span><\/span><\/code><\/pre>\n<p>Ensure that no errors appear in the terminal output. An example of\nsuccessful output is shown below.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>We need to generate a lot of random bytes. It is a good idea to perform<\/span><\/span>\n<span class=\"giallo-l\"><span>some other action (type on the keyboard, move the mouse, utilize the<\/span><\/span>\n<span class=\"giallo-l\"><span>disks) during the prime generation; this gives the random number<\/span><\/span>\n<span class=\"giallo-l\"><span>generator a better chance to gain enough entropy.<\/span><\/span>\n<span class=\"giallo-l\"><span>We need to generate a lot of random bytes. It is a good idea to perform<\/span><\/span>\n<span class=\"giallo-l\"><span>some other action (type on the keyboard, move the mouse, utilize the<\/span><\/span>\n<span class=\"giallo-l\"><span>disks) during the prime generation; this gives the random number<\/span><\/span>\n<span class=\"giallo-l\"><span>generator a better chance to gain enough entropy.<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg: \/home\/hervyqa\/.gnupg\/trustdb.gpg: trustdb created<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg: directory &#39;\/home\/hervyqa\/.gnupg\/openpgp-revocs.d&#39; created<\/span><\/span>\n<span class=\"giallo-l\"><span>gpg: revocation certificate stored as &#39;\/home\/hervyqa\/.gnupg\/openpgp-revocs.d\/5A131FCDDAC2876802F631D1D7B52C04D9B41849.rev&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span>public and secret key created and signed.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>pub   ed25519 2024-06-06 [SC]<\/span><\/span>\n<span class=\"giallo-l\"><span>      5A131FCDDAC2876802F631D1D7B52C04D9B41849<\/span><\/span>\n<span class=\"giallo-l\"><span>uid                      Hervy Work Email (Test) &lt;work@mail.org&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>sub   cv25519 2024-06-06 [E]<\/span><\/span><\/code><\/pre><h3 id=\"viewing-gnupg-key-id\">Viewing GnuPG key ID<a class=\"post-anchor\" href=\"#viewing-gnupg-key-id\" aria-label=\"Anchor link for: viewing-gnupg-key-id\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>gpg --list-secret-keys --keyid-format long<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>\/home\/hervyqa\/.gnupg\/pubring.kbx<\/span><\/span>\n<span class=\"giallo-l\"><span>--------------------------------<\/span><\/span>\n<span class=\"giallo-l\"><span>sec   ed25519\/D7B52C04D9B41849 2024-06-06 [SC]<\/span><\/span>\n<span class=\"giallo-l\"><span>      Key fingerprint = 5A13 1FCD DAC2 8768 02F6  31D1 D7B5 2C04 D9B4 1849<\/span><\/span>\n<span class=\"giallo-l\"><span>uid                 [ultimate] Hervy Work Email (Test) &lt;work@mail.org&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>ssb   cv25519\/1CC5EEC8BDE8BC06 2024-06-06 [E]<\/span><\/span><\/code><\/pre>\n<p>It should be noted that the user keys are:<\/p>\n<ul>\n<li>ID key = <strong>D7B52C04D9B41849<\/strong><\/li>\n<li>Fingerprint key = <strong>5A13 1FCD DAC2 8768 02F6 31D1 D7B5 2C04 D9B4 1849<\/strong><\/li>\n<\/ul>\n<p>The GnuPG ID key can be integrated into the OpenSSH settings in the next step.<\/p>\n<h2 id=\"ssh-key-configuration\">SSH Key Configuration<a class=\"post-anchor\" href=\"#ssh-key-configuration\" aria-label=\"Anchor link for: ssh-key-configuration\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>\n\n<a href=\"https:\/\/openssh.org\">OpenSSH<\/a> (OpenBSD Secure Shell) is a tool for securing\nnetwork protocols based on <em>Secure Socket Shell<\/em>. OpenSSH is integrated\nwith several operating systems such as BSD, Windows, macOS, and most\nLinux distributions.<\/p>\n<p>SSH has several contexts, including:<\/p>\n<ol>\n<li>Refers to the <strong>Secure Socket Shell<\/strong> network protocol.<\/li>\n<li>Refers to the <strong>OpenSSH<\/strong> software.<\/li>\n<li>Refers to a commercial company called \n\n<a href=\"https:\/\/www.ssh.com\">SSH.com<\/a>.<\/li>\n<\/ol>\n<p>For clarification, this article uses two contexts, namely numbers 1\nand 2. Number 3 is not possible because it is not the subject of this\narticle. To be clear, this article only uses these two contexts.<\/p>\n<ol>\n<li>SSH as a network protocol, which refers to <strong>Secure Socket Shell<\/strong>.\nTherefore, <strong>SSH keys<\/strong> refer to the authentication keys used for the\nSSH network protocol.<\/li>\n<li>The software that can manage, run, and generate SSH keys is\n<strong>OpenSSH<\/strong> software.<\/li>\n<\/ol>\n<h3 id=\"installing-openssh\">Installing OpenSSH<a class=\"post-anchor\" href=\"#installing-openssh\" aria-label=\"Anchor link for: installing-openssh\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Similar to GnuPG, <strong>OpenSSH<\/strong> can be installed on any platform,\nespecially BSD dan Linux-based.<\/p>\n<h4 id=\"openbsd-1\">OpenBSD<a class=\"post-anchor\" href=\"#openbsd-1\" aria-label=\"Anchor link for: openbsd-1\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg_add openssh<\/span><\/span><\/code><\/pre><h4 id=\"freebsd-1\">FreeBSD<a class=\"post-anchor\" href=\"#freebsd-1\" aria-label=\"Anchor link for: freebsd-1\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg install openssh<\/span><\/span><\/code><\/pre><h3 id=\"checking-the-openssh-version\">Checking the OpenSSH version<a class=\"post-anchor\" href=\"#checking-the-openssh-version\" aria-label=\"Anchor link for: checking-the-openssh-version\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Each operating system may have a different version of OpenSSH. Users can\nview the Git version with this command.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ssh -V<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>OpenSSH_9.7p1, OpenSSL 3.0.13 30 Jan 2024<\/span><\/span><\/code><\/pre>\n<p>For example, the version above uses version <code>9.7p1<\/code>.<\/p>\n<h3 id=\"checking-ssh-keys\">Checking SSH Keys<a class=\"post-anchor\" href=\"#checking-ssh-keys\" aria-label=\"Anchor link for: checking-ssh-keys\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>SSH keys are used for remote control authentication. They are most\ncommonly used to log in to git forges such as sourcehut, github, or\ngitlab.<\/p>\n<p>Before configuring, make sure there are no SSH keys in the <code>~\/.ssh<\/code>\ndirectory. You can check this with the following terminal command.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ls -al ~\/.ssh<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Permissions Size User    Date Modified Name<\/span><\/span>\n<span class=\"giallo-l\"><span>.rw-------   203 hervyqa 21 Mar 07:09  config<\/span><\/span>\n<span class=\"giallo-l\"><span>.rw-------   464 hervyqa 21 Mar 07:09  id_ed25519<\/span><\/span>\n<span class=\"giallo-l\"><span>.rw-------    99 hervyqa 21 Mar 07:09  id_ed25519.pub<\/span><\/span>\n<span class=\"giallo-l\"><span>.rw-------  3.6k hervyqa 21 Mar 07:09  known_hosts<\/span><\/span><\/code><\/pre>\n<p>Generally, there are three types of public key files:<\/p>\n<ul>\n<li>id_rsa.pub<\/li>\n<li>id_ecdsa.pub<\/li>\n<li>id_ed25519.pub<\/li>\n<\/ul>\n<p>If it is still empty, you can proceed to the next step to create a new\nSSH key.<\/p>\n<h3 id=\"creating-a-new-ssh-key\">Creating a new SSH key<a class=\"post-anchor\" href=\"#creating-a-new-ssh-key\" aria-label=\"Anchor link for: creating-a-new-ssh-key\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ssh-keygen -t ed25519 -C &quot;work@mail.com&quot;<\/span><\/span><\/code><\/pre>\n<p>If it doesn\u2019t work, and you get an <code>invalid format<\/code> or <code>feature not supported<\/code> error, then there is hardware security that requires the use\nof the <code>ecdsa-sk<\/code> algorithm.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ssh-keygen -t ecdsa-sk -C &quot;work@mail.com&quot;<\/span><\/span><\/code><\/pre>\n<p>Just press <kbd>enter<\/kbd> to select the default directory location.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Generating public\/private ed25519 key pair.<\/span><\/span>\n<span class=\"giallo-l\"><span>Enter file in which to save the key (\/home\/hervyqa\/.ssh\/id_ed25519): (ENTER)<\/span><\/span>\n<span class=\"giallo-l\"><span>Created directory &#39;\/home\/hervyqa\/.ssh&#39;.<\/span><\/span><\/code><\/pre>\n<p>Next, enter the user\u2019s secret password.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Enter passphrase (empty for no passphrase):<\/span><\/span>\n<span class=\"giallo-l\"><span>Enter same passphrase again:<\/span><\/span><\/code><\/pre>\n<p>If successful, the output will look like this.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Your identification has been saved in \/home\/hervyqa\/.ssh\/id_ed25519<\/span><\/span>\n<span class=\"giallo-l\"><span>Your public key has been saved in \/home\/hervyqa\/.ssh\/id_ed25519.pub<\/span><\/span>\n<span class=\"giallo-l\"><span>The key fingerprint is:<\/span><\/span>\n<span class=\"giallo-l\"><span>SHA256:KUfzOkl2FyOf5\/30nIEH60jrdNV2HafUCl8fdjgVBL8 work@mail.com<\/span><\/span>\n<span class=\"giallo-l\"><span>The key&#39;s randomart image is:<\/span><\/span>\n<span class=\"giallo-l\"><span>+--[ED25519 256]--+<\/span><\/span>\n<span class=\"giallo-l\"><span>|             .ooo|<\/span><\/span>\n<span class=\"giallo-l\"><span>|              .+ |<\/span><\/span>\n<span class=\"giallo-l\"><span>|        o . + +==|<\/span><\/span>\n<span class=\"giallo-l\"><span>|       . + o B.=X|<\/span><\/span>\n<span class=\"giallo-l\"><span>|      . S o +.=E*|<\/span><\/span>\n<span class=\"giallo-l\"><span>|       = + . o=o.|<\/span><\/span>\n<span class=\"giallo-l\"><span>|        +  o +.oo|<\/span><\/span>\n<span class=\"giallo-l\"><span>|         .o = .o=|<\/span><\/span>\n<span class=\"giallo-l\"><span>|          .+ . .+|<\/span><\/span>\n<span class=\"giallo-l\"><span>+----[SHA256]-----+<\/span><\/span><\/code><\/pre>\n<p>Please note, based on the output above, there are two files that you\nneed to know about:<\/p>\n<ul>\n<li>The private\/secret key is located at: <code>~\/.ssh\/id_ed25519<\/code>.<\/li>\n<li>The public key is located at: <code>~\/.ssh\/id_ed25519.pub<\/code>.<\/li>\n<\/ul>\n<p>The key that can be shared is <code>id_ed25519.pub<\/code> because it is public.<\/p>\n<h3 id=\"changing-the-ssh-email\">Changing the SSH Email<a class=\"post-anchor\" href=\"#changing-the-ssh-email\" aria-label=\"Anchor link for: changing-the-ssh-email\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>If you want to change the old SSH email name, you can use the following\ncommand.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ssh-keygen -c -f ~\/.ssh\/id_ed25519 -C &quot;newusername@mail.com&quot;<\/span><\/span><\/code><\/pre>\n<ul>\n<li><code>-c<\/code> replaces the comment in the private and public keys.<\/li>\n<li><code>-f<\/code> is the name of the private key file.<\/li>\n<li><code>-C<\/code> is the comment name of the generated key.<\/li>\n<\/ul>\n<h3 id=\"adding-ssh-keys-to-ssh-agent\">Adding SSH Keys to ssh-agent<a class=\"post-anchor\" href=\"#adding-ssh-keys-to-ssh-agent\" aria-label=\"Anchor link for: adding-ssh-keys-to-ssh-agent\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>By adding SSH keys to <code>ssh-agent<\/code>, if you are working with\n<code>git<\/code>\/<code>gitui<\/code>\/<code>lazygit<\/code> in a terminal environment, you only need to\nenter your password once. When <code>git push<\/code>\/<code>git pull<\/code> with SSH, the\ncommand will be executed directly without entering a password in the\nfuture. Therefore, <code>ssh-agent<\/code> is very useful and convenient for users.<\/p>\n<p>The following is the command to run ssh-agent in the background.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>eval &quot;$(ssh-agent -s)&quot;<\/span><\/span><\/code><\/pre>\n<p>Then add the private key with ssh-add.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>ssh-add ~\/.ssh\/id_ed25519<\/span><\/span><\/code><\/pre><h2 id=\"git-configuration\">Git Configuration<a class=\"post-anchor\" href=\"#git-configuration\" aria-label=\"Anchor link for: git-configuration\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<h3 id=\"installing-git\">Installing Git<a class=\"post-anchor\" href=\"#installing-git\" aria-label=\"Anchor link for: installing-git\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Git can also be installed on any platform, especially BSD and\nLinux-based.<\/p>\n<h4 id=\"openbsd-2\">OpenBSD<a class=\"post-anchor\" href=\"#openbsd-2\" aria-label=\"Anchor link for: openbsd-2\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg_add git<\/span><\/span><\/code><\/pre><h4 id=\"freebsd-2\">FreeBSD<a class=\"post-anchor\" href=\"#freebsd-2\" aria-label=\"Anchor link for: freebsd-2\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h4>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>pkg install git<\/span><\/span><\/code><\/pre><h3 id=\"checking-the-git-version\">Checking the Git version<a class=\"post-anchor\" href=\"#checking-the-git-version\" aria-label=\"Anchor link for: checking-the-git-version\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Each operating system may have a different Git version. Users can view\nthe Git version with this command.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git --version<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>git version 2.44.1<\/span><\/span><\/code><\/pre>\n<p>For example, the version above uses version <code>2.44.1<\/code>.<\/p>\n<h3 id=\"adding-username-and-email\">Adding Username and Email<a class=\"post-anchor\" href=\"#adding-username-and-email\" aria-label=\"Anchor link for: adding-username-and-email\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Add an active username and email. The username uses a name from a git\nforge account such as Sourehut, Github, Gitlab, Codeberg, or others. For\nexample, we will use <code>hervyqa<\/code> and <code>work@mail.com<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global user.name &#39;hervyqa&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span>git config --global user.email &#39;work@mail.org&#39;<\/span><\/span><\/code><\/pre><h3 id=\"adding-gnupg-key-id-to-git\">Adding GnuPG Key ID to Git<a class=\"post-anchor\" href=\"#adding-gnupg-key-id-to-git\" aria-label=\"Anchor link for: adding-gnupg-key-id-to-git\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Next, add the GnuPG key ID to the Git configuration. The ID can be found\nin <a href=\"https:\/\/hervyqa.srht.site\/blog\/configuring-gpg-openssh-for-git\/.\/#viewing-gnupg-key-id\">how to view GnuPG key ID<\/a> in the previous\nstep.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global user.signingkey D7B52C04D9B41849<\/span><\/span><\/code><\/pre>\n<p>If you don\u2019t want to add <code>--gpg-sign<\/code> manually, you can add this\nconfiguration.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global commit.gpgsign true<\/span><\/span><\/code><\/pre>\n<p>At the same time, if you want to create a tag without manually adding\n<code>--gpg-sign<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global tag.gpgsign true<\/span><\/span><\/code><\/pre>\n<p>Additional settings to change the branch name from <code>master<\/code> to <code>main<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global init.defaultBranch main<\/span><\/span><\/code><\/pre><h3 id=\"viewing-all-git-configurations\">Viewing All Git Configurations<a class=\"post-anchor\" href=\"#viewing-all-git-configurations\" aria-label=\"Anchor link for: viewing-all-git-configurations\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>If you want to view the configurations that have been set previously,\nyou can use the command below.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>git config --global --list<\/span><\/span><\/code><\/pre>\n<p>The configuration can also be viewed in the <code>~\/.config\/git<\/code> directory.\nThe configuration looks something like this.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>cat ~\/.config\/git\/config<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>[commit]<\/span><\/span>\n<span class=\"giallo-l\"><span>        gpgSign = true<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>[init]<\/span><\/span>\n<span class=\"giallo-l\"><span>        defaultBranch = &quot;main&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>[tag]<\/span><\/span>\n<span class=\"giallo-l\"><span>        gpgSign = true<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>[user]<\/span><\/span>\n<span class=\"giallo-l\"><span>        email = &quot;work@mail.org&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>        name = &quot;Hervy Work Email&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>        signingKey = &quot;D7B52C04D9B41849&quot;<\/span><\/span><\/code><\/pre><h2 id=\"in-conclusion\">In conclusion<a class=\"post-anchor\" href=\"#in-conclusion\" aria-label=\"Anchor link for: in-conclusion\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Thus, the explanation above uses the CLI, which takes longer and is not\ninstantaneous. Users can use GUI (Client) software for managing GnuPG,\nOpenSSH, and Git. However, that is not the purpose here. The hope is\nthat readers will understand the CLI process and commands so that they\ncan better understand the process. Of course, increasing literacy in\nthe use of OpenSSH and Git is very helpful for software development and\nprogramming processes.<\/p>\n"},{"title":"Industrial Revolution 4.0 for University","published":"2024-05-18T00:00:00+00:00","updated":"2026-07-01T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/talks\/industrial-revolution\/"}},"id":"https:\/\/hervyqa.srht.site\/talks\/industrial-revolution\/","content":"<h2 id=\"abstract\">Abstract<a class=\"post-anchor\" href=\"#abstract\" aria-label=\"Anchor link for: abstract\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>The Fourth Industrial Revolution has brought significant changes across\nvarious aspects of society, including the education sector. Therefore,\nunderstanding its concepts, objectives, and impacts has become essential\nfor students as the younger generation.<\/p>\n<p>This learning material aims to provide an understanding of the meaning\nand purpose of the Fourth Industrial Revolution, its impacts on\ndifferent sectors particularly education and the role students should\nplay in responding to the era of digital transformation.<\/p>\n<p>Through this learning, participants are expected to gain broader\ninsights into the Fourth Industrial Revolution, recognize opportunities\narising from technological advancements, and develop relevant\ncompetencies to adapt and contribute effectively in the future.<\/p>\n"},{"title":"SourceHut: An Open Source Git Forge Alternative to GitHub","published":"2024-04-02T00:00:00+00:00","updated":"2026-06-05T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/sourcehut-open-source-git-forge\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/sourcehut-open-source-git-forge\/","content":"<p>As a software developer, you are certainly familiar with GitHub\nas a git repository hosting provider, also known as a <em>git forge<\/em>.\nBesides GitHub, there are other alternatives such as Gitlab, Codeberg,\nSourceForge, and Bitbucket. I have used all of them, but I will not\ndiscuss them here.<\/p>\n<h2 id=\"benefits-of-using-git-forge\">Benefits of using Git Forge<a class=\"post-anchor\" href=\"#benefits-of-using-git-forge\" aria-label=\"Anchor link for: benefits-of-using-git-forge\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Before using a <em>git forge<\/em> such as SourceHut, it is important to\nunderstand the general benefits of using a <em>git forge<\/em>.<\/p>\n<ul>\n<li>Facilitates code collaboration. If you are working with a team, it\nis recommended to use a <em>git forge<\/em> because of the many features it\noffers.<\/li>\n<li>Monitors code changes before they are merged into the main branch.\nMonitoring code results is very important for project managers who\nneed to check code quality.<\/li>\n<li>Serves as a portfolio for developers. Various projects that have been\nworked on can be made into a public portfolio that can be used as\na reference.<\/li>\n<\/ul>\n<p>With the various benefits mentioned above, developers should have one of\nthese <em>git forge<\/em> institutions.<\/p>\n<h2 id=\"why-sourcehut\">Why SourceHut?<a class=\"post-anchor\" href=\"#why-sourcehut\" aria-label=\"Anchor link for: why-sourcehut\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>\n\n<a href=\"https:\/\/sourcehut.org\">SourceHut<\/a> is a cloud-based git repository hosting provider\nfor managing project code. Of course, SourceHut is also open source\nsoftware that can be customized by its users.<\/p>\n<p>So, what are the benefits of using SourceHut over other git forges? There are\nseveral interesting facts that have been discovered.<\/p>\n<h2 id=\"free-and-open-source-software\">Free and open source software<a class=\"post-anchor\" href=\"#free-and-open-source-software\" aria-label=\"Anchor link for: free-and-open-source-software\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>\n\n<a href=\"https:\/\/sourcehut.org\">SourceHut<\/a> is a free and open source <em>git forge<\/em> software\nunder the <em>GNU Affero General Public License<\/em> (AGPL 3.0). Unlike GitHub\nor GitLab, SourceHut is 100% open source. You can view, access, and\nmodify the sourcehut source code at \n\n<a href=\"https:\/\/git.sr.ht\/~sircmpwn\/sourcehut\">SourceHut Source<\/a>. Compared to\nother <em>git forges<\/em> such as GitHub, this is impossible to access because\nonly authorized personnel within the company know the source code.\nSourcehut can even be installed independently.<\/p>\n<p>Some <em>git forges<\/em> that have been used along with their source code.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Git Forge<\/th><th style=\"text-align: left\">Source<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\">SourceHut<\/td><td style=\"text-align: left\">\n\n<a href=\"https:\/\/git.sr.ht\/~sircmpwn\/sourcehut\">Open Source<\/a><\/td><\/tr>\n<tr><td style=\"text-align: left\">GitLab<\/td><td style=\"text-align: left\">\n\n<a href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab\">Open Source<\/a><sup class=\"footnote-reference\" id=\"fr-1-1\"><a href=\"#fn-1\">1<\/a><\/sup><\/td><\/tr>\n<tr><td style=\"text-align: left\">GitHub<\/td><td style=\"text-align: left\">Proprietary<\/td><\/tr>\n<tr><td style=\"text-align: left\">BitBucket<\/td><td style=\"text-align: left\">Proprietary<\/td><\/tr>\n<\/tbody><\/table>\n<blockquote class=\"markdown-alert-important\">\n<p>Open source is software code that is open, while proprietary is closed\nprogram code that is not shared publicly. Only those with\nauthorization can access it.<\/p>\n<\/blockquote>\n<p>Sourcehut was not founded by a large company. It was founded by \n\n<a href=\"https:\/\/drewdevault.com\">Drew DeVault<\/a> as CEO and maintainer of\nthe \n\n<a href=\"https:\/\/gitlab.freedesktop.org\/wlroots\/wlroots\">Wlroot<\/a> project and \n\n<a href=\"https:\/\/swaywm.org\">Swaywm<\/a> projects,\nalong with \n\n<a href=\"https:\/\/emersion.fr\">Simon Ser<\/a> as release manager of the \n\n<a href=\"https:\/\/wayland.freedesktop.org\">Wayland<\/a> project. In addition, Sourcehut is supported\nby the talented engineer \n\n<a href=\"https:\/\/bitfehler.srht.site\">Conrad Hoffmann<\/a>, who contributes to\nthe \n\n<a href=\"https:\/\/kde.org\">KDE<\/a> project, \n\n<a href=\"https:\/\/www.haproxy.org\">HAProxy<\/a>, and the \n\n<a href=\"https:\/\/prometheus.io\">Prometheus ecosystem<\/a>.<\/p>\n<h2 id=\"owned-code-data\">Owned code data<a class=\"post-anchor\" href=\"#owned-code-data\" aria-label=\"Anchor link for: owned-code-data\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>No party at sourcehut allows for data sharing, whether code data or\nuser data. Judging from the founders\u2019 track record, they have long been\ncreating various types of free software that allows for extreme caution\nregarding user privacy.<\/p>\n<p>Are you familiar with \n\n<a href=\"https:\/\/github.com\/features\/copilot\">Github Copilot<\/a>, some of you may have\nused it. The code generated by AI is code under the GPL license that is\nused as a <em>proprietary<\/em> product, which of course violates the license\npolicy itself. At sourcehut, the program code belongs entirely to the\n<em>programmer<\/em> or <em>developer<\/em>.<\/p>\n<h2 id=\"quick-and-lightweight-access\">Quick and lightweight access<a class=\"post-anchor\" href=\"#quick-and-lightweight-access\" aria-label=\"Anchor link for: quick-and-lightweight-access\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Sourcehut\u2019s performance is faster than other git forges. It\u2019s as light\nas opening plain text. Sourcehut\u2019s workflow itself also uses plain text\nemail to send patches, reviews, replies, or comments. There is no pull\nrequest (PR) feature, but it uses email-based communication similar to\nthat used in Linux kernel development, which uses plain text email. For\nyour information, Git itself is basically developed \n\n<a href=\"https:\/\/lore.kernel.org\/git\">based on email<\/a> to this day, not based on pull requests like\ncommercial git forges currently do.<\/p>\n<blockquote class=\"markdown-alert-tip\">\n<p>If you are interested in why <em>plain text email<\/em> is used instead of\nHTML email, we recommend visiting \n\n<a href=\"https:\/\/useplaintext.email\">Use Plain Text<\/a>.<\/p>\n<\/blockquote>\n<p>Drew DeVault is also the developer of \n\n<a href=\"https:\/\/aerc-mail.org\">Aerc<\/a>, a TUI-based\n<em>email client<\/em> that supports <em>vim workflow<\/em>, making it easier for\n<em>keyboard centric<\/em> developers.<\/p>\n<p>Sourcehut even claims to be the fastest of other <em>git forge<\/em> software\nsuch as Pagure, GitHub, GitLab, Bitbucket, and Codeberg. For more\ndetails, please refer to the link \n\n<a href=\"https:\/\/forgeperf.org\">Forgeperf<\/a> to find out\nmore detailed differences.<\/p>\n<h2 id=\"independent-and-modular\">Independent and modular<a class=\"post-anchor\" href=\"#independent-and-modular\" aria-label=\"Anchor link for: independent-and-modular\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>SourceHut can be installed independently by users. For installation\ninstructions, refer to the SourceHut installation section at\n\n\n<a href=\"https:\/\/man.sr.ht\/installation.md\">SourceHut Installation<\/a>. The <code>sr.ht<\/code> service requires a \n\n<a href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a> server, \n\n<a href=\"https:\/\/redis.io\">Redis<\/a> server, and\nmail server. Since the sourcehut source code is open, it can be\ninstalled as long as you have the infrastructure for CI and CD <span class=\"ref-placeholder\" data-ref=\"parasrah2022\">(<a href=\"#ref-parasrah2022\">Parasrah<\/a>)<\/span>. Of course, there are no\nsubscription or licensing fees if you install sourcehut yourself.\nAnyone can also contribute to sourcehut for service development <span class=\"ref-placeholder\" data-ref=\"strus2022\">(<a href=\"#ref-strus2022\">Stru\u015b, Marcin<\/a>)<\/span>.<\/p>\n<p>Sourcehut not only provides git repository services, but also many other\nservices, including.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Service<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\">builds.sr.ht<\/td><td style=\"text-align: left\"><em>Continuous integration<\/em> service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">git.sr.ht<\/td><td style=\"text-align: left\">Git repository service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">hg.sr.ht<\/td><td style=\"text-align: left\">Mercurial repository service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">hub.sr.ht<\/td><td style=\"text-align: left\">Project index and organization service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">lists.sr.ht<\/td><td style=\"text-align: left\">Mailing list service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">man.sr.ht<\/td><td style=\"text-align: left\">Project wiki service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">meta.sr.ht<\/td><td style=\"text-align: left\">Authentication and user account service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">pages.sr.ht<\/td><td style=\"text-align: left\">Static web service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">paste.sr.ht<\/td><td style=\"text-align: left\">Code pasting service.<\/td><\/tr>\n<tr><td style=\"text-align: left\">todo.sr.ht<\/td><td style=\"text-align: left\">Issue and bug tracker service.<\/td><\/tr>\n<\/tbody><\/table>\n<p>It does require more effort to build the infrastructure, manage\nCI\/CD, ensure stability, and patch system vulnerabilities. It would be\ntroublesome if that happened. But sourcehut also has several parameters\nthat can be considered for installation and use in production.<\/p>\n<ul>\n<li>How much is it tied to third-party agencies?<\/li>\n<li>How good is the code quality?<\/li>\n<li>How many bugs have been found?<\/li>\n<li>How are these bugs resolved?<\/li>\n<li>How many people are involved?<\/li>\n<li>And so on.<\/li>\n<\/ul>\n<p>Based on these parameters, sourcehut is still in the \u201csafe\u201d category.\nIn fact, one of the Android-based operating systems called PostMarketOS\nis also seriously considering using sourcehut for its independent\ninfrastructure <span class=\"ref-placeholder\" data-ref=\"postmarketos2022\">(<a href=\"#ref-postmarketos2022\">PostMarketOS<\/a>)<\/span>.<\/p>\n<p>If you use a Nix-based operating system, it is very easy to install\nsourcehut, because there is already an option to declare it that is\nintegrated with PostgreSQL and Redis.<\/p>\n<h2 id=\"affordable-costs\">Affordable costs<a class=\"post-anchor\" href=\"#affordable-costs\" aria-label=\"Anchor link for: affordable-costs\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Currently, sourcehut is entering the <em>alpha<\/em> development stage, where\nusers can use all available features except the <em>build<\/em>\/<em>deploy<\/em> system\nat \n\n<a href=\"https:\/\/build.sr.ht\">SourceHut Build<\/a>. To use this feature, users are required to\npay for the <em>build<\/em> system service. If anything, this is not a payment,\nbut rather a contribution or donation to cover living expenses. For\nexample, to cover the electricity, taxes, and accommodation costs of\nsourcehut developers. Uniquely, sourcehut does not have any mandatory\npricing plan categories, meaning that each category has the same\nfacilities despite having different prices. More details are available\nat sourcehut \n\n<a href=\"https:\/\/sourcehut.org\/pricing\">SourceHut Pricing<\/a>.<\/p>\n<ul>\n<li>Amateur Hacker: 2 USD\/month or 20 USD\/year<\/li>\n<li>Typical Hacker: 5 USD\/month or 50 USD\/year<\/li>\n<li>Professional Hacker: 10 USD\/month or 100 USD\/year<\/li>\n<\/ul>\n<p>Converted to Indonesian rupiah at a rate of Rp16,000, this becomes:<\/p>\n<ul>\n<li>Amateur Hacker: Rp320,000\/year<\/li>\n<li>Typical Hacker: Rp800,000\/year<\/li>\n<li>Professional Hacker: Rp1,600,000\/year<\/li>\n<\/ul>\n<p>The facilities and features are the same for all three categories. Users\nare free to choose the category they want depending on their financial\nneeds. Payment is also easy via credit card, Stripe, or cryptocurrency.<\/p>\n<p>How can it be so cheap? For example, renting a VPS costs Rp50,000 per\nmonth, or Rp600,000 per year. This is cheaper than Sourcehut, which\ncosts Rp320,000 (Amateur Hacker), or 46.6% cheaper than renting a VPS\nyourself.<\/p>\n<p>Why pay for a CI\/CD deployment system when other Git forges like GitHub\nand GitLab are free? Actually, other Git forges aren\u2019t free. Users don\u2019t\npay because someone else is paying behind the scenes, like many venture\ncapital firms (investors) sponsoring those Git forge companies. As for\nSourcehut, we all know where it stands.<\/p>\n<h2 id=\"no-tracking-and-advertising\">No tracking and advertising<a class=\"post-anchor\" href=\"#no-tracking-and-advertising\" aria-label=\"Anchor link for: no-tracking-and-advertising\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>So far, since this article was written, no advertisements have been\nfound on SourceHut. The SourceHut homepage also states that there is no\ntracking or advertising displayed on SourceHut. In fact, all features\nwork without JavaScript.<\/p>\n<p>SourceHut is simple and lightweight. Don\u2019t be fooled by the classic look\nof the website, which lacks any artistic flair. Visually (UI), it may\nbe considered poor because there are no animations, motion, pop-ups,\nor other bells and whistles. However, in terms of user experience (UX),\nsourcehut is very responsive, although it takes some getting used to\nusing the email workflow.<\/p>\n<h2 id=\"the-existence-of-hut-as-a-cli-tool-supporting-sourcehut\">The existence of <code>hut<\/code> as a CLI tool supporting sourcehut<a class=\"post-anchor\" href=\"#the-existence-of-hut-as-a-cli-tool-supporting-sourcehut\" aria-label=\"Anchor link for: the-existence-of-hut-as-a-cli-tool-supporting-sourcehut\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>\n\n<a href=\"https:\/\/sr.ht\/~emersion\/hut\">Hut<\/a> is a CLI application for interacting with \n\n<a href=\"https:\/\/sourcehut.org\">SourceHut<\/a>. It functions to monitor system deployment work,\nview tickets, patch lists, git repositories, and more. It can even be\nspecified by name, owner, or URL.<\/p>\n<p>With <code>hut<\/code>, it is easier to manage sourcehut repositories, eliminating\nthe need to open the website to access sourcehut. For the first setup,\n<code>hut init<\/code> is required to initialize a token that identifies the user\naccount.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>hut help<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>hut is a CLI tool for sr.ht<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Usage:<\/span><\/span>\n<span class=\"giallo-l\"><span>  hut [command]<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Available Commands:<\/span><\/span>\n<span class=\"giallo-l\"><span>  builds      Use the builds API<\/span><\/span>\n<span class=\"giallo-l\"><span>  export      Exports your account data<\/span><\/span>\n<span class=\"giallo-l\"><span>  git         Use the git API<\/span><\/span>\n<span class=\"giallo-l\"><span>  graphql     Execute a GraphQL query<\/span><\/span>\n<span class=\"giallo-l\"><span>  help        Help about any command<\/span><\/span>\n<span class=\"giallo-l\"><span>  hg          Use the hg API<\/span><\/span>\n<span class=\"giallo-l\"><span>  init        Initialize hut<\/span><\/span>\n<span class=\"giallo-l\"><span>  lists       Use the lists API<\/span><\/span>\n<span class=\"giallo-l\"><span>  meta        Use the meta API<\/span><\/span>\n<span class=\"giallo-l\"><span>  pages       Use the pages API<\/span><\/span>\n<span class=\"giallo-l\"><span>  paste       Use the paste API<\/span><\/span>\n<span class=\"giallo-l\"><span>  todo        Use the todo API<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Flags:<\/span><\/span>\n<span class=\"giallo-l\"><span>      --config string     config file to use<\/span><\/span>\n<span class=\"giallo-l\"><span>  -h, --help              help for hut<\/span><\/span>\n<span class=\"giallo-l\"><span>      --instance string   sr.ht instance to use<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Use &quot;hut [command] --help&quot; for more information about a command.<\/span><\/span><\/code><\/pre>\n<p>In sourcehut, you can also view repositories with <code>hut<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>hut git list<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>website (public)<\/span><\/span>\n<span class=\"giallo-l\"><span>  Learn about data science and statistics in bahasa.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>swayhome (public)<\/span><\/span>\n<span class=\"giallo-l\"><span>  Nixos configuration, sway and home-manager.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>oldblog (public)<\/span><\/span>\n<span class=\"giallo-l\"><span>  Personal blog of Hervy qurrotul<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>dotfire (public)<\/span><\/span>\n<span class=\"giallo-l\"><span>  Nixos KDE Plasma configuration for data science.<\/span><\/span><\/code><\/pre><h2 id=\"hosting-websites-with-sourcehut-pages\">Hosting websites with <em>sourcehut pages<\/em><a class=\"post-anchor\" href=\"#hosting-websites-with-sourcehut-pages\" aria-label=\"Anchor link for: hosting-websites-with-sourcehut-pages\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>You can create website pages for free with <em>sourcehut pages<\/em> using\nthe domain name <code>username.srht.site<\/code>. The website whose repository is\nlocated at \n\n<a href=\"https:\/\/git.sr.ht\/~hervyqa\/termivy\">~hervyqa&#x2F;termivy<\/a> is also\nbuilt using sourcehut pages. Creating sourcehut pages is also very\nsimple, just by creating a <code>.build.yml<\/code> file.<\/p>\n<p>For example, deploying a static website with <code>zola<\/code>. Several other\nexamples can be found at \n\n<a href=\"https:\/\/git.sr.ht\/~sircmpwn\/pages.sr.ht-examples\/tree\/master\">SourceHut Pages examples<\/a>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"yaml\" data-name=\".build.yml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span class=\"z-entity z-name z-tag\">i<\/span><span class=\"z-entity z-name z-tag\">mage<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> a<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">lpine\/edge<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><span class=\"z-entity z-name z-tag\">p<\/span><span class=\"z-entity z-name z-tag\">ackages<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> h<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ut<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> z<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ola<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-entity z-name z-tag\">o<\/span><span class=\"z-entity z-name z-tag\">auth<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> p<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ages.sr.ht\/PAGES:RW<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><span class=\"z-entity z-name z-tag\">e<\/span><span class=\"z-entity z-name z-tag\">nvironment<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-entity z-name z-tag\">  s<\/span><span class=\"z-entity z-name z-tag\">ite<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> w<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ww.example.org<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><span class=\"z-entity z-name z-tag\">  p<\/span><span class=\"z-entity z-name z-tag\">kgs<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> s<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ite.tar.gz<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 9<\/span><span class=\"z-entity z-name z-tag\">  b<\/span><span class=\"z-entity z-name z-tag\">uild_dir<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> p<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ublic<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">10<\/span><span class=\"z-entity z-name z-tag\">s<\/span><span class=\"z-entity z-name z-tag\">ources<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">11<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\"> h<\/span><span class=\"z-string z-unquoted z-plain z-out z-yaml\">ttps:\/\/git.sr.ht\/~your_username\/my-website<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">12<\/span><span class=\"z-entity z-name z-tag\">t<\/span><span class=\"z-entity z-name z-tag\">asks<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">13<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-entity z-name z-tag\"> b<\/span><span class=\"z-entity z-name z-tag\">uild<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-keyword\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">14<\/span><span class=\"z-string z-unquoted z-block z-yaml\">      cd my-website<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">15<\/span><span class=\"z-string z-unquoted z-block z-yaml\">      zola build<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">16<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-entity z-name z-tag\"> p<\/span><span class=\"z-entity z-name z-tag\">ackage<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-keyword\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">17<\/span><span class=\"z-string z-unquoted z-block z-yaml\">      cd my-website<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">18<\/span><span class=\"z-string z-unquoted z-block z-yaml\">      tar -czfv $pkgs -C $build_dir ..<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">19<\/span><span class=\"z-punctuation z-definition z-block z-sequence z-item z-yaml\">  -<\/span><span class=\"z-entity z-name z-tag\"> u<\/span><span class=\"z-entity z-name z-tag\">pload<\/span><span class=\"z-punctuation z-separator z-key-value z-mapping z-yaml\">:<\/span><span class=\"z-keyword\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">20<\/span><span class=\"z-string z-unquoted z-block z-yaml\">      hut pages publish -d $site $pkgs<\/span><\/span><\/code><\/pre>\n<p>Optionally, change the DNS server in your domain provider\u2019s <em>domain\nmanagement<\/em> to support \n\n<a href=\"https:\/\/srht.site\/custom-domains\">custom\ndomain<\/a> on sourcehut.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>@ IN A    46.23.81.157<\/span><\/span>\n<span class=\"giallo-l\"><span>@ IN AAAA 2a03:6000:1813:1337::157<\/span><\/span><\/code><\/pre><h2 id=\"diverse-continuous-integration-architecture\">Diverse Continuous Integration Architecture<a class=\"post-anchor\" href=\"#diverse-continuous-integration-architecture\" aria-label=\"Anchor link for: diverse-continuous-integration-architecture\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>SourceHut is equipped with various Linux distribution operating systems\nwith different architectures for Continuous Integration (CI) needs.\nSupported operating systems include BSD and linux-based.<\/p>\n<ol>\n<li>Alpine linux<\/li>\n<li>Arch linux<\/li>\n<li>Debian<\/li>\n<li>Fedora<\/li>\n<li>FreeBSD<\/li>\n<li>Guix System<\/li>\n<li>NetBSD<\/li>\n<li>OpenBSD<\/li>\n<li>Rocky linux<\/li>\n<li>Ubuntu<\/li>\n<\/ol>\n<p>Supported architectures:<\/p>\n<ol>\n<li><code>aarch64<\/code><\/li>\n<li><code>arm64<\/code><\/li>\n<li><code>armel<\/code><\/li>\n<li><code>armhf<\/code><\/li>\n<li><code>i386<\/code><\/li>\n<li><code>ppc64el<\/code><\/li>\n<li><code>s390x<\/code><\/li>\n<li><code>x86_64<\/code><\/li>\n<li><code>x86<\/code><\/li>\n<\/ol>\n<p>And many other architectures. If you use the <code>x86_64<\/code> or <code>amd64<\/code>\narchitecture, then that architecture uses <em>native<\/em> hardware. For\nmore information, refer to the \n\n<a href=\"https:\/\/man.sr.ht\/builds.sr.ht\/compatibility.md\">compatibility<\/a> page.<\/p>\n<h2 id=\"closing\">Closing<a class=\"post-anchor\" href=\"#closing\" aria-label=\"Anchor link for: closing\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Personally, I think sourcehut is worth using for <em>developers<\/em>. Several\nimportant personal repositories have been migrated to sourcehut,\nincluding this website\u2019s repository. When I first started using\nsourcehut, the repository was still quiet and not very popular at the\ntime this article was written. But after researching its features and\nhow sourcehut works, I became interested in some of the advantages that\nother <em>git forges<\/em> don\u2019t have. The initial considerations for choosing\nSourceHut were its speed, minimal bugs, the availability of a CLI\napplication (hut), a well-built system, and of course, its open source\nnature.<\/p>\n<p>SourceHut is not a viral and well-known git forge. It does not have\nfeatures that make it famous on social media. For example, there is no\nstar rating or total number of stars in a repository, no special badges,\nand no repository banners, so the thumbnail images look elegant. Even\nits users don\u2019t have the feature to upload profile photos. But despite\nthese shortcomings, many large project repositories are on SourceHut,\nand the famous button feature is not really needed. By leaving out these\nbells and whistles, SourceHut becomes more minimalist and faster. Back\nto the concept of <em>less is more<\/em>.<\/p>\n<p>Paying for the <em>deploy<\/em> feature on sourcehut still makes sense. First,\nthe price is still affordable. And second, the money stays within\nthe realm of FOSS (Free Open Source Software), rather than flowing to\ninvestors. This may be a matter of debate, but it still doesn\u2019t make\nsense to argue about it. The simplest logic is, is there such a thing\nas free electricity? Even the most free things still require effort. And\neffort requires accommodation and supplies.<\/p>\n<p>The word \u201cfree\u201d in the principle of <em>free software<\/em> has a\nspecific meaning that cannot be generalized. Roughly speaking,\n\u201cif it\u2019s <em>free<\/em>, then it\u2019s <em>free<\/em> everything\u201d is clearly\nimpossible. Some features are indeed free, while others are\nnot, and each has its own limitations. Sourcehut\u2019s business\nmodel is clear and transparent. There are also annual financial\nreports, for example for \n\n<a href=\"https:\/\/lists.sr.ht\/~sircmpwn\/sr.ht-discuss\/%3CBVRVZEWYB30Q.3HGIC803LDBH7@homura%3E\">2019<\/a>, \n\n<a href=\"https:\/\/sourcehut.org\/blog\/2022-04-08-2021-financial-report\">2021<\/a>, and \n\n<a href=\"https:\/\/sourcehut.org\/blog\/2023-03-27-2022-financial-report\">2022<\/a>.<\/p>\n<p>If you are accustomed to using an email-based workflow and prioritize\nperformance, then Sourcehut is worth trying.<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-1\">\n<p>The source code \n\n<a href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab\">Gitlab Source<\/a> is open source but\nnot completely open, as there is some proprietary (closed)\ncode. If you want to use open source code, you can use \n\n<a href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab-foss\">Gitlab Floss<\/a>. <a href=\"#fr-1-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"Getting Started with Helix: A Terminal Editor That Rivals Neovim","published":"2023-02-07T00:00:00+00:00","updated":"2026-04-07T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/getting-started-with-helix\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/getting-started-with-helix\/","content":"<p>\n\n<a href=\"https:\/\/helix-editor.com\">Helix<\/a> is a CLI text editor with alternative modal support\nfor Neovim and VIM. This editor is written in the Rust programming\nlanguage, making it faster with a <em>single binary<\/em>.<\/p>\n<h2 id=\"key-features\">Key Features<a class=\"post-anchor\" href=\"#key-features\" aria-label=\"Anchor link for: key-features\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Helix has minimal configuration. Unlike Neovim and VIM, which require\nmanaging configurations by installing plugins to suit the desired\nworkflow. Here is a list of features that Helix has, quoted from its\nofficial website:<\/p>\n<ul>\n<li><strong>Multiple selections simultaneously.<\/strong> Multi-cursor code editing is built\ninto Helix.<\/li>\n<li><strong>Integration with Tree-sitter.<\/strong> Enables syntax highlighting, indentation\ncalculation, and code navigation.<\/li>\n<li><strong>Code manipulation.<\/strong> Easy navigation and selection of functions, classes,\ncomments, and so on.<\/li>\n<li><strong>Language server support.<\/strong> With language-specific autocomplete, go to\ndefinition, documentation, diagnostics, and IDE features without additional\nconfiguration.<\/li>\n<li><strong>Built with the Rust programming language.<\/strong> High performance and more\nbattery efficient.<\/li>\n<li><strong>Built-in features.<\/strong> Fuzzy search for files, symbols, projects, themes,\nfugitive, surround, and much more.<\/li>\n<\/ul>\n\n<figure\n   id=\"fig-cms\"\n  class=\"ref-placeholder figure-center\"\n   data-ref=\"cms\"\n>\n\n  <picture>\n    \n    <img\n      src=\"https:\/\/hervyqa.srht.site\/processed_images\/matplotlib-sample.9f5bcbad9a7a8d83.jpg\" alt=\"matplotlib-sample\" width=\"1280\" height=\"613\" srcset=\"https:\/\/hervyqa.srht.site\/processed_images\/matplotlib-sample.ec12bdd4ba67c0e9.jpg 640w, https:\/\/hervyqa.srht.site\/processed_images\/matplotlib-sample.0b4624a5e3a5f018.jpg 784w, https:\/\/hervyqa.srht.site\/processed_images\/matplotlib-sample.09bf65d85075a494.jpg 1280w\" sizes=\"(min-width: 920px) 784px, (min-width: 700px) calc(82vw + 46px), calc(100vw - 40px)\" loading=\"lazy\">\n  <\/picture>\n  <figcaption\n    class=\"\n      \n        caption-center\n      \"\n      >Figure: Programming with Helix Editor<\/figcaption>\n<\/figure>\n\n<p>Helix is equipped with a variety of features including syntax highlight\nwhich makes it easy for <em>Platform Engineer<\/em> <span class=\"ref-placeholder\" data-ref=\"wyssmann22\">(<a href=\"#ref-wyssmann22\">Wyssmann, Adrian<\/a>)<\/span>.<\/p>\n<h2 id=\"shock-therapy\">Shock therapy<a class=\"post-anchor\" href=\"#shock-therapy\" aria-label=\"Anchor link for: shock-therapy\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>When using Helix, you have no choice but to learn again. Even with\nminimal configuration, Helix has a keymap that is 30% different from\nneovim\/vim and must be memorized to get used to. The rest of the\nkeymap is almost the same.  Fortunately, the Helix developers have\nprovided a built-in tutorial like <code>vimtutor<\/code> in vim.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>hx --tutor<\/span><\/span><\/code><\/pre>\n<p>Moreover, there is no need to think about how LSP configuration in\nHelix, because it has been well configured. If using vim\/neovim,\ntoo many vimscripts need to be taken care of all of them. While in\nHelix checking can be done with <code>hx --health markdown<\/code> and see what\nLSP needs to be installed <span class=\"ref-placeholder\" data-ref=\"timh23\">(<a href=\"#ref-timh23\">H\u00e5rek, Tim<\/a>)<\/span>.<\/p>\n<h2 id=\"installation\">Installation<a class=\"post-anchor\" href=\"#installation\" aria-label=\"Anchor link for: installation\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<h3 id=\"openbsd\">OpenBSD<a class=\"post-anchor\" href=\"#openbsd\" aria-label=\"Anchor link for: openbsd\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>doas pkg_add install helix<\/span><\/span><\/code><\/pre><h3 id=\"freebsd\">FreeBSD<a class=\"post-anchor\" href=\"#freebsd\" aria-label=\"Anchor link for: freebsd\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>doas pkg install helix<\/span><\/span><\/code><\/pre>\n<p>For complete installation instructions, please refer to the \n\n<a href=\"https:\/\/docs.helix-editor.com\">Helix Docs<\/a> page.<\/p>\n<h2 id=\"basic-usage\">Basic usage<a class=\"post-anchor\" href=\"#basic-usage\" aria-label=\"Anchor link for: basic-usage\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<h3 id=\"cursor-navigation-directions\">Cursor navigation directions<a class=\"post-anchor\" href=\"#cursor-navigation-directions\" aria-label=\"Anchor link for: cursor-navigation-directions\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Like navigation in vim, <code>helix<\/code> uses <kbd>h<\/kbd>, <kbd>j<\/kbd>, <kbd>k<\/kbd>, and <kbd>l<\/kbd> to move the cursor. You\ncan also use the arrow keys, but hjkl is faster.<\/p>\n<table><thead><tr><th>Key<\/th><th>Description<\/th><\/tr><\/thead><tbody>\n<tr><td><kbd>h<\/kbd><\/td><td>Left<\/td><\/tr>\n<tr><td><kbd>j<\/kbd><\/td><td>Down<\/td><\/tr>\n<tr><td><kbd>k<\/kbd><\/td><td>Up<\/td><\/tr>\n<tr><td><kbd>l<\/kbd><\/td><td>Right<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"opening-files\">Opening files<a class=\"post-anchor\" href=\"#opening-files\" aria-label=\"Anchor link for: opening-files\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Open helix by running <code>hx<\/code>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>hx<\/span><\/span><\/code><\/pre>\n<p>Open with a specific file.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>hx filename.xyz<\/span><\/span><\/code><\/pre><h3 id=\"closing-helix\">Closing helix<a class=\"post-anchor\" href=\"#closing-helix\" aria-label=\"Anchor link for: closing-helix\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Helix also has <code>normal<\/code>, <code>insert<\/code>, and <code>visual<\/code> modes like vim. Some of\nthe following <code>normal<\/code> mode shortcuts are still common and compatible\nwith helix.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Command<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><code>:q<\/code><\/td><td style=\"text-align: left\">Close the file and application.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><code>:q!<\/code><\/td><td style=\"text-align: left\">Force close the application.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><code>:qa!<\/code><\/td><td style=\"text-align: left\">Force close all open buffers and the application.<\/td><\/tr>\n<\/tbody><\/table>\n<blockquote class=\"markdown-alert-note\">\n<p>Buffer is a file or directory that has been opened.<\/p>\n<\/blockquote>\n<h2 id=\"configuration\">Configuration<a class=\"post-anchor\" href=\"#configuration\" aria-label=\"Anchor link for: configuration\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Some basic configurations that may need to be added. For example,\ntheme type and line number.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Command<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><code>:theme tokyonight<\/code><\/td><td style=\"text-align: left\">Change the theme.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Permanent configurations can be opened in <code>config.toml<\/code>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Command<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><code>:config-open<\/code><\/td><td style=\"text-align: left\">Opens the helix configuration.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><code>:config-reload<\/code><\/td><td style=\"text-align: left\">Reloads the helix configuration.<\/td><\/tr>\n<\/tbody><\/table>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"~\/.config\/helix\/config.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 1<\/span><span class=\"z-variable\">theme<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">tokyonight<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 2<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 3<\/span><span class=\"z-punctuation\">[<\/span><span>editor<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 4<\/span><span class=\"z-variable\">line-number<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">relative<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 5<\/span><span class=\"z-variable\">cursorline<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 6<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 7<\/span><span class=\"z-punctuation\">[<\/span><span>editor<\/span><span>.<\/span><span>lsp<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\"> 8<\/span><span class=\"z-variable\">display-messages<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-constant z-language z-boolean\"> true<\/span><\/span><\/code><\/pre>\n<p>Yep, that\u2019s right. The additional configuration is just a few lines\nabove. For more details, please refer to the \n\n<a href=\"https:\/\/docs.helix-editor.com\">Helix Docs<\/a> page.<\/p>\n<p>If you are working on a project that is quite large. Suggested enable\nmultiple to make the helix display the tab in a built-in language\nnot single file <span class=\"ref-placeholder\" data-ref=\"jonathanf24\">(<a href=\"#ref-jonathanf24\">Frere, Jonathan<\/a>)<\/span>.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"toml\" data-name=\"~\/.config\/helix\/config.toml\"><span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">1<\/span><span class=\"z-punctuation\">[<\/span><span>editor<\/span><span class=\"z-punctuation\">]<\/span><\/span>\n<span class=\"giallo-l\"><span aria-hidden=\"true\" class=\"giallo-ln\">2<\/span><span class=\"z-variable\">bufferline<\/span><span class=\"z-punctuation\"> =<\/span><span class=\"z-punctuation z-definition z-string z-begin\"> &quot;<\/span><span class=\"z-string\">multiline<\/span><span class=\"z-punctuation z-definition z-string z-end\">&quot;<\/span><\/span><\/code><\/pre><h2 id=\"advanced-usage\">Advanced usage<a class=\"post-anchor\" href=\"#advanced-usage\" aria-label=\"Anchor link for: advanced-usage\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<h3 id=\"deleting-characters\">Deleting characters<a class=\"post-anchor\" href=\"#deleting-characters\" aria-label=\"Anchor link for: deleting-characters\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Unlike vim, deleting characters in helix uses the keymap <kbd>d<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>d<\/kbd><\/td><td style=\"text-align: left\">Deletes 1 character.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"entering-characters\">Entering characters<a class=\"post-anchor\" href=\"#entering-characters\" aria-label=\"Anchor link for: entering-characters\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Similar to vim, the <code>insert<\/code> mode still uses <kbd>i<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>i<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>esc<\/kbd><\/td><td style=\"text-align: left\"><code>normal<\/code> mode (exit insert mode).<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"saving-files\">Saving files<a class=\"post-anchor\" href=\"#saving-files\" aria-label=\"Anchor link for: saving-files\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Command<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><code>:w<\/code><\/td><td style=\"text-align: left\">Save the file in the current buffer.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><code>:w filename.xyz<\/code><\/td><td style=\"text-align: left\">Save the file in the buffer with a specific name.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Can be combined with <code>q<\/code> to exit the helix.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Command<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><code>:wq<\/code><\/td><td style=\"text-align: left\">Save and close the application.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><code>:wqa<\/code><\/td><td style=\"text-align: left\">Save and close all buffers.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"insert-mode\">Insert mode<a class=\"post-anchor\" href=\"#insert-mode\" aria-label=\"Anchor link for: insert-mode\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>As previously mentioned, the keymap <kbd>i<\/kbd> for insert\nmode is right before the cursor. Meanwhile, there are several other\nkeymaps such as:<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>i<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode before the cursor.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>a<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode after the cursor.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>i<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode at the beginning of the line.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>a<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode at the end of the line.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"starting-a-new-line\">Starting a new line<a class=\"post-anchor\" href=\"#starting-a-new-line\" aria-label=\"Anchor link for: starting-a-new-line\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>o<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode after the current line.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>o<\/kbd><\/td><td style=\"text-align: left\"><code>insert<\/code> mode before the current line.<\/td><\/tr>\n<\/tbody><\/table>\n<p>The above commands are similar to those in neovim or vim.<\/p>\n<h3 id=\"movement-and-selection\">Movement and selection<a class=\"post-anchor\" href=\"#movement-and-selection\" aria-label=\"Anchor link for: movement-and-selection\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Movement and selection in helix are performed automatically and\nsimultaneously.  This is slightly different from vim.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>w<\/kbd><\/td><td style=\"text-align: left\">Move and select 1 word, including its space.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>e<\/kbd><\/td><td style=\"text-align: left\">Move and select 1 word from the cursor to the end of the word.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>b<\/kbd><\/td><td style=\"text-align: left\">Move and select 1 word from the cursor to the beginning of the word.<\/td><\/tr>\n<\/tbody><\/table>\n<p>The keymaps <kbd>shift<\/kbd>+<kbd>w<\/kbd>, <kbd>shift<\/kbd>+<kbd>e<\/kbd>, and <kbd>shift<\/kbd>+<kbd>b<\/kbd> also have similar functions, except that the\nmovement depends on whitespace such as spaces and tabs.<\/p>\n<h3 id=\"moving-by-count\">Moving by count<a class=\"post-anchor\" href=\"#moving-by-count\" aria-label=\"Anchor link for: moving-by-count\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Moving by count is also possible, for example <kbd>2<\/kbd><kbd>w<\/kbd>, <kbd>4<\/kbd><kbd>e<\/kbd>, <kbd>5<\/kbd><kbd>b<\/kbd>. The explanation is as follows:<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>2<\/kbd><kbd>w<\/kbd><\/td><td style=\"text-align: left\">Move 2 words forward.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>4<\/kbd><kbd>e<\/kbd><\/td><td style=\"text-align: left\">Move 4 words forward ending at the end of a word.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>5<\/kbd><kbd>b<\/kbd><\/td><td style=\"text-align: left\">Move 5 words backward.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"changing-characters\">Changing characters<a class=\"post-anchor\" href=\"#changing-characters\" aria-label=\"Anchor link for: changing-characters\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>The shortcut used is the keymap <kbd>r<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>c<\/kbd><\/td><td style=\"text-align: left\">Changes the selected character or word\/sentence.<\/td><\/tr>\n<\/tbody><\/table>\n<p>For example, select a word with <kbd>w<\/kbd>, then replace it with\nthe keymap <kbd>c<\/kbd>, which immediately enters insert mode.<\/p>\n<h3 id=\"visual-selection-mode\">Visual\/selection mode<a class=\"post-anchor\" href=\"#visual-selection-mode\" aria-label=\"Anchor link for: visual-selection-mode\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Visual mode in helix is almost the same as in vim.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>v<\/kbd><\/td><td style=\"text-align: left\"><code>visual<\/code> mode.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>v<\/kbd> again, or <kbd>esc<\/kbd><\/td><td style=\"text-align: left\"><code>normal<\/code> mode (exit visual mode).<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"selecting-lines\">Selecting lines<a class=\"post-anchor\" href=\"#selecting-lines\" aria-label=\"Anchor link for: selecting-lines\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Select a line using the <kbd>x<\/kbd> keymap. If you want to\nselect the next line, press <kbd>x<\/kbd> again. Sometimes you may\nintend to delete a character, but instead select it in helix. (This\nis because your subconscious is used to using <kbd>x<\/kbd>\nto delete characters in vim.)<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>x<\/kbd><\/td><td style=\"text-align: left\">Select 1 row.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>5<\/kbd><\/td><td style=\"text-align: left\">Select 5 rows.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>;<\/kbd><\/td><td style=\"text-align: left\">Deselect rows.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>alt<\/kbd>+<kbd>;<\/kbd><\/td><td style=\"text-align: left\">Flip row selection.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"undoing-changes\">Undoing changes<a class=\"post-anchor\" href=\"#undoing-changes\" aria-label=\"Anchor link for: undoing-changes\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Commands for undoing changes:<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>u<\/kbd><\/td><td style=\"text-align: left\">Undo<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>u<\/kbd><\/td><td style=\"text-align: left\">Redo.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Repeat several times until the changes are as expected.<\/p>\n<h3 id=\"copying-and-pasting\">Copying and pasting<a class=\"post-anchor\" href=\"#copying-and-pasting\" aria-label=\"Anchor link for: copying-and-pasting\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Copying in helix can be done in the internal helix or in the clipboard\nsystem.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>y<\/kbd><\/td><td style=\"text-align: left\">Yank\/copy, copies the selected characters.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>p<\/kbd><\/td><td style=\"text-align: left\">Paste, pastes the copied content.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>p<\/kbd><\/td><td style=\"text-align: left\">Paste, pastes the copied content before the cursor.<\/td><\/tr>\n<\/tbody><\/table>\n<p>This can also be done with calculations to determine the number of\ncopies\/pastes.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>2<\/kbd> <kbd>y<\/kbd><\/td><td style=\"text-align: left\">2x Yank\/copy, copies the selected characters.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>4<\/kbd> <kbd>p<\/kbd><\/td><td style=\"text-align: left\">4x Paste, pastes the copied characters.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>10<\/kbd> <kbd>shift<\/kbd>+<kbd>p<\/kbd><\/td><td style=\"text-align: left\">10x Paste, pastes the copied characters before the cursor.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Basically, the keymaps <kbd>d<\/kbd> (delete character) and <kbd>c<\/kbd> (change character) can also be considered yank mode,\nwhere the deleted\/changed characters are stored in the buffer so\nthat the paste command <kbd>p<\/kbd> or <kbd>shift<\/kbd>+<kbd>p<\/kbd> can be executed.<\/p>\n<p>To avoid storing in the buffer, use <kbd>alt<\/kbd>+<kbd>d<\/kbd> or <kbd>alt<\/kbd>+<kbd>c<\/kbd>. To copy or paste from the system clipboard,\nuse the keymaps below.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>space<\/kbd><kbd>y<\/kbd><\/td><td style=\"text-align: left\">Copy to system clipboard.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>space<\/kbd><kbd>p<\/kbd><\/td><td style=\"text-align: left\">Paste from system clipboard.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"character-search\">Character search<a class=\"post-anchor\" href=\"#character-search\" aria-label=\"Anchor link for: character-search\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Search for characters like in vim or neovim.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>&#x2F;<\/kbd><\/td><td style=\"text-align: left\">Search for characters\/words.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>n<\/kbd><\/td><td style=\"text-align: left\">Go to the next search result.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>n<\/kbd><\/td><td style=\"text-align: left\">Go to the previous search result.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>?<\/kbd><\/td><td style=\"text-align: left\">Search for characters\/words backwards.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Unlike in vim, in helix, when searching with <kbd>shift<\/kbd>+<kbd>&#x2F;<\/kbd>,\nthe <kbd>n<\/kbd> direction remains forward and <kbd>shift\nn<\/kbd> remains backward\/previous.<\/p>\n<h3 id=\"multiple-cursors\">Multiple cursors<a class=\"post-anchor\" href=\"#multiple-cursors\" aria-label=\"Anchor link for: multiple-cursors\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Adding cursors is very useful for changing characters\nsimultaneously. For example, for deleting, replacing, and regex\nfunctions.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>c<\/kbd><\/td><td style=\"text-align: left\">Search for characters\/words.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>alt<\/kbd>+<kbd>c<\/kbd><\/td><td style=\"text-align: left\">Go to the next search result.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>,<\/kbd><\/td><td style=\"text-align: left\">Go to the previous search result.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"selecting-from-the-selection-results\">Selecting from the selection results<a class=\"post-anchor\" href=\"#selecting-from-the-selection-results\" aria-label=\"Anchor link for: selecting-from-the-selection-results\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>This is intended to replace a selected character or text. Usually to\nreplace a word, similar to the sed regex function in vim.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>s<\/kbd><\/td><td style=\"text-align: left\">Selects the appropriate character according to the selection.<\/td><\/tr>\n<\/tbody><\/table>\n<p>For example, the pattern works like this: select several times\nwith <kbd>x<\/kbd> or <kbd>%<\/kbd> for all lines. Press\n<kbd>s<\/kbd>, then enter the desired character and press <kbd>enter<\/kbd>. It will automatically become a multi-cursor. You\ncan then change it as desired.<\/p>\n<h3 id=\"additional-selection-with-regex\">Additional selection with <em>regex<\/em><a class=\"post-anchor\" href=\"#additional-selection-with-regex\" aria-label=\"Anchor link for: additional-selection-with-regex\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>This selection can use the plus sign <code>+<\/code> when using the <kbd>s<\/kbd> keymap in the selection area. For example: space and plus <code>+<\/code>.<\/p>\n<h3 id=\"straightening-from-selection\">Straightening from selection<a class=\"post-anchor\" href=\"#straightening-from-selection\" aria-label=\"Anchor link for: straightening-from-selection\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>&amp;<\/kbd><\/td><td style=\"text-align: left\">Straighten the selection results.<\/td><\/tr>\n<\/tbody><\/table>\n<p>For example, there is a line like this.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span> * 98) lorem<\/span><\/span>\n<span class=\"giallo-l\"><span> * 99) ipsum<\/span><\/span>\n<span class=\"giallo-l\"><span> * 100) dolor<\/span><\/span>\n<span class=\"giallo-l\"><span> * 101) sit<\/span><\/span>\n<span class=\"giallo-l\"><span> * 102) amet<\/span><\/span><\/code><\/pre>\n<p>Becoming:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span> *  97) lorem<\/span><\/span>\n<span class=\"giallo-l\"><span> *  99) ipsum<\/span><\/span>\n<span class=\"giallo-l\"><span> * 100) dolor<\/span><\/span>\n<span class=\"giallo-l\"><span> * 101) sit<\/span><\/span>\n<span class=\"giallo-l\"><span> * 102) amet<\/span><\/span><\/code><\/pre><h3 id=\"dividing-the-selection-into-rows\">Dividing the selection into rows<a class=\"post-anchor\" href=\"#dividing-the-selection-into-rows\" aria-label=\"Anchor link for: dividing-the-selection-into-rows\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>alt<\/kbd>+<kbd>s<\/kbd><\/td><td style=\"text-align: left\">To split into options on each line. Generally used to straighten tables.<\/td><\/tr>\n<\/tbody><\/table>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>    | FRUIT   | AMOUNT |<\/span><\/span>\n<span class=\"giallo-l\"><span>    |---------|--------|<\/span><\/span>\n<span class=\"giallo-l\"><span> | Apples  | 8      |<\/span><\/span>\n<span class=\"giallo-l\"><span>    | Bananas | 6      |<\/span><\/span>\n<span class=\"giallo-l\"><span>  | Oranges | 3      |<\/span><\/span>\n<span class=\"giallo-l\"><span>     | Donuts  | 4      |<\/span><\/span><\/code><\/pre>\n<p>Becoming:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>     | FRUIT   | AMOUNT |<\/span><\/span>\n<span class=\"giallo-l\"><span>     |---------|--------|<\/span><\/span>\n<span class=\"giallo-l\"><span>     | Apples  | 8      |<\/span><\/span>\n<span class=\"giallo-l\"><span>     | Bananas | 6      |<\/span><\/span>\n<span class=\"giallo-l\"><span>     | Oranges | 3      |<\/span><\/span>\n<span class=\"giallo-l\"><span>     | Donuts  | 4      |<\/span><\/span><\/code><\/pre><h3 id=\"selecting-down-to-specific-characters\">Selecting down to specific characters<a class=\"post-anchor\" href=\"#selecting-down-to-specific-characters\" aria-label=\"Anchor link for: selecting-down-to-specific-characters\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>f<\/kbd><\/td><td style=\"text-align: left\">Selects the line up to and including the specified character.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>t<\/kbd><\/td><td style=\"text-align: left\">Selects the line up to but not including the specified character.<\/td><\/tr>\n<\/tbody><\/table>\n<p><kbd>shift<\/kbd>+<kbd>f<\/kbd> and <kbd>shift<\/kbd>+<kbd>t<\/kbd> also have\nsimilar functions, except that they skip over whitespace characters\nsuch as spaces or tabs.<\/p>\n<h3 id=\"replacing-characters-or-words\">Replacing characters or words<a class=\"post-anchor\" href=\"#replacing-characters-or-words\" aria-label=\"Anchor link for: replacing-characters-or-words\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>r<\/kbd><\/td><td style=\"text-align: left\">Paste with special characters.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>r<\/kbd><\/td><td style=\"text-align: left\">Paste with the contents of the buffer or the system clipboard.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"repetition\">Repetition<a class=\"post-anchor\" href=\"#repetition\" aria-label=\"Anchor link for: repetition\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Repetition can be used to repeat the same command, or to repeat the\nprevious search results <kbd>f<\/kbd> and <kbd>t<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>.<\/kbd><\/td><td style=\"text-align: left\">Repeats the previous insert mode result.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>alt<\/kbd>+<kbd>.<\/kbd><\/td><td style=\"text-align: left\">Repeats the command from the previous <kbd>f<\/kbd> or <kbd>t<\/kbd> result.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"replacing-text-from-the-yank-clipboard-copy\">Replacing text from the <em>yank\/clipboard<\/em> copy<a class=\"post-anchor\" href=\"#replacing-text-from-the-yank-clipboard-copy\" aria-label=\"Anchor link for: replacing-text-from-the-yank-clipboard-copy\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Once text has been copied, either by yanking or from the system\nclipboard, it can be used to replace other text if it has been selected.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>r<\/kbd><\/td><td style=\"text-align: left\">Replaces the selected text with the contents of the clipboard.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"merging-lines\">Merging lines<a class=\"post-anchor\" href=\"#merging-lines\" aria-label=\"Anchor link for: merging-lines\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Multiple lines must first be selected with <kbd>x<\/kbd>, then\npress <kbd>shift<\/kbd>+<kbd>j<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>j<\/kbd><\/td><td style=\"text-align: left\">Merges multiple selected lines.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"line-indentation\">Line indentation<a class=\"post-anchor\" href=\"#line-indentation\" aria-label=\"Anchor link for: line-indentation\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Indents the current line or selected lines.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>&gt;<\/kbd><\/td><td style=\"text-align: left\">Indentation protrudes outward\/to the right.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>&lt;<\/kbd><\/td><td style=\"text-align: left\">Indentation protrudes inward\/to the left.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"addition-and-subtraction\">Addition and subtraction<a class=\"post-anchor\" href=\"#addition-and-subtraction\" aria-label=\"Anchor link for: addition-and-subtraction\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Incrementing and decrementing values can be done in helix. This is\nusually done to change values in a list.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>a<\/kbd><\/td><td style=\"text-align: left\">Increases the value.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>x<\/kbd><\/td><td style=\"text-align: left\">Decreases the value.<\/td><\/tr>\n<\/tbody><\/table>\n<p>For example:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>1) list a<\/span><\/span>\n<span class=\"giallo-l\"><span>3) list b<\/span><\/span>\n<span class=\"giallo-l\"><span>4) list c<\/span><\/span>\n<span class=\"giallo-l\"><span>5) list d<\/span><\/span>\n<span class=\"giallo-l\"><span>6) list e<\/span><\/span><\/code><\/pre>\n<p>Becoming,<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>1) list a<\/span><\/span>\n<span class=\"giallo-l\"><span>2) list b<\/span><\/span>\n<span class=\"giallo-l\"><span>3) list c<\/span><\/span>\n<span class=\"giallo-l\"><span>4) list d<\/span><\/span>\n<span class=\"giallo-l\"><span>5) list e<\/span><\/span><\/code><\/pre><h3 id=\"register-function\"><em>Register<\/em> Function<a class=\"post-anchor\" href=\"#register-function\" aria-label=\"Anchor link for: register-function\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>This function is used to store different copies, which can be called\nup at any time. Unlike the usual yank, which only stores one copy,\nthe register can store many different copies. register key is <kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd>.<\/p>\n<p>For example, register:<\/p>\n<ul>\n<li>condition a: copy <code>sentence one<\/code><\/li>\n<li>condition b: copy <code>sentence two<\/code><\/li>\n<li>condition c: copy <code>sentence three<\/code><\/li>\n<\/ul>\n<p>There are 3 conditions consisting of <code>a<\/code>, <code>b<\/code>, and <code>c<\/code>. To store the\nregister, use the command:<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>a<\/kbd> <kbd>y<\/kbd><\/td><td style=\"text-align: left\">Stores (yanks) the copy to register <code>a<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>b<\/kbd> <kbd>y<\/kbd><\/td><td style=\"text-align: left\">Stores (yanks) the copy to register <code>b<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>c<\/kbd> <kbd>y<\/kbd><\/td><td style=\"text-align: left\">Stores (yanks) a copy to register <code>c<\/code>.<\/td><\/tr>\n<\/tbody><\/table>\n<p>After storing, next paste the text from a register.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>a<\/kbd> <kbd>p<\/kbd><\/td><td style=\"text-align: left\">Paste text from register <code>a<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>b<\/kbd> <kbd>p<\/kbd><\/td><td style=\"text-align: left\">Paste text from register <code>b<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>c<\/kbd> <kbd>p<\/kbd><\/td><td style=\"text-align: left\">Pastes text from register <code>c<\/code>.<\/td><\/tr>\n<\/tbody><\/table>\n<p>The copied text can also be used to replace selected text.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>a<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Replaces the text from register <code>a<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>b<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Replaces the text from register <code>b<\/code>.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>&#x27;<\/kbd> <kbd>c<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Replaces text from register <code>c<\/code>.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"macro-function\"><em>Macro<\/em> Function<a class=\"post-anchor\" href=\"#macro-function\" aria-label=\"Anchor link for: macro-function\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Useful for storing command steps in a register. Default key is <kbd>@<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>q<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Start macro recording.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>shift<\/kbd>+<kbd>q<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Stop macro recording.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>q<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Run the macro function.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>5<\/kbd><kbd>q<\/kbd> <kbd>r<\/kbd><\/td><td style=\"text-align: left\">Run the macro function 5 times, can be replaced with <code>nq<\/code>.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"searching-with-selection\">Searching with selection<a class=\"post-anchor\" href=\"#searching-with-selection\" aria-label=\"Anchor link for: searching-with-selection\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Search for text using <kbd>&#x2F;<\/kbd> and then type the word you\nwant to find.  In addition to typing characters, another way is to\nselect characters as search characters.<\/p>\n<p>After selecting a character word, for example with <kbd>w<\/kbd>\/<kbd>e<\/kbd>\/<kbd>b<\/kbd>, press <kbd>*<\/kbd>\nto save it as a search register. Then the word can be searched for\nwith <kbd>n<\/kbd> or <kbd>shift<\/kbd>+<kbd>n<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>*<\/kbd><\/td><td style=\"text-align: left\">Keep selection results into search registers <kbd>&#x2F;<\/kbd>.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"using-jumplist\">Using Jumplist<a class=\"post-anchor\" href=\"#using-jumplist\" aria-label=\"Anchor link for: using-jumplist\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>With jumplist, you can save the cursor position at a specific location.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>ctrl<\/kbd>+<kbd>s<\/kbd><\/td><td style=\"text-align: left\">Save jumplist.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>ctrl<\/kbd>+<kbd>o<\/kbd><\/td><td style=\"text-align: left\">Next jumplist.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>ctrl<\/kbd>+<kbd>i<\/kbd><\/td><td style=\"text-align: left\">Previous jumplist.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"rotate-and-delete-primary-selection\">Rotate and delete primary selection<a class=\"post-anchor\" href=\"#rotate-and-delete-primary-selection\" aria-label=\"Anchor link for: rotate-and-delete-primary-selection\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>After selecting, there may be times when some selections are not\nneeded. By using <kbd>alt<\/kbd>+<kbd>,<\/kbd>, the selected results can\nbe deleted.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>)<\/kbd><\/td><td style=\"text-align: left\">Go to the next selection.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>(<\/kbd><\/td><td style=\"text-align: left\">Go to the previous selection.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>alt<\/kbd>+<kbd>,<\/kbd><\/td><td style=\"text-align: left\">Clear the main selection.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"changing-uppercase-lowercase-letters\">Changing uppercase\/lowercase letters<a class=\"post-anchor\" href=\"#changing-uppercase-lowercase-letters\" aria-label=\"Anchor link for: changing-uppercase-lowercase-letters\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>To change uppercase letters to lowercase letters, use <kbd>`<\/kbd>, while to change lowercase letters to uppercase letters, use <kbd>alt<\/kbd>+<kbd>`<\/kbd>.<\/p>\n<table><thead><tr><th style=\"text-align: left\">Key<\/th><th style=\"text-align: left\">Description<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: left\"><kbd>`<\/kbd> or <kbd>alt<\/kbd>+<kbd>`<\/kbd><\/td><td style=\"text-align: left\">Switch between lowercase and uppercase letters.<\/td><\/tr>\n<tr><td style=\"text-align: left\"><kbd>~<\/kbd><\/td><td style=\"text-align: left\">Switch between uppercase and lowercase letters.<\/td><\/tr>\n<\/tbody><\/table>\n<h3 id=\"separating-selections-with-regex-patterns\">Separating selections with <em>regex patterns<\/em><a class=\"post-anchor\" href=\"#separating-selections-with-regex-patterns\" aria-label=\"Anchor link for: separating-selections-with-regex-patterns\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h3>\n<p>Separating selections has specific use cases, such as capitalizing\na sentence, separating combined lines into multiple lines, and other\nconditions that require separating selected words\/sentences.<\/p>\n<p>The general steps are as follows.<\/p>\n<ul>\n<li>Select a line, using either <kbd>x<\/kbd>, <kbd>w<\/kbd>, <kbd>e<\/kbd>, or <kbd>b<\/kbd>.<\/li>\n<li>Press <kbd>shift<\/kbd>+<kbd>s<\/kbd> to split the selection.<\/li>\n<li>Select the regex pattern. For example, separate by a period space <code>.<\/code>,\nexclamation mark space <code>!<\/code>, or question mark space <code>?<\/code>. Sentences\nare usually separated by separators and spaces. So, the regex is\n<code>\\. |! |\\?<\/code>. Periods and question marks need to be preceded by a\nbackslash <code>\\<\/code>.<\/li>\n<li>Select the cursor position to be in front of or behind the separated\nsentence. Move it using <kbd>alt<\/kbd>+<kbd>;<\/kbd>.<\/li>\n<li>In multi-cursor mode, replace the desired changes with <kbd>r<\/kbd>, <kbd>c<\/kbd>, or <kbd>i<\/kbd>.<\/li>\n<\/ul>\n<p>For example, there are 3 sentences. Separate them and capitalize the first letter.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>learn programming languages! python is a high-level programming language? created by guido van rossum.<\/span><\/span><\/code><\/pre>\n<p>Becomes:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Learn programming languages!<\/span><\/span>\n<span class=\"giallo-l\"><span>python is a high-level programming language?<\/span><\/span>\n<span class=\"giallo-l\"><span>Created by guido van rossum.<\/span><\/span><\/code><\/pre><h2 id=\"conclusion\">Conclusion<a class=\"post-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Helix is ideal because it uses minimal configuration with built-in\nautocomplete, fuzzy search, and multi-cursor features. Although each\nprogramming language\u2019s <code>language-server<\/code> is installed separately\nwith Helix (as with other editors), Helix still has features such as\nautopairs, fugitive, and others to support program writing. Settings\nfor LSP are available on the \n\n<a href=\"https:\/\/github.com\/helix-editor\/helix\/wiki\/How-to-install-the-default-language-servers\">Helix Wiki<\/a>. More complete\nkeymap configurations and usage instructions are available in the \n\n<a href=\"https:\/\/docs.helix-editor.com\">official documentation<\/a>.<\/p>\n<p>Helix is considered to have fairly fast performance. It even\nsupports modals such as <kbd>space<\/kbd>, <kbd>f<\/kbd>, and <kbd>g<\/kbd>, which make navigation maneuvers easier\n<span class=\"ref-placeholder\" data-ref=\"evans25\">(<a href=\"#ref-evans25\">Evans, Julia<\/a>)<\/span>. Good to go to definition,\ndeclaration, and reference.<\/p>\n<p>New users migrating from vim or neovim will certainly like it, and it\nis definitely worth trying. Even if you are a veteran vim\/neovim with\ndecades of experience <span class=\"ref-placeholder\" data-ref=\"lafdzun25\">(<a href=\"#ref-lafdzun25\">Lafdzun, Kalamuna<\/a>)<\/span>.<\/p>\n"},{"title":"Programming Languages For Data Scientists Must Know","published":"2023-02-01T00:00:00+00:00","updated":"2026-06-09T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/programming-languages-for-data-science\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/programming-languages-for-data-science\/","content":"<p>Becoming a data scientist does not require an IT background. From the\nnetworks I follow on LinkedIn, many people have changed careers from\nvarious backgrounds to become data scientists. And that\u2019s only natural,\nconsidering that companies around the world are flocking to the digital\nindustry. In early January 2023, I tried to transition from designer to\ndata scientist.<\/p>\n<p>Alright, let\u2019s get straight to the topic. Here are the programming\nlanguages that data scientists need to know. What are they?<\/p>\n<h2 id=\"python\">Python<a class=\"post-anchor\" href=\"#python\" aria-label=\"Anchor link for: python\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<ul>\n<li>Website: \n\n<a href=\"https:\/\/python.org\">Python<\/a><\/li>\n<li>Documentation: \n\n<a href=\"https:\/\/python.org\/doc\">Python Docs<\/a><\/li>\n<li>Books: \n\n<a href=\"https:\/\/pythonbooks.org\">Python Books<\/a>, \n\n<a href=\"https:\/\/realpython.com\/best-python-books\">Realpython Books<\/a><\/li>\n<\/ul>\n<p>Python, created by \n\n<a href=\"https:\/\/gvanrossum.github.io\">Guido van Rossum<\/a>, is a high-level data\nstructure programming language that is simple, clear, and logical, yet\neffective for object-oriented programming (OOP).<\/p>\n<p>It is recommended to install Python version <code>python3.10<\/code> or higher\nto get full support. Python, which is a multi-paradigm programming\nlanguage, also offers several functional programming supports similar to\n<code>lisp<\/code>, such as filter, map, reduce, set, and generator expressions.<\/p>\n<p>Python also offers a wide range of \n\n<a href=\"https:\/\/pypi.org\">library<\/a>.\nFor example, pandas, numpy, scipy, scikit-learn, matplotlib, seaborn,\nand many more for data science needs. You can try Python using the link\nabove and practice your programming skills every day.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>python<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Python 3.10.9 (main, Dec  6 2022, 18:44:57) [GCC 11.3.0] on linux<\/span><\/span>\n<span class=\"giallo-l\"><span>Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<\/span><\/span>\n<span class=\"giallo-l\"><span>&gt;&gt;&gt; print(&quot;Hello World&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>Hello World<\/span><\/span><\/code><\/pre><h2 id=\"sql\">SQL<a class=\"post-anchor\" href=\"#sql\" aria-label=\"Anchor link for: sql\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<ul>\n<li>Website: \n\n<a href=\"https:\/\/mariadb.org\">MariaDB<\/a><\/li>\n<li>Documentation: \n\n<a href=\"https:\/\/mariadb.org\/documentation\">MariaDB Docs<\/a><\/li>\n<li>Books: \n\n<a href=\"https:\/\/mariadb.com\/kb\/en\/books\">MariaDB Books<\/a><\/li>\n<\/ul>\n<p>SQL (pronounced: sequel) or Structured Query Language is a programming\nlanguage for accessing data in relational databases (RDBMS). Almost all\ndatabase servers use SQL for data management.<\/p>\n<p>Data scientists will inevitably deal with databases, such as creating\ndatabases, processing data, and translating data to make it more\nunderstandable. This is necessary for determining stakeholder decisions.<\/p>\n<p>When using SQL, \n\n<a href=\"https:\/\/mariadb.org\">MariaDB<\/a> (a derivative of \n\n<a href=\"https:\/\/mysql.com\">MySQL<\/a>) is used for data management because it is more\nflexible to develop openly and is not tied to proprietary licensed\nproducts (Oracle). MariaDB also has more storage engines than MySQL.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>sudo mysql -u root -p<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Welcome to the MariaDB monitor.  Commands end with ; or \\g.<\/span><\/span>\n<span class=\"giallo-l\"><span>Your MariaDB connection id is 3<\/span><\/span>\n<span class=\"giallo-l\"><span>Server version: 10.6.11-MariaDB MariaDB Server<\/span><\/span>\n<span class=\"giallo-l\"><span>Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.<\/span><\/span>\n<span class=\"giallo-l\"><span>Type &#39;help;&#39; or &#39;\\h&#39; for help. Type &#39;\\c&#39; to clear the current input statement.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>MariaDB [(none)]&gt; show databases;<\/span><\/span>\n<span class=\"giallo-l\"><span>+--------------------+<\/span><\/span>\n<span class=\"giallo-l\"><span>| Database           |<\/span><\/span>\n<span class=\"giallo-l\"><span>+--------------------+<\/span><\/span>\n<span class=\"giallo-l\"><span>| hervymart          |<\/span><\/span>\n<span class=\"giallo-l\"><span>| hervypraktek       |<\/span><\/span>\n<span class=\"giallo-l\"><span>| information_schema |<\/span><\/span>\n<span class=\"giallo-l\"><span>| mysql              |<\/span><\/span>\n<span class=\"giallo-l\"><span>| performance_schema |<\/span><\/span>\n<span class=\"giallo-l\"><span>| sys                |<\/span><\/span>\n<span class=\"giallo-l\"><span>+--------------------+<\/span><\/span>\n<span class=\"giallo-l\"><span>6 rows in set (0,097 sec)<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>MariaDB [(none)]&gt;<\/span><\/span><\/code><\/pre><h2 id=\"r\">R<a class=\"post-anchor\" href=\"#r\" aria-label=\"Anchor link for: r\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<ul>\n<li>Website: \n\n<a href=\"https:\/\/r-project.org\">R-Project<\/a><\/li>\n<li>Documentation: \n\n<a href=\"https:\/\/docs.posit.co\/ide\/user\/ide\/get-started\">Posit Docs<\/a><\/li>\n<li>Books: \n\n<a href=\"https:\/\/www.r-project.org\/doc\/bib\/R-books.html\">R-Project Books<\/a><\/li>\n<\/ul>\n<p>The R programming language is better known as a programming\nlanguage for statistics and graphical visualization. Created by \n\n<a href=\"https:\/\/en.wikipedia.org\/wiki\/Ross_Ihaka\">Ross Ihaka<\/a> and \n\n<a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_Gentleman_(statistician)\">Robert Gentleman<\/a> at the\nUniversity of Auckland, it is now developed by the R Development Core\nTeam.<\/p>\n<p>The R language, under the GNU GPL license, has become the de facto\nstandard among statisticians for statistical software development, and\nis widely used for statistical software development and data analysis.<\/p>\n<p>The R language can be used with \n\n<a href=\"https:\/\/jupyter.org\">Jupyter<\/a> or \n\n<a href=\"https:\/\/posit.co\/products\/open-source\/rstudio\">RStudio Posit<\/a> to make it easier for data scientists to process\ndata.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span class=\"z-entity z-name z-function\">R<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>R version 4.2.1 (2022-06-23) -- &quot;Funny-Looking Kid&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>Copyright (C) 2022 The R Foundation for Statistical Computing<\/span><\/span>\n<span class=\"giallo-l\"><span>Platform: x86_64-pc-linux-gnu (64-bit)<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>R is free software and comes with ABSOLUTELY NO WARRANTY.<\/span><\/span>\n<span class=\"giallo-l\"><span>You are welcome to redistribute it under certain conditions.<\/span><\/span>\n<span class=\"giallo-l\"><span>Type &#39;license()&#39; or &#39;licence()&#39; for distribution details.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>  Natural language support but running in an English locale<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>R is a collaborative project with many contributors.<\/span><\/span>\n<span class=\"giallo-l\"><span>Type &#39;contributors()&#39; for more information and<\/span><\/span>\n<span class=\"giallo-l\"><span>&#39;citation()&#39; on how to cite R or R packages in publications.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Type &#39;demo()&#39; for some demos, &#39;help()&#39; for on-line help, or<\/span><\/span>\n<span class=\"giallo-l\"><span>&#39;help.start()&#39; for an HTML browser interface to help.<\/span><\/span>\n<span class=\"giallo-l\"><span>Type &#39;q()&#39; to quit R.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>&gt; print(&quot;HelloWorld&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>[1] &quot;HelloWorld&quot;<\/span><\/span><\/code><\/pre><h2 id=\"julia\">Julia<a class=\"post-anchor\" href=\"#julia\" aria-label=\"Anchor link for: julia\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<ul>\n<li>Website: \n\n<a href=\"https:\/\/julialang.org\">Julia Language<\/a><\/li>\n<li>Documentation: \n\n<a href=\"https:\/\/docs.julialang.org\/en\">Julia Language Docs<\/a><\/li>\n<li>Books: \n\n<a href=\"https:\/\/julialang.org\/learning\/books\">Julia Language Books<\/a><\/li>\n<\/ul>\n<p>The Julia programming language is one of the languages used for\nefficient numerical analysis and data visualization. Similar to Python,\nJulia is a high-level language with syntax that is relatively easy for\nbeginners.<\/p>\n<p>Julia is arguably Python\u2019s competitor, as its performance is much faster\nthan Python\u2019s. This is because Julia is compiled with the LLVM framework\nfor JIT compilation, which is comparable to the speed of C. In addition,\nJulia can be integrated with VIM, Jupyter, and \n\n<a href=\"https:\/\/julia-vscode.org\">Julia VScode<\/a>. Julia also has \n\n<a href=\"https:\/\/www.juliapackages.com\">Julia Packages<\/a> for libraries needed by\ndata scientists, and interestingly, Julia has \n\n<a href=\"https:\/\/fluxml.ai\">FluxML<\/a>, a\nlibrary specifically for machine learning.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>julia<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>   _       _ _(_)_     |  Documentation: https:\/\/docs.julialang.org<\/span><\/span>\n<span class=\"giallo-l\"><span>  (_)     | (_) (_)    |<\/span><\/span>\n<span class=\"giallo-l\"><span>   _ _   _| |_  __ _   |  Type &quot;?&quot; for help, &quot;]?&quot; for Pkg help.<\/span><\/span>\n<span class=\"giallo-l\"><span>  | | | | | | |\/ _` |  |<\/span><\/span>\n<span class=\"giallo-l\"><span>  | | |_| | | | (_| |  |  Version 1.8.5 (2023-01-08)<\/span><\/span>\n<span class=\"giallo-l\"><span> _\/ |\\__&#39;_|_|_|\\__&#39;_|  |<\/span><\/span>\n<span class=\"giallo-l\"><span>|__\/                   |<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>julia&gt; print(&quot;Hello World&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>Hello World<\/span><\/span>\n<span class=\"giallo-l\"><span>julia&gt;<\/span><\/span><\/code><\/pre><h2 id=\"scala\">Scala<a class=\"post-anchor\" href=\"#scala\" aria-label=\"Anchor link for: scala\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<ul>\n<li>Website: \n\n<a href=\"https:\/\/scala-lang.org\">Scala Language<\/a><\/li>\n<li>Documentation: \n\n<a href=\"https:\/\/docs.scala-lang.org\">Scala Language Docs<\/a><\/li>\n<li>Books: \n\n<a href=\"https:\/\/docs.scala-lang.org\/books\">Scala Language Books<\/a><\/li>\n<\/ul>\n<p>Scala (Scalable language) was started in 2001 by Martin Odersky and is a\ngeneral-purpose, high-level, multi-paradigm programming language.<\/p>\n<p>Scala, like Java, is an object-oriented programming language that\nis safe and supports functional programming. Scala runs on the Java\nplatform (Java virtual machine) and is compatible with existing Java\nprograms.<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"scala\"><span class=\"giallo-l\"><span class=\"z-keyword\">object<\/span><span class=\"z-entity z-name z-class\"> HelloWorld<\/span><span class=\"z-keyword\"> extends<\/span><span class=\"z-entity z-name z-class\"> App<\/span><span class=\"z-punctuation\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span>  println<\/span><span class=\"z-meta z-bracket\">(<\/span><span class=\"z-punctuation z-definition z-string z-begin z-scala\">&quot;<\/span><span class=\"z-string z-quoted z-double z-scala\">Hello, World!<\/span><span class=\"z-punctuation z-definition z-string z-end z-scala\">&quot;<\/span><span class=\"z-meta z-bracket\">)<\/span><\/span>\n<span class=\"giallo-l\"><span class=\"z-punctuation\">}<\/span><\/span><\/code><\/pre>\n<p>Compiling:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>scalac HelloWorld.scala<\/span><\/span><\/code><\/pre>\n<p>Running binary:<\/p>\n<pre class=\"giallo z-code\"><code data-lang=\"shellsession\"><span class=\"giallo-l\"><span>scala HelloWorld<\/span><\/span><\/code><\/pre><pre class=\"giallo z-code\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Hello, World!<\/span><\/span><\/code><\/pre><h2 id=\"conclusion\">Conclusion<a class=\"post-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Regardless of the language used, tailor it to the needs and criteria of\nthe data at hand for greater effectiveness. The following programming\nexamples are organized by subheading, starting with the easiest and most\ncommon ones, making them easier for beginners to learn.<\/p>\n<p><strong>What is the best language?<\/strong><\/p>\n<p>All programming languages are the best as long as they meet the needs\nand specifications, because each language has its own advantages and\ndisadvantages. Personally, I recommend not focusing on the language\nitself, but rather understanding the basic concepts of programming\nalgorithms first, which is more important.<\/p>\n"},{"title":"Are You Sure It's Just About Learning?","published":"2023-01-31T00:00:00+00:00","updated":"2026-06-11T00:00:00+00:00","author":{"name":"\n            hervyqa\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/hervyqa.srht.site\/blog\/just-about-learning\/"}},"id":"https:\/\/hervyqa.srht.site\/blog\/just-about-learning\/","content":"<p>Essentially, the learning process involves a change in the nature of\nthe learner from not knowing to knowing, from not understanding to\nunderstanding.<\/p>\n<p>Whether it\u2019s programming, playing guitar, learning languages, public\nspeaking, cooking, or sports. People who look skilled usually don\u2019t just\nlearn the theory, they\u2019ve gotten used to doing it every day.<\/p>\n<p>This means that learning does not necessarily change a person\u2019s\nattitude, does not always produce results, and certainly does not make\nthe learner a professional in a particular field.<\/p>\n<h2 id=\"getting-used-to-it\">Getting used to it<a class=\"post-anchor\" href=\"#getting-used-to-it\" aria-label=\"Anchor link for: getting-used-to-it\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>One potential approach is to <strong>get used to<\/strong> a particular process by\nrepeating it over and over again (looping) until it becomes second\nnature.<\/p>\n<p>By getting used to it, whether you like it or not, you will shape and\npractice what you have learned. Of course, the output of the learning\nprocess can be remembered in the long term. If the \u201clearning\u201d process is\ndone first, how can someone understand without getting used to it first?<\/p>\n<ul>\n<li>Friend: What are you learning right now?<\/li>\n<li>Me: I\u2019m learning in C (programming language) so that I can get used to\nbuild application.<\/li>\n<\/ul>\n<p>Similar questions that are often asked are: why use an operating system\nwhen the commands is complicated and difficult to memorize, instead of just\nclicking? Why use an application when there are few tutorials, but others\nwith plenty? Why choose X over Z? And so on.<\/p>\n<p>The answer often like these: \u201cBecause I\u2019m used to\u201d. It can be said that\nthis answer is very subjective based on the experience of the person\nanswering, but that\u2019s the actual reality.<\/p>\n<p>The way to get used to and be fluent in computer programming is to code\nevery day. To get used to making good designs, you have to design every\nday. To get used to speaking Japanese, you have to speak Japanese every\nday. To get used to public speaking, of course, you have to speak every\nday.<\/p>\n<p>In 2009, I still remember my junior high school biology teacher, who\nwas also an MIPA (Mathematics and Natural Sciences) Olympiad instructor\nat the time, asking, \u201cSir, how did you memorize all the terms related\nto digestion, respiration, hearing, the excretory system, cells, and so\non?\u201d He casually replied, \u201cBecause I\u2019ve been teaching biology every\nday for years and I also teach at a private school.\u201d<\/p>\n<p>I could only mutter, \u201cOh\u2026 that makes sense.\u201d It turns out that\nfrequent practice and getting used to something are ways to build a\nstrong foundation.<\/p>\n<h2 id=\"having-a-goal\">Having a goal<a class=\"post-anchor\" href=\"#having-a-goal\" aria-label=\"Anchor link for: having-a-goal\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Apart from \u201cbeing accustomed to it,\u201d another strong reason is having\na goal for what you want to get used to. This is what becomes the\nfundamental (intention and motivation) for getting used to something.\nBefore planning to get used to something, first make sure you have a\nstrong reason for needing it.<\/p>\n<p>For example, why should you use Linux? Because you want to become a\ncertified system administrator at a company. Why should you get used to\nPython and SQL? To become a professional data scientist in the future.\nWhy should you get used to Java? To become a mobile programmer at a\ncompany. Why should you get used to Inkscape? To become a great logo\ndesigner. And so on. It will feel empty if you do something without a\nmeaningful and defined goal.<\/p>\n<h2 id=\"having-more-features\">Having more features<a class=\"post-anchor\" href=\"#having-more-features\" aria-label=\"Anchor link for: having-more-features\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>Another answer is because it has \u201cmore features.\u201d Usually, the argument\nis based on features that are more suitable and meet spesific needs.\nFor example, using BSD or Linux-based because it is lighter and offers\nmaximum performance. Using drawing apps because it has editable layers\nand compatible with printing color standards, and so on.<\/p>\n<p>The answers to these arguments generally refer more to technical\nmatters.<\/p>\n<h2 id=\"same-network\">Same network<a class=\"post-anchor\" href=\"#same-network\" aria-label=\"Anchor link for: same-network\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>\u201cI use X software because many of my colleagues use it,\u201d is a fairly\nrational argument. Once you know your goal, there will definitely be\nindividuals or groups who share the same passion. By joining a group\nor community, you will be able to build connections within the same\nnetwork. That way, you can ask for feedback once you have created your\nportfolio.<\/p>\n<h2 id=\"back-to-the-topic\">Back to the topic<a class=\"post-anchor\" href=\"#back-to-the-topic\" aria-label=\"Anchor link for: back-to-the-topic\"><span aria-hidden=\"true\">#<\/span><\/a>\n<\/h2>\n<p>It\u2019s not just about learning, but also practicing what has been learned.\nLearning is only the initial process of understanding concepts and\ntheories, but the euphoria is more about the results of execution, trial\nand error, and repeated practice.<\/p>\n<p>Is it enough to just practice? Of course not. The concept of learning\nis more than that. The process is as follows: Starting with having a\nspecific goal &gt; Getting used to it &gt; Learning &gt; Understanding &gt; Teaching\nothers &gt; Guiding &gt; Facilitating learners to maintain the concept of\nlearning <span class=\"ref-placeholder\" data-ref=\"neuroscience2019\">(<a href=\"#ref-neuroscience2019\">Dagmar et al<\/a>)<\/span>.<\/p>\n<blockquote>\n<p>\u201cI hate every minute of training, but I say, Don\u2019t quit. Suffer now\nand live the rest of your life as a champion.\u201d<\/p>\n<p>\u2014 <cite>Muhammad Ali<\/cite><\/p>\n<\/blockquote>\n<p>If you only read books, subscribe to courses, watch webinars and video\ntutorials, this is only a small part of the learning concept above. It\nmust be more than that, one must get used to practicing it. Every day!<\/p>\n"}]}