<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>foswret.com</title>
    <link rel="self" type="application/atom+xml" href="https://foswret.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://foswret.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-05T00:00:00+00:00</updated>
    <id>https://foswret.com/atom.xml</id>
    <entry xml:lang="en">
        <title>Libreboot For Dell Latitude</title>
        <published>2026-01-05T00:00:00+00:00</published>
        <updated>2026-01-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/libreboot/"/>
        <id>https://foswret.com/posts/libreboot/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/libreboot/">&lt;p&gt;&lt;img src=&quot;&#x2F;libreboot.webp&quot; alt=&quot;Libreboot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;preamble&quot;&gt;Preamble&lt;&#x2F;h1&gt;
&lt;p&gt;Libreboot is a coreboot distribution that provides (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libreboot.org&#x2F;news&#x2F;policy.html&quot;&gt;mostly&lt;&#x2F;a&gt;) libre boot firmware. I installed it on a Dell Latitude E6230, which is a one of the supported laptops listed on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libreboot.org&#x2F;docs&#x2F;install&#x2F;#laptops-intel-x86&quot;&gt;Libreboot’s website&lt;&#x2F;a&gt;. Unknowing to myself before undertaking this process, the Latitude line of laptops are actually &lt;em&gt;easier&lt;&#x2F;em&gt; to flash Libreboot onto, compared to other hardware. This process, Internal Flashing, can be done through Linux without any intrusive hardware work. There is an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libreboot.org&#x2F;docs&#x2F;install&#x2F;latitude.html#external-flashing&quot;&gt;External Flashing&lt;&#x2F;a&gt; way to do this as well, but that was too hard.&lt;&#x2F;p&gt;
&lt;p&gt;I assume that because every computer requires different workarounds &amp;amp; special care, the instructions to install Libreboot are not intuitive. The documentation is uniquely maze-like, making it painful to understand what is going on. This whole post is essentially verbatim from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libreboot.org&quot;&gt;Libreboot.org&lt;&#x2F;a&gt;, ∴ I actually don’t know what I’m doing. Follow the official documentation if you’re going to do this, using this page as a way to orient yourself.&lt;&#x2F;p&gt;
&lt;p&gt;In general, you download a utility called &lt;code&gt;lbmk&lt;&#x2F;code&gt;, do some minor hardware tweaks, patch the firmware ROM (which is Libreboot), and flash it onto your laptop. There is more steps than that, but there wasn’t anything on the website that spelled it out that plainly.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;background&quot;&gt;Background&lt;&#x2F;h1&gt;
&lt;p&gt;This is the general outline that I followed.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Download needed files
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lbmk&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;libreboot tarball&lt;&#x2F;li&gt;
&lt;li&gt;Install dependencies&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Prepare hardware
&lt;ul&gt;
&lt;li&gt;disable &#x2F;dev&#x2F;mem protection&lt;&#x2F;li&gt;
&lt;li&gt;Disable SecureBoot&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dell-flash-unlock&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Build everything
&lt;ul&gt;
&lt;li&gt;Inject vendor files&lt;&#x2F;li&gt;
&lt;li&gt;Build ROM image&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;flashprog
&lt;ul&gt;
&lt;li&gt;Create backup&lt;&#x2F;li&gt;
&lt;li&gt;Flash patched libreboot ROM&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h1 id=&quot;hardware&quot;&gt;Hardware&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Dell Latitude E6230
&lt;ul&gt;
&lt;li&gt;Intel i5-3340M (4 Threads) @ 3.400GHz&lt;&#x2F;li&gt;
&lt;li&gt;Two 4GB RAM sticks; 8GB Total&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;instructions&quot;&gt;Instructions&lt;&#x2F;h1&gt;
&lt;p&gt;I did a clean install of Linux Mint 22.2 Xfce as a “clean slate”. SecureBoot also needs to be disabled if you are using a UEFI setup.&lt;&#x2F;p&gt;
&lt;p&gt;The two things that need to be explicitly downloaded is the &lt;code&gt;lbmk&lt;&#x2F;code&gt; (Libreboot MaKe) utility and the libreboot tarball. All dependency installation is done through &lt;code&gt;lbmk&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Libreboot’s build system defaults to a single build thread, but this can be changed by changing &lt;code&gt;XBMK_THREADS&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;export XBMK_THREADS=4
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Libreboot’s build system uses &lt;code&gt;git&lt;&#x2F;code&gt;, so you should install it.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install git
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also make sure date&#x2F;hwclock reports the correct time&#x2F;date due to some files being downloaded through HTTPS that require correct date&#x2F;times. I don’t see how this would be a problem if you’re connected to the internet and using Linux Mint.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;download&quot;&gt;Download&lt;&#x2F;h2&gt;
&lt;p&gt;Download &lt;code&gt;lbmk&lt;&#x2F;code&gt; and install all relevant dependencies &lt;strong&gt;using&lt;&#x2F;strong&gt; &lt;code&gt;lbmk&lt;&#x2F;code&gt;. a list of support distros can be found in &lt;code&gt;config&#x2F;dependencies&lt;&#x2F;code&gt; in the root directory of &lt;code&gt;lbmk&lt;&#x2F;code&gt;. The following example is installing the dependencies for Linux Mint.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;git clone https:&#x2F;&#x2F;codeberg.org&#x2F;libreboot&#x2F;lbmk
cd lbmk
sudo .&#x2F;mk dependencies mint
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, download the libreboot files and check file integrity. This is part of the firmware that will actually be flashed onto the laptop. Make sure it is the tarball for your machine. I downloaded the tarball in the root directory of &lt;code&gt;lbmk&lt;&#x2F;code&gt; for simplicity.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https:&#x2F;&#x2F;rsync.libreboot.org&#x2F;stable&#x2F;25.06&#x2F;roms&#x2F;libreboot-25.06_e6230_12mb.tar.xz 
curl -O https:&#x2F;&#x2F;rsync.libreboot.org&#x2F;stable&#x2F;25.06&#x2F;roms&#x2F;libreboot-25.06_e6230_12mb.tar.xz.sha512

# Check with sha512sum
sha512sum -c libreboot-25.06_e6230_12mb.tar.xz.sha512

# Check with gpg
curl -O https:&#x2F;&#x2F;rsync.libreboot.org&#x2F;stable&#x2F;25.06&#x2F;roms&#x2F;libreboot-25.06_e6230_12mb.tar.xz.sig
curl -O https:&#x2F;&#x2F;libreboot.org&#x2F;lbkey.asc
gpg --import lbkey.asc
gpg --verify libreboot-25.06_e6230_12mb.tar.xz.sig libreboot-25.06_e6230_12mb.tar.xz
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For the &lt;code&gt;gpg --verify&lt;&#x2F;code&gt; command, Look for “Good Signature”. Ignore “This key is not certified with a trusted signature!”&lt;&#x2F;p&gt;
&lt;h2 id=&quot;disable-dev-mem-protection&quot;&gt;Disable &#x2F;dev&#x2F;mem Protection&lt;&#x2F;h2&gt;
&lt;p&gt;If you don’t disable &#x2F;dev&#x2F;mem protection, I think you’ll get an error. Disabling &#x2F;dev&#x2F;mem protection requires editing a kernel parameter. This can be done through GRUB. Edit &#x2F;etc&#x2F;default&#x2F;grub to include &lt;code&gt;iomem=relaxed&lt;&#x2F;code&gt; in the &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;&#x2F;code&gt; line, as seen below. In Linux Mint, the default arguements should just be “quiet splash”, which should be after the addition of the &lt;code&gt;iomem&lt;&#x2F;code&gt; arguement. Once Libreboot has been flashed, this can be changed back to its original state.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;iomem=relaxed quiet spash&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Exit the file, update GRUB, and reboot.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo update-grub
reboot
cat &#x2F;proc&#x2F;cmdline   # check if the change took effect.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;dell-flash-unlock&quot;&gt;&lt;code&gt;dell-flash-unlock&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;For the Dell Latitude line of systems, Libreboot provides a utility called &lt;code&gt;dell-flash-unlock&lt;&#x2F;code&gt; that allows changes to be written to the EC. It is thankfully provided as a part of &lt;code&gt;lbmk&lt;&#x2F;code&gt;. Just go into the source directory for &lt;code&gt;dell-flash-unlock&lt;&#x2F;code&gt; and build it.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;cd util&#x2F;dell-flash-unlock
make
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Run &lt;code&gt;util&#x2F;dell-flash-unlock&lt;&#x2F;code&gt;. Once it has run, poweroff the laptop (I did this with the &lt;code&gt;poweroff&lt;&#x2F;code&gt; command). The laptop should start back up automatically, but in my case it did not. Just power the laptop on again how you normally would. Once booted back in, run the command again. There should be confirmation that internal flashing should now work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building&quot;&gt;Building&lt;&#x2F;h2&gt;
&lt;p&gt;Because of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libreboot.org&#x2F;news&#x2F;policy.html&quot;&gt;Libreboot’s Binary Blob Reduction Policy&lt;&#x2F;a&gt;, vendor files need to be injected into the tarball after downloading. This, of course, is another action handled by &lt;code&gt;lbmk&lt;&#x2F;code&gt;. If the program says that the tarball was modified after being run, then it should be good.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;.&#x2F;mk inject libreboot-25.06_e6230_12mb.tar.xz
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, the firmware ROM can now be built. All ROMs can be built with &lt;code&gt;.&#x2F;mk -b coreboot&lt;&#x2F;code&gt; with no arguments, but you can target your specific laptop, as seen below.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;.&#x2F;mk -b coreboot list       # Get a list of possible targets
.&#x2F;mk -b coreboot e6230_12mb
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;flashing&quot;&gt;Flashing&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;flashprog&lt;&#x2F;code&gt; is the utility that writes to the flashchip. It does not need to be downloaded separately. It can be downloaded and built through &lt;code&gt;lbmk&lt;&#x2F;code&gt;. It resides in the &lt;code&gt;elf&#x2F;&lt;&#x2F;code&gt; directory, for some reason.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;.&#x2F;mk -b flashprog
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Make a backup of the original firmware.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;cd elf&#x2F;flashprog
sudo .&#x2F;flashprog -p internal -r ~&#x2F;factory.rom   # I saved my backup to my home directory.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Flash. I flashed &lt;code&gt;seagrub_e6230_12mb_libgfxinit_corebootfb_usqwerty.rom&lt;&#x2F;code&gt;, but there are of course other options to choose from.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo .&#x2F;flashprog -p internal -w bin&#x2F;e6230_12mb&#x2F;[ROM]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, shutdown the laptop. When I first tried to push the power button to start it back up, visually and sonically it looked like I just bricked my laptop. However, pushing the power button again started the laptop as usual.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;libreboot.org&#x2F;docs&#x2F;install&#x2F;latitude.html&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;libreboot.org&#x2F;download.html&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;libreboot.org&#x2F;docs&#x2F;build&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;askubuntu.com&#x2F;questions&#x2F;1120578&#x2F;how-do-i-edit-grub-to-add-iomem-relaxed&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;browse.libreboot.org&#x2F;lbmk.git&#x2F;plain&#x2F;util&#x2F;dell-flash-unlock&#x2F;README.md&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=w5ZjmF4JdMo&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;libreboot.org&#x2F;docs&#x2F;install&#x2F;devmem.html&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;libreboot.org&#x2F;git.html&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Pomodoro Timer</title>
        <published>2025-09-18T00:00:00+00:00</published>
        <updated>2025-09-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/pomodoro-timer/"/>
        <id>https://foswret.com/posts/pomodoro-timer/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/pomodoro-timer/">&lt;p&gt;Recently, I finally got around to completing a project. I had started work on a simple pomodoro timer in the terminal, but I only got as far as the backend timer portion of it. However, I finally got a basic version of it working and I thought for posterity’s sake I would go through my code.&lt;&#x2F;p&gt;
&lt;p&gt;The code is located on my git repository at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.foswret.com&#x2F;beefsteak&#x2F;about&#x2F;&quot;&gt;https:&#x2F;&#x2F;git.foswret.com&#x2F;beefsteak&#x2F;&lt;&#x2F;a&gt;. I called it &lt;code&gt;beefsteak&lt;&#x2F;code&gt; because beefsteak is a variety of tomato, and the name sounds very un-like the functionality of the program and the pomodoro method in general. The program is coded in C and platform compatible to the best of my ability.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-code&quot;&gt;The Code&lt;&#x2F;h1&gt;
&lt;pre&gt;&lt;code data-lang=&quot;c&quot;&gt;#define WORK_TIME_MIN 50
#define BREAK_TIME_MIN 10
#define SESSION_COUNT 3

&#x2F;* System requirements:
 * notify-send
 * *&#x2F;

&#x2F;* 60 SECONDS = 1 MINUTE *&#x2F;
&#x2F;* 60 MINUTES = 1 HOUR, 3600 SECONDS *&#x2F;


int clear_stream(void) {
	fflush(stdout);
	printf(&amp;quot;\r&amp;quot;);
	return(0);
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;^^^
This first chunk is defining time variables and the &lt;code&gt;clear_stream()&lt;&#x2F;code&gt; function. &lt;code&gt;clear_stream()&lt;&#x2F;code&gt; allows the timer to continuously be on the same line after every second change. For the variables, the default work session timing is 50 minutes with each break being 10 minutes. These constants are turned into seconds, which is usable with the next function.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;c&quot;&gt;void seconds_to_string(int seconds) {
	int hour = 0;
	int minute = 0;

	if ((seconds&#x2F;60) &amp;gt;= 60) { &#x2F;&#x2F; If seconds &amp;gt; one hour
		hour = (seconds - (seconds % 3600)) &#x2F; 3600;
		seconds = seconds % 600;
	}
	if ((seconds&#x2F;60) &amp;gt;= 1) { &#x2F;&#x2F; If seconds &amp;gt; one minute
		minute = (seconds - (seconds % 60)) &#x2F; 60;
		seconds = seconds % 60;
	}
	printf(&amp;quot;%.2d:%.2d:%.2d&amp;quot;, hour, minute, seconds);
	clear_stream();
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;^^^
This is probably the most important part of the whole program. The actual timer value is just an integer value for seconds and the time remaining is printed using this function. For every second that goes by, this function is called again, but with the &lt;code&gt;seconds&lt;&#x2F;code&gt; variable being decreased by one.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;c&quot;&gt;int send_notification(int type) {
	char command[100], message[100];
	strcpy(command, &amp;quot;notify-send &amp;quot;); &#x2F;* Notifcation Backend *&#x2F;
	switch(type) {
		case 0: &#x2F;* Work Started *&#x2F;
			sprintf(message, &amp;quot;\&amp;quot;🍅 Work Session Started\&amp;quot; \&amp;quot;Time Remaining: %d minutes.\&amp;quot;&amp;quot;, WORK_TIME_MIN);
			strcat(command, message);
			system(command);
			break;
		case 1: &#x2F;* Break Started *&#x2F;
			sprintf(message, &amp;quot;\&amp;quot;🏖️ Break Session Started\&amp;quot; \&amp;quot;Time Remaining: %d minutes.\&amp;quot;&amp;quot;, BREAK_TIME_MIN);
			strcat(command, message);
			system(command);
			break;
		case 2: &#x2F;* Session Ended*&#x2F;
			sprintf(message, &amp;quot;\&amp;quot;🕰️ Pomodoro Session Complete\&amp;quot; \&amp;quot;All Done.\&amp;quot;&amp;quot;);
			strcat(command, message);
			system(command);
			break;
	}
	return 0;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;^^^
The &lt;code&gt;send_notification&lt;&#x2F;code&gt; function does what it says: send a notification. It uses the &lt;code&gt;libnotify&lt;&#x2F;code&gt; library, which is defined in the &lt;code&gt;org.freedesktop.Notifications&lt;&#x2F;code&gt; Desktop Specification. I have only tested this program out with &lt;code&gt;dunst&lt;&#x2F;code&gt;, but if it works with that I’m pretty sure it will function with desktop environment notifiers.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;c&quot;&gt;int main(int argc, char **argv) {
	for (int i = 0; i &amp;lt; SESSION_COUNT; i++) {
		int work_time_seconds = WORK_TIME_MIN * 60;
		int break_time_seconds = BREAK_TIME_MIN * 60;
		send_notification(0);
		while (work_time_seconds &amp;gt; 0) {
			printf(&amp;quot;Work Time Left: &amp;quot;);
			seconds_to_string(work_time_seconds);
			sleep(1);
			work_time_seconds--;
		}
		send_notification(1);
		while (break_time_seconds &amp;gt; 0) {
			printf(&amp;quot;Break Time Left: &amp;quot;);
			seconds_to_string(break_time_seconds);
			sleep(1);
			break_time_seconds--;
		}
	}
	send_notification(2);
	return 0;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;^^^
Putting the program together. Basically:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Repeat the following for however many sessions you want (Ex. 3):
&lt;ul&gt;
&lt;li&gt;Send a notification, saying work has begun&lt;&#x2F;li&gt;
&lt;li&gt;Every one second, decrease the remaining work time by one second&lt;&#x2F;li&gt;
&lt;li&gt;Once time has reached zero, switch the timer over to the &lt;code&gt;break_time_seconds&lt;&#x2F;code&gt; variable and send a notification. Decrease time by one every second. Until it reaches zero.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;the-future&quot;&gt;The Future&lt;&#x2F;h1&gt;
&lt;p&gt;In the future, I want to add an audible alarm that says work has finished. I also want a key to be pressed in order for the timers to switch. This timer isn’t perfect, but it works well enough and is pretty similar to a physical timer.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello World</title>
        <published>2025-06-26T00:00:00+00:00</published>
        <updated>2025-06-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/hello-world/"/>
        <id>https://foswret.com/posts/hello-world/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/hello-world/">&lt;p&gt;If you are reading this, you are most likely viewing it on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;foswret.com&quot;&gt;https:&#x2F;&#x2F;foswret.com&lt;&#x2F;a&gt;. That is if I remember to pay for the domain and server.&lt;&#x2F;p&gt;
&lt;p&gt;For the longest time, I had been hosting my personal website through GitHub Pages. This worked well, but I was unhappy with the domain name being constrained to &lt;code&gt;.github.io&lt;&#x2F;code&gt;. I could have simply bought a domain and had it direct to the &lt;code&gt;.github.io&lt;&#x2F;code&gt; address, but if I was going to go through the trouble of buying a domain I might as well rent a VPS as well.&lt;&#x2F;p&gt;
&lt;p&gt;In terms of cost, the domain and VPS were not much. All together, it come out to a few bucks per month. Paying this small fee per month is honestly a better allocation of funds than buying a subscription to a service that purposely blocks functionality as an incentive to buy in.&lt;&#x2F;p&gt;
&lt;p&gt;Everything on this website is built with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gohugo.io&quot;&gt;Hugo&lt;&#x2F;a&gt;. Im also now hosting a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.foswret.com&#x2F;&quot;&gt;git server&lt;&#x2F;a&gt; in conjunction with this website. I’ve got a few things hosted there as of right now like my dotfiles and two programs, but I hope that I’ll come to host many more projects on there. I will eventually host this website’s theme as well once I feel like everything looks good.&lt;&#x2F;p&gt;
&lt;p&gt;So, that is how this website came to be. I may be the only soul to read this website, but at least it has been a rewarding experience setting this up and grants me a little more ownership in my online presence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Antonia</title>
        <published>2024-04-28T00:00:00+00:00</published>
        <updated>2024-04-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/my-antonia/"/>
        <id>https://foswret.com/posts/my-antonia/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/my-antonia/">&lt;p&gt;I always wanted to read &lt;em&gt;My Ántonia&lt;&#x2F;em&gt;. Not because I was aware of the story, but because of the cover. My paperback copy is this small, reddish-maroon book with WPA-Era art adorning the cover. The overall look of this book made me think that this book would be interesting.&lt;&#x2F;p&gt;
&lt;p&gt;If I could describe this book in very broad terms, I would say it is a coming of age story of a young man who grows up in Nebraska and how that childhood shapes the person he is. The book being titled &lt;em&gt;My Ántonia&lt;&#x2F;em&gt; is in reference to a bohemian girl named Ántonia who grows up in parallel with the main character, Jim Burden.&lt;&#x2F;p&gt;
&lt;p&gt;I would say that the author, Willa Cather, excels especially at her ability to describe landscapes. The book is filled with very beautiful descriptions of the scenery that surrounds the events of the book. This beauty contrasts the often demanding work that Ántonia must go through. She works in the fields day after day and grows up to be a very tough and admirable woman.&lt;&#x2F;p&gt;
&lt;p&gt;The book also gives a glimpse into the lives of 1800s settlers, showing the struggles and joys of the era. I always find it fascinating to read about different time periods in American history. The sense of homesickness looms over this book in a very moving way. I cannot help but feel bad for &lt;em&gt;Ántonia’s&lt;&#x2F;em&gt; family who work so hard to get by, but yet have so much respect for them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;My Ántonia&lt;&#x2F;em&gt; is a short book: around 260 pages. I think this is to its benefit. The story is often pretty dry and I don’t think I could personally sit through more than 400 pages of this story. The book does not necessarily have a central conflict that needs to be overcome, but doesn’t become a list of diary entries like Jack Kerouac’s &lt;em&gt;On the Road&lt;&#x2F;em&gt; becomes.&lt;&#x2F;p&gt;
&lt;p&gt;As an easy to read yet enjoyable book, I would recommend reading &lt;em&gt;My Ántonia&lt;&#x2F;em&gt;. With likable characters, saddening yet moving moments, and some excellent descriptions, it is a book that really drew me in and will do the same for others.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Collection of Poems</title>
        <published>2024-04-13T00:00:00+00:00</published>
        <updated>2024-04-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/poems/"/>
        <id>https://foswret.com/posts/poems/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/poems/">&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The ground sits, hardened into hills and flat lands for life to be.&lt;&#x2F;p&gt;
&lt;p&gt;Light darkens, bringing way to humble crystals that coat dull earth.&lt;&#x2F;p&gt;
&lt;p&gt;Light brightens. Its return holds true, and our new friend will leave soon.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The world sat  in a firm state,  slowly changing without a voice&lt;&#x2F;p&gt;
&lt;p&gt;Against choice, This silent change turns into coarse yet forced actions&lt;&#x2F;p&gt;
&lt;p&gt;Hope is for a new paradigm, yet these things start without stop&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A safe, quaint vernal pool&lt;&#x2F;p&gt;
&lt;p&gt;A sea for miniscule creatures&lt;&#x2F;p&gt;
&lt;p&gt;A bird hopping, waiting for warmth&lt;&#x2F;p&gt;
&lt;p&gt;The wind blowing through the bare trees&lt;&#x2F;p&gt;
&lt;p&gt;Bare trees&lt;&#x2F;p&gt;
&lt;p&gt;Dead leaves&lt;&#x2F;p&gt;
&lt;p&gt;Green spring upon us&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Collatz Sequence</title>
        <published>2024-01-11T00:00:00+00:00</published>
        <updated>2024-01-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/collatz/"/>
        <id>https://foswret.com/posts/collatz/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/collatz/">&lt;p&gt;The website &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;projecteuler.net&#x2F;&quot;&gt;ProjectEuler.net&lt;&#x2F;a&gt; has many different math and logic based programming problems that
can be solved. In my attempt to deepen my understanding about coding and learn C, I decided to solve the problem relating to finding the
longest &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;projecteuler.net&#x2F;problem=14&quot;&gt;Collatz Sequence&lt;&#x2F;a&gt;. The following program was compiled using gcc.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;c&quot;&gt;
#include &amp;lt;stdio.h&amp;gt;

long evenOperation (long n) {
    n = n &#x2F; 2;
    return(n);
}

long oddOperation (long n) {
    n = (3*n) + 1;
    return(n);
}

int main (int argc, char **argv) {
    long number = 0;
    long maxPathLength = 0;
    long maxLengthInt = 0;
    long numOfTerms = 100;

    for (int i = 0; i &amp;lt; numOfTerms; i++) {
        long currentLength = 1;
        while (number &amp;gt; 1) {
            if ((number % 2) == 0) {
                number = evenOperation(number);
                currentLength++;
            }
            else {
                number = oddOperation(number);
                currentLength++;
            }
        }
        if (currentLength &amp;gt; maxPathLength) {
            maxPathLength = currentLength;
            maxLengthInt = i-1;
        }
        number = i;
    }
    printf(&amp;quot;TERM: &amp;#39;%li&amp;#39; WITH A SEQUENCE LENGTH OF &amp;#39;%li&amp;#39;\n&amp;quot;, maxLengthInt, maxPathLength);
    return(0);
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Using Vim</title>
        <published>2023-07-28T00:00:00+00:00</published>
        <updated>2023-07-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/vim/"/>
        <id>https://foswret.com/posts/vim/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/vim/">&lt;h2 id=&quot;my-experience-using-vim&quot;&gt;My Experience Using Vim&lt;&#x2F;h2&gt;
&lt;p&gt;Around the start of June, I went through the trouble of installing Artix Linux on a laptop. With this, I had the choice of what text editor I could install onto my system. In the past, I have never really done any true programming work or config editing on my previous desktop Linux Mint machine. In the occasion that I did, however, I must have used a default text editor like xed. This style of usage really discouraged any sort of terminal work, which would be suited to using vim. I must have heard about vim in the past, and heard about its efficiency when working and its keyboard centric control. So, I installed vim and began my learning process.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;At the time of writing, I am not someone that programs regularly and cannot speak well for its functionality as a IDE. This is just my experience using vim casually for various tasks.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Vim is operated through different “modes” which allow you to do different actions. “Normal” mode is usually where you enter in commands to do various actions. “Insert” mode is exactly what it sounds like and doesn’t allow you to do much else except hit the keyboard and type text. “Visual” mode works similarly to GUI text editors and allows you to select text. Vim’s effeciency comes through using this modal system and allows you to execute specific key combinations to do exactly what you intend to do. Many actions that a mouse would normally do is replaced with keys. Instead of scrolling, you can use &lt;code&gt;hjkl&lt;&#x2F;code&gt; for going line-by-line, &lt;code&gt;ctrl + u&lt;&#x2F;code&gt; and &lt;code&gt;ctrl + d&lt;&#x2F;code&gt; for going up and down half a page, go to the top with &lt;code&gt;gg&lt;&#x2F;code&gt;. go to the bottom with &lt;code&gt;G&lt;&#x2F;code&gt;, move the screen so the cursor is in the middle with &lt;code&gt;zz&lt;&#x2F;code&gt;, and more. This fine control over what you can do allows you to forego the aiming of a mouse. Everything you want to can be performed by muscle memory keypresses.&lt;&#x2F;p&gt;
&lt;p&gt;The need to learn this system is probably a reason for people being hesitant to starting to use vim. However, I think the time used to learn vim is at least more productive than participating in any other of the common time-waster activities. It was pretty easy to learn and did not require difficult memorizing. I started operating vim with a very limited number of actions I knew and gradually learned more to the point where now I can say that I can do a decent amount of stuff I want. I certainly have not learned everything that vim can do, but through using it, you learn more and more.&lt;&#x2F;p&gt;
&lt;p&gt;I eventually switched to using neovim for its additional features. I followed the ThePrimeagen’s configuration guide to add various plugins and themes. It has worked out pretty well and has added some features that make using vim more comfortable. The differences between vim and neovim are not huge but research online will provide you with differences that make neovim the better choice over the two.&lt;&#x2F;p&gt;
&lt;p&gt;I have been using vim at the moment for editing configuration files, system files, learning c and writing this web page you have been reading this on. Using neovim’s telescope, syntax highlighting, and LSP has made all of these tasks pleasent. I tried using vim whilst using Debian in a graphical desktop environment and it just wasn’t worth the hassle of switching back and forth from using the keyboard in vim to doing stuff in a file manager. There are graphical vim forks, but I have not tried them and cannot vouch for their usability. Using a tiling WM with vim seems natural while using vim whilst also using a mouse is uncomfortable. You can avoid this possible usage conflict by using vim-like keybindings for your existing text editor.&lt;&#x2F;p&gt;
&lt;p&gt;Using vim has been pretty enjoyable to use for casual text editing. Everyone should at least try out vim-style keybindings or test out vim to see if it is perferable to any existing system they have in place.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Catcher in the Rye Review</title>
        <published>2023-07-20T00:00:00+00:00</published>
        <updated>2023-07-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://foswret.com/posts/catcher/"/>
        <id>https://foswret.com/posts/catcher/</id>
        
        <content type="html" xml:base="https://foswret.com/posts/catcher/">&lt;p&gt;If you have never read “The Catcher in the Rye” before, one may think that the book is a sophisticated piece of fiction that should be classified in the same category as celebrated 19th century
stories. It should surely be a difficult to read yet highly insightful body of work. Even if not everyone thinks these things, it is certainly what I thought when I first decided to read
“The Catcher in the Rye”. However, my preassumed opinions of the book were quickly ruined when the very first paragraph was written as a teenager complaining. This guy was complaining about his
parents being “touchy as hell” and his brother being a supposed prostitute.&lt;&#x2F;p&gt;
&lt;p&gt;The book takes place over the course of two days in the life of Holden Caufield. He comes from a rich family and has been kicked out of a posh private school once again and has to face his soon to be
angry parents. With some time to kill and no want to finish any obligations at the school, he decides to roam the streets of New York City. His whole experience in these two days are told
continuously. No locational or time details are skipped. He is only 16, yet attempts to act older by going into bars, ordering drinks, and even getting a prostitute into his hotel room. Often,
people comment on how young he looks or refuses to serve him alcohol.&lt;&#x2F;p&gt;
&lt;p&gt;I would say that the best way to describe the writing style J. D. Salinger used would be “faithful”. The way he portrays Caufield would be of a typical, yet overly bitter, young person. Holden
Caufield is constantly talking about how he does not like other people or how he thinks many things are stupid. I thought this constant throughout the book would become tiresome, but I did not find
this to be the case. In addition to this level of realism, the book is written in the style of the teenager spoken word of the era, which I would think to be pretty uncommon to be seen from books
written at the same time.&lt;&#x2F;p&gt;
&lt;p&gt;Judging the book on entertainment value, I thought the book was quite funny. There were some lines that Holden says in the book that were pretty clever and funny. In terms of striking societal
commentary with a deep meaning: didn’t really find that with this book. The actual mention of “the Catcher in the Rye” only appears in exactly one chapter. You learn about exactly what that means, but
I couldn’t quite see if that theme was present throughout the whole book. Maybe I would have to do a re-reading or maybe I am too young to fully appreciate the meaning.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, A good fiction book about a relevant topic that many people can relate to.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
