A bunch of changes

master
Tait Hoyem 7 months ago
parent 07036039c9
commit 29e24a0588

@ -0,0 +1,16 @@
---
title: "Dynasties & Interludes 2nd Edition"
layout: post
---
* 5 individuals have held over half the time as Canadian Prime Minister.
1. W.L. McKenzie King: 14%
2. John A. McDonald: 14%
3. Wilfred Laurier: 9%
4. Pierre Eliot Trudeau: 9%
7. John Defeinbaker: 7%
* And three other individuals are not far behind at a collective 21% of time in office:
1. Justin Trudeau: 7%
2. Jean Cretian: 7%
3. Stephen Harper: 7%

@ -1,10 +1,10 @@
- institution: "Athabasca University"
- institution: "University of Lethbridge"
level: "Bachelor's Degree"
name: "Bachelor's of Science in Computer Science"
years: "2021-2024"
description: "Theoretical underpinnings of a future goal: a Master's in Cybersecurity. General studies to round out technical knowledge. 100% online."
years: "2023-2025"
description: "Theoretical underpinnings of a future goal: a Master's in Cybersecurity. General studies to round out technical knowledge."
- institution: "Southern Alberta Institute of Technology"
level: "Diploma"
name: "Information Technology — Software Development Major"
name: "Diploma in Information Technology"
years: "2019-2021"
description: "Full-stack two year software development diploma. Focusing on databases, interface design, systems administration, security and enterprise solutions."
description: "Full-stack two year software development diploma. Focusing on databases, interface design, systems administration, security, and enterprise solutions."

@ -1,16 +1,25 @@
- company: "SAIT (Southern Alberta Institute of Technology)"
- company: "Matthew Campbell"
position: "Software Developer"
years: "May 2023-October 2023"
link: "#"
description: "Designer, developer and project manager of freedesktop.org's global Accessibility Portal. The portal solves multiple long-standing issues for accessibility on Linux, including support for screen reader key bindings in Wayland desktop environments and a permissions system similar to Android."
- company: "Oxfam Canada"
position: "Accessibility Consultant"
years: "December 2022-May 2023"
link: "https://oxfam.ca/"
description: "Brought in to fix accessibility issues related to meeting WCAG 2.0 AA standards based on an audit by a third-party. Use of advanced Wordpress add-on functionality along with completing detailed reports of the work done through git commits."
- company: "Southern Alberta Institute of Technology"
link: "https://sait.ca/"
position: "Instructor"
years: "June 2022-April 2023"
description: "Teaching two full-stack web-development courses. The basics of HTML and CSS to MySQL and PHP. A pinch of Javascript here and there."
years: "June 2022-December 2023"
description: "Instructor for courses covering everything from project and team management all the way to full-stack web development (LAMP, HTML, CSS, and JS)."
- company: "Bytetools Technologies Inc."
position: "Founder"
years: "2020-present"
description: "Providing institutions and individuals with the latest accessible technology in the form of transcription services and diagram creation tools. Mostly using WCAG standards, the Rust programming language, "
link: "https://bytetools.ca/"
description: "Providing institutions and individuals with the latest accessible technology in the form of transcription services and diagram creation tools. Using WCAG standards and the Rust programming language to produce structural-text and physical tactile diagrams for the blind."
- company: "Zone4 Systems Inc."
position: "Software Developer"
years: "June 2021-December 2021"
link: "https://zone4.ca/"
description: "Software development and QA for an international race timing company with a small team. Testing using Python's unittest and Selenium. Development done in Javascript and Tornado. Used the Bitbucket issue tracker and git service along with weekly team meetings to manage and discuss new ideas."
- company: "Independent"
position: "Private Tutor"
years: "2019-present"
description: "Working with computer science students explaining introductory to advanced concepts. Covering languages from C/C++, Java, Javascript, to Python and everything in between. Specialize in working with students with visual impairments."

