Skip to content


Blessed Units

Let's get rid of pounds, kilograms, feet, meters, seconds, and degrees altogether and come up with a new, pure unit system to describe our world, the Blessed Unit System, or BUS, pronounced booze. For example, lets use "speed of light"s to describe quantities of velocity. Since this is a blog post and not a scientific research paper, let's keep this simple, assuming there are only 4 (out of the seven) physical base units in our universe. Let's also assume our universe has 4 fundamental constants. See the tables below for the list of each and symbols.

Table of Reference

Base Unit Symbol
Mass M
Length L
Time T
Temperature H
Constant Symbol
Speed of Light C
Gravitational Constant G
Boltzmann Constant B
Planck Constant h

Let's create the Blessed Unit System using these fundamental physical constants. First, we need to define the constants in terms of their base units. For this, we can break down each constant into it's base units and combine them by adding or subtracting their exponents. Units of length, for example, are expressed in L or L^(1). Area, which is length squared, is expressed in L*L = L^(1) * L^(1) = L^(1+1) = L^(2). Inverted units are subtracted instead of added, because they have negative exponents.

Speed of Light

The speed that electromagnetic radiation travels in a vacuum

C = Length / Time
  = L^(1)T^(-1)

Gravitational Constant

Proportionality constant between the gravitational force of two bodies and their masses and distance apart

G = Force * Length ^ 2 / Mass ^ 2
  = M^(1)L^(1)T^(-2) * L^(2) * M^(-2)
  = M^(-1)L^(3)T^(-2)

Boltzmann Constant

Proportionality factor that relates the thermal energy of gas particles with their temperature

B = Energy / Temperature
  = M^(1)L^(2)T^(-2) * H^(-1)
  = M^(1)L^(2)T^(-2)H^(-1)

Planck Constant

The ratio of a photon's energy over its wavelength

h = Energy * Time
  = M^(1)L^(2)T^(-2) * T^(1)
  = M^(1)L^(2)T^(-1)

Combining Fundamental Constants

We can combine fundamental physical constants the same way they were derived. For this exercise, let's multiply the speed of light by the gravitational constant.

C * G = L^(1)T^(-1) * M^(-1)L^(3)T^(-2)
      = M^(-1)L^(1+3)T^(-1-2)
      = M^(-1)L^(4)T^(-3)

Since we multiplied a length (from C) and a length to the 3 power (from G), we now have a length to the 4 power! But what if we wanted to cancel out length, or even time? Let's start by making a more general case by multiplying C with some factor a by G with some factor b?

aC * bG = L^(a)T^(-a) * M^(-b)L^(3b)T^(-2b)
        = M^(-b)L^(a+3b)T^(-a-2b)

Now we have some options here! Length will cancel out when a = -3b, and the time factor cancels out when a = -2b. Mass only cancels out when b = 0. Great, now we're getting somewhere. We can rewrite our 4 fundamental physical constants into a matrix A.

         C  G  B  h
    M |  0 -1  1  1 |      | C |      | M |
A = L |  1  3  2  2 |  x = | G |  b = | L |
    T | -1 -2 -2 -1 |      | B |      | T |
    H |  0  0 -1  0 |      | h |      | H |

This gives us a linear combination of our fundamental constants and our base units. Now we can find the inverse of A. This is the result of plugging it into an online calculator.

         | -1 -3 -5  5 |
A^(-1) = | -1  1  1 -1 | * 1/2
         |  0  0  0 -2 |
         |  1  1  1  1 |

Not so pretty, but we can now use this to rewrite our linear combination from Ax=b to x=A^(-1)b. We get to pick b here depending on what our measurement dimension is. Let's run a quick test for units of velocity, which is length over time, or length to the first times time to the minus first. This is how we should set b up.

    |  0 |  (M)
b = |  1 |  (L)
    | -1 |  (T)
    |  0 |  (H)

For this value of b we should expect to get a value output of just C since the speed of light already matches these units exactly and can describe our quantity.

