placeholder description
git clone
Log | Files | Refs | Submodules

commit fc7857d53f7a559e20e0de138a5217dca7b02fb7
Author: Ian <>
Date:   Fri,  3 Feb 2023 23:25:51 -0500

Initial commit

A.gitmodules | 3+++
Aarchetypes/ | 6++++++
Aconfig.toml | 5+++++
Acontent/posts/2020/01/ | 34++++++++++++++++++++++++++++++++++
Acontent/posts/2020/02/ | 19+++++++++++++++++++
Acontent/posts/2020/02/ | 11+++++++++++
Acontent/posts/2020/03/ | 19+++++++++++++++++++
Acontent/posts/2020/05/ | 10++++++++++
Acontent/posts/2020/06/ | 15+++++++++++++++
Acontent/posts/2020/06/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/posts/2020/06/figure1.png | 0
Acontent/posts/2020/06/figure2.png | 0
Acontent/posts/2020/06/figure3.png | 0
Acontent/posts/2020/08/ | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/posts/2020/08/ | 13+++++++++++++
Acontent/posts/2021/01/ | 33+++++++++++++++++++++++++++++++++
Acontent/posts/2021/05/ | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/posts/2021/08/ | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/posts/2022/01/ | 14++++++++++++++
Acontent/posts/2022/02/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/posts/2022/03/ | 30++++++++++++++++++++++++++++++
Acontent/posts/2022/08/ | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/posts/2022/09/ | 11+++++++++++
Athemes/wizard | 1+
24 files changed, 569 insertions(+), 0 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/wizard"] + path = themes/wizard + url = diff --git a/archetypes/ b/archetypes/ @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/config.toml b/config.toml @@ -0,0 +1,4 @@ +baseURL = '' +languageCode = 'en-us' +title = 'Shmage Site' +theme = 'wizard' +\ No newline at end of file diff --git a/content/posts/2020/01/ b/content/posts/2020/01/ @@ -0,0 +1,34 @@ +--- +title: "Why I don't use Snapchat" +date: 2020-01-31 +draft: false +--- + +Over the past few years, I've been met with questions regarding my decision to not opt-in to certain commonly used software, with Snapchat being the biggest deal. Unfortunately, I historically reach for bad answers, such as "I don't like it" and "It creates a bad habit". Now that I have an outlet to concisely and clearly punch words in an HTML box, I will outline the exact reasons I do not use Snapchat, for my personal record keeping. + +The reasons why I refuse to opt-in can be put in bullet points. + +- The software itself and the means it uses to get messages to people are proprietary. This enough is generally reason alone for me to decide to not use something. +- Snapchat is made of bad UI design. +- Snapchat restricts user choice in a hilariously bad fashion. +- Snapchat is riddled with ads. +- It isn't platform friendly. I have to use a cell phone to chat. + +Those second and third reasons offer me the most to talk about. As soon as you open the Snapchat app, you are booted straight to the camera, whether you want to take a picture or not. There are no configuration options to tell the app where you want to start the app, so you end up opening your camera repeatedly just to look at a text message. + +From the camera, you're able to swipe left-to-right to reveal the text chat menu. The gimmick of Snapchat is that messages are "deleted" by default and the user is told if anything they have uploaded has been seen, saved, or screenshotted by the hands of another user. This feature is useless, since screen-recording software can be used to record posts without detection, and the animation between the message log and a chat allows the user to read the message before actually entering the chat screen, thus not alerting the sender of something being read. + +If you swipe towards the left from the camera, you're brought to a weird page that shows a list of your friends' Stories - public posts (that must be pictures or video) and also an endless feed of Snapchat-ified news. The "news" ranges from BIG WORD CLICKBAIT to a cartoon about Fortnite or an account that exclusively posts "satisfying things." + +If you want to access the streamlined list of Stories, you must go to this page. You cannot opt out of recieving news, and you cannot even give Snapchat a list of feeds that you want to see. You may long-tap a media-Story and proclaim that you wish to see less of that type of news, and pray to the black box of Snapchat that you will someday use CPU cycles to recieve news that you might actually want to look at instead of cheap clickbait. A news/media feed on a chatting app is already doing more than I asked it to, since I just want to see the list of Stories. + +Since Snaps (videos) can only be several seconds at a time, and must be portrait oriented, all news is either: + +- butchered into several jump-cuts and ads every (not exaggerating) 10 seconds. +- serving as a flashy cover to an article that you have to open up in the web browser supplied by Snapchat. + +Snapchat also offers side-services, like a find-my-friends-esque service that pings your location to your friends when you log in, and a avatar system that can only be used if you download a separate app. On top of that they offer small games ala Apple iMessage and other superfluous stuff. + +I cannot simply message people I have on my friends list, I must also deal with a UI that works against me and constantly changes in its own interests instead of the user's, a bloated mess of filters (that you must download per-use) and services that I don't want to use and will instead be advertised to me like I'm stupid. It's insulting software that pretends it knows what you want better than you do, all on top of a proprietary protocol and a nightmare of a [privacy policy]( that reserves the right to do ridiculous things with vague wording. A fun activity is plugging "snapchat privacy policy" into a search engine and seeing just how many results are articles attempting to explain away scares. + +All these things people are willing to compromise with because of the ubiquity of Snapchat. Nobody downloaded Snapchat because they heard it was the best and safest thing around, they downloaded it because their friend told them to. Here we have software that holds its users in the grip of its culture and familiarity deciding to use its powers for evil. This reinvention of the wheel into a square isn't the treatment a user deserves, especially when there are better, safer, platform friendly, FOSS, and brand-independent technologies already out there that do the chat thing just fine. diff --git a/content/posts/2020/02/ b/content/posts/2020/02/ @@ -0,0 +1,19 @@ +--- +title: "Freedom in Self-Hosting" +date: 2020-02-04 +draft: false +--- + +I find often that a computer user carries the attitude that daily computing is kind of whimsical, in the sense that it might seem like a computer does what it wants, and when it doesn't want something to work one day, it won't work. The user works for the computer, and not the other way around. + +>"I don't know why it's loading so slow. I guess the computer is deciding to throw a fit." + +Today, I believe that we only encourage that attitude by diverting most of the computing to centralized servers and bottlenecking performance based on how good a user's internet connection is. These servers may be run by large companies, but their uptime will never be indefinite nor guaranteed. + +Most of the apps that do this diversion of computation do it in irresponsible ways, creating software that relies on one provider and stops working once the provider decides to end service. An imperfect example is video games without available server hosting software or always-on DRM. + +The industry seems to think the only way to make money is to charge a service cost for unicorn software that can only be hosted by themselves. + +Now is a better time than ever to take control of the services you use and see the end of "whimsical" computing in an afternoon with software we have right now, available gratis. It doesn't take a lot of computing power to host a server for single person use, especially when you need a replacement for simple things such as cloud storage and cross-device syncing. You can get a cheap device such as a Raspberry Pi for about 30-300 USD depending on your needs and you can start to build your own services that you can be more confident in the performance of, because you host them yourself. [Nextcloud]( is a great example. It's a Google Drive-like suite of self-hosted services that provide an easy setup for a multitude of use cases. + +The modern cycle of SaaS is "users trusting tyranical software that do not guarantee anything," "software breaks users' trust," "users pick new company with a cleaner name to trust." When you self host, you don't have to worry about the whim of whatever company you're submitting to, especially when most of the things you trust them for are really simple. When there is an issue, you can immediately start to consult the issue yourself, instead of waiting for a company to get their servers back up. If you want to amend your service and add your own special functionality, you can, instead of waiting for a company to decide what you want. Packaged in this is the added plus of knowing exactly what your server is running, and what computations you are doing with your data. Have a blog, cloud, or chat service without being blasted by the standards of providers and forces that bend the web for the interests of the hand that force-feeds you. diff --git a/content/posts/2020/02/ b/content/posts/2020/02/ @@ -0,0 +1,11 @@ +--- +title: "On Covering Laptop Cameras" +date: 2020-02-04 +draft: false +--- + +Front-facing cameras (face-facing?) on laptops are grossly ubiquitous. When was the last time you actually used it? It serves a low quality picture, and you usually just opt to use your phone for that kind of face-technology stuff for a less cumbersome experience. The only purpose they serve is to remind the user that there's secretly a personal FBI agent watching you do homework. So users cover them up with tape. + +It's a weird mixture of the rejection of gross privacy invasion and the acceptance that the software that they're using has the possibility of spying on them, or something. I see the practice as a kind of user complacency. A rejection of WYSIWYG but also agreeing that there's nothing one can do about it. That's how computers work. It's a kind of hopelessness that I hate to see people bear. I don't cover up my laptop camera, because I am comfortable with my computer. Yes, I use some proprietary firmware blobs and such, but if I really want to disable the use of my camera, I can. It doesn't really matter whether there really is an FBI guy on the other end, becuase it's an issue of a userbase not feeling empowered by their computers. The most you can possibly do is to politely ask "please don't." + +To many, I believe computers seem like magical black boxes that you have to go to college for to use to their full extent. diff --git a/content/posts/2020/03/ b/content/posts/2020/03/ @@ -0,0 +1,19 @@ +--- +title: "Notes Without Paper- Can it be Done?" +date: 2020-03-02 +draft: false +--- + +Being a student in mathematics, I took all my notes on paper during my first semester. I can't type math, and even if I could, why would I tie all of my personal reference to a digital format on a machine that could run out of battery? Paper is cool because it doesn't run out of battery. It's also not cool because I can't rice my paper and have a browser open on the side. I also can't sync paper across interfaces or conveniently copy it. + +So now- paper is deprecated. The goto for writing notes was simply sorted text files that I edited with LibreOffice Writer. I could do bullet points easily enough and organize things just about as quickly as writing. The issue is that LibreOffice Writer doesn't expect you to need to quicly write math repetitively and uniformly. I couldn't go back to paper now, I had only just started. + +So I go to find a way to write math on a computer. Interestingly enough, I was able to integrate it into my workflow pretty gracefully without a whole bunch of extra software. The key is a combination of LaTeX and some vim-fu. + +What I personally do is reminiscent of [this blogpost](, which combines the use of vim snippets and a lightweight LaTeX editing suite. [Vimtex]( lets you compile your work in to a PDF on the fly with your preferred viewer, and [UltiSnips]( for auto-completion of repetitive LaTeX syntax. I also use [Vundle]( for my plugin management. + +I'm still working to get my note-taking to be as quick as writing, but math looks so much more elegant when it isn't in my poor penmanship. The blogpost I linked has a lot more information on how to use snippets to your advantage, so I won't go over it here. The curve is really learning LaTeX and knowing what you should automate. I still have a reference sheet open for some classes, but it doesn't detract too much from what I manage to get down. You'll hit a wall if you find yourself with a document that doesn't compile. You kind of just have to keep going and get to fixing your problem later. + +My reason for posting is to simply say this- after my first couple of months of giving it a shot- it is more than possible (dare I say, fun?) to write mathematics notes on the computer. Don't doom yourself to clicking special symbols in GSuite or whatever. + +Also, [Here's a list of TeX editors in case you're curious.]( diff --git a/content/posts/2020/05/ b/content/posts/2020/05/ @@ -0,0 +1,10 @@ +--- +title: "Beautify your /bin/login" +date: 2020-05-22 +draft: false +--- + + +I'd been looking for a bit to stop using a display manager for my main, single user computer, since there isn't a lot of use for a complicated login manager when all I'm going to do is type in my password. This means that I would need to have X (or my desktop environment of choice) start automatically when I log into tty1. You can put this check in your ~/.bash_profile with a good example on the [Gentoo wiki]( The only issue I had migrating from lightdm was that there were a couple environment variables not set properly at first when starting X in this fashion, but it was easy to find out what with set or env. + +Since /etc/inittab is going to be the file your init will read off after "starting" (this is what calls agetty), you can tweak it to personalize its behavior. The cool bit is the ability to login in style by telling /etc/inittab to run your own login wrapper script. You can do this by passing the program to agetty [like this](, and now you suddenly have free reign to run some nice programs as you log in. Since agetty opens a tty port and then simply invokes /bin/login, passing an alternative program to it with --login-program works as long as you remember to run /bin/login. Pretty cool, right? Right now I just do a funny cowsay before my password prompt, for that authentic hacker aesthetic. I really recommend this method for single user systems, since it allows you a lot of freedom of what you can do with your login. Just make sure you're either invoking your desktop environment directly in your ~/.bash_profile hack, or if you're using a window manager, invoking your startup programs in your ~/.xinitrc. diff --git a/content/posts/2020/06/ b/content/posts/2020/06/ @@ -0,0 +1,15 @@ +--- +title: "Becoming my Own Package Maintainer (the Portage way)" +date: 2020-06-03 +draft: false +--- + +I was frustrated with my update flow. For all my computers, I would essentially be installing the same things on different systems manually with different package managers. I use Gentoo and Portage on my "faster" machines, but usually leave less powerful computers on systems that rely on binary package providers. Loving the Portage philosophy and hating redundancy, I wanted to reduce the number of different tools I was using to keep all of my systems up-to-date. Did I really need apt, pacman, etc, etc, to install slightly different builds of ffmpeg on similar systems? I already configure most of my systems to operate similarly for simplicity, but I wanted to automate it. + +My solution, luckily, was already implemented in a severely underrated feature in Portage. Portage allows you to build your own packages and then package them into binaries for you to distribute to other computers, given that there won't be any compile or USE flag conflicts, with support for ftp, ssh, and http transfer. Since a lot of my posts just involve pointing at a wiki page, I'll go ahead and provide it [here]( + +To test how this could work, I wiped a cheap laptop clean and started a Gentoo Linux installation. A key part of the way binary packages work in Portage is the quickpkg program, which translates installed atoms to binaries. By default, generation via quickpkg enables CONFIG_PROTECT, which obfuscates the configuration files in your system related to a package (see "equery f"). What went over my head, however, is that enabling CONFIG_PROTECT doesn't obfuscate your configuration file by generating a skeleton file on installation, but rather *omits* a configuration file altogether. This can make installing critical system packages for the first time via binary dangerous. Even if you disable CONFIG_PROTECT, you risk writing configuration files that are incorrect for your system. This means that you should still compile most mission critical programs if you're installing them for the first time. If you still want to write out / overwrite configuration files in a case where you're absolutely sure, you can set CONFIG_PROTECT="-{atom}" to (as per the manpage) "mercilessly auto-update your config files." + +As for server configuration, I settled with ssh, with a user dedicated to serving packages. Setting --getbinpkg in EMERGE_DEFAULT_OPTS on the client lets you seamlessly and automatically pull binaries of the same atom when you use emerge. I tend to include configuration files on build for builds that write trivial configuration files, like the GIMP or Libreoffice, since for those, something is better than nothing on first install. + +I'm surprised this isn't noted more when I hear discussions about Portage. You get to make your own ecosystem of specialized packages that you distribute to yourself, to keep low-power systems updated but also optimized. The only thing you might be giving up is a bit of specialization, since the distributor needs to be using the same USE and compile options as the client. Save for a kernel upgrade, the updates to my old machine take less time than on my high-power machines, and I can trust all my computers to behave similarly. diff --git a/content/posts/2020/06/ b/content/posts/2020/06/ @@ -0,0 +1,37 @@ +--- +title: "My First Pull Request" +date: 2020-06-16 +draft: false +--- + +I was finally ready to make my first pull request. After double checking, and checking again, I knew my changes were ready to merge. I typed up a short summary of what I did, and how it was implemented. I refreshed the pull request page on Github every ten minutes for a few hours until I finally got the response I was waiting for: + +>"Please fix the indentation problems. Github diff page should show you." + +Oops. + +### Finding My First Project, or The First Victim of my Bad Convention-Following + +The project I contributed to was [nnn](, a nifty little file manager written with C and Curses for Vim-like browsing and keyboard-oriented navigation. I'd never actually used nnn prior to contributing, but the especially easy to read code let me discover and contribute pretty much within the same day. + +### Tackling The Issue + +The issue at hand had to do with how Curses handled the hardware cursor. Text is drawn by Curses based on where the cursor is, but upon the refresh of the screen, the cursor always gets placed at the bottom of the screen, with the status bar. Normally, the cursor is invisible, since we don't use it in the program, but we can see it if we recompile the program with curs_set(TRUE) instead of curs_set(FALSE). + +![figure1](figure1.png) ![figure2](figure2.png) + +See the difference between the selected item and where the cursor "actually is"? + +This happens since the status bar is drawn last, and since it isn't important where the cursor is, then we can leave it where it got sent last. The problem is that some accessibility tools like screen readers rely on the cursor's position to detect what someone is looking at. The simple solution is to add a launch option, and then simply move the cursor to the selected item automatically when it's enabled, specifically after Curses is done drawing all the text onscreen. Since the currently selected item's line was already defined, this was easy. + +![figure3](figure3.png) + +Much better. + +### Code Quality + +My changes were eventually merged, but my indentation and ignorance of conventions within the project got slammed. Pretty much every line I added had to be sanitized of silly mistakes. Oops. The kind maintainer was willing to fix my changes and push to master. + +### My Tips for New Open Source Contributors, Like Myself + +You probably want to contribute to a project you're already fond of. This project was particularly well documented and minimalistic, with only one C file to keep track of. Knowing a program well in usage will let you be more pragmatic when deciphering code. Also, follow code conventions. You might be able to implement a requested feature or fix, but you want to know you're doing it the best way possible. At the end of the day, you're deciding to contribute to software that helps out everyone. Keep at it. diff --git a/content/posts/2020/06/figure1.png b/content/posts/2020/06/figure1.png Binary files differ. diff --git a/content/posts/2020/06/figure2.png b/content/posts/2020/06/figure2.png Binary files differ. diff --git a/content/posts/2020/06/figure3.png b/content/posts/2020/06/figure3.png Binary files differ. diff --git a/content/posts/2020/08/ b/content/posts/2020/08/ @@ -0,0 +1,52 @@ +--- +title: "Website Generation with Unix Coreutils" +date: 2020-05-08 +draft: false +--- + +As a newbie website author, my process of post-writing consisted of: + +- Copying the last post I made in raw HTML +- Erasing the paragraphs and writing new ones +- Pushing to my server with scp + +I'm serious! + +I knew about static site generators, but they all seemed unpleasant and bloated, and not worth the trouble if I'm just going to be writing plain HTML blog posts every few weeks or so. I was on the search for something better, though, since this bad workflow discouraged me from writing. If I wanted to make a change to the footer of my website, I'd have to come up with a clever sed command to add what I wanted to every page, and then re-push. I even wrote out most of the rss feed by hand! + +I came across [this post]( by [Anjandev Momi](, which inspired me to take my own dive into a new blogging setup that this site is being built with as of now. + +Momi's post was a huge help in getting me set up and guiding me around some of the nuances of the tools I used. + +[ssg5]( is a static site generator made with 180 lines of shell script. I would have never thought I could simply read my site generator. I'll document my experience porting my site over here similarly to Momi's post. + +### rssg + +To generate an rss feed, [rssg]( is a companion script that generates a feed from your webpages. rssg is kind of finicky, though, and needs a list of posts laid out a certain way to generate correctly. I took a trick out of Anjan's book and wrote my own [script]( to generate a list for rssg to use. Figuring out what rssg was looking for was definitely the hardest part of the setup, and it took me a few tries to wrap my head around how it was generating. + +Anjan's post mentions having to change the date_rfc_822() function in rssg to fit his date format / keep compatibility with GNU coreutils. Since my dates were already in MM-DD-YYYY format, I was able to pretty much omit the function from my copy. + +### ssg5 + +Since I wanted a different header based on whether the user was looking at a blogpost or the index, I made some small changes to ssg5. I separated the header definition into a "default header" and an "index header" in main(): + +<pre> +h_file="$src/_header.html" +h_index_file="$src/_header-index.html" +f_file="$src/_footer.html" +test -f "$f_file" && FOOTER=$(cat "$f_file") && export FOOTER +test -f "$h_file" && DEFHEADER=$(cat "$h_file") && export DEFHEADER +test -f "$h_index_file" && INDEXHEADER=$(cat "$h_index_file") && export INDEXHEADER +</pre> + +Then in render\_md\_files\_markdown\_pl(), I added a check to match the filename with This change is also pretty similar to the one in Momi's post. + +<pre> +if $(echo "$1/$f" | grep "" > /dev/null); then +HEADER="$INDEXHEADER" && export HEADER +else +HEADER="$DEFHEADER" && export HEADER +fi +</pre> + +To push my website, I wrote a script that just runs the programs in order and then rsyncs it to my server. It makes and deploys super quick, and has really gotten me back in the groove of writing again. Thanks again to [Anjandev Momi]( for writing a great introduction to something I probably would never have heard of otherwise. diff --git a/content/posts/2020/08/ b/content/posts/2020/08/ @@ -0,0 +1,13 @@ +#!/bin/bash +cd dst +FILES="$(find post/ -type f -name "*.html" | sort)" +TITLES="$(cat $FILES | grep h1 | sed 's|</*h1>||g')" +DATES="$(cat $FILES | grep h2 | sed 's|</*h2>||g')" + +FILESHTML="$(printf %b "$FILES" | sed 's|^|<a href="/|g;s/$/" /g')" +DATESPREPEND="$(printf %b "$DATES" | sed 's/^/<li>/g;s/$/ /g')" +DATESHTML="$(printf %b "$DATES" | sed 's/^/title="/g;s/$/"/g')" +TITLESHTML="$(printf %b "$TITLES" | sed 's/^/>/g;s|$|</a></li>|g')" + +paste -d "" <(echo "$DATESPREPEND") <(echo "$FILESHTML") <(echo "$DATESHTML") <(echo "$TITLESHTML") | tac +printf %b "<a href=\"\">rss</a>" diff --git a/content/posts/2021/01/ b/content/posts/2021/01/ @@ -0,0 +1,33 @@ +--- +title: "Sxmo Brings Suckless Philosophy to Mobile" +date: 2021-01-02 +draft: false +--- + +One of the aspects of computing that I lament most is the current state of the mobile smart phone market. +Nearly all cell phones are made to limit the user's capabilities and freedoms. +Most phones are designed to be replaced later, and restrict the user with an operating system that limits what the user can do with the computer they've just bought. +[Pine64's Pinephone]( and [Purism's Librem 5]( are examples of some products that are designed with extensibility or freedom in mind. + +Whenever I hear discussion about one of these products, I hear a phrase that rings similarly to + +"It's not ready yet," + +"I'll consider it when there's more polish," or + +"It needs more time to be usable as a daily driver." + +I can say, at least, with my experience with Pine64's Pinephone, that using a Pinephone as a day-to-day device is definitely possible, right now. +While I haven't tried many of the interfaces available for the Pinephone yet, I can say without a doubt that my favorite is [Sxmo: Simple X Mobile]( +I've done some work with the project last year, but I've just now gotten back to giving it a try after letting my Pinephone collect dust for a few months, and the improvements made in my absense prompted me to write this post. + +Sxmo is built on top of [PostmarketOS](, and exists as a collection of programs to build an interface that truly follows the Unix and suckless philosophies. +Sxmo takes GNU, suckless utilities, and the tools on-hand to create a sleek, working environment. +The fact that it's made up of common GNU utilities and suckless software makes it extremely user friendly to those already versed in their usage. +For example, window managment is done with a modified [dwm](, and most of the utilities that are custom-made for the environment are shell scripts that take advantage of the GNU coreutils. + +Because of this, it's very easy to say, open an SSH server on the device, or set up a file-sharing job, since OpenSSH and rsync already exist here. +This also makes the source code of the included utilities easy to read, understand, and modify. +If I were to attempt some of these things on a stock Android installation, they would become much more difficult and at times seemingly impossible. +I'm finally able to treat my mobile device as the computer it is, and I'm able to extend it for any purpose with the freedom I'm given. +If you have a Pinephone on-hand, or are considering the benefits of having one, I recommend this environment to enjoy along with the other liberties you'd be gaining from these devices, like removable batteries and network kill-switches. diff --git a/content/posts/2021/05/ b/content/posts/2021/05/ @@ -0,0 +1,63 @@ +--- +title: "Text Interfaces Are The Most User Friendly" +date: 2021-05-27 +draft: false +--- + +The situation I was in had me dealing with a set of about 550k png images in a single directory extracted from a recovery image. +The images were extracted by Foremost on a partition that used to contain a root filesystem. +Since filenames weren't preserved, they weren't named in any way I could pick out the ones I wanted, and I could only go off of image metadata. +There was only a small portion of this massive library of images I needed to recover, and there was no way I could browse that many pictures to pick what I wanted. +Anything I was looking for was randomly placed in a sea of UI images or browser-cached icons. + +I knew the images I wanted were likely to be larger than the majority of the rest, and listing images by size decreasing is simple. +However, PCManFM couldn't read the massive directory, and trying to browse it with Geeqie was also unusably slow on my old disk. + +I was willing to sift through maybe a few thousand pictures, and I only needed to see the largest ones - maybe over 300x300 in resolution. +I realized I didn't really need a conventional file manager to do this. + +``$ feh -p --min-dimension 300x300 $(find . -maxdepth 1 -type f -printf '%s\t%p\n' | sort -n | tail -n $TOLERABLE_NUMBER | cut -f2)`` + +It's not the most radical example of shell magic, +but it made me appreciate that a bash interpreter allowed me to make my own rules and answer to a dynamic query. +That snippet is equivalent to the statement: + +``In this directory, use an image viewer to show me a slideshow of the largest X images that are 300x300 or larger. With the smallest ones first, please.`` + +Or, more literally: + +``In this directory, find files, and give me two fields, their size and name. Sort the entries numerically and give me the first X of those inputs. Now take the name field of each of these and pass them as arguments to the image viewer feh, truncating images whose resolutions are smaller than 300x300.`` + +With Bash (or most shell language) syntax, the query could go on and on with manipulations or sorts I could do to arbitrary input. +The best part about this is that I don't have to wonder if something's a 'feature' of the program I'm using - it's a matter of using the tools in my toolbox to explain what I want to happen in an exact fashion. + +A misnomer I hear all the time is that users are "scared away from using Linux (sic.)" +because there's something terribly awful and *un*intuitive about "the command line" that will cause a new user to suddenly go mad and have no choice but to quit before psychosis sets in. + +This post is an argument to the contrary - the text interface of a shell is one of the most ingenious and user-*friendly* interfaces I can think of. + ++ Small programs that do one thing allow you to intuitively do nuanced things. ++ Text is the most accessible medium - there are many ways to enter text. ++ It's easy to share text with my friend. If he wants to do what I did, I can send him verbatim what I've just done. ++ If the only I/O you have to worry about is text streams, then it's easier to extend scripts. ++ Since Bash (or similar shell) is a programming language itself, I can save the text as a script and run it. ++ I can access every one of my tools from the same interface. I don't have to learn a new button layout or general syntax to do something else. ++ As long as a program takes input, and puts something out, it's useful. + +These points might seem obvious, but I've never heard these points brought up from a UX perspective. +If you don't know what something does, you can peruse the manual and see exactly how you can use a program with no ambiguity. +The only real learning hurdle happens when you don't know something exists on your machine, +but most interfaces struggle with that problem somewhat. +Once you add a tool to your mental toolbox, you can use it forever. +I can use grep to apply a regular expression to input. +That input could be a file, but it could be input from anything else. +You kind of get this natural-language feel to it all. +grep is logically less a program and more a verb. +You don't have to be computer-savvy or a programmer to construct a query with some semantics that would be hard or almost impossible to do in an application where the developer has to attempt to accomodate each use case. + +There are definitely programs that benefit from not being driven by a text interface, +and they mostly happen to be that way because the core of the purpose of the program can't be practically protrayed by text. +I'll never use GIMP with a CLI, nor will I play SuperTuxKart in the buffer - they are obvious cases. + +However, there is still something to be said about the massive versatility of the text interface that can't quite be replicated by any interface that takes pride in their ease of use. +The definition of 'ease' in many minds is not "let the user easily do what they want" but rather "let the user easily do what we think they want." diff --git a/content/posts/2021/08/ b/content/posts/2021/08/ @@ -0,0 +1,111 @@ +--- +title: "You Can't Have Your Cake and Eat it Too With GNU/Linux Distributions" +date: 2021-08-20 +draft: false +--- + +The reason that "The Year of The 'Linux Desktop'" is mostly a meme and +thrown around as a buzzword in blogs is because we fundamentally +misunderstand the meaning of the phrase 'Linux Desktop'. The 'Linux +Desktop' as most people think of it is a myth and something that will +never happen, not because the open model of the Free Software desktop +isn't viable, but rather because most have the wrong idea of how a +desktop that affords you freedom should be. + +Tell me if you've heard an anecdote of this type somewhere: + +_...So I went to try out Linux, mostly because I was sick of +$PROPRIETARYOS. I installed $POPULARDISTRIBUTION since the desktop +looked nice and people said it was 'easy'. I had to do a weird thing +to get my graphics working, but I followed a guide online so it was +O.K. I was smooth sailing, until +about a week ago when a system update broke my graphics. I don't know +what happened, but I went back to $PROPRIETARYOS because it never +breaks like that. Guess Linux isn't ready for 'prime-time' yet._ + +_Hmm... What could have happened? It broke during an update? Jeez, +these distribution maintainers are awfully irresponsible for not being +able to maintain a system that "works"._ + +It's understandable for a new GNU/Linux user to be confused that a +component of his operating system seemed to have stopped +working. However, notice the order of things that happened. + ++ A user picks a distribution filled with pre-loaded software and +configuration, ++ The user has a special case where they need to change a default +configuration to suit their needs, ++ This modification was the probable cause of some trouble brewing outside +of the user's awareness, and so he chalks it up to lack of polish. + +A key difference between a proprietary operating system and one that +affords you freedom is the fact that you have the ability to choose +how your computer works, and change any aspect you'd like. For some +reason, though, distribution projects pride themselves on piling on as +much of their own configuration into the disk image as possible, for +the _out of the box_ experience. + +Issues usually come about when you then try to change something about +your system. What's fine and dandy at first turns into a maintenance nightmare when +you're trying to figure out what those default configurations are, and +you suddenly need to distinguish between general-purpose software +documentation, distribution-specific documentation, and forum posts +that may or may not be relevant to your problem, because you have no +idea what software your computer is running, for the most part. + +This is the phase where most new users get too frustrated, and quit. + +The problem lies in wanting to have your cake and eat it too. _I want +an operating system that is libre and configurable to the highest +level,_ but also, _I want an operating system that makes every decision +for me, except when I want to, but also never collides with my +actions. It should always do what I want and never do what I don't +expect._ +The trouble that distribution projects often come to face +with is the sheer amount of directions they're being pulled into in +order to appease "the user" and make sure they never have to learn +anything about the software they're running. They market themselves on +being "hassle-free", when it's never further from the truth with those +projects. All of the sudden, you see users "distro-hopping" and +getting frustrated because they can't find an image of GNU with +everything they want and nothing of what they don't want. + +No more telling people to blindly install Mint because "it's easy and works". +The standard needs to be set for users to configure their own systems, +so that they can choose the software they want. At the very least, a +user needs to know what programs they want to install. Less decisions +made by distribution developers and more decisions made by the +computer user himself. This way, a user can usually diagnose a +problem with his GNU system, or change his system to his specific needs, +because he knows how he's configured his computer to work. Even +if they can't solve general software problems, they'll surely have a +better idea of how to explain it to somebody who can. The user can get +the full benefits of a GNU/Linux system without compromises for the +illusion of ease. + +Distributions that embody this idea are usually called "minimal", +but are also wrongly classified as "for advanced users" or "only if +you want to know under the hood stuff" + +_You're an elitist! You think computer users want to live in the +command line all day! I've got a job, buddy!_ + +The thing I don't understand about this argument is that you actually +_save_ time in the long-run by choosing your configuration when you +install your operating system, which maybe takes an afternoon, +max. You don't need to be a programmer or a command-line wiz to type a +command to install your audio server. Taking the time _now_ beats +taking even more time _later_ when you're doing something +mission-critical and suddenly need to figure out why running 'apt +upgrade' broke your special manually-installed driver. Then, once you +have that configuration, it isn't like you need to re-write it every +day or something. You can back it up and save it, and share it with +other people. You can modify it to suit new hardware or different +needs. All of the sudden, you've harnessed the power of a truly Free +operating system. This is what users coming from proprietary and evil +operating systems don't understand, and at no fault of their own. You +can't promise a lifelong Windows user Windows if you're giving them GNU +instead. They will be frustrated when they mistake design paradigm for +instability. + +tl;dr: RTFM diff --git a/content/posts/2022/01/ b/content/posts/2022/01/ @@ -0,0 +1,14 @@ +--- +title: "Updates to The Website" +date: 2022-01-16 +draft: false +--- + ++ You might have noticed already that I've changed the domain of the website (and links in pages) to some time ago. +For the time being will redirect to, maybe the next year or so, but from now on I will use as my domain for mail and my website. + ++ I've also redone the git server from scratch (I will post about it soon) since I haven't touched it in a long time. +The dotfiles repo was outdated since my migration from Gentoo to GuixSD on most of my systems (I'll also post about this soon). + ++ There was also an issue with how my rss feed generator was formatting publish dates. +If you're using newsboat and dates don't look right, clear the cache and re-download the feed. diff --git a/content/posts/2022/02/ b/content/posts/2022/02/ @@ -0,0 +1,37 @@ +--- +title: "Gentoo to Guix System" +date: 2022-02-24 +draft: false +--- + +Last December, I volunteered to help run the Free Software Foundation's table at [Ohio LinuxFest](, and it was a great experience. +I met a lot of professionals and excellent people who shared some of my passions. +One thing I needed to do to be able to represent the FSF was to make sure any computer I was taking to the event was for the most part running Free Software- that is, that the laptop I brought with me was running a Free operating system. + +When I was asked whether I could do this, I remembered I was still using a nonfree kernel on my laptop (the internal wifi card depended on iwlwifi), and it was running Gentoo GNU/Linux, which isn't [FSF-endorsed]( because part of the project is maintaining nonfree software (packaging nonfree kernel bits, nonfree software packages etc). +I knew my laptop really only depended on a nonfree wifi-card driver from a nonfree blob, but the FSF was happy to mail me an adapter that was usable with linux-libre. +At this point, I installed [Guix System]( on the free space on my drive, since I've heard good things about Guix's packaging philosophy. +I was already a fan of Portage, because of the responsible way build options can be automated and streamlined, so I was interested in how Guix differed. + +The first sign I was out of familiar water was the way Guix System handles what we would consider 'global configurations' like the contents of `fstab` or whatever system daemons we tell the init system to manage. +The best way I can describe the philosophy of Guix is "functional" - the goal state is that you can provide an input to produce its associated output. +When you use Guix System, you define your *system* in Scheme, and then `guix system` interprets the output and makes it to your spec. +That is, you don't change `fstab`, you tell Guix how `fstab` should be. +This is super cool, and it makes for reproducible systems, and easy rollbacks in case you make a breaking change. +Also, since the only requirement for your operating system spec is that it has to be a valid `operating-system` type declaration, you can use whatever tricks you want up your sleeve to define it. + +Traditionally for matters like this I usually either just remember how I had something set up and try my best to replicate it, or back-up the configurations themselves, although sometimes it can be dubious whether or not the package manager will manhandle my configurations if I tell it to do something. +For example, Portage would often see my changes to `inittab` as something that needs to be overwritten and prompt me to during `etc-update`. +With Guix, the state of `inittab` is defined when my operating system is generated, and it is immutable until I make a new `operating-system`. +System configuration is so consolidated now that I [just stick the whole thing on git for backup and tracking]( + +Package management with Guix has the same type of philosophy, since `guix system`, is just part of Guix. +Packages are also defined functionally with the effect that if I hand you a definition for some package, you will be able to replicate it bit-for-bit. +If sources are referenced with Git, you can cite the commit hash and give a checksum to ensure that you are using the exact same codebase that I am. +I've found writing packages to be very easy and straightforward, despite my lacking sense for Scheme. + +Guix also has other nuances that win me over, like profiles and its extreme flexibility by design. +I ended up using it full-time instead of Gentoo GNU/Linux, and I've been enjoying the experience, so I'll be using it on my personal computers for the time being. +It's a bonus that it's another excuse for me to learn some Lisps, and that's the real learning curve of using Guix system. +The Guix paradigm diverges from how GNU systems are set-up, and so oftentimes doing an internet search for "linux how to do x" in the context of system administration doesn't fly. +Learning how to do things the Guix Way can be daunting, but the documentation is well done for such a new project and after a while it 'makes sense' such that I can solve novel 'how can I produce x's by intuition, which is an indicator that something's being done right. diff --git a/content/posts/2022/03/ b/content/posts/2022/03/ @@ -0,0 +1,30 @@ +--- +title: "Everything I Love on The Internet Dies!" +date: 2022-03-03 +draft: false +--- + +I'm currently writing this as I'm downloading all of my music from Bandcamp in FLAC format after seeing [their recent acquisition by Epic Games, of all things]( +I loved Bandcamp as an independent provider of DRM-free music. +I also would have never thought they would sell-out to a tech behemoth because of their identity as a safe service for musicians to share and sell their work. +In their acquisition letter, Ethan Diamond calls Epic Games "champions for a fair and open Internet," and this is all I need to see to know this is another humdrum case of an independent project throwing themselves at gobs of cash for maximum upward velocity. +Maybe they wanted to bail for a handsome payout? +I will never know, but Bandcamp has died. +It isn't palpable to anyone who just goes to the front page without reading the news, but that's exactly the strategy. +Bandcamp will be a corpse that imitates its old self for branding while it distorts into something inconsolably separate from its identity. +Expect Bandcamp to not prioritize freedom anymore, and to see features incrementally being revoked to make it more profitable in 'The New Web.' + +But, everything I love on the internet dies, and I think it's safe to operate under the pretense that *everything you love that exists on the internet will die.* +Internet users take the services handed to them supposedly for 'free' and treat them like they're features of the internet. +The truth is that the thing you load up tomorrow could be totally different from what you saw today, and there is nothing you can do about it. +That seems like a tautology, since you don't own Bandcamp or Youtube or Reddit or whatever, but it's easy to fall into a sense of security with things that appear to have consistency. +So, see this as a reminder. +No matter how much you 'trust' an entity, and no matter how big it is, and no matter how consistent it may seem, *if you don't own it, it will die.* +Death isn't just the thing going offline. +The service doesn't have your interests in mind, and it won't hesitate to mutate itself beyond recognition when money or VC interests are in the question. +Everything you call a 'platform' or 'service' will functionally not exist in a decade. + +The internet was about a bunch of entities coming together to share. +Instead, it's turned into a bunch of entities tuning in to the same channel, under the impression that the hand that feeds them will come back. +Combat this culture by making your own website, and hosting your own things for your friends and community. +You are still free to reap the benefits of the internet yourself, and have security in the things you actually own. diff --git a/content/posts/2022/08/ b/content/posts/2022/08/ @@ -0,0 +1,45 @@ +--- +title: "What Does Free Software Mean for Students?" +date: 2022-08-23 +draft: false +--- + +*The following is a mirror of a post I wrote for my university's Linux Club, [here](* + +## What does 'Free Software' mean? +I aim to be a campus advocate for Free Software, especially in the context of education. + +Free Software, in short, is software that is licensed to you with the freedom to + ++ Use the program for any purpose, ++ Study the program (including viewing the 'source code' of the program, or a human-readable copy), ++ Redistribute copies of the program, and ++ Distribute modified copies of the program to benefit others. + +Most software that schools mandate the usage of is nonfree, or proprietary, meaning that they do not offer at least one of these freedoms, but usually they do not offer a single one of these freedoms. + +## Why is nonfree software bad for students? +Nonfree software is not only bad for students, but for any computer user, regardless of whether they are a programmer or not. +Most nonfree programs, by not affording you the four freedoms, restrict your usage of the program, reducing its usefulness, and often times harming end-users with policies that encroach on their privacy and agency. +For example, while it's inconvenient that you have to log into Adobe to use their Acrobat reader, it's also harmful to the end user, since it puts a restriction on what terms the program is allowed to be used (you must be online). +Ideally, a document reader should only serve to read documents, but since Adobe obfuscates what Acrobat does, they can also hide features behind pay-walls [(You have to pay a subscription to sign documents?)]( and embed them permanently in the program as ads, since no one else is allowed to implement the features themselves. + +Additionally, the obfuscation of a program's function makes it useless as a learning platform, since a student isn't able to see what the program is doing. +If a student was able to see what their software was doing via source code, then the program itself becomes an opportunity for learning and the student becomes a potential contributor to software that helps everyone. +Unfortunately, many learning tools that universities across the country mandate the usage of to earn a degree are still nonfree, usually under the excuse that they are "industry standard" (read: 'we got a discount on bulk license fees'). + +This severely harms the average student's experience, as they find themselves required to agree to countless proprietary license agreements after they've signed up for classes and paid their fees for school. +Almost no student reads these terms, which leads to administration expecting complacency out of their students, and forcing more nonfree software on students, who have no choice but to accept that they have to install [malware on their own computers]( +[Zoom is another widely adopted example of egregiously unsafe software to force students to be using]( + +## What do you do? What can I do? +Since the software required by schools is determined on a per-department basis, and is completely undocumented, it can be difficult or impossible to identify all of the software licenses our school implicitly attaches us to when we give them money to enroll. +It's possible to avoid most 'required' nonfree software usage by using Free Software that mimics the function of popular proprietary programs (MS Office, et cetera). +However, sometimes the use of nonfree software is strictly required, like in the case of an "anti-cheating browser" that hijacks your computer to try to prevent you from cheating during a test. +I encourage every student to speak up about the mandated use of nonfree software, suggest alternatives, and when it is really not possible to go without it, to use a school-owned computer instead of installing malware on their own computers. + +The Bowling Green State University administration is uninterested in making the software they mandate for students accessible and safe in favor of the status quo, but this can change if enough students show their interest in Free Software. + +## Further Reading + ++ [Free Software and Education,]( diff --git a/content/posts/2022/09/ b/content/posts/2022/09/ @@ -0,0 +1,11 @@ +--- +title: "Alias Change" +date: 2022-09-13 +draft: false +--- + +I've changed my alias again from 'eonn' to 'shmage' (cool hacker name), in an effort to have a name that's a little more easier to say or spell phonetically. +Redirects from to will work for the next year or so. +If you cloned any of my repos on my git server, make sure the url and repo name is correct. +Some of my accounts that were called eonn will be changed to shmage over the next few weeks as well. +Thanks! diff --git a/themes/wizard b/themes/wizard @@ -0,0 +1 @@ +Subproject commit ed9fefe9a92032381ad2ffa4673e762d050a87ee