@ -1,6 +1,9 @@
- name: "Odilia Screen Reader"
link: "https://odilia.app/"
description: "Significant contributor to a new screen reader for Linux, written in the Rust programming language. Using git and collaborating with two other contributors from around the world. Using the AT-SPI standard, DBus communication, and we submit upstream library contributions."
description: "Primary contributor to a new screen reader for Linux, written in the Rust programming language. Using git to collaborate with other developers from around the world. Using the AT-SPI accessibility standard over the DBus communication protocol. As part of this project, we also submit upstream library contributions to fix long-standing accessibility bugs."
- name: "atspi"
link: "https://crates.io/crates/atspi"
description: "Primary maintainer of the Rust language library for the AT-SPI specification. Using syn to create procedural macros and code generation. Follows semantic versioning (semver) v2.0, and uses automated Github CI tests to enforce high standards for code contribution. This library is also used as part of AccessKit, a library to implement accessibility for GUI applications in a cross-platform manner."
- name: "Simple Markdown Editor"
link: "https://tait.tech/md/"
description: "A simple online (and offline) browser-based markdown editor that supports the automatic creation of accessible math (MathML). Written in Javascript with the <a href=\"https://katex.org/\">KaTeX</a> library."

@ -1,6 +1,7 @@
---
title: "From Software Noob To Linux Accessibility Master"
layout: post
draft: true
code: true
tags: "atspi, dbus, dbus a11y, accessibility, a11y, linux, linux a11y"
---