| -1 -3 -5  5 |   |  0 |         | 1 |  (C)
| -1  1  1 -1 | * |  1 | * 1/2 = | 0 |  (G)
|  0  0  0 -2 |   | -1 |         | 0 |  (B)
|  1  1  1  1 |   |  0 |         | 0 |  (h)

After solving A^(-1)b we obtain x = C^(1) as expected! That means we can express a speed as a multiple of the speed of light to the first power. This is not super interesting alone but is mainly used to test that the formula is working as expected. Let's do a more interesting example. How would we describe mass just using our 4 physical fundamental constants? Just set b = [ 1 0 0 0 ] and calculate.

| -1 -3 -5  5 |   | 1 |         | -1/2 |  (C)
| -1  1  1 -1 | * | 0 | * 1/2 = | -1/2 |  (G)
|  0  0  0 -2 |   | 0 |         |   0  |  (B)
|  1  1  1  1 |   | 0 |         |  1/2 |  (h)

The resulting x matrix tells us that we can express mass as a multiple of this quantity.

M = C^(-1/2) * G^(-1/2) * h(1/2)
  = sqrt[ (planck constant) / { (gravitational constant) * (speed of light) } ].

How to read this: Mass is measured in square root of planck's over gravitational-speed of lights.

Representing Base Units as Multiples of Fundamental Constants

We already calculated mass above, and to spare the reader from all the math, I calculated the remaining base physical units and inserted them into the table below, as well as some other commonly used dimensions.

Description Base Units Representation
Mass M sqrt(h/(G*C))
Length L sqrt(G*h/C^(3))
Time T sqrt(G*h/C^(5))
Temperature H sqrt(h*C^(5)/G)/B
Area L^(2) G*h/C^(3)
Volume L^(3) sqrt((G*h)^(3)/C^(9))
Density M^(1)L^(-3) C^(4)/(G^(2)*h)
Velocity L^(1)T^(-1) C
Acceleration L^(1)T^(-2) sqrt(C^(7)/(G*h))
Momentum M^(1)L^(1)T^(-1) sqrt(C*h/G)
Force M^(1)L^(1)T^(-2) C^(3)/G
Energy M^(1)L^(2)T^(-2) sqrt(C^(3)*h/G)
Power M^(1)L^(2)T^(-3) C^(4)/G
Pressure M^(1)L^(-1)T^(-2) C^(6)/(G^(2)*h)


Let's finish this up by wrapping up what I originally did this research for and use one of these newly represented quantities. First, an easy example: If I'm driving at 60 miles per hour (~100 KPH), what is my velocity in the Blessed Unit System (BUS)? Start by defining what my units of velocity are. From the table above, speed is measured in C, or "speeds of light". 1 speed of light (or 1 C) is just over 1 billion kilometers per hour. Using this simple formula, we can convert from SI to BUS units.

Velocity(BUS) = Velocity(SI) / (C)
              = 100 / 1 000 000 000
              = 0.000 000 1

My driving speed is 0.0000001 velocity BUS. It doesn't matter if I converted from standard SI or US units, or football fields per millisecond - my driving speed will be 0.0000001 velocity BUS no matter what.

Now, let's measure my height in length BUS. Length BUS are measured in sqrt(G*h/C^(3)). My height is around 5'9", or about 1.75 meters, let's translate it into square root of gravitational-plank over speed of light cubes. We can use the same formula as last time to determine my height in length BUS.

Length(BUS) = Length(SI) / sqrt(G*h/C^(3))
            = 1.75 m / sqrt(6.674E-11 * 1.055E-34 / (3E8)^(3)) m
            = 1.75 m / 1.615E-35 m  <-- Planck length!
            = 1.084E35 Length(BUS)

