<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Piero Lescano</title><description>Piero Lescano&apos;s blog posts</description><link>https://pierolescano.com</link><generator>Astro v5.18.1</generator><item><title>Colophon</title><link>https://pierolescano.com/colophon</link><guid isPermaLink="true">https://pierolescano.com/colophon</guid><description>How this website is made.</description><pubDate>Tue, 16 Dec 2025 03:39:32 GMT</pubDate><content:encoded>&lt;blockquote&gt;
  &lt;p&gt;A &lt;strong&gt;colophon&lt;/strong&gt; is a page or section (typically in a footer) of a site that describes how the site is
  made, with what tools, supporting what technologies, and often published on personal sites at a top level
  &lt;code&gt;/colophon&lt;/code&gt; page.&lt;/p&gt;
  &lt;cite&gt;&lt;a href=&quot;https://indieweb.org/colophon&quot;&gt;Colophon - IndieWeb&lt;/a&gt;&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;h2&gt;General&lt;/h2&gt;
&lt;p&gt;This website is build with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; and &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;TailwindCSS&lt;/a&gt;. The font is
&lt;a href=&quot;https://www.jetbrains.com/lp/mono/&quot;&gt;JetBrains Mono&lt;/a&gt; and the theme is based on colors from
&lt;a href=&quot;https://github.com/rebelot/kanagawa.nvim&quot;&gt;kanagawa.nvim&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The site is currently hosted on &lt;a href=&quot;https://workers.cloudflare.com/&quot;&gt;Cloudflare Workers&lt;/a&gt;. The
&lt;a href=&quot;https://github.com/piero-vic/pierolescano.com&quot;&gt;code repository&lt;/a&gt; is hosted on GitHub. I have a simple deployment
pipeline to build the site every time new commits are added to the main branch.&lt;/p&gt;
&lt;h2&gt;Content&lt;/h2&gt;
&lt;p&gt;Most content on the site is written in Markdown and managed using Astro Content Collections. I’ve also used Astro
Islands for interactive components in one blog posts, but I plan to migrate to web components when it comes to content.
Mainly to increase portability in case I need to change frameworks in the future.&lt;/p&gt;
&lt;p&gt;Publication and update dates for are generated based on the git history and include links to the corresponding commit on
GitHub.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid&lt;/a&gt; for diagramming in some of my &lt;a href=&quot;/notes&quot;&gt;notes&lt;/a&gt;. SVGs with the diagrams are
generated during the build process using Playwright.&lt;/p&gt;
&lt;p&gt;I provide an &lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt; for blog posts. Feeds for other content on the site are coming soon.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/giscus/giscus&quot;&gt;giscus&lt;/a&gt; for blog posts comments.&lt;/p&gt;</content:encoded></item><item><title>Now</title><link>https://pierolescano.com/now</link><guid isPermaLink="true">https://pierolescano.com/now</guid><description>A list of the things I&apos;m focusing on at this particular time in my life.</description><pubDate>Tue, 16 Dec 2025 03:42:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a &lt;a href=&quot;https://nownownow.com/about&quot;&gt;now page&lt;/a&gt;. A list of the things I’m focusing on at this particular time in my
life.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Working as a software developer at &lt;a href=&quot;https://rhinolabs.agency/&quot;&gt;Rhinolabs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Practicing touch typing from time to time. I’m aiming for 100 wpm.&lt;/li&gt;
&lt;li&gt;Working out. Mainly by running, doing calisthenics and using kettlebells.&lt;/li&gt;
&lt;li&gt;Trying to get through
&lt;a href=&quot;https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs&quot;&gt;Structure and Interpretation of Computer Porgrams&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Exploring &lt;a href=&quot;https://htmx.org/essays/hypermedia-driven-applications/&quot;&gt;Hypermedia-Driven Applications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Studying for the &lt;abbr&gt;SAA-C03&lt;/abbr&gt; certification.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Reading</title><link>https://pierolescano.com/reading</link><guid isPermaLink="true">https://pierolescano.com/reading</guid><description>A list of the books I&apos;ve read and what I&apos;m currently reading.</description><pubDate>Sun, 29 Sep 2024 00:23:18 GMT</pubDate><content:encoded>&lt;h2&gt;Finished Reading&lt;/h2&gt;
&lt;h3&gt;2026&lt;/h3&gt;















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Title&lt;/th&gt;&lt;th&gt;Author&lt;/th&gt;&lt;th&gt;Read&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/1268479.Warbreaker&quot;&gt;Warbreaker&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2026-03-10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;2025&lt;/h3&gt;






































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Title&lt;/th&gt;&lt;th&gt;Author&lt;/th&gt;&lt;th&gt;Read&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/2767793-the-hero-of-ages&quot;&gt;The Hero of Ages&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2025-12-30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/68429.The_Well_of_Ascension&quot;&gt;The Well of Ascension&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2025-12-19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/60531416-yumi-and-the-nightmare-painter&quot;&gt;Yumi and the Nightmare Painter&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2025-12-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/68428.Mistborn&quot;&gt;Mistborn: The Final Empire&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2025-12-08&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/60531420-the-sunlit-man&quot;&gt;The Sunlit Man&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2025-11-13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/57933306-stolen-focus&quot;&gt;Stolen Focus: Why You Can’t Pay Attention— and How to Think Deeply Again&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Johann Hari&lt;/td&gt;&lt;td&gt;2025-10-04&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/214151728-mood-machine&quot;&gt;Mood Machine: The Rise of Spotify and the Costs of the Perfect Playlist&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Liz Pelly&lt;/td&gt;&lt;td&gt;2025-09-30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/53254940&quot;&gt;Blood Song&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Anthony Ryan&lt;/td&gt;&lt;td&gt;2025-09-17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://resilientwebdesign.com&quot;&gt;Resilient web design&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Jeremy Keith&lt;/td&gt;&lt;td&gt;2025-03-14&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/320.One_Hundred_Years_of_Solitude&quot;&gt;One Hundred Years of Solitude&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Gabriel García Márquez&lt;/td&gt;&lt;td&gt;2025-03-08&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/198678736-co-intelligence&quot;&gt;Co-Intelligence&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Ethan Mollick&lt;/td&gt;&lt;td&gt;2025-02-03&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/8855321-leviathan-wakes&quot;&gt;Leviathan Wakes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;James S.A. Corey&lt;/td&gt;&lt;td&gt;2025-01-18&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;2024&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Title&lt;/th&gt;&lt;th&gt;Author&lt;/th&gt;&lt;th&gt;Read&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://understandingdistributed.systems/&quot;&gt;Understanding Distributed Systems&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Roberto Vitillo&lt;/td&gt;&lt;td&gt;2024-12-17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/54785515-four-thousand-weeks&quot;&gt;Four Thousand Weeks&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Oliver Burkeman&lt;/td&gt;&lt;td&gt;2024-09-28&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/49021976-rhythm-of-war&quot;&gt;Rhythm of War&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Brandon Sanderson&lt;/td&gt;&lt;td&gt;2024-08-25&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/6288.The_Road&quot;&gt;The Road&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cormac McCarthy&lt;/td&gt;&lt;td&gt;2024-01-05&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</content:encoded></item><item><title>Uses</title><link>https://pierolescano.com/uses</link><guid isPermaLink="true">https://pierolescano.com/uses</guid><description>A list of the hardware and software I use on a regular basis.</description><pubDate>Tue, 16 Dec 2025 03:41:09 GMT</pubDate><content:encoded>&lt;p&gt;This is my &lt;a href=&quot;https://uses.tech/&quot;&gt;&lt;code&gt;/uses&lt;/code&gt;&lt;/a&gt; page. It contains a list of some of the tools I use on a regular basis. This
isn’t meant to be a complete list, but a highlight of the tools I use the most.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;

