<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><![CDATA[0xhenrique]]></title>
<description><![CDATA[0xhenrique]]></description>
<link>https://blog.0xhenrique.org/</link>
<lastBuildDate>Fri, 05 Dec 2025 18:45:28 +0000</lastBuildDate>
<item>
  <title><![CDATA[Global Install NPM Packages on GNU Guix]]></title>
  <description><![CDATA[
<p>
This post is not exactly a tutorial, but rather a record for myself. I've already needed to configure npm on Guix a few times and, inevitably, I ended up forgetting the steps when I installed the system again. To avoid wasting time in the future, I leave here the procedure that always solves the problem for me.
</p>

<p>
When trying to install packages globally with npm, the error is usually this:
</p>

<div class="org-src-container">
<pre class="src src-nil">home@user ~/workspace/dump$ npm i --global @volar/typescript
npm error code ENOENT
npm error syscall mkdir
npm error path /gnu/store/7wn5cq17bjndjxqpzlp6icyyyfxz36bf-node-22.14.0/lib/node_modules/@volar
npm error errno -2
npm error enoent ENOENT: no such file or directory, mkdir '/gnu/store/...'
npm error enoent This is related to npm not being able to find a file.
npm error A complete log of this run can be found in: /home/user/.npm/_logs/2025-12-05T18_11_26_115Z-debug-0.log
</pre>
</div>

<p>
The problem happens because Guix, like NixOS, keeps the /gnu/store directory immutable. npm tries to write there and fails. The practical solution is to redirect global packages to a directory in $HOME.
</p>
<div id="outline-container-org2ca5ea0" class="outline-2">
<h2 id="org2ca5ea0">Step by step</h2>
<div class="outline-text-2" id="text-org2ca5ea0">
<div class="org-src-container">
<pre class="src src-nil"># Create a directory for global packages:
mkdir ~/.npm-global

# Configure npm prefix:
npm config set prefix '~/.npm-global'

# Add the new path to PATH:
export PATH="$HOME/.npm-global/bin:$PATH"

# Confirm that the configuration has been applied:
npm config get prefix
/home/user/.npm-global

# Install the desired package:
npm install -g @volar/typescript
added 5 packages in 1s
</pre>
</div>

<p>
There are other ways around this limitation, but working with npm (and other package managers) in Guix can be a bit of a pain. This simple adjustment is often enough to avoid headaches in most cases.
</p>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-web.html">web</a> <a href="https://blog.0xhenrique.org/tag-guix.html">guix</a> </div>]]></description>
  <category><![CDATA[web]]></category>
  <category><![CDATA[guix]]></category>
  <link>https://blog.0xhenrique.org/2025-12-05-global-install-npm-packages-on-gnu-guix.html</link>
  <guid>https://blog.0xhenrique.org/2025-12-05-global-install-npm-packages-on-gnu-guix.html</guid>
  <pubDate>Fri, 05 Dec 2025 18:21:00 +0000</pubDate>
</item>
<item>
  <title><![CDATA[Managing Bookmarks in Emacs: Why I Built ESB]]></title>
  <description><![CDATA[
<div id="outline-container-org86a9c6b" class="outline-2">
<h2 id="org86a9c6b">The Problem with Browser Bookmarks</h2>
<div class="outline-text-2" id="text-org86a9c6b">
<p>
If you are reading this, maybe you spend most of your day inside Emacs. You probably already use it for emails, RSS, file stuff, even browsing web pages. But then, why bookmarks are still stuck inside Firefox or Chrome?
</p>

<p>
Bookmarks in browser just feel annoying when everything else is in Emacs. Like, you find a nice link while working in Emacs, but now you need to switch to browser just to save it. Not only that, your bookmarks are locked to some sync system from Google or Mozilla or someone else.
</p>

<p>
But for us who like to own our data and keep things inside Emacs, I think there is a better way.
</p>
</div>
</div>
<div id="outline-container-orge863b95" class="outline-2">
<h2 id="orge863b95">Enter ESB: Emacs Simple Bookmark</h2>
<div class="outline-text-2" id="text-orge863b95">
<p>
So I made ESB. It's a small and simple bookmark manager that works inside Emacs. It also encrypts bookmarks, and you can sync them in any way you want.
</p>

<p>
Idea is very basic: bookmarks are your data, so they should stay in your system, not in someone else’s cloud. Want to sync with GitHub? Go ahead. Self-hosted GitLab? Sure. Your own server? Even better.
</p>
</div>
<div id="outline-container-orgbcda676" class="outline-3">
<h3 id="orgbcda676">Technical Implementation</h3>
<div class="outline-text-3" id="text-orgbcda676">
<p>
Bookmarks are saved in JSON file. Each one has URL, maybe description, and some tags. The cool part is the storage backend. By default it uses GPG to encrypt before saving:
</p>

<div class="org-src-container">
<pre class="src src-elisp">(defcustom esb-storage-backend 'gpg
  "Storage backend for bookmarks."
  :type '(choice (const :tag "GPG encrypted" gpg)
                 (const :tag "Plain text" plain)
                 (function :tag "Custom backend"))
  :group 'esb)
</pre>
</div>

<p>
Because of GPG, you can put the bookmark file on public GitHub repo and it's still safe. I do this for my dotfiles. Also, ESB loads bookmarks in memory, so it feels fast. It only writes to file when you change something.
</p>

<p>
You can use prefix args to filter by tag. This helps a lot when you have many bookmarks and want to find one doc or article you saved long time ago.
</p>
</div>
</div>
</div>
<div id="outline-container-org35c1d7f" class="outline-2">
<h2 id="org35c1d7f">Why This Approach Makes Sense For Me</h2>
<div class="outline-text-2" id="text-org35c1d7f">
<p>
The nice thing about keeping bookmarks in Emacs is not only workflow. It’s also about owning your stuff and making it flexible. You can grep them, version control them, backup with dotfiles, or write scripts to do whatever you want.
</p>

<p>
Also, you're free from browser companies. Change browser? Bookmarks are still there. Change OS? Still there. Want to move to different system later? It's JSON, so export is easy.
</p>

<p>
And if you sync with Git, you get history. Deleted bookmarks by mistake? <code>git revert</code>. Want to check what links you saved last year? <code>git log</code> can show.
</p>
</div>
</div>
<div id="outline-container-orge49549e" class="outline-2">
<h2 id="orge49549e">The Limitations</h2>
<div class="outline-text-2" id="text-orge49549e">
<p>
But, let’s be honest. This setup is not for everyone. You need to set up GPG, Git repo, and remember to commit. If you just want bookmarks to work and don’t want to think too much, the browser way is easier.
</p>

<p>
Also, ESB is only in Emacs. If you browse a lot outside Emacs, it’s not so nice. You can still look at the file, but not use the Emacs functions.
</p>

<p>
GPG can also be tricky, especially when you use many computers with different configs. I try to explain this in the README, but it’s still harder than clicking “sync” in browser, of course.
</p>
</div>
</div>
<div id="outline-container-orgfe99883" class="outline-2">
<h2 id="orgfe99883">Should You Use It?</h2>
<div class="outline-text-2" id="text-orgfe99883">
<p>
If you live inside Emacs and care more about control than convenience, I think ESB is good for you. If you keep dotfiles in Git, run your own stuff, and like tools that play nice together, maybe try it.
</p>

<p>
But if you just want bookmarks that sync and you don’t want to worry about how, then browser is better. That’s fine too, not everyone needs the same thing.
</p>

<p>
If you’re curious, the code is on GitHub, AGPL license. PRs, issues, or just feedback are all welcome. It works fine for me, but I want to see how others use it too.
</p>

<p>
GitHub link: <a href="https://github.com/0xhenrique/esb">https://github.com/0xhenrique/esb</a>
</p>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-emacs.html">emacs</a> <a href="https://blog.0xhenrique.org/tag-esb.html">esb</a> <a href="https://blog.0xhenrique.org/tag-projects.html">projects</a> </div>]]></description>
  <category><![CDATA[emacs]]></category>
  <category><![CDATA[esb]]></category>
  <category><![CDATA[projects]]></category>
  <link>https://blog.0xhenrique.org/why-i-build-esb.html</link>
  <guid>https://blog.0xhenrique.org/why-i-build-esb.html</guid>
  <pubDate>Fri, 30 May 2025 08:57:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Pluto Review]]></title>
  <description><![CDATA[
<div id="outline-container-org607b163" class="outline-2">
<h2 id="org607b163">Summary</h2>
<div class="outline-text-2" id="text-org607b163">
<p>
I would dare to say that Pluto is an anime carried almost entirely by its direction and art, while its story leaves something to be desired in many respects. I had difficulties with the way the author approached the problems inherent in the type of narrative he chose. In this review, I won't go into the technical aspects of animation and direction since I don't have enough knowledge to evaluate them. My focus will be on the writing and storytelling.
</p>
</div>
</div>
<div id="outline-container-org81c8436" class="outline-2">
<h2 id="org81c8436">The premise</h2>
<div class="outline-text-2" id="text-org81c8436">

<figure id="org8bcf5bd">
<img src="https://i.imgur.com/oEU9QPZ.jpeg" alt="oEU9QPZ.jpeg">

</figure>

<p>
The story takes place in a world where artificial intelligence has evolved to the point where it is difficult to distinguish robots from humans. As expected of any work with this premise, the author uses this basis to raise reflections on humanity, ethics, morality and even religion. However, one of the biggest problems I found with Pluto was the attempt to draw a parallel between robots and slaves. On the surface, it may seem like a valid comparison, but it's not. The reason is simple: robots are not living beings, let alone humans.
</p>

<p>
Although there is a significant difference between a simple calculator and a robot with advanced artificial intelligence capable of simulating human emotions, that doesn't make it valid to equate robots with slaves. However advanced an AI may become, it will still be <b><b>ARTIFICIAL</b></b>. The moment you suggest that these machines should have the same rights as humans, you are actually lowering the meaning of what it means to be human, equating us with mere codes and circuits.
</p>

<p>
I believe that the two biggest flaws in the narrative are exactly these: the attempt to humanise the robots to the point of comparing them to slaves, and the implication that they possess genuine empathy. I'll explore these issues in more detail below.
</p>
</div>
</div>
<div id="outline-container-orgd569c81" class="outline-2">
<h2 id="orgd569c81">Robots are not slaves</h2>
<div class="outline-text-2" id="text-orgd569c81">

<figure id="org2901ed8">
<img src="https://i.imgur.com/qV2kSo3.jpeg" alt="qV2kSo3.jpeg">

</figure>

<p>
I hope I'm not using a Strawman fallacy here, but my impression is that the author is trying to generate empathy for the robots through this analogy. By portraying the conditions in which they lived before the implementation of the International Robot Laws, it is clear that the intention is to move the viewer, evoking feelings similar to those we experience when learning about the horrors of slavery in real history.
</p>

<p>
However, there is a fundamental difference between the two cases: human emotions are real, while the emotions of robots are only <b><b>SIMULATIONS</b></b>. When an enslaved human being is forced to work under degrading conditions, both their body and their mind suffer real damage. Fear, fatigue, illness and death are concrete and <b><b>REAL</b></b> consequences. A robot, however advanced, merely simulates these states. Just as we feel empathy for fictional characters in a film, we can be moved by the robots in the story - but that doesn't make them comparable to humans.
</p>
</div>
</div>
<div id="outline-container-orge64d61d" class="outline-2">
<h2 id="orge64d61d">Do robots have empathy?</h2>
<div class="outline-text-2" id="text-orge64d61d">

<figure id="org7047fc0">
<img src="https://i.imgur.com/h64nW5I.jpeg" alt="h64nW5I.jpeg">

</figure>

<p>
This is another point that the author deals with in a paradoxical way. At the same time as he tries to convince the viewer that robots are highly humanised, he himself exposes the limitations of this supposed empathy. The best example of this is Uran. In the anime, her ability to ‘feel’ human feelings is described as impressive. After Atom's death, we see that she has ‘suffered’, something that is perceptible to the people around her. However, this idea is contradicted when Uran realises that the pain of a boy, a victim of bullying, is much deeper than hers.
</p>

<p>
This scene completely breaks the idea that robots can really feel like humans do. If even one of the world's most advanced machines, programmed to recognise and react to human emotions, shows less grief for losing her brother than a child who has been bullied, how can we equate these robots with human beings? This inconsistency ends up undermining the author's own proposal.
</p>
</div>
</div>
<div id="outline-container-org40d486b" class="outline-2">
<h2 id="org40d486b">The Best Part</h2>
<div class="outline-text-2" id="text-org40d486b">

<figure id="orgb989c3b">
<img src="https://i.imgur.com/FAFafwr.jpeg" alt="FAFafwr.jpeg">

</figure>

<p>
For me, the highlight of Pluto remains the first episode. The story of Sir Duncan, an elderly musician who has lost his sight and starts living with North #2, one of the most advanced robots in the world, is well done. Apart from showing the horrors experienced by North #2 in the war, the episode also explores Duncan's childhood in a more satisfying way than the rest of the series. Even the soundtrack of this episode stands out, being more striking than that of the rest of the anime. I could even say that watching just the second half of the first episode gives you a better and rewarding experience than watching all the following episodes.
</p>
</div>
</div>
<div id="outline-container-orgc31f7ab" class="outline-2">
<h2 id="orgc31f7ab">Conclusion</h2>
<div class="outline-text-2" id="text-orgc31f7ab">

<figure id="org8bca91b">
<img src="https://i.imgur.com/lTmfFfr.jpeg" alt="lTmfFfr.jpeg">

</figure>

<p>
The end of the story is different from the rest of the series. Yes, I understand that inside Pluto was Sahad, a ‘good-hearted’ robot, but seeing his shell of hatred defeated with a few words from Atom made it feel like I was watching Naruto, not a work by Urasawa. All the hatred that motivated the destruction of the seven most advanced robots in the world was simply dispelled with a ‘hatred isn't worth it’. And no, this isn't just a problem with the anime adaptation - it's exactly the same in the manga. Even if Sahad was a robot with no bad intentions, Pluto was pure hatred, and seeing him defeated with such a simplistic cliché completely undermined the climax of the story.
</p>

<p>
I also missed a more memorable soundtrack. There were several moments in the anime when the lack of an emotional music made some scenes less impactful than they could have been. Overall, the music in Pluto seems to serve more as a backdrop than as an element to intensify the emotions.
</p>
</div>
</div>
<div id="outline-container-org5d4da71" class="outline-2">
<h2 id="org5d4da71">Final considerations</h2>
<div class="outline-text-2" id="text-org5d4da71">

<figure id="orgd661418">
<img src="https://i.imgur.com/Gjtwhpn.jpeg" alt="Gjtwhpn.jpeg">

</figure>

<p>
Pluto starts in a good spot, excellent direction and artwork, but it fails to explore its narrative and the problems presented. The attempt to equate robots with humans fails to sustain the complexity of this discussion. The first episode is exceptional, but overall the plot is very inconsistent. The anime ends in an anticlimactic and simplistic way.
</p>

<p>
In the end, Pluto raises interesting questions, but fails to answer them reasonably.
</p>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-anime.html">anime</a> <a href="https://blog.0xhenrique.org/tag-review.html">review</a> </div>]]></description>
  <category><![CDATA[anime]]></category>
  <category><![CDATA[review]]></category>
  <link>https://blog.0xhenrique.org/pluto-review.html</link>
  <guid>https://blog.0xhenrique.org/pluto-review.html</guid>
  <pubDate>Wed, 12 Feb 2025 06:17:00 +0000</pubDate>
</item>
<item>
  <title><![CDATA[Why I Chose Guix Over Nix]]></title>
  <description><![CDATA[
<p>
I've been using NixOS for quite some time, but somehow I ended up with Guix. In this article I will try to write about the reasons why I don't use Nix anymore.
</p>
<div id="outline-container-org58d397b" class="outline-2">
<h2 id="org58d397b">The Emacs &gt; Elisp &gt; SICP &gt; Scheme pipeline</h2>
<div class="outline-text-2" id="text-org58d397b">

<figure id="org288b134">
<img src="https://i.imgur.com/ouSS2fe.png" alt="ouSS2fe.png">

</figure>

<p>
I honestly don't remember the first time I heard about Emacs, but I remember the first time I tried to use it I got gatekept by the Elisp magecraft.
After that, I spent some days trying to learn some basic concepts of this ancient text editor. Thanks to <a href="https://learnxinyminutes.com/docs/elisp/">https://learnxinyminutes.com/docs/elisp/</a> I was able to write some simple functions to make my Emacs experience smoother. To be honest, I didn't really liked to write Lisp back then, it sucked a lot for me. Even reading simple functions was a hassle since I wasn't used to see through all the parenthesis.
At that time, I already knew about the 'Structure and Interpretaion of Computer Programs' book, but didn't read until then. It was only after seeing the MIT class linked below that I got hooked into computer magecraft:
</p>

<p>
Lecture 1A: Overview and Introduction to Lisp: <a href="https://www.youtube.com/watch?v=-J_xL4IGhJA">https://www.youtube.com/watch?v=-J_xL4IGhJA</a>
</p>

<p>
That was when I finally decided to read the SICP and, consequently, learn Scheme.
</p>
</div>
</div>
<div id="outline-container-org2182493" class="outline-2">
<h2 id="org2182493">The Nix Language is not easy to write</h2>
<div class="outline-text-2" id="text-org2182493">
<p>
And that alone is huge win for Guix. Configuring Nix packages was a pain in the ass. Not because you need to set everything up from scratch (that's not even a problem), but because the language is confusing as hell and the documentation doesn't help. It's not a secret, everywhere you go on the internet you will find people complaining about how the Nix language is hard to grasp, but no because it is complex, just because it lacks proper documentation. You can't be sure to find what you're looking for. All the information is fragmented on the internet, there is not a place where you can just find what you're looking for.
At the end of the day you spend more time guessing "where the information is" rather "how to do X".
For instance, here's a comparison between the figlet package ported to Nix and the one ported to Guix:
</p>


<figure id="orgbb173f6">
<img src="https://i.imgur.com/9epJ4qs.png" alt="9epJ4qs.png">

</figure>

<p>
And no, I'm not even talking about how the Nix code is bigger than the Scheme code, that's not really a problem. The thing is, which one is easier to read? Which one is easier to maintain? Which one is more elegant? Which one is more expressive about what it does?
The Nix language was a mistake and I think it is the Achilles' heel of the Nix project. I can assure you that most of the people using NixOS right now don't even know how the language works, most of the time tthey just copy and paste code that was already written by some Nix wizard and call it a day. But the moment you need to do something new you're left in the lurch. But I have to admit, most of the Nix wizards are nice people and they will probably help you. The thing is, do you really want to depend so much on the community to get things done?
</p>

<p>
Guix solves that. It's not like you need to learn a complex language to start with Guix, Scheme is relatively simple and most of the time the docs are everything you need to get up and running. Packaging a program for Guix isn't hard, I plan to make another blog post to delve into that soon.
</p>
</div>
</div>
<div id="outline-container-orgc15e9fc" class="outline-2">
<h2 id="orgc15e9fc">The LISP way of life</h2>
<div class="outline-text-2" id="text-orgc15e9fc">

<figure id="org59b48ec">
<img src="https://imgs.xkcd.com/comics/lisp_cycles.png" alt="lisp_cycles.png">

</figure>

<p>
There are some reasons why some Emacs wizards stick to LISP: metaprogramming, macros, higher-order functions, recursion etc. Not only that, LISP is a crucial part of computer science history. It helps you understand why things are the way they are. It helps you understand mathematical concepts. It helps you understand functional programming. It helps you understand core concepts of programming, hence Scheme is used as the language for the SICP book.
</p>

<p>
And yes, Nix also supports abstractions, but Guix's use of Scheme provides more powerful and general ways to define those abstractions.
Since all the Guix configuration and packaging logic is expressed in Guile Scheme, you can deeply customise and program your system at at level.
For instance, you can define custom operating system services, package definitions, or system configuration options entirely in Guile Scheme.
You can't really say the same for NixOS. The language itself is more limited to package definitions, which makes it harder to set system-level configurations. If you want to customise deeply at system-level you will probably need external scripting or some other configuration management tools.
</p>

<p>
Scheme has a long history in theoretical computer science and has been used for decades in academic research and programming language design. Using Scheme to configure your system basically gives your superpowers, it's pretty much like standing on the shoulders of giants.
To be honest I don't see a point in learning such a complex language as Nix just to define packages. Scheme gives you so much potential for broader use cases other than package definitions. System configuration, scripting, automation, general programming, you name it. Even if you don't plan to write packages for Guix you still can use Scheme for lots of other tasks, specially if your using the Guix operating system.
</p>
</div>
</div>
<div id="outline-container-orgea72236" class="outline-2">
<h2 id="orgea72236">Guix is Free (as in Freedom)</h2>
<div class="outline-text-2" id="text-orgea72236">
<p>
Guix places more emphasis on software freedom and adheres to the FSF standards for ethical distros.
</p>

<p>
Yes, I do use some proprietary software, but that's something I want to change. I would say that the only reason I still use the Linux kernel is because of the lack of free bluetooth drivers for my laptop. That's something I also want to change. I made a mistake buying a bluetooth headphone, specially because I already knew that there were no free bluetooth drivers for me. I hope to abandon Linux and its proprietary binaries as soon as possible. Software freedom might be hard to achieve, but freedom in general isn't easy to achieve.
</p>


<figure id="org8e7ad33">
<img src="https://preview.redd.it/7ozal346p6kz.png?auto=webp&amp;s=f1058e3a298c411182de3a9bd788f65cec5d1bc1" alt="7ozal346p6kz.png?auto=webp&amp;s=f1058e3a298c411182de3a9bd788f65cec5d1bc1">

</figure>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-guix.html">guix</a> <a href="https://blog.0xhenrique.org/tag-nix.html">nix</a> <a href="https://blog.0xhenrique.org/tag-operating-systems.html">operating-systems</a> </div>]]></description>
  <category><![CDATA[guix]]></category>
  <category><![CDATA[nix]]></category>
  <category><![CDATA[operating-systems]]></category>
  <link>https://blog.0xhenrique.org/why-i-chose-guix-over-nix.html</link>
  <guid>https://blog.0xhenrique.org/why-i-chose-guix-over-nix.html</guid>
  <pubDate>Mon, 23 Sep 2024 07:01:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Guix Wallpapers]]></title>
  <description><![CDATA[
<p>
I've been using Guix for quite some time now. It's been a great experience so far.
Here are some wallpapers I've been collecting for my Guix desktop.
</p>


<p>
<img src="https://i.imgur.com/se5Qk6P.png" alt="se5Qk6P.png">
<img src="https://i.imgur.com/bYxUNO7.png" alt="bYxUNO7.png">
<img src="https://i.imgur.com/KT1Uo39.png" alt="KT1Uo39.png">
<img src="https://i.imgur.com/LuEaj38.png" alt="LuEaj38.png">
<img src="https://i.imgur.com/IGCGrEI.png" alt="IGCGrEI.png">
<img src="https://i.imgur.com/OyOJUyY.png" alt="OyOJUyY.png">
<img src="https://i.imgur.com/eb0qu4z.png" alt="eb0qu4z.png">
<img src="https://i.imgur.com/UyKmkHr.png" alt="UyKmkHr.png">
<img src="https://i.imgur.com/yXVVoH8.png" alt="yXVVoH8.png">
</p>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-guix.html">guix</a> <a href="https://blog.0xhenrique.org/tag-wallpaper.html">wallpaper</a> <a href="https://blog.0xhenrique.org/tag-ricing.html">ricing</a> </div>]]></description>
  <category><![CDATA[guix]]></category>
  <category><![CDATA[wallpaper]]></category>
  <category><![CDATA[ricing]]></category>
  <link>https://blog.0xhenrique.org/guix-wallpapers.html</link>
  <guid>https://blog.0xhenrique.org/guix-wallpapers.html</guid>
  <pubDate>Fri, 20 Sep 2024 15:01:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Monogatari - Text Editor in Python]]></title>
  <description><![CDATA[
<p>
Monogatari is a text editor built with Python using the Tkinter GUI library.
<img src="https://raw.githubusercontent.com/henrique-marques-vsoft/monogatari/master/pics/shinobu.gif" alt="shinobu.gif">
</p>
<div id="outline-container-orgb3e51d4" class="outline-2">
<h2 id="orgb3e51d4">Installation and usage</h2>
<div class="outline-text-2" id="text-orgb3e51d4">
<p>
Assuming you already have Python installed in your machine:
</p>
<div class="org-src-container">
<pre class="src src-bash">$ git clone git@github.com:all123all/monogatari.git
$ cd monogatari
$ python monogatari.py
</pre>
</div>

<p>
If you're using Linux you probably will need to install tk manually:
</p>

<div class="org-src-container">
<pre class="src src-bash">//Arch based distros
$ sudo pacman -S tk
//For Ubuntu based
$ sudo apt-get install tk
</pre>
</div>
</div>
</div>
<div id="outline-container-orga2c7fc8" class="outline-2">
<h2 id="orga2c7fc8">Goals</h2>
<div class="outline-text-2" id="text-orga2c7fc8">
<ul class="org-ul">
<li>Basic text editor functionalities (create file, open file, exit etc.)</li>
<li>Black background and a colorpicker option to choose another color</li>
<li class="off"><code>[&#xa0;]</code> Test routine for the basic functionalities</li>
<li class="off"><code>[&#xa0;]</code> Release a package</li>
<li class="off"><code>[&#xa0;]</code> The close function is being called even when the file isn't modified</li>
</ul>
</div>
</div>
<div id="outline-container-orgc2fc1dd" class="outline-2">
<h2 id="orgc2fc1dd">Contribute to MONOGATARI - Text Editor</h2>
<div class="outline-text-2" id="text-orgc2fc1dd">
<ul class="org-ul">
<li>Click the fork button on top right</li>
<li>Git clone your fork</li>
<li>Connect with my repo:</li>
</ul>
<div class="org-src-container">
<pre class="src src-bash">$ git remote add all123all git://github.com/all123all/monogatari
$ git remote -v
</pre>
</div>

<p>
You are now ready to start to code! Just do as always:
</p>
<div class="org-src-container">
<pre class="src src-bash">$ git add .
$ git commit -m "fix: something that was fixed"
$ git push
</pre>
</div>

<p>
Then you can create a pull request right here on Github. Just go to the Pull Requests tab and select `New pull request` button to do so.
</p>
</div>
</div>
<div id="outline-container-orgec2302c" class="outline-2">
<h2 id="orgec2302c">Screenshots</h2>
<div class="outline-text-2" id="text-orgec2302c">

<figure id="orgb474faf">
<img src="https://raw.githubusercontent.com/henrique-marques-vsoft/monogatari/master/pics/print.png" alt="print.png">

</figure>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-projects.html">projects</a> <a href="https://blog.0xhenrique.org/tag-python.html">python</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <category><![CDATA[python]]></category>
  <link>https://blog.0xhenrique.org/monogatari.html</link>
  <guid>https://blog.0xhenrique.org/monogatari.html</guid>
  <pubDate>Sat, 17 Aug 2024 08:57:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Lum - Linux Ubiquitous Marker]]></title>
  <description><![CDATA[
<p>
Link: <a href="https://github.com/0xhenrique/lum">https://github.com/0xhenrique/lum</a>
</p>

<p>
Lum is a project I started as a way to escape the feeling of being tied to the web-browser when it comes to bookmarks.
The objective is relatively simple, to have access to my bookmarks outside of the browser. This way I could call my bookmarks from anywhere on the computer, whether from Vim, Emacs, the browser itself, the window manager or wherever.
I'm still not sure if I'm going to turn this project into a CLI tool or a library. I still need to try to integrate Lum with some other tool and evaluate which points I failed, which ones I need to improve and where I got things right.
</p>

<p>
I started using the Rust language, but I realized that I wasn't familiar enough with the language to do this. So I left Rust aside for a while and took advantage of the situation to rewrite Lum using Clojure, since I had been planning to put it into practice for a while.
</p>

<p>
This was my first more "serious" project using Clojure, so a lot of things are out of place, a lot of rough edges, a lot of design mistakes, etc.
For example, I'm using JSON to save the bookmarks, but to be honest I don't know if I'll keep this format until the end.
I'm still evaluating whether this would be the most practical and quickest way, considering that I already accumulated more than 12 thousand bookmarks at the height of my NEET time.
I don't think parsing 12 thousand objects in JSON is efficient, but it's something I still need to test in practice.
But at least it helped me get better grasp of a Lisp language. I still intend to revisit this project sometime in the future, maybe even restructure it from scratch to fix the mistakes I made.
For now, I don't think it can replace browser bookmarks, but it's something I'll focus on more in my next iteration with Lum.
</p>
<div id="outline-container-orgdba89fb" class="outline-2">
<h2 id="orgdba89fb">Running Lum</h2>
<div class="outline-text-2" id="text-orgdba89fb">
<p>
Although it is not really necessary to run this program, having fzf and xclip would be great if you want to integrate with other programs. A pretty useful command to fetch your bookmarks would be:
</p>
<div class="org-src-container">
<pre class="src src-bash">$ lum -l | fzf | xclip -selection clipboard
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc9b6ab1" class="outline-2">
<h2 id="orgc9b6ab1">Integration with Emacs</h2>
<div class="outline-text-2" id="text-orgc9b6ab1">
<p>
While I'm not deploying binary packages to Lum, I can check my bookmarks through Emacs with a very simple function:
</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(defun pache/my-consult-bookmark ()
  "Select a bookmark using `completing-read` and copy it to the clipboard."
  (interactive)
  (let* ((candidates (split-string (shell-command-to-string "java -jar ~/path/to/lum-1.0.0-SNAPSHOT-standalone.jar -l") "\n" t))
         (selection (completing-read "Select bookmark: " candidates)))
    (when selection
      (kill-new selection)
      (message "Copied to clipboard: %s" selection))))
(global-set-key (kbd "C-c b") 'pache/my-consult-bookmark)
</pre>
</div>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-projects.html">projects</a> <a href="https://blog.0xhenrique.org/tag-programming.html">programming</a> <a href="https://blog.0xhenrique.org/tag-clojure.html">clojure</a> <a href="https://blog.0xhenrique.org/tag-lum.html">lum</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <category><![CDATA[programming]]></category>
  <category><![CDATA[clojure]]></category>
  <category><![CDATA[lum]]></category>
  <link>https://blog.0xhenrique.org/lum.html</link>
  <guid>https://blog.0xhenrique.org/lum.html</guid>
  <pubDate>Sat, 17 Aug 2024 08:57:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Internet Lurk Compilation #1]]></title>
  <description><![CDATA[
<div id="outline-container-orge1f12a7" class="outline-2">
<h2 id="orge1f12a7">General Findings</h2>
<div class="outline-text-2" id="text-orge1f12a7">
<ul class="org-ul">
<li>Pure gold from the 90s: <a href="https://lunduke.substack.com/p/the-computers-used-to-do-3d-animation">https://lunduke.substack.com/p/the-computers-used-to-do-3d-animation</a></li>
<li>Symbolics Internet Museum: <a href="https://symbolics.com/museum/">https://symbolics.com/museum/</a></li>
<li>What is the relationship between Apple and Serial Experiments Lain? <a href="https://www.cjas.org/~leng/apple-lain.htm">https://www.cjas.org/~leng/apple-lain.htm</a></li>
<li>The Cornell Anime Club: <a href="https://www.cjas.org/">https://www.cjas.org/</a></li>
<li>Appearances of MIT in Anime: <a href="https://anime.mit.edu/resources/mit_in_anime">https://anime.mit.edu/resources/mit_in_anime</a></li>
<li>How Emacs got into Tron: Legacy: <a href="https://boingboing.net/2011/04/06/how-emacs-got-into-t.html">https://boingboing.net/2011/04/06/how-emacs-got-into-t.html</a></li>
<li>The Jargon File: <a href="http://www.catb.org/jargon/">http://www.catb.org/jargon/</a></li>
</ul>
</div>
</div>
<div id="outline-container-org0aad49e" class="outline-2">
<h2 id="org0aad49e">Neocities</h2>
<div class="outline-text-2" id="text-org0aad49e">
<ul class="org-ul">
<li>Lainzine (Lain Magazine): <a href="https://lainzine.org/">https://lainzine.org/</a></li>
<li>About Software Privacy and other topics: <a href="https://digdeeper.neocities.org/">https://digdeeper.neocities.org/</a></li>
<li>Reminds of Fauux: <a href="https://blackwings.neocities.org/">https://blackwings.neocities.org/</a></li>
<li>Fauux: <a href="https://fauux.neocities.org/">https://fauux.neocities.org/</a></li>
<li>Tatsumoto's guide to Nihongo: <a href="https://tatsumoto.neocities.org/">https://tatsumoto.neocities.org/</a></li>
</ul>
</div>
</div>
<div id="outline-container-org2feaa2e" class="outline-2">
<h2 id="org2feaa2e">Internet Archive Findings</h2>
<div class="outline-text-2" id="text-org2feaa2e">
<ul class="org-ul">
<li>Oh! PC (Jul 01 1990) [Content in Japanese]: <a href="https://archive.org/details/oh-pc-issue-127-jul-01-1990/Oh%21%20PC%20Issue%20127%20%28Jul%2001%201990%29/mode/2up">https://archive.org/details/oh-pc-issue-127-jul-01-1990/Oh%21%20PC%20Issue%20127%20%28Jul%2001%201990%29/mode/2up</a></li>
<li>Comptiq Manazine [Content in Japanese]: <a href="https://archive.org/search?query=comptiq">https://archive.org/search?query=comptiq</a></li>
<li>The Symbol of the Knights of Eastern Calculus: <a href="https://web.archive.org/web/20200121124624/http://www.cjas.org/~leng/knights.htm">https://web.archive.org/web/20200121124624/http://www.cjas.org/~leng/knights.htm</a></li>
<li>MSX Magazine (1985-02) [Content in Japanese]: <a href="https://archive.org/details/msx-magazine-1985-02-ascii-jp/mode/2up">https://archive.org/details/msx-magazine-1985-02-ascii-jp/mode/2up</a></li>
</ul>
</div>
</div>
<div id="outline-container-org6fd2e7b" class="outline-2">
<h2 id="org6fd2e7b">Websites I visit from time to time</h2>
<div class="outline-text-2" id="text-org6fd2e7b">
<ul class="org-ul">
<li>A <code>~modern~</code> Javascript approach to SICP: <a href="https://sicp.sourceacademy.org/">https://sicp.sourceacademy.org/</a></li>
<li>A blog by Sam Greydanus: <a href="https://greydanus.github.io/">https://greydanus.github.io/</a></li>
<li>Xah Lee (he's also one of the minds behind ergoemacs and xah-fly-keys): <a href="https://xahlee.info/">https://xahlee.info/</a></li>
<li>Sasha Chua blog: <a href="https://sachachua.com/blog/">https://sachachua.com/blog/</a></li>
<li>Lunduke Journal: <a href="https://lunduke.substack.com/">https://lunduke.substack.com/</a></li>
</ul>

<p>
<b><b>If you find a broken link or a website that shares things that are clearly illegal, please let me know by email so I can remove it: &lt;hm2030master@proton.me&gt;</b></b>.
</p>

<p>
<b><b>Also, if you don't want me to list your website here, feel free to also contact me via email so I can remove it.</b></b>
</p>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-blogs.html">blogs</a> <a href="https://blog.0xhenrique.org/tag-links.html">links</a> </div>]]></description>
  <category><![CDATA[blogs]]></category>
  <category><![CDATA[links]]></category>
  <link>https://blog.0xhenrique.org/internet-lurk-compilation.html</link>
  <guid>https://blog.0xhenrique.org/internet-lurk-compilation.html</guid>
  <pubDate>Sat, 17 Aug 2024 08:57:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[About]]></title>
  <description><![CDATA[
<div id="outline-container-org0cb804a" class="outline-2">
<h2 id="org0cb804a">whoami</h2>
<div class="outline-text-2" id="text-org0cb804a">
<p>
Hello there! You can call me Henrique.
The main purpose of this website is to share some interesting things I find on the world wide web and the projects of mine.
Some of the stuff I work on <a href="https://github.com/0xhenrique">Github</a>.
</p>
</div>
</div>
<div id="outline-container-org12dfaea" class="outline-2">
<h2 id="org12dfaea">My Computers</h2>
<div class="outline-text-2" id="text-org12dfaea">
</div>
<div id="outline-container-org2279fe9" class="outline-3">
<h3 id="org2279fe9">ThinkPad T480</h3>
<div class="outline-text-3" id="text-org2279fe9">
<ul class="org-ul">
<li>OS: GNU Guix</li>
<li>DE: EXWM/XFCE4</li>
<li>CPU: Intel i5-8350U (8) @ 3.600GHz</li>
<li>GPU: 😕</li>
<li>RAM: 24Gb</li>
</ul>
</div>
</div>
<div id="outline-container-orge762258" class="outline-3">
<h3 id="orge762258">Xeon PC</h3>
<div class="outline-text-3" id="text-orge762258">
<ul class="org-ul">
<li>OS: GNU Guix</li>
<li>DE: EXWM/XFCE4</li>
<li>CPU: Intel Xeon E5-2650 v4 (24) @ 2.900GHz</li>
<li>GPU: AMD ATI Radeon 540/540X/550/550X / RX 540X/550/550X</li>
<li>Memory: 32GB</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orgb648439" class="outline-2">
<h2 id="orgb648439">Keyboards</h2>
<div class="outline-text-2" id="text-orgb648439">
</div>
<div id="outline-container-org24e7381" class="outline-3">
<h3 id="org24e7381">The Charybdis by Bastard Keyboards</h3>
<div class="outline-text-3" id="text-org24e7381">
<p>
<img src="https://i.imgur.com/vqbSpXX.jpeg" alt="vqbSpXX.jpeg">
Right now I'm using the Charybdis. It simply feels "correct" to type with it.  
The only <span class="underline">drawback</span> from this keyboard is the price, but I don't think you will find a dactyl for a cheap price.  
As far as I know, there's no company mass producing that type of keyboard.  
But at the end I think it's worth it, at least for me it is.
</p>
</div>
</div>
<div id="outline-container-org3f1e4f1" class="outline-3">
<h3 id="org3f1e4f1">The Sofle V1 by Mechboards UK</h3>
<div class="outline-text-3" id="text-org3f1e4f1">
<p>
<img src="https://i.imgur.com/O4zYPni.jpeg" alt="O4zYPni.jpeg">
The other one I have (although don't use very much anymore) is the Sofle V1 that I bought from Mechboards UK.
It was very nice to type on a <span class="underline">low profile</span> keyboard. It's not so expansive as the Charybdis.
</p>
</div>
</div>
</div>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-computers.html">computers</a> <a href="https://blog.0xhenrique.org/tag-emacs.html">emacs</a> <a href="https://blog.0xhenrique.org/tag-blog.html">blog</a> </div>]]></description>
  <category><![CDATA[computers]]></category>
  <category><![CDATA[emacs]]></category>
  <category><![CDATA[blog]]></category>
  <link>https://blog.0xhenrique.org/about.html</link>
  <guid>https://blog.0xhenrique.org/about.html</guid>
  <pubDate>Sat, 17 Aug 2024 08:57:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Nazare Beach]]></title>
  <description><![CDATA[
<p>
I visited Nazaré Beach last year (2023). Such a lovely place.
Shame on me for not taking my camera with me that day. I'm not a fan of smartphone cameras to be honest. Still, I couldn't let the opportunity pass. Here are some photos I took that day.
</p>


<figure id="orgb2358a9">
<img src="https://i.imgur.com/ATjnpyl.jpeg" alt="ATjnpyl.jpeg">

</figure>

<p>
According to Wikipedia, Nazaré is one of the most traditional Portuguese fishing villages, having the most popular bathing beach on the Portuguese west coast, where you can still find, on the sand, some women dressed in the traditional costume of seven skirts, taking care of the fish that dries in the sun, lined up on stakes.
</p>


<figure id="org04cc88b">
<img src="https://i.imgur.com/GwZIh3p.jpeg" alt="GwZIh3p.jpeg">

</figure>

<p>
I plan to go back there in the winter, but this time I will remember to take my camera with me. I have an 18-55 and a 200mm, but I believe I will get better photos with the 200mm, especially in the higher parts. Not to mention that I will be able to aim further without losing sharpness.
</p>

<p>
<img src="https://i.imgur.com/hxY0rcS.jpeg" alt="hxY0rcS.jpeg">
<img src="https://i.imgur.com/8uRNHtF.jpeg" alt="8uRNHtF.jpeg">
</p>
<div class="taglist"><a href="https://blog.0xhenrique.org/tags.html">Tags</a>: <a href="https://blog.0xhenrique.org/tag-travel.html">travel</a> <a href="https://blog.0xhenrique.org/tag-photography.html">photography</a> <a href="https://blog.0xhenrique.org/tag-portugal.html">portugal</a> </div>]]></description>
  <category><![CDATA[travel]]></category>
  <category><![CDATA[photography]]></category>
  <category><![CDATA[portugal]]></category>
  <link>https://blog.0xhenrique.org/Nazare-Beach.html</link>
  <guid>https://blog.0xhenrique.org/Nazare-Beach.html</guid>
  <pubDate>Sat, 17 Aug 2024 08:57:00 +0100</pubDate>
</item>
</channel>
</rss>