As it turns out, 1 length BUS is equal to 1 planck length. From the math, I am 1.084E35 planck lengths tall. The truly amazing thing about this unit system, is that it is completely independent from human interventions (e.g. redefining the SI unit system) and can work anywhere in the universe. The only reason that I needed to determine a conversion rate from BUS to meters (which turned out to be the planck length) is because our measurement tools on Earth currently only support measuring US or SI units - but if we adopt the Blessed Unit System, there would no longer be a need for either US or SI units. My height is always 1.084E35 planck lengths regardless of what human (or other) unit system it's converted from.

The Problem With Dates

I have a problem with... dates. But probably not the date you're thinking. Not going out, not the fruit, but the instance of time. Why? Good question.


Let's start small, wait a second. Second? Not first? Why is our base unit of time called a second? After some research, I discovered that it is the second (2nd) division of 60 in an hour, the first division of 60 being a minute. This explanation does little to subside my rage. However, it is time to move on.


One minute passes every 60 seconds. You can write a mathematical function to relate seconds (s) and minutes (m):

m = 60 * s

Surprisingly, the factor of 60 does not bother me here. It works just as well as any other number, if not better, since 60 has its own factors of 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, and of course, 60. It is still a bit of a strange number, and the leading theory is that you can count up to 12 on one hand using your thumb to point to a finger segment, and using your other hand to count the number of 12's, up to 5 times 12, or 60.


One hour passes every 60 minutes. You like where this is going, right? You can also express hours (h) in terms of seconds - 60 to the second power. Curious.

h = 60 * m = 60 * (60 * s) = 60^2 * s

So far, we have a nice pattern. We can say one minute is 60 to the first hours, and one second is 60 to the second seconds. You can also invert that and say that one minute is 60 to the minus first hours, and one second is 60 to the minus second hours. There was such a nice thing going, and this is where it all falls apart.


One day is the length of time it takes for the Earth to make one full rotation about its axis. One day (d) is about 24 hours.

d = 24 * h

Not only does this break the beautiful pattern, but as it turns out, one Earth day is not exactly 24 hours.


One month (M) is about the length of time that corresponds to one cycle of the moon's phases. Also, it is 28 days. And 29 days. And 30 days. And 31 days. It is truly an awful unit of time measurement.


One year (Y) is the length of time for Earth to complete one revolution around the Sun. It is always exactly 12 months, which contain a variable amount of days. One year is about 365 or 366 days.


This is an awkward one. One week (w) is always 7 days, but it is not often used with our timekeeping system, except to define days which are working and nonworking days, and planned recurring events every 7 day interval. There are about 52 weeks in one year.

Time Zones and Daylight Savings Time

There are other ways to further complicate the measurement of time including 38 time zones which have offsets ranging from 15 minutes, 30 minutes, 45 minutes, and 1 hour from adjacent time zones. Some of which employ daylight savings time which shifts the local time usually by 1 hour for a portion of the year.

What we've learned so far

There are exact ways to express seconds to minutes, hours, days, and weeks. The numbers with an asterisk are approximated.

s m h d w M Y
s 1 60 3,600 86,400 604,800 2.4Mil~2.7Mil* 31.5Mil~31.6Mil*
m 1 60 1,440 10,080 40,320~44,640* 525,600~527,040*
h 1 24 168 672~744* 8,760~8,784*
d 1 7 28-31 365-366
w 1 4~5* 52*
M 1 12
Y 1

The cells containing "X" have an exact factor from one unit of time to another.

s m h d w M Y
s X X X X
m X X X
h X X
d X

It's clear that months and years cannot be easily converted into any other unit of time besides each other. How do we fix this?

Proposed Solution

Our timekeeping system is in desparate need of an overhaul. My motivations to create a universal timekeeping system are:

  1. Uniform time across all timekeeping devices
  2. Time system does not depend on any planet or solar system
  3. Every unit of time has a clearly defined, constant factor to convert to any other unit of time
  4. With the above true, time still tells us useful information about the position of our Sun and the tilt of Earth (time of day and season of year)

I'm realizing there's no easy way to do this. Some of my ideas involved completely remove time zones and daylight savings time, which are unnecessary obstacles in my plan.