&lt;p&gt;My main workstation is a &lt;a href=&quot;https://wiki.archlinux.org/title/Lenovo_ThinkPad_T480s&quot;&gt;Lenovo Thinkpad T480s&lt;/a&gt; running Arch
Linux. I use this laptop for all my software development work.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Component&lt;/th&gt;&lt;th&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;Intel i7-8550U&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;Intel UHD Graphics 620&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAM&lt;/td&gt;&lt;td&gt;16 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OS&lt;/td&gt;&lt;td&gt;Arch Linux&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WM&lt;/td&gt;&lt;td&gt;Sway&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Software&lt;/h2&gt;

&lt;h3&gt;Environment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/swaywm/sway&quot;&gt;Sway&lt;/a&gt; - Wayland compositor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Alexays/Waybar&quot;&gt;Waybar&lt;/a&gt; - Status bar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/emersion/mako&quot;&gt;mako&lt;/a&gt; - Notification daemon&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/davatorium/rofi&quot;&gt;Rofi&lt;/a&gt; - Application and script launcher&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CLI and TUI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/fosskers/aura&quot;&gt;aura&lt;/a&gt; - Package manager&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zsh.org/&quot;&gt;zsh&lt;/a&gt; - Shell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;neovim&lt;/a&gt; - Text editor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gokcehan/lf&quot;&gt;lf&lt;/a&gt; - Terminal file manater&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tmux/tmux&quot;&gt;tmux&lt;/a&gt; - Terminal multiplexer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GUI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt; - Terminal emulator&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.xfce.org/xfce/thunar&quot;&gt;Thunar&lt;/a&gt; - File manager&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.pwmt.org/pwmt/zathura&quot;&gt;Zathura&lt;/a&gt; - Document viewer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.firefox.com/&quot;&gt;Firefox&lt;/a&gt; - Browser&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thunderbird.net/&quot;&gt;Thunderbird&lt;/a&gt; - Mail client&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details on the software I’m running feel free to check out my &lt;a href=&quot;https://github.com/piero-vic/dotfiles&quot;&gt;dotfiles&lt;/a&gt;
repo.&lt;/p&gt;</content:encoded></item><item><title>Adding Comments to My Blog with Giscus</title><link>https://pierolescano.com/blog/adding_comments_to_my_blog</link><guid isPermaLink="true">https://pierolescano.com/blog/adding_comments_to_my_blog</guid><description>Use GitHub Discussions to add comments to your blog.</description><pubDate>Sun, 20 Feb 2022 15:34:58 GMT</pubDate></item><item><title>Building a metronome: React vs Alpine</title><link>https://pierolescano.com/blog/building_a_metronome_react_vs_alpine</link><guid isPermaLink="true">https://pierolescano.com/blog/building_a_metronome_react_vs_alpine</guid><description>Building the same component with two different frameworks.</description><pubDate>Fri, 29 Apr 2022 15:30:33 GMT</pubDate></item><item><title>iCal feeds</title><link>https://pierolescano.com/blog/ical-feeds</link><guid isPermaLink="true">https://pierolescano.com/blog/ical-feeds</guid><description>Some thoughts on the use of iCal feeds.</description><pubDate>Sun, 27 Apr 2025 15:48:33 GMT</pubDate><content:encoded>&lt;p&gt;As you might or might not know, &lt;a href=&quot;https://en.wikipedia.org/wiki/ICalendar&quot;&gt;iCal&lt;/a&gt; is a format to store and share calendar
events. Calendar applications use this format to display events, but you can also share and iCal feed in a website
similar to how you would share an RSS feed.&lt;/p&gt;
&lt;p&gt;My interest for this of feeds started a couple of months ago when I came across
&lt;a href=&quot;https://taylor.town/meetup-ics&quot;&gt;a post by Taylor&lt;/a&gt;. I learned that &lt;a href=&quot;https://meetup.com/&quot;&gt;meetup.com&lt;/a&gt; offers a feed for
the events of a specific group. I found it very convenient after using it a for a while.&lt;/p&gt;
&lt;p&gt;Sadly, I haven’t found many websites that share calendars using this method. Twitch offers
&lt;a href=&quot;https://dev.twitch.tv/docs/api/reference/#get-channel-icalendar&quot;&gt;iCal feeds for channels&lt;/a&gt;, but it has some
&lt;a href=&quot;https://paul.af/twitch-ical&quot;&gt;problems&lt;/a&gt;. If you’re into F1, you can subscribe to the
&lt;a href=&quot;https://www.formula1.com/en/racing/2025&quot;&gt;events of the current season&lt;/a&gt;. You need to create an account to access it.&lt;/p&gt;
&lt;p&gt;Apart from the meetup events I’ve been using iCal feeds to keep up to date with the schedule of wrestling shows. For
this, I’ve been using &lt;a href=&quot;https://www.tvmaze.com/&quot;&gt;TVmaze&lt;/a&gt;, which offers a basic feed for the TV shows you have on your
favorite list.&lt;/p&gt;
&lt;p&gt;Outside the personal use cases, it seems like iCal feeds are also used so synchronize the availability of rentals and
reservations between booking applications like &lt;a href=&quot;https://www.airbnb.com/help/article/99&quot;&gt;Airbnb&lt;/a&gt; and
&lt;a href=&quot;https://partner.booking.com/en-gb/help/rates-availability/extranet-calendar/syncing-your-bookingcom-calendar-third-party-calendars&quot;&gt;Booking.com&lt;/a&gt;.
I haven’t done much research regarding this use case yet, but if I ever get a gig working on a booking management system
I know where to look.&lt;/p&gt;</content:encoded></item><item><title>Jailbroken Kindle</title><link>https://pierolescano.com/blog/jailbroken-kindle</link><guid isPermaLink="true">https://pierolescano.com/blog/jailbroken-kindle</guid><description>Some toughts on jailbreaking a Kindle.</description><pubDate>Sat, 09 Aug 2025 14:48:25 GMT</pubDate><content:encoded>&lt;p&gt;I’ve never had a proper e-reader. For years, I’ve been reading digital books on my phone. I tried a Kindle Fire a few
years ago but didn’t like the experience. The device didn’t have an e-ink display, it was really slow and adding PDFs or
e-books not bought via Amazon was a major hassle. After that experience I went back to my phone and forgot about
e-readers. At least until last week.&lt;/p&gt;
&lt;p&gt;Last month I started coming across &lt;a href=&quot;https://www.youtube.com/watch?v=Qtk7ERwlIAk&quot;&gt;some videos&lt;/a&gt; about jailbreaking
Kindles. It seemed like the perfect opportunity to try something new. Also, I haven’t been reading much lately, and I
thought a new single purpose device could help me get back on track. After some searching, I found a good deal for a
second hand Kindle Paperwhite and bought it right away.&lt;/p&gt;
&lt;h2&gt;Why the need for the jailbreak?&lt;/h2&gt;
&lt;p&gt;So I can read the digital books I already have without hassle and not have to worry about
&lt;a href=&quot;https://gizmodo.com/amazon-secretly-removes-1984-from-the-kindle-5317703&quot;&gt;Amazon deleting books&lt;/a&gt;, banning my account or
spam me with “special offers” ads I don’t want to see.&lt;/p&gt;
&lt;p&gt;I also like giving old devices a new life. The Kindle I got for this experiment is from 2015. I guess is similar to
installing Linux on old ThinkPads. It is just a cool small project to try.&lt;/p&gt;
&lt;h2&gt;Breaking the jail&lt;/h2&gt;
&lt;p&gt;The jailbreak instructions are in &lt;a href=&quot;https://kindlemodding.org&quot;&gt;The Kindle Modding Wiki&lt;/a&gt;. They are easy to follow if you
are somewhat computer-literate.&lt;/p&gt;
&lt;p&gt;The guide recommends filling almost all the storage in the device to
&lt;a href=&quot;https://kindlemodding.org/jailbreaking/prevent-auto-update.html&quot;&gt;prevent automatic updates&lt;/a&gt;. I had success running the
jailbreak without the need to fill the storage, but your millage might vary. I would suggest following the instructions
to fill the storage just in case.&lt;/p&gt;
&lt;p&gt;After following the instructions you will probably want to install &lt;a href=&quot;https://koreader.rocks/&quot;&gt;KOReader&lt;/a&gt;. The whole
jailbreaking process seems like foreplay for this.&lt;/p&gt;
&lt;p&gt;KOReader is amazing. You can tweak lots of options for how to display your books, connect to Calibre, use Wikipedia, add
custom screensaver or even make add plugins to interact with &lt;a href=&quot;https://github.com/omer-faruq/assistant.koplugin&quot;&gt;LLMs&lt;/a&gt; or
&lt;a href=&quot;https://github.com/stelzch/zotero.koplugin&quot;&gt;Zotero&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;I like the idea of single purpose devices. I’ve been reading more without distractions, enjoying the experience of the
e-ink screen and actually looking forward for the next book. The device I got is a bit old, but it serves me well. I
hope I can use if for many years to come.&lt;/p&gt;</content:encoded></item><item><title>My computing setup for 2026</title><link>https://pierolescano.com/blog/my-computing-setup-2026</link><guid isPermaLink="true">https://pierolescano.com/blog/my-computing-setup-2026</guid><description>A deep dive of my computing setup for 2026.</description><pubDate>Sun, 18 Jan 2026 18:56:39 GMT</pubDate><content:encoded>&lt;p&gt;This is a walkthrough of my current setup. I have a &lt;a href=&quot;/uses&quot;&gt;&lt;code&gt;/uses&lt;/code&gt;&lt;/a&gt; page where I keep a list of some of the tools I
use. However, I thought doing a deep dive of my current setup would be a good thing to do as my first post for the year.&lt;/p&gt;
&lt;h2&gt;Basics&lt;/h2&gt;
&lt;p&gt;Let’s start with the basics. My main computer is a
&lt;a href=&quot;https://wiki.archlinux.org/title/Lenovo_ThinkPad_T480s&quot;&gt;ThinkPad T480s&lt;/a&gt; running Arch Linux. I’ve been using Arch for
almost 4 years. My current installation is almost 2 years since I changed my laptop at the start of 2024.&lt;/p&gt;
&lt;p&gt;Arch meets all my needs. I have a system that is almost always up-to-date. The
&lt;a href=&quot;https://wiki.archlinux.org/&quot;&gt;documentation&lt;/a&gt; is second to none. If a package is not available in the official
repositories I will probably find it in the &lt;a href=&quot;https://aur.archlinux.org/&quot;&gt;AUR&lt;/a&gt;. I wouldn’t want to use another
distribution for the time being.&lt;/p&gt;
&lt;h2&gt;Window manager&lt;/h2&gt;
&lt;p&gt;Instead of using a full desktop environment like GNOME or KDE Plasma, I use &lt;a href=&quot;https://swaywm.org/&quot;&gt;Sway&lt;/a&gt;, a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Tiling_window_manager&quot;&gt;tiling window manager&lt;/a&gt; and Wayland compositor. It has been
my window manager of choice since I switched from GNOME. I’ve tried other compositors like Hyperland, but Sway works
well, so I haven’t had the need to switch.&lt;/p&gt;
&lt;p&gt;I don’t do much &lt;a href=&quot;https://www.reddit.com/r/unixporn/&quot;&gt;ricing&lt;/a&gt; but when I stated using Sway I did tinker with a bunch of
configurations until I settle on what I have now. Likewise, I try to stick to the default keybindings most of the time.
I might change this in the future in order to make the setup easier to use with my
&lt;a href=&quot;/blog/trying-out-the-corne-keyboard&quot;&gt;Corne keyboard&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Status Bar&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/Alexays/Waybar&quot;&gt;Waybar&lt;/a&gt; for the status bar. I’ve tried to keep my
&lt;a href=&quot;https://github.com/piero-vic/dotfiles/blob/main/.config/waybar/config.jsonc&quot;&gt;configuration&lt;/a&gt; as simple as possible. I
only have one custom module used to display if &lt;a href=&quot;https://sr.ht/~kennylevinsen/wlsunset/&quot;&gt;&lt;code&gt;wlsunset&lt;/code&gt;&lt;/a&gt; is running. More on
this tool later.&lt;/p&gt;
&lt;h2&gt;Launcher&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/davatorium/rofi&quot;&gt;&lt;code&gt;rofi&lt;/code&gt;&lt;/a&gt; as a launcher. When making custom
&lt;a href=&quot;https://github.com/piero-vic/dotfiles/tree/main/.local/bin&quot;&gt;scripts&lt;/a&gt; I stick with the &lt;code&gt;dmenu&lt;/code&gt; mode. I do this just in
case I want to try another launcher since most of them have a mode compatible with &lt;code&gt;dmenu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/firecat53/networkmanager-dmenu&quot;&gt;networkmanager-dmenu&lt;/a&gt; and
&lt;a href=&quot;https://github.com/Layerex/dmenu-bluetooth&quot;&gt;dmenu-bluetooth&lt;/a&gt; for easy access to Wi-Fi and Bluetooth configurations.&lt;/p&gt;
&lt;p&gt;So far, I haven’t had the need to switch launchers. However, &lt;a href=&quot;https://github.com/vicinaehq/vicinae&quot;&gt;Vicinae&lt;/a&gt; looks
like something I would like to try.&lt;/p&gt;
&lt;h2&gt;Audio&lt;/h2&gt;
&lt;p&gt;I’ve been using PipeWire and WirePlumber since I started using Linux. Volume levels for both audio inputs and outputs
are controlled by keybindings configured in Sway. I have also built
&lt;a href=&quot;https://github.com/piero-vic/volume-notify&quot;&gt;volume-notify&lt;/a&gt;, a small program to display notifications whenever volume
levels change.&lt;/p&gt;
&lt;p&gt;Whenever I need more control I use &lt;a href=&quot;https://github.com/tsowell/wiremix&quot;&gt;wiremix&lt;/a&gt; and
&lt;a href=&quot;https://gitlab.freedesktop.org/rncbc/qpwgraph&quot;&gt;qpwgraph&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Power&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/linrunner/TLP&quot;&gt;TLP&lt;/a&gt; to optimize battery usage. I also wrote a custom program called
&lt;a href=&quot;https://github.com/piero-vic/battery-notify&quot;&gt;battery-notify&lt;/a&gt; to remind me to plug in my laptop when the battery is
running out.&lt;/p&gt;
&lt;h2&gt;Browsers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.firefox.com/&quot;&gt;Firefox&lt;/a&gt; is my main browser. Mainly out of habit although I really like
&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers&quot;&gt;multi-account containers&lt;/a&gt;. I use it to
compartmentalize how I browse the web. The only extensions I currently use are
&lt;a href=&quot;https://ublockorigin.com/&quot;&gt;uBlock Origin&lt;/a&gt; and &lt;a href=&quot;https://github.com/brookhong/Surfingkeys&quot;&gt;Surfingkeys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I keep Chromium and Brave installed for web development. They are nice to have if I want to try features that are not
yet available in Firefox.&lt;/p&gt;
&lt;h2&gt;Terminal&lt;/h2&gt;
&lt;p&gt;Most of my work is done in the terminal. I use &lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt; alongside
&lt;a href=&quot;https://github.com/tmux/tmux&quot;&gt;tmux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When it comes to tmux, I mostly stick to the default keybindings. I’ve set my prefix to &lt;kbd&gt;Ctrl&lt;/kbd&gt; +
&lt;kbd&gt;Space&lt;/kbd&gt; because it feels better on the hands.&lt;/p&gt;
&lt;h2&gt;Shell&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://www.zsh.org/&quot;&gt;zsh&lt;/a&gt;. I don’t use any framework like &lt;a href=&quot;https://ohmyz.sh/&quot;&gt;Oh My Zsh&lt;/a&gt;. I only use
&lt;a href=&quot;https://github.com/starship/starship&quot;&gt;starship&lt;/a&gt; as my prompt and rely on tools like
&lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt; and &lt;a href=&quot;https://github.com/ajeetdsouza/zoxide&quot;&gt;zoxide&lt;/a&gt; for easy navigation.&lt;/p&gt;
&lt;h2&gt;Text editor&lt;/h2&gt;
&lt;p&gt;My text editor of choice is &lt;a href=&quot;https://github.com/neovim/neovim&quot;&gt;Neovim&lt;/a&gt;. I use it for everything that involves editing
files. That includes writing code, taking notes, doing some &lt;a href=&quot;/notes/plain-text-accounting&quot;&gt;plain text accounting&lt;/a&gt;,
among other things.&lt;/p&gt;
&lt;p&gt;I use a moderate amount of plugins, my setup is pretty stable, and I can do productive work in many programming
languages. One thing I haven’t added is any AI integration. That’s something I might try in the following months.&lt;/p&gt;
&lt;p&gt;When it comes to other options, I’ve tried Emacs. However, it never stuck with me. I would like to give it a try again
but the effort to configure and learn a new editor is not something I’ll like to spend my time on at the moment. Maybe
in a few months I can get some free time to try Emacs again. I do like &lt;a href=&quot;https://orgmode.org/&quot;&gt;orgmode&lt;/a&gt; though. I’m
currently trying out a &lt;a href=&quot;https://github.com/nvim-orgmode/orgmode&quot;&gt;port&lt;/a&gt; for Neovim.&lt;/p&gt;
&lt;h2&gt;Screen ergonomics&lt;/h2&gt;
&lt;p&gt;I used to use dark mode exclusively. However, I work outdoors from time to time and dark mode is a pain for these
situations, so I use &lt;a href=&quot;https://gitlab.com/WhyNotHugo/darkman&quot;&gt;&lt;code&gt;darkman&lt;/code&gt;&lt;/a&gt; to switch between light and dark mode.&lt;/p&gt;
&lt;p&gt;I also use &lt;a href=&quot;https://sr.ht/~kennylevinsen/wlsunset/&quot;&gt;&lt;code&gt;wlsunset&lt;/code&gt;&lt;/a&gt; to adjust the screen temperature. It works automatically
depending on the time of the day, and it’s almost always on when I’m using dark mode.&lt;/p&gt;
&lt;h2&gt;Everything else&lt;/h2&gt;
&lt;p&gt;I’ll try to do some more writing for specific parts of my setup and how they relate to my work as a developer. If you
find any of this interesting feel free to browse my &lt;a href=&quot;github.com/piero-vic/dotfiles&quot;&gt;dotfiles&lt;/a&gt; repo. Everything I didn’t
mention here can probably be found there.&lt;/p&gt;</content:encoded></item><item><title>Status update, January 2024</title><link>https://pierolescano.com/blog/status-update-2024-01</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2024-01</guid><description>Updates from the previous month.</description><pubDate>Thu, 01 Feb 2024 03:03:50 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been wanting to establish a writing habit for quite some time now. So this year I’m committed to publishing at
least once a month. Inspired by the likes of &lt;a href=&quot;https://macwright.com/&quot;&gt;Tom MacWright&lt;/a&gt; and
&lt;a href=&quot;https://xn--gckvb8fzb.com/&quot;&gt;マリウス&lt;/a&gt;, I’ll be sharing monthly updates on some of my professional and personal project.
I’ll also be sharing things that caught my eye during this period.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Personal&lt;/h2&gt;
&lt;p&gt;Let’s start with some of the changes I’m making to my setup. I got a new laptop, a second hand Thinkpad T480S. It will
be replacing my old 2012 MacBook as my main workstation. I broke the MacBook last year and now the lid cannot be closed,
making it unportable. Everything else still works, so I’ll see if I can get it fixed and keep it as a backup machine.&lt;/p&gt;
&lt;p&gt;In other news, I’ve been getting into self-hosting. This month, I managed to deploy some services on a VPS using Docker
Compose. Here’s a list of the things I’m currently running:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sabre.io/baikal/&quot;&gt;Baikal&lt;/a&gt;, a CalDAV and CardDAV server.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sissbruecker/linkding/&quot;&gt;Linkding&lt;/a&gt;, a bookmark manager.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://miniflux.app/&quot;&gt;Miniflux&lt;/a&gt;, a feed reader.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nginxproxymanager.com/&quot;&gt;Nginx Proxy Manager&lt;/a&gt;, a tool for easily expose the services with SSL certificates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current setup is still experimental, so there’s room for improvements. I want to add &lt;a href=&quot;https://restic.net/&quot;&gt;restic&lt;/a&gt;
to handle backups, and maybe deploy a few more services. I think I’ll be able to get everything done within the next few
weeks.&lt;/p&gt;
&lt;p&gt;Regarding the things I’m consuming, I started off the year reading The Road by Cormac McCarthy. It was a pretty good
read. I’m eager to see how the movie adapts the book. Right after finishing it, I moved on to One Hundred Years of
Solitude by Gabriel García Márquez. I’ve been wanting to read this book for months and so far it’s keeping me hooked.&lt;/p&gt;
&lt;p&gt;Reading is one of the activities I put away when I started working full time. I didn’t read much last year so I’m glad I
was able to find the time to get back to it during the last few weeks.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Professional&lt;/h2&gt;
&lt;p&gt;My job’s been tough lately. I’m working on a project built with Angular. I’m not loving it, but I have to admit there
are some features and patterns that do appeal to me. Built-in dependency injection makes components and services more
reusable and easier to test. RxJS has also captured my interest because of how different it is from what I’m used to.&lt;/p&gt;
&lt;p&gt;I’m also curious about the framework’s new features. SSR support, signals, and the new template syntax might change my
feelings about Angular, but I haven’t tried them yet. I also want to give &lt;a href=&quot;https://github.com/analogjs/analog&quot;&gt;Analog&lt;/a&gt; a
try. It seems like it could drastically improve the experience of building web apps with Angular.&lt;/p&gt;
&lt;p&gt;On to other things, I recently made a &lt;a href=&quot;https://github.com/charmbracelet/gum/pull/483&quot;&gt;small contribution&lt;/a&gt; to the
open-source project &lt;a href=&quot;https://github.com/charmbracelet/gum&quot;&gt;gum&lt;/a&gt;, a small tool within the &lt;a href=&quot;https://charm.sh/&quot;&gt;Charm&lt;/a&gt;
ecosystem that aims to enhance shell scripts. Charm was the reason why I started to learn Go. I specifically wanted to
use the &lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;Bubble Tea&lt;/a&gt; framework to build terminal applications. I already
have a couple of these apps in the pipeline, and I’ll be sharing them next month. Stay tuned for updates!&lt;/p&gt;</content:encoded></item><item><title>Status update, February 2024</title><link>https://pierolescano.com/blog/status-update-2024-02</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2024-02</guid><description>Updates from the previous month.</description><pubDate>Sat, 02 Mar 2024 04:05:48 GMT</pubDate><content:encoded>&lt;h2&gt;Personal&lt;/h2&gt;
&lt;p&gt;This month I received a RaspberryPi 3B as a birthday present. The Pi, as some people call it, is a small single-board
computer that has tons of use cases. My initial plan was to use it as a home media server but realized that it doesn’t
meet the minimum system requirements to run Jellyfin effectively. Additionally, I don’t yet have a proper power supply
for the Pi, so it is running underpowered.&lt;/p&gt;
&lt;p&gt;I also considered using the Pi to host some of the applications I’m currently running on a VPS. The services are
intended for personal use and only accessible via &lt;a href=&quot;https://tailscale.com/&quot;&gt;Tailscale&lt;/a&gt;, so it will be cheaper to host
them myself. However, I decided to postpone the migration until I get a proper power supply for the Pi&lt;/p&gt;
&lt;p&gt;Instead, I decided to set up a &lt;a href=&quot;https://directus.io/&quot;&gt;Directus&lt;/a&gt; instance on the RaspberryPi. Directus describes itself
as an open source backend to build anything or everything. I’ve been using it at my job as a headless
&lt;abbr&gt;CMS&lt;/abbr&gt;. However, I don’t get the chance to use all of its features. I want
to explore its potential as a Backend-as-a-Service, so I’ll be using it for prototyping some personal projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Professional&lt;/h2&gt;
&lt;p&gt;I’ve been working with Angular for the last few months, and it hasn’t been the best experience. However, there are a
couple of new project coming in that will be using other frameworks. I cannot wait to start working on them.&lt;/p&gt;
&lt;p&gt;One of the new projects has many requirements and few complex features. I’ve been having meetings to give some feedback
on the UI design and to discuss some of the implementation details to ensure that all necessary features are accounted
for.&lt;/p&gt;
&lt;p&gt;To round things off, I’ve had limited time to code outside of work, but I hope this changes in the following weeks. One
of my side projects is nearing completion, but I haven’t given myself enough time to finish it. I’ll be aiming to wrap
things up next month and sharing more details about it in a dedicated blog post. In the meantime, stay tuned for
updates.&lt;/p&gt;</content:encoded></item><item><title>Full-text search with SQLite.</title><link>https://pierolescano.com/blog/full-text-search-with-sqlite</link><guid isPermaLink="true">https://pierolescano.com/blog/full-text-search-with-sqlite</guid><description>A short introduction to full-text search with SQLite.</description><pubDate>Tue, 15 Apr 2025 23:44:27 GMT</pubDate><content:encoded>&lt;p&gt;I recently discovered that SQLite has support for &lt;a href=&quot;https://en.wikipedia.org/wiki/Full-text_search&quot;&gt;full-text search&lt;/a&gt;. We
just need to use the &lt;a href=&quot;https://sqlite.org/fts5.html&quot;&gt;FTS5&lt;/a&gt; extension to create a virtual table. All full-text search
queries are run against this new table.&lt;/p&gt;
&lt;p&gt;Let’s see an example. I’ve been playing around with some food datasets, so I’ll use a table called &lt;code&gt;food&lt;/code&gt; for the
example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; TABLE&lt;/span&gt;&lt;span&gt; food&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    id &lt;/span&gt;&lt;span&gt;INTEGER&lt;/span&gt;&lt;span&gt; PRIMARY KEY&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt; TEXT&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    description&lt;/span&gt;&lt;span&gt; TEXT&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    category &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    carbohydrate &lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cholesterol &lt;/span&gt;&lt;span&gt;INTEGER&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    protein &lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    monosaturated_fat &lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    polysaturated_fat &lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    saturated_fat &lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I want to be able to search the records using the &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt; or &lt;code&gt;category&lt;/code&gt; columns. To accomplish this I can
create a new virtual table called &lt;code&gt;food_fts&lt;/code&gt; containing these columns.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; VIRTUAL &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; food_fts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;USING&lt;/span&gt;&lt;span&gt; fts5 (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;, category, content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;food&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, content_rowid &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I’m creating another table to handle full-text search because I don’t want to use columns like &lt;code&gt;carbohydrate&lt;/code&gt; or
&lt;code&gt;protein&lt;/code&gt; when searching the collection. Notice that I’m also declaring two additional options, &lt;code&gt;content&lt;/code&gt; and
&lt;code&gt;content_rowid&lt;/code&gt;. This is to make sure that the &lt;code&gt;food_fts&lt;/code&gt; table only stores indexes. The actual content lives in the
&lt;code&gt;food&lt;/code&gt; table.&lt;/p&gt;
&lt;p&gt;Then we need to populate the new table.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;INSERT INTO&lt;/span&gt;&lt;span&gt; food_fts (rowid, &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;, category, &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;, category, &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; food;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After that I only need a query like this to search for records in the &lt;code&gt;food&lt;/code&gt; table.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    food.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    food_fts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    JOIN&lt;/span&gt;&lt;span&gt; food &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; food_fts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rowid&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; food&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    food_fts &lt;/span&gt;&lt;span&gt;MATCH&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;The thing I am searching for&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I’m doing a &lt;code&gt;JOIN&lt;/code&gt; operation, so I can also get the other columns in the &lt;code&gt;food&lt;/code&gt; table. The &lt;code&gt;MATCH&lt;/code&gt; keyword is the thing
what that does the magic. This allows me to use the &lt;code&gt;foods_fts&lt;/code&gt; table to search the records.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sqlite.org/fts5.html&quot;&gt;SQLite FTS5 Extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>A picker for bullet journal style checkboxes in Neovim</title><link>https://pierolescano.com/blog/a-picker-for-bullet-journal-style-checkboxes-for-neovim</link><guid isPermaLink="true">https://pierolescano.com/blog/a-picker-for-bullet-journal-style-checkboxes-for-neovim</guid><description>A walkthrough of a simple checkbox picker for Neovim.</description><pubDate>Fri, 14 Feb 2025 20:47:35 GMT</pubDate><content:encoded>&lt;p&gt;Ever since I discovered &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; a few years ago, I’ve been using with the
&lt;a href=&quot;https://minimal.guide/&quot;&gt;Minimal theme&lt;/a&gt;. The only reason being that this theme supports
&lt;a href=&quot;https://minimal.guide/checklists#Alternate+checkboxes&quot;&gt;alternate checkboxes&lt;/a&gt; which provide a bunch of icons similar to
the ones you would have in a bullet journal.&lt;/p&gt;
&lt;p&gt;Obsidian is great, but in the last few months, I’ve been moving most of my note-taking to the terminal. After
discovering &lt;a href=&quot;https://github.com/MeanderingProgrammer/render-markdown.nvim&quot;&gt;render-markdown.nvim&lt;/a&gt;, a Neovim plugin which
also renders alternate checkboxes, I decided to move my note-taking workflow to Neovim. And since I already commit to
only use Neovim, why not write some Lua to make it easier to work with checkboxes?&lt;/p&gt;
&lt;p&gt;I wanted to create a simple automation to easily change between checkboxes. First, I created a table containing the all
the custom checkboxes I use. For my use case, I’m sticking with a few similar to the ones that come with the minimal
theme.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- This is using nerd fonts, so you might not be able to see the icons.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; checkboxes&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;to-do&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;incomplete&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;done&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;󰒊&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;forwarded&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;󰃭&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;scheduling&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;bookmark&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;󰔵&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  { &lt;/span&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;󰔳&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;down&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I wrote a function. The logic is pretty simply. First, I’m running a couple of checks to make sure I’m in a
markdown file and that the current line contains a checkbox. Then, I’m using
&lt;a href=&quot;https://neovim.io/doc/user/lua.html#vim.ui.select()&quot;&gt;&lt;code&gt;vim.ui.select&lt;/code&gt;&lt;/a&gt; with the table of checkboxes as the options.
Finally, if there is a selection, I’m changing the checkbox in the current line using
&lt;a href=&quot;https://www.lua.org/manual/5.3/manual.html#pdf-string.gsub&quot;&gt;&lt;code&gt;string.gsub&lt;/code&gt;&lt;/a&gt;. That’s it. Not a lot of code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; select_checkbox&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; vim&lt;/span&gt;&lt;span&gt;.bo.filetype &lt;/span&gt;&lt;span&gt;~=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;markdown&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  local&lt;/span&gt;&lt;span&gt; pattern&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%- %[.-%] &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  local&lt;/span&gt;&lt;span&gt; line&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; vim&lt;/span&gt;&lt;span&gt;.api.&lt;/span&gt;&lt;span&gt;nvim_get_current_line&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; line&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pattern&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  vim&lt;/span&gt;&lt;span&gt;.ui.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;checkboxes&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    prompt&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;Checkboxes:&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format_item&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      return&lt;/span&gt;&lt;span&gt; string.format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;%s %s&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.icon, &lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.label)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    end&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }, &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;choice&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; choice&lt;/span&gt;&lt;span&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      return&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    local&lt;/span&gt;&lt;span&gt; checkbox&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; string.format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;- [%s] &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;choice&lt;/span&gt;&lt;span&gt;.char)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    local&lt;/span&gt;&lt;span&gt; modified_line&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; line&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;gsub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pattern&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;checkbox&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    vim&lt;/span&gt;&lt;span&gt;.api.&lt;/span&gt;&lt;span&gt;nvim_set_current_line&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;modified_line&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  end&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think this can be improved by making use of tree-sitter, but this is more than enough for me at the moment. Now all we
need to do is to create a keybinding.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vim&lt;/span&gt;&lt;span&gt;.keymap.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;lt;leader&amp;gt;tt&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;select_checkbox&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Status update, March 2024</title><link>https://pierolescano.com/blog/status-update-2024-03</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2024-03</guid><description>Updates from the previous month.</description><pubDate>Sun, 07 Apr 2024 21:33:09 GMT</pubDate><content:encoded>&lt;p&gt;For this status update, I’d like to focus primarily on my personal projects. Unfortunately, there isn’t much new to
share about my job, as most of my tasks have been repetitive over the past few weeks. However, I’ve continued to learn
new things during my free time. Given that this year’s theme for me has been hosting services for personal use, the
projects I’ve been working on during this month revolved around this topic.&lt;/p&gt;
&lt;p&gt;To start off, I deployed &lt;a href=&quot;https://ollama.com/&quot;&gt;Ollama&lt;/a&gt; on &lt;a href=&quot;https://fly.io/&quot;&gt;Fly.io&lt;/a&gt; after I came across
&lt;a href=&quot;https://fly.io/blog/scaling-llm-ollama/&quot;&gt;this article&lt;/a&gt;. Previously, I had been running Ollama locally but found that
even the smaller models were extremely slow due to the limited hardware on my machine. I decided to use Fly because of
its support for GPUs and the feature that allows machines to be stopped when they’re not being used. With Fly LLMs run
smoothly, and I only get charged for the amount computation I actually use.&lt;/p&gt;
&lt;p&gt;On to other things, I’m now hosting most of my services on a Raspberry Pi 3B. Previously, I had been running them on a
cloud VPS. However, after getting a power supply and case for the Pi, I decided to set it up to work as a mini home
server. I moved all the data to the Pi and set up a basic backup strategy using &lt;a href=&quot;https://restic.net/&quot;&gt;Restic&lt;/a&gt;. I’m also
using &lt;a href=&quot;https://tailscale.com/&quot;&gt;Tailscale&lt;/a&gt; to access the services when I’m not at home.&lt;/p&gt;
&lt;p&gt;Finally, the highlight of the last month was the deployment of a messaging service for personal use. I started hosting
my own services because I wanted to have full control over my data. Given that online communication is such an integral
part of my digital life, it makes sense for me to host my own private messaging service. To accomplish this, I decided
to use &lt;a href=&quot;https://www.ejabberd.im/&quot;&gt;ejabberd&lt;/a&gt;, an open-source instant messaging solution based on the
&lt;a href=&quot;https://xmpp.org/&quot;&gt;XMPP&lt;/a&gt; protocol.&lt;/p&gt;
&lt;p&gt;I was initially reluctant to host a messaging server. Moving to a privacy-focused platform can be hard. Most people are
content using well-known platforms and may not be interested in privacy-focused alternatives. In most cases, asking them
to try another platform could result in a negative response. That wasn’t my case though. I found that close relatives
and friends were willing to give the server a try if they know it was something I was running.&lt;/p&gt;
&lt;p&gt;I’ll continue to explore self-hosted solutions for most of my needs. I’m currently looking for an inventory management
tool and a fitness tracker. In addition, I’m eager to delve deeper into XMPP. I want to gain deeper understanding of the
protocol and its potential use cases for real-time applications. Stay tuned for further updates.&lt;/p&gt;</content:encoded></item><item><title>Status update, September 2024</title><link>https://pierolescano.com/blog/status-update-2024-09</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2024-09</guid><description>Updates from the previous month.</description><pubDate>Sat, 05 Oct 2024 14:01:08 GMT</pubDate><content:encoded>&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;I haven’t been reading much since the last time I wrote. But for the last couple of months I’ve been trying to keep up
with the things I enjoy the most. I finished two books this month:
&lt;a href=&quot;https://www.goodreads.com/book/show/49021976-rhythm-of-war&quot;&gt;Rhythm of War&lt;/a&gt; and
&lt;a href=&quot;https://www.goodreads.com/book/show/54785515-four-thousand-weeks&quot;&gt;Four Thousand Weeks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rhythm of War wasn’t my favorite book out of The Stormlight Archive, but somehow Sanderson makes me have the same
excitement I had when starting the series. The plot thickens with every book. I cannot wait for all to pay off when
&lt;a href=&quot;https://www.goodreads.com/book/show/203578847-wind-and-truth&quot;&gt;Wind and Truth&lt;/a&gt; is released.&lt;/p&gt;
&lt;p&gt;I think Four Thousand Weeks ended up in &lt;a href=&quot;/notes/books&quot;&gt;my list&lt;/a&gt; after hearing a recommendation on a podcast. I don’t
really remember. It’s not the kind of book I’ll usually read, but Oliver Burkeman did provide a few ideas worth thinking
about.&lt;/p&gt;
&lt;h2&gt;Watching&lt;/h2&gt;
&lt;p&gt;I haven’t watched many movies these last few months but
&lt;a href=&quot;https://letterboxd.com/film/kingdom-of-the-planet-of-the-apes/&quot;&gt;Kingdom of the Planet&lt;/a&gt; of the Apes is my favorite movie
of the year so far.&lt;/p&gt;
&lt;p&gt;My brother also got me into watching wrestling. It all started with WrestleMania XL early this year, and I’ve been
getting into it since then.&lt;/p&gt;
&lt;h2&gt;Gaming&lt;/h2&gt;
&lt;p&gt;I started playing &lt;a href=&quot;https://www.valheimgame.com/&quot;&gt;Valheim&lt;/a&gt; after realizing that it isn’t that hard to play games on Linux
anymore. I’ve running Steam though Flatpak on Arch Linux and haven’t had any issues so far.&lt;/p&gt;
&lt;h2&gt;Coding&lt;/h2&gt;
&lt;p&gt;A few weeks ago I wrote &lt;a href=&quot;https://github.com/piero-vic/go-linkding&quot;&gt;go-linkding&lt;/a&gt;, a small Go package to interact with
&lt;a href=&quot;https://linkding.link/&quot;&gt;Linkding&lt;/a&gt;. I’m working on two personal projects that make calls to the Linkding API, so I
decided to extract the code into a package and publish it.&lt;/p&gt;</content:encoded></item><item><title>Status update, October 2024</title><link>https://pierolescano.com/blog/status-update-2024-10</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2024-10</guid><description>Updates from the previous month.</description><pubDate>Sat, 09 Nov 2024 04:25:02 GMT</pubDate><content:encoded>&lt;h2&gt;Personal&lt;/h2&gt;
&lt;p&gt;I made a trip to Santiago de Chile to visit some friends I hadn’t seen in a while. I traveled with just one backpack
containing all the things I thought I would need. However, I ended up taking with me a bunch of clothes I didn’t get to
wear.&lt;/p&gt;
&lt;p&gt;My brother gave me an analog camera, and I was planning to take it with me on the trip. However, I decided not to due to
lens caps being missing. I didn’t want to take the risk to scratch the lens. I found some 3D models on Thingiverse that
would work for the lens, but I still need to fix an old 3d printer I have at home to print the
&lt;a href=&quot;https://www.thingiverse.com/thing:6115527&quot;&gt;front&lt;/a&gt; and &lt;a href=&quot;https://www.thingiverse.com/thing:6061109&quot;&gt;rear&lt;/a&gt; caps for the
lens.&lt;/p&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;I started to read &lt;a href=&quot;https://understandingdistributed.systems/&quot;&gt;Understanding Distributed Systems&lt;/a&gt; since I want to get
more familiar with system design and backend development.&lt;/p&gt;
&lt;h2&gt;Watching&lt;/h2&gt;
&lt;p&gt;I watched two movies this month.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://letterboxd.com/film/cure/&quot;&gt;Cure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letterboxd.com/film/look-back-2024/&quot;&gt;Look Back&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coding&lt;/h2&gt;
&lt;p&gt;I haven’t been coding much lately, but I wrote &lt;a href=&quot;https://github.com/piero-vic/volume-notify&quot;&gt;volume-notify&lt;/a&gt;, a small
program show notifications on volume changes using PulseAudio. The idea came from a
&lt;a href=&quot;https://git.sr.ht/~whynothugo/dotfiles/tree/72e90546fda70e700b963528a2e0afd15bfb4e84/item/home/.local/lib/volctld&quot;&gt;shell script by Hugo Osvaldo Barrera&lt;/a&gt;
that does basically the same thing. I decided to build my own version using Go and later came across a similar project
called &lt;a href=&quot;https://github.com/ikrivosheev/pa-notify&quot;&gt;pa-notify&lt;/a&gt; which is written in C.&lt;/p&gt;</content:encoded></item><item><title>Status update, January 2025</title><link>https://pierolescano.com/blog/status-update-2025-01</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2025-01</guid><description>Updates from the previous month.</description><pubDate>Mon, 03 Feb 2025 02:52:52 GMT</pubDate><content:encoded>&lt;h2&gt;Personal&lt;/h2&gt;
&lt;p&gt;Last month I decided to give &lt;a href=&quot;https://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt; a try. If you don’t know what it is, I would describe it
as a markup language with a strong focus on task management and note-taking. One thing worth mentioning is that Org Mode
is almost exclusively used in conjunction with Emacs. I’m not really an Emacs guy or at least I haven’t been converted
yet. For the time being, I’ve been using on &lt;a href=&quot;https://github.com/nvim-orgmode/orgmode&quot;&gt;nvim-orgmode/orgmode&lt;/a&gt; with Neovim.&lt;/p&gt;
&lt;p&gt;Org Mode is great. It scratches my itch for organization software. However, I’ve decided to not adopt it fully for now.
The main reason is that Org Mode seems like a good system for busy people, but my current workload is low, and the use
of system like this might be overkill. Also, I already have a bunch of &lt;a href=&quot;/notes&quot;&gt;notes&lt;/a&gt; written in Markdown. I don’t want
to deal with migrating them to another format since I’ll have to rework my publishing setup. For now, the only thing I’m
using Org Mode for is to track my workouts.&lt;/p&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;I finish &lt;a href=&quot;https://www.goodreads.com/book/show/8855321-leviathan-wakes&quot;&gt;Leviathan Wakes&lt;/a&gt;. I’ve heard amazing things about
The Expanse and this book in particular, but I didn’t like it that much.&lt;/p&gt;
&lt;p&gt;The other book I read this month was &lt;a href=&quot;https://www.goodreads.com/book/show/198678736-co-intelligence&quot;&gt;Co-Intelligence&lt;/a&gt;.
While it provided some interesting insights, I don’t think I got much out of it. Maybe because I work on tech, and I’ve
been already bombarded with content discussing the topic of AI and LMMs.&lt;/p&gt;
&lt;p&gt;I wouldn’t recommend it if you are already familiar with LLMs. The group of people that would benefit the most of this
book are people who are not that familiar with AI or tech in general.&lt;/p&gt;
&lt;h2&gt;Coding&lt;/h2&gt;
&lt;p&gt;I’m currently working on a web application to track my workouts. It will be focused on weight lifting since it is what I
do, but I might add support for other forms of training in the future. The main goal is to have app that is easy to use
and that I can host myself. I’ll release it with open source license when it is ready.&lt;/p&gt;</content:encoded></item><item><title>Status update, February 2025</title><link>https://pierolescano.com/blog/status-update-2025-02</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2025-02</guid><description>Updates from the previous month.</description><pubDate>Thu, 06 Mar 2025 16:26:13 GMT</pubDate><content:encoded>&lt;h2&gt;Personal&lt;/h2&gt;
&lt;p&gt;There’s not much to share when it comes to personal stuff. One thing worth mentioning is the fact that I build my own
desk. I don’t really do woodworking, but I took a course last year and I thought it would be nice to make something on
my own instead of buying it.&lt;/p&gt;
&lt;h2&gt;Writing&lt;/h2&gt;
&lt;p&gt;I definitely need to write a more. Last month I wrote
&lt;a href=&quot;/blog/a-picker-for-bullet-journal-style-checkboxes-for-neovim&quot;&gt;one blog post&lt;/a&gt; talking about a picker I wrote for
Neovim.&lt;/p&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;I’m about to finish reading &lt;em&gt;One Hundred Years of Solitude&lt;/em&gt;. I was reading it last year but sadly dropped it due to
other obligations. That’s why I think I’m feeling a bit pressured to finish it as soon as possible. However, that
doesn’t mean I’m not enjoying it. It’s a fantastic book.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://theartofpostgresql.com/&quot;&gt;The Art of PostgreSQL&lt;/a&gt; is another book I’ve been checking out this month. I like to
always have a technical books I can reach to. They provide a bunch of new ideas or patters I can try out. Some of the
things that have caught my interest are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The use of materialized views for caching.&lt;/li&gt;
&lt;li&gt;Listen/Notify to have simple PubSub implementation.&lt;/li&gt;
&lt;li&gt;A bunch of patterns for writing queries using &lt;a href=&quot;https://www.postgresql.org/docs/17/queries-with.html&quot;&gt;CTEs&lt;/a&gt; and
&lt;a href=&quot;https://www.postgresql.org/docs/17/tutorial-window.html&quot;&gt;window functions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coding&lt;/h2&gt;
&lt;p&gt;I wrote &lt;a href=&quot;https://github.com/piero-vic/battery-notify&quot;&gt;battery-notify&lt;/a&gt;, a small daemon that sends a desktop notification
when the battery of my laptop is running out. I want to make some improvements, but it fulfills my current needs, so
it’s not a priority.&lt;/p&gt;
&lt;p&gt;The project that takes most of my time is a web app I’m building to track my workouts. I’ve been trying to use Go for
all my personal projects, so instead of reaching for a full-stack JavaScript framework as I often do, I decided to take
a &lt;a href=&quot;https://htmx.org/essays/hypermedia-driven-applications/&quot;&gt;hypermedia-driven&lt;/a&gt; approach with this application. The
current tech stack is as follows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/&quot;&gt;Go&lt;/a&gt; and &lt;a href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; in the backend.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://templ.guide/&quot;&gt;temple&lt;/a&gt; to render HTML.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alpinejs.dev/&quot;&gt;Alpine.js&lt;/a&gt; to add client-side interactivity.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://htmx.org/&quot;&gt;HTMX&lt;/a&gt; for client-server communication.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve come across a few difficulties, but I think they are just due my lack of familiarity with the tech stack. I still
have a lot of work to do but once the application reaches a usable state (i.e. I can use it myself at the gym without
any issues), I’ll be open sourcing it.&lt;/p&gt;</content:encoded></item><item><title>Status update, March 2025</title><link>https://pierolescano.com/blog/status-update-2025-03</link><guid isPermaLink="true">https://pierolescano.com/blog/status-update-2025-03</guid><description>Updates from the previous month.</description><pubDate>Mon, 07 Apr 2025 00:11:57 GMT</pubDate><content:encoded>&lt;p&gt;March has been a slow month. I’ve not being doing much.&lt;/p&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;I’m still waiting for &lt;em&gt;Wind and Truth&lt;/em&gt;. It was published last December, but I haven’t found the Spanish translation in
any of the book stores I frequent. Just to keep the streak going I started reading &lt;em&gt;The Hobbit&lt;/em&gt;. Maybe I end up
re-reading Lord of the Rings.&lt;/p&gt;
&lt;h2&gt;Watching&lt;/h2&gt;
&lt;p&gt;I went to see &lt;a href=&quot;https://letterboxd.com/film/flow-2024/&quot;&gt;Flow&lt;/a&gt;, an Oscar-winning movie that happens to have been created
with Blender. I’m a huge open source nerd and, to be honest, the fact that the movie was made with Blender was the only
reason I wanted to see it.&lt;/p&gt;
&lt;h2&gt;Self-hosting&lt;/h2&gt;
&lt;p&gt;I don’t thinker much with my self-hosted setup. It works fine without me having to constantly monitor it. However, once
a month or so I check if there are any new applications worth deploying. This month I decide to try to add a single
sign-on service to centralize the authentication for the apps I’m running on my Raspberry Pi.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.authelia.com/&quot;&gt;Authelia&lt;/a&gt; seemed to be the easiest to set up. It is also written in Go, which is a plus for
me. At this point almost all the services I run are written in Go.&lt;/p&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;p&gt;I’ve been exploring how to build Discord bots, practicing data structures and algorithms and also checking out some
stuff with D-Bus. Apart from that not much else. The lifting tracker app has been staled for a while. I need to get back
to it.&lt;/p&gt;</content:encoded></item><item><title>Trying out the Corne Keyboard</title><link>https://pierolescano.com/blog/trying-out-the-corne-keyboard</link><guid isPermaLink="true">https://pierolescano.com/blog/trying-out-the-corne-keyboard</guid><description>Some thoughts on my first time using a split keyboard.</description><pubDate>Mon, 02 Jun 2025 22:38:33 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been wanting to give ergonomic keyboards a try for while now. Last month I came across a good offer for a second
hand &lt;a href=&quot;https://github.com/foostan/crkbd&quot;&gt;Corne&lt;/a&gt;, so I didn’t hesitate to buy it. The experience with a split keyboard has
been interesting. It felt similar to learning vim for the first time. Strange, uncomfortable, but rewarding nonetheless.&lt;/p&gt;
&lt;h2&gt;Learning&lt;/h2&gt;
&lt;p&gt;The first thing that felt weird about the keyboard was, well… the fact that it’s split. The keys were also arranged in
straight columns instead of being at an angle. I already knew how to touch type, so it only took me a week or so to get
used to the shape of the Corne.&lt;/p&gt;
&lt;p&gt;The keyboard I bought came with labelless keycaps. I don’t mind labelless keycaps, however, the keycaps also lacked
those little bumps in the &lt;kbd&gt;F&lt;/kbd&gt; and &lt;kbd&gt;J&lt;/kbd&gt; keys which cause me to unintentionally shift the position of my
hands. I ended up swapping the keycaps for ones from a spare keyboard.&lt;/p&gt;
&lt;p&gt;Other thing that bothered me a bit was the small number of keys this keyboard had compared to a regular one. To be able
to type numbers or symbols you need to use layers. Layers are similar to how the &lt;kbd&gt;Fn&lt;/kbd&gt; is used to access media
controls in some keyboards. A layer is activated by holding one or more designated keys configured by the user. It seems
like layers are one of the things that scare people the most when it comes to trying an ergonomic keyboard.&lt;/p&gt;
&lt;p&gt;Finally, as a consequence of the change in layout, the way I type the shortcuts of my most used programs changed
significantly. Using things like Sway, Neovim and tmux felt weird. It bothered me a lot at the beginning, but I’m now
capable of using the new layout without too much hassle.&lt;/p&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;p&gt;The Corne is highly configurable. The version I have uses QMK, an open source firmware for custom keyboards. Before
diving into writing my own custom layout, I decided to try the QMK default. I got used to most of the layout. The only
thing that bothered me was having the &lt;kbd&gt;Esc&lt;/kbd&gt; on the right side, so I decided to change that.&lt;/p&gt;
&lt;p&gt;I also tried &lt;a href=&quot;https://github.com/vial-kb/vial-qmk&quot;&gt;VIAL&lt;/a&gt;, a fork of QMK that comes with a GUI to configure the keyboard
in real time. It allowed me to configure the keyboard without having to flash it every time I wanted to change
something. I used it for couple days, but I had problems when trying to configure media keys, so I switch back to QMK.&lt;/p&gt;
&lt;figure&gt;
    
    &lt;figcaption&gt;
        My current layout. Made with
        &lt;a href=&quot;https://www.keyboard-layout-editor.com/&quot;&gt;Keyboard Layout Editor&lt;/a&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;I’ll be exploring other layouts from time to time. I’m happy with my current setup, but I think I make improve my use of
layers. &lt;a href=&quot;https://keymapdb.com/&quot;&gt;KeymapDB&lt;/a&gt; seems like a good website to see how other people configure their QMK
keyboards.&lt;/p&gt;
&lt;p&gt;I also want to learn how to configure the OLED displays. There are a lot of configuration examples on the internet. I
might take some inspiration and see what can I do. It might also be a good opportunity to learn a bit of C.&lt;/p&gt;
&lt;p&gt;Building my own keyboard is definitely in the backlog. It’s not unusual to see people in the custom keyboard space
crafting their own keyboards. I think that I miss the special part of the process by buying it.&lt;/p&gt;</content:encoded></item></channel></rss>