@ -0,0 +1,146 @@
---
layout: post
draft: true
title: "A Libre Solution to Live Sharing"
---
Nothing irritates me more than when a relatively simple thing is not possible with free (libre) software.
Such is the case with sharing code with others, live.
## The Problem
Here is what I want:
I'd like to open a share session in a directory on my machine, have others be able to join it from their editor (via a plugin).
When you are logged in and connected to a session a user may be put in `RO` or `RW` mode to allow them permission to read and write.
Finally, a `.live` file should be produced using a similar format to `asciinema`, except slightly simplified.
This file will show the progression of the file or directory over time.
It shows everything from every character typed, deleted, retyped, files created, removed, all with timestamps as to when each action occurred.
### Why?
Everyone has different preferences and needs, including but not limited to: editor complexity (and ability), color scheme, internet speed caps, accessibility needs, etc.
While everyone can generally accommodate themselves on their own project, or when collaborating with others over a longer period of time (see: `git`),
these preferences and needs are *not* met when it comes to live sharing code.
### Existing Options
There are many existing programs, plugins and websites dedicated to sharing code on the fly.
Most of these offer a similar level of functionality whereby one person can share their code, and others can see what they're working on as the presenter changes the code.
However, if you've ever tried to use these systems, you may have noticed something:
*They don't work cross-editor*, nearly every single code-sharing platform I can find only allows you to share code if everyone is using the same editor.
"But Tait! What about [CodeTogether](https://www.codetogether.com/)? That's cross-editor!" you might say.
Unfortunately, it only supports cross-IDE development: Eclipse, VS Code, and IntelliJ;
it does not support basic editors like Pluma, vim and emacs.
"But Tait! What about [Floobits](https://floobits.com/)? It's cross-editor, supports Emacs and Neovim, and it's open-source!"
Sadly, no. It does support the various editors, and that is by far and away it's most exciting feature!
But it still isn't fully open-source. Only the plugins are open;
the server and deployment techniques are hidden from view.
Technically speaking, this is a simple problem to solve:
Create and share an open-source, self-hostable, simple implementation of live text-sharing code, and let the community take over as the needs of certain users get increasingly complex.
Of course, nobody will do this for some of the reasons I will explain down below.
## Making Money In Open-Source Development
Although most developers would have a fairly easy time creating a project like this over the course of six months to a year,
there is an obvious problem that comes up almost immediately when it comes to creating a set of open tools like this:
making money with open-source cat be quite the challenge.
It is certainly not impossible, look at the success of [SourceHut](https://sr.ht/), a self-hostable `git` server with an extensive plugin network.
The service isn't free, but you can self-host for free.
They also work on creating other open-source projects for consulting fees, trying to grow the ecosystem of FOSS tools.
With that said, the return on investment in terms of developer hours worked is often very slim when creating products on this model.
Let's take a theoretical example:
Support one were to pour their free-time efforts for six to twelve months into a project like what I mentioned earlier.
Imagine they were able to establish a corporation, figure out financials, *and* create a viable product for the end-user.
The developer has, by now, used: let's say on average ten hours a week on this project.
Let's multiply that by 52, since that's the number of weeks in a year:
that's 520 hours of work, or about 13 weeks of full-time work---completely unpaid.
This is a huge risk for a developer to take.
They must sacrifice their free time with family, friends, and hobbies to dedicate their time to a cause they care about, but no *no* (guarentees TODO) as to how much they will make in the future.
If given the option between the scenario above, and working a full-time development job o pay the bills,
which would you rather choose?
I know my decision wouldn't take long.
So who would be wild enough to work on such a difficult project for (potentially) such a small amount of money?
1. Those who are attempting to start their career in tech and want examples of professional work experience.
2. People who are passionate about their project.
3. People with extra time on their hands.
I fall into the first and second categories, personally.
Do you fall into any of these?
Some of the most difficult times in one's career (so I'm told) are those times where you decide that something is worth the risk.
And for those with a passion or career drive, why not accept some risk for the possibility of significant reward.
> "No risk, no reward"
> ---A Guy At The Gym
## The Solution
With that large aside over, let's take a look at what I'm envisioning this system to look like as a user and as a developer.
I'll split this into two section for each respective type of user.
### End User
For the end user, you can use the following features:
1. Record and broadcast your file edits live by plain text.
2. You may (optionally) join this with an audio stream to supplement your viewers' experience.
3. You may use any editor, IDE, or even notepad++.
4. These recordings and live-streams can record and stream entire directories of information.
5. There are some minor restrictions:
* Binary files will not be transmittable for multiple security reasons. This includes .zip files, .jar, and .exe files.
* The "free" hosting solution will only be able to handle ~10 viewers per stream, and can only live-share code under 1MB in size, since otherwise it will require too much RAM.
6. A self-hosted server may be spun up the user's machine at any time if they have the know-how to get others connected directly to their computer.
If you want more: pay-up or self-host.
This seems pretty reasonable to me.
### Developers
Developers will be ecstatic to hear that this will use a very simple method of holding all this data.
Here's an example of the format;
note that the "file" key is relative to the root directory being shared:
```json
{
"files": [
{"file":"/accounts/models.py","id":1},
{"file":"/accounts/views.py","id":2},
...
],
"version": "1.0",
"starting_content": [
{
"id": 1,
"content": "..."
},
...
],
}
// this begins the live-streaming, whereby users may view the steeam on a line-by-line basis, or skip to a specific point in time to view details about the file at a certain timestamp. Think of it like video timestamps.
{"id":2,"action":"del","line":10,"char":22,"len":5}
{"id":1,"action":"ins","line:23,"char":4,"text":"# quality"}
// Each line represents an action done to one of the files at some point in time.
// In theoy, you could even have edtiors use this information to update their files on the fly if two people have the file open at the same time.
// the OS should probably stop you from doing this, but at least you could get the editors to communicate if you wanted.
```
In `serde` terms, this would be an untagged enum of possible actions as well as their arguments.
This is a prototype idea that I have created a repo for called `livetext`, which is a silly name;
I'll rename this when I come up with something better.
Check out the repo [here](https://git.tait.tech/tait/livetext/).
Send some PRs, and let's see if we can create the next generation of code-sharing technology.
So long and thanks for all the fish!
Happy live-hacking!

@ -0,0 +1,125 @@
---
title: "Open Assistive Technologies"
draft: true
layout: post
---
I haven't been on this earth very long,
but I can notice a trend when it's right in front of me.
Open-source and [libre](https://www.gnu.org/philosophy/free-sw.html) assistive technologies are being abandoned in front of our very eyes.
## Exceptions
This is not to say that the tremendous effort of [Federico Quintero](https://viruta.org/fixing-test-coverage.html) is not appreciated.
Nor is this an insult to the outstanding efforts of [Joanne Diggs](https://wiki.gnome.org/JoanmarieDiggs) who works on the Orca screen reader.
The [GNOME Accessibility Team](https://wiki.gnome.org/Accessibility) has done fantastic things with the funding that has been provided them.
I applaud their efforts at focusing on creating a free and open desktop that is accessible.
But even then, just last week I heard that one of the primary architects in the accessibility world did not have their contract renewed.
And one at a time, funding for accessibility continues its decline.
## Microsoft, Google, Apple
The biggest technology companies in the world are able to spend a fraction of a fraction of a percent of their revenue to put together an accessibility team.
Global, multi-trillion dollar companies are easily able to fund the accessibility of their platforms.
Their efforts are divided;
their efforts are duplicated;
their efforts are dwarfed by their primary goal: to make a profit from their users by selling their data.
Your preferred company is complicit in this.
Despite their fantastic accessibility and "focus on privacy", now even Apple is offering ads on their users' phones.
Since Apple locks down their accessibility infrastructure, there is nobody who can extend this functionality to better and greater things.
Only Apple, *not their customers* have a say in how accessibility functions on their device.
## Proprietary Technology
This principle does not only apply to the tech giant.
All public for-profit companies benefit exclusively from driving up dividends for their shareholders.
They do not profit from accessibility;
they do not profit from putting the user first;
they only profit by selling your data.
People who require accessibility features, those I will from now on call "the needers", since they *need* accessibility tools to complete day-to-day tasks--they do not have a choice in their system.
In theory, they *could* choose Android or they could load their computer with Linux.
But the option is not attractive for a variety of reasons, including accessibility.
Inside the Linux bubble, there are those who want to see Linux take off as a desktop computing experience.
This is a surprisingly popular opinion.
To them, software freedom is defined by the freedoms as they are defined by the [FSF](https://fsf.org).
1. The freedom to run the code for any purpose.
2. The freedom to modify the code as they see fit.
3. The freedom to redistribute copies so you can help others.
4. The freedom to redistribute your modified version of the code.
These may seem very abstract for a non-technical person, but I will help it make sense for you as a user.
1. The freedom to run an app for any reason you want.
* Does not allow any individual or company to stop you from running the apps you want.
2. The freedom for others, let's say your technically-inclined child or sibling, to help you modify the program to fit your needs just that *little* bit more.
* You know that feeling when you think "Man! Do I ever wish that ABC could do XYZ!"
* This would grant you that freedom, as long as you know somebody knowledgeable enough to do it.
3. The freedom (and requirement) to share copies of your changes. This also encompasses freedom 4.
* The changes created by your friend, colleague, or family member must be shared to the public; you can not take that change for yourself. You *must* give back.
* This clause is generally why big companies don't like the GPL.
## Selling Openness
Here's a fact: it is not profitable to sell free software.
It's in the name!
Although free-software fanatics would prefer your use the term "libre" or "gratis" instead of "free"---it misses the point that software that is free to download is very hard to sell, and especially so to technically-inclined users that know how to build programs from their source code.
That said, there are at least a few companies [1](https://redhat.com/)[2](https://sr.ht/) which have managed to make it using the <abbr title="Software-as-a-Service">SaaS</abbr> and <abbr title="Enterprise-as-a-Serice">EaaS</abbr> models.
Specifically, [SourceHut](https://sr.ht/) uses the SaaS business model: the software is free, but to host on their servers is not.
Also note that this is a payed-only service.
This is something you don't see much of in the open-source game.
I think normalizing the cost of services to the consumer is a great idea!
Maybe a free trial for a code sharing service would make sense,
but not everything needs to be a charity,
and making money through open-source software is possible if you structure your business a certain way.
Let me talk about a few of the ways open-source businesses can create *better* products, especially if they don't have a free trail.
### Advantages
1. You do not need to rely on advertising to subsidize their free tiers of service. This makes the experience better for the consumer, from a privacy, simplicity and an UX standpoint.
2. The software can be improved by people who care about your mission, and you don't even *need* to pay them. Obviously, a small stipend to amazing people sending large patches should be considered. You essentially get free marketing and development work from the community.
3. Freedom to follow what's best for your users. Without venture capital or sponsors telling your how to run your service, you get to take feedback from your users and actually implement it. You don't need to balance your users' needs with those of who actually pays you.
### Disadvantages
With any upside, there is a downside.
Let's begin with the most obvious.
1. Investors are extraordinarily hard to find. Open-source projects like SourceHut or RedHat generally don't have a business model that can sustain exponential growth, and this takes away from a lot of the possible initial funding.
2. (Due to 1), the upfront cost before you can receive buy-in from average users is very high. Nobody wants to use a git server that doesn't have merge requests, an advanced permission system, etc.
3. Licensing. Licensing as an open-source business can be complicated. We'll give this its own section, since it is quite involved.
#### Licensing
Depending on the type of license chosen for your codebase, there are some complications as to how you can use this to make money.
It also adds restrictions on how others may make money with your software.
Let's discus three categories of licenses: permissive, copyleft, and file-based copyleft.
* Permissive -- a permissive license generally allows other individuals and companies to use your code as they please, with the only restriction being a notice that you wrote some of the software. Licenses in this category are the MIT license and most BSD licenses.
* Copyleft -- a copyleft license allows others to take your code for their own purposes, but with the exception that any modifications that they make to the code must be made public. This (usually) includes calling libraries functions from other code.
* File-based copyleft -- this type of license is more-or-less unique to the Mozilla Public License. It makes a compromise: anyone can use your code for any purpose, including a closed-source, for-profit system, but they may not modify your original code; they may only add new files to the program. Changing a file which was created by you is allowed, but only if they share those changes that you created with you so that you may improve the software.
For individual hobby projects, and even for small commercial projects, the GPL makes a lot of sense.
It allows anyone to use your code, as long as the advancements and improvements generated by others can be openly shared.
For large-scale enterprise software, however, it can be a little complicated.
I mentioned earlier the different models of open-source businesses: Support/Software-as-a-Service, and Enterprise-as-a-Service (where you implement custom, proprietary functionality to your own tools, for profit).
The Software/Support-as-a-Service models are compatible with copyleft licensing.
It's simple: we offer software for free, and those who want to deployed instance and want to support the development will pay the developer to make it happen.
Things get quite tricky for the Enterprise-as-a-Service model, however.
Implementing custom features and proprietary components to a system can be incredibly profitable, especially for tools where you do not maintain the original codebase, but only extend what is there.
A copyleft license does indeed stop this from happening.
Some may say that this is the entire point of the copyleft license: to stop a big company like Apple from taking your work, including it in their operating system, and not paying you a cent.
Others say that there are points to be made for private, internal business use-cases where it makes sense to have a license that allows modification of the software in a proprietary context.
So let's reach a compromise.
TODO: CITATION NEEDED
The Mozilla Public License allows for the *addition* of new files to a project, or extensions for the project to be created using any license deemed acceptable.
The only thing it does not allow is for anyone to modify the original files supplied in the codebase.
Modification, or addition to these files must be shared with the original author to make their codebase better for everyone.
Personally, I find this very convincing.
TODO WHY?

@ -1,5 +1,5 @@
<nav>
{% for item in site.data.nav %}
<a href="{{ item.link }}" class="nav-link" {% if item.link == page.url %} class="on-page"{% endif %} {% if item.new_tab == true %} target="_blank" rel="noopener noreferrer" {% endif %}>{{ item.name }}</a>
<a href="{{ item.link }}" class="nav-link" {% if item.link == page.url %} aria-current="page" class="on-page"{% endif %} {% if item.new_tab == true %} target="_blank" rel="noopener noreferrer" {% endif %}>{{ item.name }}</a>
{% endfor %}
</nav>

@ -57,3 +57,6 @@ Things are (slowly) looking up for audio (and eventually screen-reader support)
Phew! Glad I'm not the only one thinking about this!
Happy UEFI hacking :)
* UPDATE #1: [They failed to complete the implementation by the end of GSoC](https://listman.redhat.com/archives/edk2-devel-archive/2022-April/048197.html)

@ -4,10 +4,11 @@ layout: post
math: true
---
During a recent run-in with the Simon Fraser Fraser University accessibility department,
I learned that they're writers are so well-trained as to write "image" where a simple diagram is shown,
During a recent run-in with the a university accessibility department,
I learned that they're writers lacked somewhat in their abilities.
They wrote "image" where a simple diagram is shown,
and "print out picture of output" where a piece of code lies.
I figure the geniuses over there could use some help creating files for the visually impaired.
I figure they could use some help creating files for the visually impaired.
Here's a quick guide!
## Diagrams

@ -0,0 +1,50 @@
---
layout: post
title: "How To Fix \"Out Of Bounds Pointer\" Error with GRUB"
---
Here's the process:
## Use `efibootmgr` to remove all boot messages.
<pre class="terminal">
$ efibootmgr
BootCurrent: 0000
Timeout: 5 seconds
BootOrder: 0000,2001,0002,2002,2003
...
$ # now take the IDs from the BootOrder line and remove each of them using the following commands
$ efibootmgr -b 0000 -B
$ efibootmgr -b 2001 -B
$ efibootmgr -b 0002 -B
$ efibootmgr -b 2002 -B
$ efibootmgr -b 2003 -B
</pre>
This tells your EFI system that there are no EFI entries to boot into.
Don't worry, this will get repopulated later.
## Remove `/boot/EFI/` and `/boot/grub/`
To remove all EFI boot images and all grub configurations, run the following command:
<pre class="terminal">
# rm -rf /boot/EFI/ /boot/grub/
</pre>
## Re-install `grub`
Re-install the GRUB bootloader, along with its config files.
<pre class="terminal">
# grub-install --efi-directory=/boot
# grub-mkconfig -o /boot/grub/grub.cfg
</pre>
## Conclusion
This should fix the issue, since it clears out all grub and EFI entries.
I had to re-install grub through my package manager, and change a few settings that I had set up for <abbr title="Full-Disk Encryption">FDE</abbr>.
If this is helpful, you can let me know by sending me an email, by [contributing to a project I work on](https://github.com/TTWNO/), or [sponsoring me to work on open-source technology](https://liberapay.com/tait/).
Happy GRUB hacking!

@ -0,0 +1,17 @@
import init, { roll } from "/assets/js/dice/pkg/roll_lib.js";
const result = document.querySelector("#result");
const input = document.querySelector("#input");
init().then(() => {
const update_result = (ev) => {
if (event.key != "Enter") {
return true;
}
result.innerText = roll(ev.target.value);
}
input.addEventListener("keydown", update_result);
});

@ -0,0 +1,32 @@
---
title: "Simple Dice Program"
layout: simple
---
{% contentfor extrahead %}
<script defer type="module" src="/assets/js/dice/handlers.js"></script>
{% endcontentfor %}
# Tait's Dice Tool
## Version Information
* Tait's Dice Tool (v2.0)
* Caith (v4.2.3)
## Instructions
* Type in the box using this format: `XdY`
* Where `X` is the number of dice,
* and `Y` is the number of sides of each dice.
* For example, `5d10` will roll 5 dice with 10 sides each.
* The result will be spoken to you automatically.
## Dice Roller
<label for="input">Dice input:</label>
<input id="input"/>
<label for="reuslt">Result:</label>
<span id="result" aria-live="polite"></span>

@ -7,7 +7,7 @@ description: "Tait Hoyem's website. The home of accessible, simple and secure co
<h1>Tait Hoyem</h1>
<p>I have four goals in my software development career:</p>
<p>I have three goals in my software development career:</p>
<ol>
<li>Strong adherence to the <a href="http://www.catb.org/~esr/writings/taoup/html/ch01s06.html">UNIX principles</a> of software design.</li>

@ -5,41 +5,33 @@ title: "Resume"
<h1 class="center">Tait Hoyem</h1>
## Experience
<ul class="clear-list">
{% for job in site.data.experience %}
<li>
<strong>{{ job.company }}</strong> &mdash; <em>{{ job.position }}</em> ({{ job.years }})
<h3>{{ job.position }}</h3>
<strong>{{ job.company }}</strong> &mdash; {{ job.years }}
<p>{{ job.description }}</p>
</li>
<p>{{ job.description }}</p>
{% endfor %}
</ul>
## Education
<ul class="clear-list">
{% for education in site.data.education %}
<li>
<strong>{{ education.institution }}</strong> &mdash; {{ education.level }} / <em>{{ education.name }}</em> ({{ education.years }})
<h3>{{ education.name }}</h3>
<strong>{{ education.institution }}</strong> ({{ education.years }})
{{ education.description | markdownify }}
</li>
{{ education.description | markdownify }}
{% endfor %}
</ul>
## Projects
<ul class="clear-list">
{% for project in site.data.projects %}
<li>
<strong><a href="{{ project.link }}">{{ project.name }}</a></strong>
<p>{{ project.description }}</p>
</li>
{% for project in site.data.projects %}
<h3><a href="{{ project.link }}">{{ project.name }}</a></h3>
<p>{{ project.description }}</p>
{% endfor %}
</ul>
## Skills
{% for list in site.data.skills %}
<h3>{{ list.section }}</h3>
<h3>{{ list.section }}</h3>
<ul>
{% for skill in list.skilllist %}
<li>{{ skill.skill }}</li>

Loading…
Cancel
Save