I also need to define an "origin" of time, for example 0 AD, or the Unix Epoch (1970.) I considered using the big bang for the origin time = 0 and the heat death of the universe to be the final time, or time = 1. All decimal values in between would represent instances in time which is uniform no matter where you are in the universe. One issue with that is the heat death of the universe is googols of years after the birth of the universe, which is currently about 14 billion years old. Using my proposed timescale, we are at about time = 0.000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 001. Of course we could increase our timescale from 0 to 1, to 0 to googol. Another similar idea is using the total measurement of entropy to measure time. Turns out this is actually a theory with some issues with it.

Really large or small numbers can be "adjusted" using the metric prefixes using a base 10 number system.

For a dimensionless quantity like I'm proposing to use as the base unit of time, to make sense on a planetary scale, you would need to know the rotation and revolution speed of the planet you're on to make judgements and predictions on when the Sun will rise, and when the seasons change.

It's undeniably difficult to create a time system that satisfies all these requirements and is simpler than our currently outrageous timekeeping system. Once humans begin to colonize other planets, we'll be faced with this issue again, and won't have the time to plan one out that works. Have any ideas how we could make a universal timekeeping system? Send me an email using the link below!

Building My PC

Want to learn about my frustrating journey to building my second PC? Read on!

Part I: Diagnosis

Sometime in August 2023, my power shut off for a few hours when I wasn't home. I'm not sure if this was the reason, but when I returned home, my computer would no longer turn on. To be more precise, it was getting power, the fans were spinning, but none of the LEDs would light up, and of course, no signal to the monitor. I tried everything I could find online to fix my PC, including but not limited to...

The simple fixes:

  • Unplugging my PC and trying a different power outlet
  • Trying different HDMI cables
  • Use the motherboard's IO port, instead of the GPU's, in an attempt to run off the CPU's graphics software

The still-pretty-simple fixes:

  • Clearing the CMOS
  • Reseating the RAM
  • Making sure the interior of the case is dust-free

The mildly-annoying fixes:

  • Replacing the CMOS battery
  • Unplugging all the PSU cables from the motherboard and plugging them back in one by one

The complicated fixes:

  • Removing all components from the case
  • Unplugging all the front IO cables and manually jumping pins to turn on
  • Removing all components, only install those in order for the PC to POST
  • Try 1 stick of ram at a time

After all these were through and through with no visible progress made, I narrowed down the issue to the motherboard or CPU, and decided it was simply time for an upgrade. After thorough research, I picked out these components on PCPartPicker. The RAM, SSD, and PSU were salvaged from my current (previous) build. Remember this for later.

Part II: Rebuild

I ordered all my new parts through Amazon, and put it together extremely carefully. I made the best effort not to touch any pins or contacts and grounded myself before any instance I needed to handle the motherboard. The first thing I did was to remove the old case fans from my previous case to install on the new one. No problem.

Then, I did a minimal installation sitting atop a cardboard box. It's just the CPU and 1 stick of RAM, all connected to the power supply. After jumping the on/off pins, the fans spin up and the LEDs turned on. After connecting the HDMI cable, I get a signal, hooray! Surprisingly, no issues at all so far.

Things start to get a little tricky with the SSD and GPU - this motherboard has a heatsink for the SSD, which is very close to where the GPU sits. But again, after some finesse with the installation, they fit perfectly. After plugging the HDMI into the GPU and powering on, I luckily get an error message; turns out I forgot to supply power to the GPU fans. After fixing that, so far so good.

Next step is to install everything in the case, which is difficult due to the lack of clearance on 2 sides of the motherboard. I was terrified during this step, because it is nearly impossible to avoid touching pins/metal on the motherboard. Eventually I get everything screwed in thanks to a magnetic screwdriver.

The last step was to plug in all the front IO cables and hope for the best. This was difficult once again due to lack of clearance, I had to wiggle the cables just to sit on top of the pins, and gently push them in using pliers. After finding the power button (which blended into the case, I'm not proud of how long it took me...) the monitor received a signal! The only issue was the case LEDs not turning on. I tried a different set of pins, still no luck. I actually gave up on this, but later found out there was a small button on the case to turn them on! (Wow, this is embarrassing.)

So as of now, my fully-built computer turns on and sends a signal to the monitor.

Fun fact: I actually finished the build at around 2:00 AM. It was an extremely warm night and I couldn't sleep.

Part III: Backup

My SSD still has old files which I want to keep. It also contains my old OS, Windows and drivers for my old PC components. I read online that booting a new computer with a disk containing drivers built for your old components can potentially cause damage to your hardware. (E.g. voltage/current settings.) Despite the low risk, I did not want to risk this. So now I'm stuck with a disk I cannot boot into.

Luckily, my computer scientist friend taught me to create a bootable USB with Ubuntu OS, which access files on your disk. This is exactly what I did. I created a bootable USB using Kubuntu OS (22.04) and booted with that. I also had an empty flash drive to use for my backup files. The backup took forever, and actually froze at one point and I had to restart, but eventually it ran to completion.

Part IV: Install

After my files were backed up on a flash drive, I installed Kubuntu. It destroyed any data that was left over on the SSD and replaced it with the new operating and file systems. This should have been the end of story, but unfortunately, that couldn't be further from the truth.

Up until now, the hardware and software installs have been relatively straightforward, with no major hitches. From the first power-on with the new Kubuntu OS, it was stuck in the boot loader, which displays a low-resolution terminal called Grub. To actually complete the boot, I ran the following commands I found in this StackOverflow post.

set prefix=(hd0,gpt3)/boot/grub
set root=(hd0,gpt3)
insmod linux
insmod normal

After the OS finally finished booting up, I discovered all sorts of software problems, since my OS was still in "recovery mode." That post, as well as others, recommends a permanent fix by running sudo update-grub and sudo grub-install, or by installing the Boot Repair utility. None of these fixed the problem; every time I would reboot, my computer would get stuck in the boot loader stage. I attempted to re-install Kubuntu, twice (once with 3rd party drivers, and once with a minimal installation), and ran into the exact same issues both times.

From the error messages I received from the Grub commands and Boot Repair, I finally discovered that my SSD was using the incorrect file system type. At the moment I'm writing this, I cannot recall what file system type it was, but the Linux OS family uses the EXT4 file system type. There was an option in my motherboard's BIOS to format and sanitize the SSD. After this ran to completion, and reinstalling Kubuntu, it finally booted with no errors.

The only small catch was that my GPU was unrecognized, so I needed to install the corresponding driver for it.

Part V: Printer Shenanigans

Home stretch...

  • The hardware is fully built out
  • The software runs as intended
  • The OS boots completely every time
  • I've done some fun customization with on-board LEDs
  • Essential software is installed (GPU drivers)
  • "Essential" software is installed (VS Code, Brave, Inkscape...)
  • I've imported my backup from the flash drive

I own a Canon MX410 wireless printer, which is already connected to my network. My PC can "see" it, so I give it a try. No response from the printer, and the printer queue is immediately emptied. This is going to be fun, isn't it...

Kubuntu comes with several printer drivers pre-installed, but naturally the MX410 is not in the list. The next logical step is to check the Canon MX410 website, which contains not the driver itself, but source files, which need to be compiled and built. On first attempt, the build fails due to lack of dependencies. Usually, this is no problem, but two of those dependencies are libpng12 and libtff4, which are now deprecated for their newer versions 16 and 5 respectively. Of course, I install the newer versions, being the only option anyway. This doesn't satisfy the requirement, and since these versions are not found to download, I turn to other options. I explore the list of pre-installed Canon drivers and try some at random, with no results. OpenPrinting contains drivers for several legacy printers, but no luck again. That means it's time to track down the deprecated libraries and manually build the driver. Sure enough, someone on StackOverflow asked the exact thing I am trying to achieve (libpng12 and libtiff4). With some sweat and tears, and these commands...

tar zxvf cnijfilter-mx410series-3.50-1-deb.tar.gz
cd cnijfilter-mx410series-3.50-1-deb
sudo ./

...The driver built sucessfully, and the printer was finally conquered!

The birth of my 3 'main' websites

Hello, world! This is my first post on this website, although I may retroactively add some prior work. Today I had time to work on my own projects, and I finally knocked this one out of the way. Today marks the birth of my 3 'main' websites. Those being:

  1. This one:
  2. My photography website:
  3. And, my homepage: (or

At work, I recently learned about a technique to generate beautiful documentation using a software package called mkdocs. I immediately started playing around with it and discovered it can be used for so much more than code documentation. As of this article, all 3 of my mentioned websites are using mkdocs to build the website.

How does it work?

mkdocs takes input markdown files and generates a HTML and CSS code package that can be hosted at any modern web hosting service. GitHub Pages is a good solution, since it is free, and I am just generating static pages. The input markdown files can be extended to also include custom HTML and CSS, but unless you are trying to do something very specific, it's usually not necessary.

It also requires a "theme." There are a few builtin themes in mkdocs but there are several professional-quality themes that are built and maintained by the community. My favorite theme by far is mkdocs-material because of its extensive configuration options. I am using the same theme with similar configuration for all 3 of my websites. Notice its versatility, going from a blog, to a photography website, to a single-page portfolio.

Minor Differences

Each website had its own complications associated with building it initially. For each one, I had to set up a corresponding mkdocs.yml configuration file for mkdocs, and a .github/workflows/pages.yml workflow file to automatically stage, build, and deploy each website on every commit. Each of these files had minor (or major) differences going from one website to the next.


By far, this was the simplest configuration to implement. My goal was to remove the top bar entirely, but unfortunately this was not possible without additional CSS. (I wanted to avoid custom CSS to ensure not to overwrite any of the CSS rules generated by mkdocs.) However, I found it possible to remove the search bar, navigation bar, and table of contents, simply with this bit of YAML:

# mkdocs.yml
plugins: []

  - navigation
  - toc

The only other oddity in this setup was the profile image the Download Resume button. For both of those, I had to go against my previous statement and use custom CSS. Instead of including an entire stylesheet, I entered the style rules directly in using CSS selectors. This was made available by the attr_list extension. Here is my profile picture, as an example:

![Me](me.jpg){ style="max-width:200px;height:auto;float:right;" }


For this one, I had to install the blog plugin from mkdocs-material. At this point in time, it's not a full-fledged feature yet, so it is only compatible with the latest beta version of mkdocs-material. Unfortunately, the beta version of mkdocs-material takes about twice as long to install in the GitHub workflow (from about 10 seconds to 20, so not a huge issue.) The blog plugin also expects a different file structure by default, so I had to add some configuration to indicate which directory my blog posts are in, as well as additional configuration for the navigation dropdown menu.


By far this was the most complicated development. First I need to describe my planned process of maintaining this website:

  1. Take a new set of photos
  2. Create a new folder in my website directory that follows the pattern: YYYY/MM/Location
  3. Dump my photos in the new folder
  4. Rename the photo files to set their captions

In this process, I do not want to create any markdown files manually. I created a Python script to search for all image files and generate an entire package of markdown files to use in the website and execute mkdocs. This Python script carefully does not package any image files into the final website structure. Why? Each image is 1-10MB. Currently there are over 60 photographs on my website, still early in development. Taking an average case of 5MB per file, that makes 300MB total, or about 1/3 GB, not including any other files!

Originally, my Python script packaged all images in the website. I realized this was unsustainable early on, when the GitHub workflows were taking over 5 minutes just to upload the website! After I made the change to ignore the images, the total process start to finish takes around 30 seconds to 1 minute only!

But how does the website still render the photographs at all? I marked that GitHub repository as public, which means the files are publicly hosted for all to see. I modified the script from referencing local image files, to remote-hosted files, from my GitHub repository. Surprisingly, this actually made my website load even faster! Thanks, GitHub!