Add new post

master
Tait Hoyem 3 years ago
parent 82857b64f4
commit 7331fb5e90

@ -1,107 +0,0 @@
---
title: "The \"Quiz Your Friends\" XSS Exploit"
layout: post
---
## TODO write intro
## How I Found This Exploit
While filling in one of my friend's surveys I thought it would be
funny for them to know it is me without anyone else knowing.
We were young and had `Inspect Element`ed a few things together,
so it was a safe bet that an HTML joke would let them know.
I decided to write my name like so: `<b>Steve</b>`.
Steve is in reference to the [main character](https://minecraft.gamepedia.com/Player) in the video game Minecraft.
<figure>
<img src="/assets/img/qyf-xss/2-bold.png">
<figcaption>
<p>Me typing in my name as <span class="mono">&lt;b&gt;Steve&lt;/b&gt;</span>.</p>
</figcaption>
</figure>
Now in theory this should have shown in in the leaderboard as: "&lt;b&gt;Steve&lt;/b&gt;"
However, to my horror and excitement, I saw this in the leaderboard:
<figure>
<img src="/assets/img/qyf-xss/3-steve-board.png">
<figcaption>
<p><span class="mono">&lt;b&gt;Steve&lt;/b&gt;</span> displaying in the leaderboard as bold text: <b>Steve</b></p>
</figcaption>
</figure>
The text "Steve" showed up **in bold** on the leaderboard.
This told me all I needed to know.
How did this happen? You might wonder.
### Server-Side Validation
Here is a great demonstration why you should do most of your validation on the server side.
As a user, I can edit any of the HTML, CSS, or Javascript your server serves to me.
Quiz your friends uses the `maxlength=20` HTML attribute on the name input field.
Imagine trying to fit in a script tag doing anything useful with 20 characters! Don't forget that includes the `<script>` tag.
That would leave 13 characters for Javascript.
Although I'm sure a genius would be able to [code golf](https://code.golf/) that, I know I couldn't.
Now obviously I can edit any HTML that a server has sent to me.
If I open up my inspect element window, I can go ahead and change that `maxlength` attribute to anything I want.
Let's change it to 100!
<figure>
<img src="/assets/img/qyf-xss/5-maxlength.png" alt='An image of the Quiz Your Friends name input field with inspect element. THe code reads: <font class="style6"><input class="inputbutton" name="takername" type="text" id="takername" maxlength="20" width="425" placeholder="Your First Name" style="text-align: center; text-decoration:inherit; font-size:38px;" tabindex="-1"></font>'>
<figcaption>
Manually changing the maxlength attribute.
</figcaption>
</figure>
In theory, there is a way that a site can stop people from just putting in their name of any length: server-side validation.
The server *could* check to see if the input is too long and reject it if it is.
The Quiz My Friends server has *no such checks in place*.
Therefore, I can send an almost arbitrary load to them.
Being able to send something potentially very large (more than a few megabytes) is a vulnerability of its own.
Imagine being able to send entire executable programs as your "name" in one of these quizzes?
#### Hacking:
So I went on my merry way thinking about ways to use malicious javascript.
Then, I thought that might be mean, so I decided to warn users instead.
I filled in the name with a script tag and a call to `alert()` to warn the user about this site.
`JAVASCRIPT_NAME.JPG`
I ran out of room before I could finish it. Hmmm.
What if I do "Inspect Element" and manually override the max-length attribute?
The unfortunate truth is: this worked as well!
Not only could I manually set the max-length by changing it in the HTML,
but there were no client-side OR server-side checks to make sure the name I was sending was less than or equal to 20 characters.
If Javascript checked it, it would have stopped me (although maybe not a professional).
If the server checked it, it could have stopped almost anyone.
## Executing An Exploit
Suppose we're on a vulnerable site like [Quiz Your Friends](https://www.quizyourfriends.com/)
and you decide you want to hack your friend's quiz!
How can this be done?
#### Creating A Quiz
Here is my quiz below:
`CREATING_QUIZ.IMG`
#### Setting A Name With an HTML Tag
Just like the image above, about how I found out about this vulnerability: go ahead and use an HTML tag in your name to test this out.
`BOLD_ITALIC_STEVE.JPG`

@ -1,149 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>The "Quiz Your Friends" XSS Exploit | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">The "Quiz Your Friends" XSS Exploit</h1>
<time datetime="" class="post-date"></time>
</header>
<hr>
<h2 id="todo-write-intro">TODO write intro</h2>
<h2 id="how-i-found-this-exploit">How I Found This Exploit</h2>
<p>While filling in one of my friends surveys I thought it would be
funny for them to know it is me without anyone else knowing.
We were young and had <code class="language-plaintext highlighter-rouge">Inspect Element</code>ed a few things together,
so it was a safe bet that an HTML joke would let them know.</p>
<p>I decided to write my name like so: <code class="language-plaintext highlighter-rouge">&lt;b&gt;Steve&lt;/b&gt;</code>.
Steve is in reference to the <a href="https://minecraft.gamepedia.com/Player">main character</a> in the video game Minecraft.</p>
<figure>
<img src="/assets/img/qyf-xss/2-bold.png" />
<figcaption>
<p>Me typing in my name as <span class="mono">&lt;b&gt;Steve&lt;/b&gt;</span>.</p>
</figcaption>
</figure>
<p>Now in theory this should have shown in in the leaderboard as: “&lt;b&gt;Steve&lt;/b&gt;
However, to my horror and excitement, I saw this in the leaderboard:</p>
<figure>
<img src="/assets/img/qyf-xss/3-steve-board.png" />
<figcaption>
<p><span class="mono">&lt;b&gt;Steve&lt;/b&gt;</span> displaying in the leaderboard as bold text: <b>Steve</b></p>
</figcaption>
</figure>
<p>The text “Steve” showed up <strong>in bold</strong> on the leaderboard.
This told me all I needed to know.
How did this happen? You might wonder.</p>
<h3 id="server-side-validation">Server-Side Validation</h3>
<p>Here is a great demonstration why you should do most of your validation on the server side.
As a user, I can edit any of the HTML, CSS, or Javascript your server serves to me.</p>
<p>Quiz your friends uses the <code class="language-plaintext highlighter-rouge">maxlength=20</code> HTML attribute on the name input field.
Imagine trying to fit in a script tag doing anything useful with 20 characters! Dont forget that includes the <code class="language-plaintext highlighter-rouge">&lt;script&gt;</code> tag.
That would leave 13 characters for Javascript.
Although Im sure a genius would be able to <a href="https://code.golf/">code golf</a> that, I know I couldnt.</p>
<p>Now obviously I can edit any HTML that a server has sent to me.
If I open up my inspect element window, I can go ahead and change that <code class="language-plaintext highlighter-rouge">maxlength</code> attribute to anything I want.
Lets change it to 100!</p>
<figure>
<img src="/assets/img/qyf-xss/5-maxlength.png" alt="An image of the Quiz Your Friends name input field with inspect element. THe code reads: &lt;font class=&quot;style6&quot;&gt;&lt;input class=&quot;inputbutton&quot; name=&quot;takername&quot; type=&quot;text&quot; id=&quot;takername&quot; maxlength=&quot;20&quot; width=&quot;425&quot; placeholder=&quot;Your First Name&quot; style=&quot;text-align: center; text-decoration:inherit; font-size:38px;&quot; tabindex=&quot;-1&quot;&gt;&lt;/font&gt;" />
<figcaption>
Manually changing the maxlength attribute.
</figcaption>
</figure>
<p>In theory, there is a way that a site can stop people from just putting in their name of any length: server-side validation.
The server <em>could</em> check to see if the input is too long and reject it if it is.
The Quiz My Friends server has <em>no such checks in place</em>.
Therefore, I can send an almost arbitrary load to them.
Being able to send something potentially very large (more than a few megabytes) is a vulnerability of its own.
Imagine being able to send entire executable programs as your “name” in one of these quizzes?</p>
<h4 id="hacking">Hacking:</h4>
<p>So I went on my merry way thinking about ways to use malicious javascript.
Then, I thought that might be mean, so I decided to warn users instead.
I filled in the name with a script tag and a call to <code class="language-plaintext highlighter-rouge">alert()</code> to warn the user about this site.</p>
<p><code class="language-plaintext highlighter-rouge">JAVASCRIPT_NAME.JPG</code></p>
<p>I ran out of room before I could finish it. Hmmm.
What if I do “Inspect Element” and manually override the max-length attribute?</p>
<p>The unfortunate truth is: this worked as well!</p>
<p>Not only could I manually set the max-length by changing it in the HTML,
but there were no client-side OR server-side checks to make sure the name I was sending was less than or equal to 20 characters.</p>
<p>If Javascript checked it, it would have stopped me (although maybe not a professional).
If the server checked it, it could have stopped almost anyone.</p>
<h2 id="executing-an-exploit">Executing An Exploit</h2>
<p>Suppose were on a vulnerable site like <a href="https://www.quizyourfriends.com/">Quiz Your Friends</a>
and you decide you want to hack your friends quiz!
How can this be done?</p>
<h4 id="creating-a-quiz">Creating A Quiz</h4>
<p>Here is my quiz below:</p>
<p><code class="language-plaintext highlighter-rouge">CREATING_QUIZ.IMG</code></p>
<h4 id="setting-a-name-with-an-html-tag">Setting A Name With an HTML Tag</h4>
<p>Just like the image above, about how I found out about this vulnerability: go ahead and use an HTML tag in your name to test this out.</p>
<p><code class="language-plaintext highlighter-rouge">BOLD_ITALIC_STEVE.JPG</code></p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020-04-27-quiz-your-friends-xss/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>

@ -1,96 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Padding And Margin | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Padding And Margin</h1>
<time datetime="20-01-22" class="post-date">Wednesday, January 22 2020</time>
</header>
<hr>
<p>Many people have expressed confusion over how padding and margins work in HTML/CSS. I have been one of those people. In this short article I will explain what the differences are between the two, and how it may affect the functionality of your site.</p>
<p>Here is an image from the World Wide Web Consortium (W3C) who sets the standards for the web.</p>
<p><img src="/assets/img/w3c-padding-margin.png" alt="The W3C standard for padding, margin, borders and width. Width encompases the inner element + padding; the border then encompases it. The margin is the space beyond the border and in between other elements." title="W3C border, padding, margin standard." /></p>
<p>Now although this image shows all the different types of spacing as equal, the majority of the time these will mostly be padding (inner) and margin (outer). Padding is the inner space between the element and its border; margin is the outer space between two different elements.</p>
<p>Within the margin the user is unable to press any links or execute any javascript code. It is <em>empty</em> space. If each <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> on your navigation bar has 10 pixels of margin, then there would be 20 pixels in between each <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> that would <em>not</em> be clickable by the user.</p>
<p>If you have <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code>s on your navigation bar with <em>padding</em> set to 20 pixels, however, then there will be 20 pixels on each side of the <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> text where the user <em>is</em> able to click.</p>
<p>If that part is confusing, try thinking about it in terms of whether <code class="language-plaintext highlighter-rouge">background-color</code> would apply.</p>
<table>
<thead>
<tr>
<th>Attribute</th>
<th><strong>Padding</strong></th>
<th><strong>Margin</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Spacing</td>
<td>within element</td>
<td>between elements</td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">background-color</code> applies</td>
<td>Yes</td>
<td>No</td>
</tr>
</tbody>
</table>
<p>In summary:</p>
<ul>
<li><strong>Padding</strong>: the space within a tag which is still part of the same tag. <code class="language-plaintext highlighter-rouge">background-color</code> applies.</li>
<li><strong>Margin</strong>: the space in between two seperate tags. <code class="language-plaintext highlighter-rouge">background-color</code> does not apply; it is empty space.</li>
<li><strong>Border</strong>: the space in between the two; it surrounds the padding, but is not the margin. It looks nice somtimes, but it has no non-visual function. <code class="language-plaintext highlighter-rouge">background-color</code> does not apply.</li>
</ul>
<p>I hope this covers the basics of margin and padding! Happy coding!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/01/22/padding-and-margin/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Padding And Margin | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Padding And Margin</h1> <time datetime="20-01-22" class="post-date">Wednesday, January 22 2020</time> </header> <hr> <p>Many people have expressed confusion over how padding and margins work in HTML/CSS. I have been one of those people. In this short article I will explain what the differences are between the two, and how it may affect the functionality of your site.</p> <p>Here is an image from the World Wide Web Consortium (W3C) who sets the standards for the web.</p> <p><img src="/assets/img/w3c-padding-margin.png" alt="The W3C standard for padding, margin, borders and width. Width encompases the inner element + padding; the border then encompases it. The margin is the space beyond the border and in between other elements." title="W3C border, padding, margin standard."/></p> <p>Now although this image shows all the different types of spacing as equal, the majority of the time these will mostly be padding (inner) and margin (outer). Padding is the inner space between the element and its border; margin is the outer space between two different elements.</p> <p>Within the margin the user is unable to press any links or execute any javascript code. It is <em>empty</em> space. If each <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> on your navigation bar has 10 pixels of margin, then there would be 20 pixels in between each <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> that would <em>not</em> be clickable by the user.</p> <p>If you have <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code>s on your navigation bar with <em>padding</em> set to 20 pixels, however, then there will be 20 pixels on each side of the <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> text where the user <em>is</em> able to click.</p> <p>If that part is confusing, try thinking about it in terms of whether <code class="language-plaintext highlighter-rouge">background-color</code> would apply.</p> <table> <thead> <tr> <th>Attribute</th> <th><strong>Padding</strong></th> <th><strong>Margin</strong></th> </tr> </thead> <tbody> <tr> <td>Spacing</td> <td>within element</td> <td>between elements</td> </tr> <tr> <td><code class="language-plaintext highlighter-rouge">background-color</code> applies</td> <td>Yes</td> <td>No</td> </tr> </tbody> </table> <p>In summary:</p> <ul> <li><strong>Padding</strong>: the space within a tag which is still part of the same tag. <code class="language-plaintext highlighter-rouge">background-color</code> applies.</li> <li><strong>Margin</strong>: the space in between two seperate tags. <code class="language-plaintext highlighter-rouge">background-color</code> does not apply; it is empty space.</li> <li><strong>Border</strong>: the space in between the two; it surrounds the padding, but is not the margin. It looks nice somtimes, but it has no non-visual function. <code class="language-plaintext highlighter-rouge">background-color</code> does not apply.</li> </ul> <p>I hope this covers the basics of margin and padding! Happy coding!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/01/22/padding-and-margin/">beta.tait.tech</a>. </footer> </div> </body> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,75 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How To Encrypt Your Own Documents Using gpg | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">How To Encrypt Your Own Documents Using gpg</h1>
<time datetime="20-04-06" class="post-date">Monday, April 06 2020</time>
</header>
<hr>
<p>If you have ever wanted to garuntee the utmost security of your emails and documents, then this is the guide for you!
It should be noted that in some circles the tools used are more common than in others.
These are the everyday tools of many privacy advocates and computer nerds.</p>
<p>If you have never used Linux however, then the method of doing this will be rather unfamiliar.
This tutorial will be done on an <a href="https://archlinux.org/">Arch Linux</a> machine,
but it should be the same on Ubuntu, Fedora, CentOS, Debian,
OpenBSD, FreeBSD, MacOSX, etc.
The only operating system that does not include these tools by default (or easily accessible) is Windows.</p>
<p>This tutorial makes heavy use of the terminal.
You have been warned.</p>
<p><em>Let us…begin!</em></p>
<h2 id="glossary">Glossary</h2>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Binary-to-text_encoding#ASCII_armor"><strong>ASCII armour</strong></a> — A way to encode <strong>OpenPGP</strong> documents so they are readable by humans. These files end in .asc</li>
<li><strong>(Open)PGP</strong> — An open standard for encoding pulbic keys and encrypted documents.</li>
<li><strong>GPG</strong> — GNUPrivacyGaurd is an implementation of <strong>OpenPGP</strong>. It is installed by default on most Linux distrobutions.</li>
</ul>
<h2 id="step-0-setup">Step 0: Setup</h2>
<p>We will be using the utility <code class="language-plaintext highlighter-rouge">gpg</code> for this tutorial.</p>
<p>The other thing to note: The character $ (dollar sign) is usually not typed when shown in a command.
It simply indicates that you do not need administrative privilages to run these commands.</p>
<p>Test to see if you get this output in your terminal.</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>How To Encrypt Your Own Documents Using gpg | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">How To Encrypt Your Own Documents Using gpg</h1> <time datetime="20-04-06" class="post-date">Monday, April 06 2020</time> </header> <hr> <p>If you have ever wanted to garuntee the utmost security of your emails and documents, then this is the guide for you! It should be noted that in some circles the tools used are more common than in others. These are the everyday tools of many privacy advocates and computer nerds.</p> <p>If you have never used Linux however, then the method of doing this will be rather unfamiliar. This tutorial will be done on an <a href="https://archlinux.org/">Arch Linux</a> machine, but it should be the same on Ubuntu, Fedora, CentOS, Debian, OpenBSD, FreeBSD, MacOSX, etc. The only operating system that does not include these tools by default (or easily accessible) is Windows.</p> <p>This tutorial makes heavy use of the terminal. You have been warned.</p> <p><em>Let us…begin!</em></p> <h2 id="glossary">Glossary</h2> <ul> <li><a href="https://en.wikipedia.org/wiki/Binary-to-text_encoding#ASCII_armor"><strong>ASCII armour</strong></a> — A way to encode <strong>OpenPGP</strong> documents so they are readable by humans. These files end in .asc</li> <li><strong>(Open)PGP</strong> — An open standard for encoding pulbic keys and encrypted documents.</li> <li><strong>GPG</strong> — GNUPrivacyGaurd is an implementation of <strong>OpenPGP</strong>. It is installed by default on most Linux distrobutions.</li> </ul> <h2 id="step-0-setup">Step 0: Setup</h2> <p>We will be using the utility <code class="language-plaintext highlighter-rouge">gpg</code> for this tutorial.</p> <p>The other thing to note: The character $ (dollar sign) is usually not typed when shown in a command. It simply indicates that you do not need administrative privilages to run these commands.</p> <p>Test to see if you get this output in your terminal.</p> <pre class="terminal">
$ gpg --version
gpg (GnuPG) 2.2.20
@ -78,51 +7,13 @@ Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;https://gnu.org/licenses/gpl.html&gt;
...
</pre>
<p>If this is not successful look into how to install these tools on your system.</p>
<h2 id="step-1-getcreate-a-public-key">Step 1: Get/Create A Public Key!</h2>
<h3 id="get-somebody-elses">Get Somebody Elses</h3>
<p>Step one is having somebody to send your encrypted message to. Maybe this is a friend, a journalist, or a whistleblower.</p>
<p>To encrypt a document with somebodys public key, you need to first obtain it.
My public key is available <a href="/public-key.asc">at this link</a>, and you can use it to send me encrypted stuff.</p>
<p>If you are on a linux terminal, you can use the <code class="language-plaintext highlighter-rouge">curl</code> or <code class="language-plaintext highlighter-rouge">wget</code> command to download it.</p>
<p>wget:</p>
<pre class="terminal">
</pre> <p>If this is not successful look into how to install these tools on your system.</p> <h2 id="step-1-getcreate-a-public-key">Step 1: Get/Create A Public Key!</h2> <h3 id="get-somebody-elses">Get Somebody Elses</h3> <p>Step one is having somebody to send your encrypted message to. Maybe this is a friend, a journalist, or a whistleblower.</p> <p>To encrypt a document with somebodys public key, you need to first obtain it. My public key is available <a href="/public-key.asc">at this link</a>, and you can use it to send me encrypted stuff.</p> <p>If you are on a linux terminal, you can use the <code class="language-plaintext highlighter-rouge">curl</code> or <code class="language-plaintext highlighter-rouge">wget</code> command to download it.</p> <p>wget:</p> <pre class="terminal">
$ wget https://tait.tech/public-key.asc
</pre>
<p>Curl:</p>
<pre class="terminal">
</pre> <p>Curl:</p> <pre class="terminal">
$ curl https://tait.tech/public-key.asc -o public-key.asc
</pre>
<h3 id="make-your-own-optional">Make Your Own (optional)</h3>
<p>The following section is quite long,
so if you dont want to create your own keypair,
then feel free to skip to <a href="#step-2-import-public-key">Step #2</a>.</p>
<p>If you want to encrypt your own documents,
or you want others to be able to send you encrypted messages,
then you can create your own public/private key pair.
You can use these to encrypt your documents,
and you can send our public key to others so that they can securely communicate with yourself.</p>
<p>Run the following command in your terminal, and follow the steps I outline to get you started.</p>
<pre class="terminal">
</pre> <h3 id="make-your-own-optional">Make Your Own (optional)</h3> <p>The following section is quite long, so if you dont want to create your own keypair, then feel free to skip to <a href="#step-2-import-public-key">Step #2</a>.</p> <p>If you want to encrypt your own documents, or you want others to be able to send you encrypted messages, then you can create your own public/private key pair. You can use these to encrypt your documents, and you can send our public key to others so that they can securely communicate with yourself.</p> <p>Run the following command in your terminal, and follow the steps I outline to get you started.</p> <pre class="terminal">
$ gpg --full-gen-key
</pre>
<p>This will produce the following dialog:</p>
<pre class="terminal">
</pre> <p>This will produce the following dialog:</p> <pre class="terminal">
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
@ -134,21 +25,10 @@ Please select what kind of key you want:
(4) RSA (sign only)
(14) Existing key from card
Your selection?
</pre>
<p>Select the option <code class="language-plaintext highlighter-rouge">1</code>. You want two keys, both RSA.</p>
<p>Next we will select the key size:</p>
<pre class="terminal">
</pre> <p>Select the option <code class="language-plaintext highlighter-rouge">1</code>. You want two keys, both RSA.</p> <p>Next we will select the key size:</p> <pre class="terminal">
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
</pre>
<p>Type the number 2048.</p>
<p>Next it will ask you how long you want the key to be valid.</p>
<pre class="terminal">
</pre> <p>Type the number 2048.</p> <p>Next it will ask you how long you want the key to be valid.</p> <pre class="terminal">
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
@ -157,29 +37,10 @@ Please specify how long the key should be valid.
&lt;n&gt;m = key expires in n months
&lt;n&gt;y = key expires in n years
Key is valid for? (0)
</pre>
<p>Type the number 1. This will enable you time to test it,
but it will make the key expire within 24 hours so that if you accidentally
share your private key, or delete your VM and no longer have access to it, you will be fine.</p>
<p>It will ask your if you are sure about the expiry date.</p>
<pre class="terminal">
</pre> <p>Type the number 1. This will enable you time to test it, but it will make the key expire within 24 hours so that if you accidentally share your private key, or delete your VM and no longer have access to it, you will be fine.</p> <p>It will ask your if you are sure about the expiry date.</p> <pre class="terminal">
Key expires at Tue Apr 7 02:24:23 2020 UTC
Is this correct? (y/N)
</pre>
<p>Type <code class="language-plaintext highlighter-rouge">y</code> to confirm your choice.</p>
<p>Now <code class="language-plaintext highlighter-rouge">gpg</code> is going to ask you to create a user id to indetify this key.
Use some test data for now.
User input is in bold, feel free to follow along or to put your own test data in.</p>
<p>Once you are more comfortable with the tools,
then you can create a public/private keypair that you will keep for some time.</p>
<pre class="terminal">
</pre> <p>Type <code class="language-plaintext highlighter-rouge">y</code> to confirm your choice.</p> <p>Now <code class="language-plaintext highlighter-rouge">gpg</code> is going to ask you to create a user id to indetify this key. Use some test data for now. User input is in bold, feel free to follow along or to put your own test data in.</p> <p>Once you are more comfortable with the tools, then you can create a public/private keypair that you will keep for some time.</p> <pre class="terminal">
GnuPG needs to construct a user ID to identify your key.
Real name: <b>Mr. Tester</b>
@ -189,30 +50,12 @@ You selected this USER-ID:
"Mr. Tester (for testing only) &lt;test@test.org&gt;"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? <b>O</b>
</pre>
<p>It will then ask you for a password.
If you are simply using this for test purposes,
then you can feel free to set it to something like “test”.
When create a long-term use pulbic key make sure to make the password <em>very</em> secure.</p>
<p>During the process of creating your key, <code class="language-plaintext highlighter-rouge">gpg</code> may warn you with this message:</p>
<pre class="terminal">
</pre> <p>It will then ask you for a password. If you are simply using this for test purposes, then you can feel free to set it to something like “test”. When create a long-term use pulbic key make sure to make the password <em>very</em> secure.</p> <p>During the process of creating your key, <code class="language-plaintext highlighter-rouge">gpg</code> may warn you with this message:</p> <pre class="terminal">
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
</pre>
<p>If this happens, feel free to smash your keyboard (lightly),
watch a YouTube video on the machine,
browse the web with <a href="http://w3m.sourceforge.net/">w3m</a>,
etc. until the key is generated.</p>
<p>You will know it is done when you see this message (or something similar):</p>
<pre class="terminal">
</pre> <p>If this happens, feel free to smash your keyboard (lightly), watch a YouTube video on the machine, browse the web with <a href="http://w3m.sourceforge.net/">w3m</a>, etc. until the key is generated.</p> <p>You will know it is done when you see this message (or something similar):</p> <pre class="terminal">
gpg: key EACCC490291EA7CE marked as ultimately trusted
gpg: revocation certificate stored as '/home/tait/.config/gnupg/openpgp-revocs.d/FFA7D7525C6546983F1152D8EACCC490291EA7CE.rev'
public and secret key created and signed.
@ -221,95 +64,25 @@ pub rsa2048 2020-04-06 [SC] [expires: 2020-04-07]
FFA7D7525C6546983F1152D8EACCC490291EA7CE
uid Mr. Tester (for testing only) &lt;test@test.org&gt;
sub rsa2048 2020-04-06 [E] [expires: 2020-04-07]
</pre>
<p>Tada! You have your own public/private keypair!</p>
<p>Sharing a keypair that will expire soon is not a good idea,
however, if you are ready, then you can use this command to generate a public key file to share with others.</p>
<p>Feel free to substitute “Mr. Tester” for any other identifying part of your key.
Remember that to use the email, you must enclose it in &lt; and &gt;.</p>
<pre class="terminal">
</pre> <p>Tada! You have your own public/private keypair!</p> <p>Sharing a keypair that will expire soon is not a good idea, however, if you are ready, then you can use this command to generate a public key file to share with others.</p> <p>Feel free to substitute “Mr. Tester” for any other identifying part of your key. Remember that to use the email, you must enclose it in &lt; and &gt;.</p> <pre class="terminal">
$ gpg --export --armour "Mr. Tester" &gt; public-key.asc
</pre>
<p>To use the email as the identifier:</p>
<pre class="terminal">
</pre> <p>To use the email as the identifier:</p> <pre class="terminal">
$ gpg --export --armour "&lt;test@test.org&gt;" &gt; public-key.asc
</pre>
<h2 id="step-2-import-public-key">Step 2: Import Public Key</h2>
<p>This list of keys that <code class="language-plaintext highlighter-rouge">gpg</code> keeps on tap so to speak, is called our “keyring”.
Your will need to import a new public key to encrypt files with <code class="language-plaintext highlighter-rouge">gpg</code>.</p>
<p>If you already created your own public key, then this step is not necessary unless you want to also encrypt something for me :)</p>
<figure>
<img src="/assets/img/keyring.jpg" alt="A keyring holding eight allen keys." />
<figcaption>
A keyring holding eight allen keys.
</figcaption>
</figure>
<p>To import a public key to use for encrypting files, use the <code class="language-plaintext highlighter-rouge">--import</code> option of <code class="language-plaintext highlighter-rouge">gpg</code>. Like so:</p>
<pre class="terminal">
</pre> <h2 id="step-2-import-public-key">Step 2: Import Public Key</h2> <p>This list of keys that <code class="language-plaintext highlighter-rouge">gpg</code> keeps on tap so to speak, is called our “keyring”. Your will need to import a new public key to encrypt files with <code class="language-plaintext highlighter-rouge">gpg</code>.</p> <p>If you already created your own public key, then this step is not necessary unless you want to also encrypt something for me :)</p> <figure> <img src="/assets/img/keyring.jpg" alt="A keyring holding eight allen keys."/> <figcaption> A keyring holding eight allen keys. </figcaption> </figure> <p>To import a public key to use for encrypting files, use the <code class="language-plaintext highlighter-rouge">--import</code> option of <code class="language-plaintext highlighter-rouge">gpg</code>. Like so:</p> <pre class="terminal">
$ gpg --import public-key.asc
gpg: key 64FB4E386953BEAD: public key "Tait Hoyem &lt;tait.hoyem@protonmail.com&gt;" imported
gpg: Total number processed: 1
gpg: imported: 1
</pre>
<p>Now that we have imported a public key, we can make a message to send!</p>
<h2 id="step-3-have-a-message-to-encrypt">Step 3: Have A Message To Encrypt</h2>
<p>You can make a new file which holds some important, secret data.
Feel free to use a graphical editor if you have one, if not, <code class="language-plaintext highlighter-rouge">nano</code> works alright too.</p>
<pre class="terminal">
</pre> <p>Now that we have imported a public key, we can make a message to send!</p> <h2 id="step-3-have-a-message-to-encrypt">Step 3: Have A Message To Encrypt</h2> <p>You can make a new file which holds some important, secret data. Feel free to use a graphical editor if you have one, if not, <code class="language-plaintext highlighter-rouge">nano</code> works alright too.</p> <pre class="terminal">
Rules Of A Good Life:
1. Wash your hands!
2. Work hard!
3. Be firm.
5. Have good friends!
</pre>
<p>Save this file as something like <code class="language-plaintext highlighter-rouge">test-pgp.txt</code>, and well use that name later.</p>
<h2 id="step-4-encrypt-a-message">Step 4: Encrypt A Message</h2>
<p>Now that we have a message to send and person to send to,
all we have to do is encrypt this message and itll be on its merry way!
To do so, we must specify two new options to <code class="language-plaintext highlighter-rouge">gpg</code>.</p>
<p>The first is <code class="language-plaintext highlighter-rouge">--recipient</code>.
This tells <code class="language-plaintext highlighter-rouge">gpg</code> to encrypt using a certin public key that we have in our keyring.
You can use the persons name, email address, or the keys uid.</p>
<p>The second is <code class="language-plaintext highlighter-rouge">--encrypt</code>.</p>
<p>You will also specify the <code class="language-plaintext highlighter-rouge">--armour</code> option to use ASCII armoured files. Put this option after <code class="language-plaintext highlighter-rouge">--encrypt</code>, and put the file name after <code class="language-plaintext highlighter-rouge">--armour</code>. See below.</p>
<p>You can either use your own public key name to encrypt a document (allowng only you to decrypt it),
or you can use my public key that we imported earlier (allowing only me to decrypt it).
Either way works fine.</p>
<p>This is the big one!</p>
<pre class="terminal">
</pre> <p>Save this file as something like <code class="language-plaintext highlighter-rouge">test-pgp.txt</code>, and well use that name later.</p> <h2 id="step-4-encrypt-a-message">Step 4: Encrypt A Message</h2> <p>Now that we have a message to send and person to send to, all we have to do is encrypt this message and itll be on its merry way! To do so, we must specify two new options to <code class="language-plaintext highlighter-rouge">gpg</code>.</p> <p>The first is <code class="language-plaintext highlighter-rouge">--recipient</code>. This tells <code class="language-plaintext highlighter-rouge">gpg</code> to encrypt using a certin public key that we have in our keyring. You can use the persons name, email address, or the keys uid.</p> <p>The second is <code class="language-plaintext highlighter-rouge">--encrypt</code>.</p> <p>You will also specify the <code class="language-plaintext highlighter-rouge">--armour</code> option to use ASCII armoured files. Put this option after <code class="language-plaintext highlighter-rouge">--encrypt</code>, and put the file name after <code class="language-plaintext highlighter-rouge">--armour</code>. See below.</p> <p>You can either use your own public key name to encrypt a document (allowng only you to decrypt it), or you can use my public key that we imported earlier (allowing only me to decrypt it). Either way works fine.</p> <p>This is the big one!</p> <pre class="terminal">
$ gpg --recipient "Tait Hoyem" --encrypt --armour test-gpg.txt
</pre>
<p>“But there is no output!” you might say!
Yes, that is because our new (encrypted) file has already been saved.
Lets look at it with cat.</p>
<pre class="terminal">
</pre> <p>“But there is no output!” you might say! Yes, that is because our new (encrypted) file has already been saved. Lets look at it with cat.</p> <pre class="terminal">
$ cat test-gpg.txt.asc
-----BEGIN PGP MESSAGE-----
@ -330,24 +103,9 @@ jaDMzZnIKoax1GFz/coUAHFQub2rLzaQ5DDbvrkX++UrAjuUtRcSFH0TKhahZmCF
nv117moLfK22Mst/
=bw8T
-----END PGP MESSAGE-----
</pre>
<h2 id="step-5-decryption-optional">Step 5: Decryption (optional)</h2>
<p>If you created your own public/private keypair in step 1,
and you encryped using <code class="language-plaintext highlighter-rouge">--recipient "Your Test Name"</code>,
then you can decrypt your document as well!</p>
<p>You will need to specify <code class="language-plaintext highlighter-rouge">--decrypt</code>, and thats all folks!</p>
<pre class="terminal">
</pre> <h2 id="step-5-decryption-optional">Step 5: Decryption (optional)</h2> <p>If you created your own public/private keypair in step 1, and you encryped using <code class="language-plaintext highlighter-rouge">--recipient "Your Test Name"</code>, then you can decrypt your document as well!</p> <p>You will need to specify <code class="language-plaintext highlighter-rouge">--decrypt</code>, and thats all folks!</p> <pre class="terminal">
$ gpg --decrypt test-gpg.txt.asc
</pre>
<p>A password dialog will then come up asking for your previously created password.
As long as you remember your password from before and enter it correctly: voila!</p>
<pre class="terminal">
</pre> <p>A password dialog will then come up asking for your previously created password. As long as you remember your password from before and enter it correctly: voila!</p> <pre class="terminal">
gpg: encrypted with 4096-bit RSA key, ID 6989B986FCBE4225, created 2020-01-02
"Tait Hoyem &lt;tait.hoyem@protonmail.com&gt;"
Rules Of A Good Life:
@ -356,37 +114,4 @@ Rules Of A Good Life:
2. Work hard!
3. Be firm.
5. Have good friends!
</pre>
<h2 id="step-6-finale">Step 6: Finale!</h2>
<p>Ladies and gentleman, you have done it!
You have encrypted our very own document.
(And maybe even decrypted it yourself too :)</p>
<p>If you encrypted using my public key,
feel free to send it to <a href="mailto:tait@tait.tech">my email</a>.
I am happy to verify if it worked.</p>
<p>For more information on this subject, check out <a href="https://www.gnupg.org/gph/en/manual/c14.html">gnugp.orgs guide</a> on using GPG.
They are the ones that make these tools available,
and the <a href="https://www.gnu.org/">GNU Project</a> has been instrumental in creating the open-source world as it exists today.
Give em some love, eh!</p>
<p>Thank you so much for sticking through this whole thing!
Let me know if there is anything that doesnt make sense.
I am happy to improve this guide as time goes on if that is necessary.</p>
<p>Happy hacking :)</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/04/06/rsa4/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <h2 id="step-6-finale">Step 6: Finale!</h2> <p>Ladies and gentleman, you have done it! You have encrypted our very own document. (And maybe even decrypted it yourself too :)</p> <p>If you encrypted using my public key, feel free to send it to <a href="mailto:tait@tait.tech">my email</a>. I am happy to verify if it worked.</p> <p>For more information on this subject, check out <a href="https://www.gnupg.org/gph/en/manual/c14.html">gnugp.orgs guide</a> on using GPG. They are the ones that make these tools available, and the <a href="https://www.gnu.org/">GNU Project</a> has been instrumental in creating the open-source world as it exists today. Give em some love, eh!</p> <p>Thank you so much for sticking through this whole thing! Let me know if there is anything that doesnt make sense. I am happy to improve this guide as time goes on if that is necessary.</p> <p>Happy hacking :)</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/04/06/rsa4/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,102 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>NAS Part 1: Theorize | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">NAS Part 1: Theorize</h1>
<time datetime="20-04-12" class="post-date">Sunday, April 12 2020</time>
</header>
<hr>
<p>New Project, phase one:
Theorize.</p>
<p>I want to build a NAS server to store a bunch of data on. Current problem is lack of a computer to accept multiple SATA connections.</p>
<h3 id="problem-1-sata-connectors">Problem 1: SATA connectors</h3>
<p>This can be solved by an HBE card. Although they tend to be quite expensive (250+).
One decent model that isnt that much is the <a href="https://www.amazon.ca/SAS9211-8I-8PORT-Int-Sata-Pcie/dp/B002RL8I7M/ref=sr_1_2?keywords=9211-8i&amp;qid=1586699707&amp;sr=8-2">LSI 9211-8I</a>.
This is ideal for future expansion.</p>
<p>A cheaper option is a PCIe multi-SATA connector <a href="https://www.amazon.ca/Rivo-Controller-Expansion-Profile-Non-Raid/dp/B0836MKFCR?ref_=ast_slp_dp">like this</a>.</p>
<p>Either work, but one is cheaper and the other is more expandable.
The 9211-8I uses two SAS ports, which can be expanded indefinetely. SAS supports splitting.
SATA can be connected in a 4:1 ratio to SAS connectors with some <a href="https://www.amazon.com/Cable-Matters-Internal-SFF-8087-Breakout/dp/B012BPLYJC">cheap cables</a>.</p>
<h3 id="problem-2-drives">Problem 2: Drives</h3>
<p>I do not have enough drives to make this work right now.
For the setup I want it would require 5 or 6 drives.
I will get 4-5 drives worth of space as one drive worth of space is dedicated to “parity”, making you able to:</p>
<ol>
<li>Verify data integrity. If anything goes wrong with a write, it will be fixed automatically.</li>
<li>If <em>one</em> drive dies, the system can stay online with no problem. Two drives and Im eff-you-see-kay-ed-dee.</li>
</ol>
<p>My other option is to use two drives worth of space for partiy.
This would only have me 3-4 drives of space, but
this system can withstand the failure of <em>two</em> drives.</p>
<h3 id="problem-3-computer-system">Problem 3: Computer System</h3>
<p>I currently have 5 computers.</p>
<ol>
<li>Celery Stick. An old grey HP laptop with a Braille stickered keyboard. <em>Does not work right now; bad thermal paste job.</em></li>
<li>A Dell laptop lent to me by my school during my studies.</li>
<li>Houston. A 21-inch 2011 iMac for which the screen does not work under Linux (excep with the <code class="language-plaintext highlighter-rouge">nomodeset</code> kernel option enabled).</li>
<li>An Old Toshiba laptop (circa 2010) that I got for $50 to test with OpenBSD (works….sometimes).</li>
<li>Main Rig. My main laptop is an ASUS-705 TUF gaming laptop.</li>
</ol>
<p>None of these have PCIe expansion slots with a case that can handle the new drives.</p>
<p>I think its reasonable to say that for hard-drives and low-end tower PCs,
I will likely have luck on a place like <a href="https://kijiji.ca">Kijiji</a> (Canadian Craigslist).</p>
<p>The search continues :)</p>
<p>Im in for a fun ride…. and a few monnies.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/04/12/nas1/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>NAS Part 1: Theorize | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">NAS Part 1: Theorize</h1> <time datetime="20-04-12" class="post-date">Sunday, April 12 2020</time> </header> <hr> <p>New Project, phase one: Theorize.</p> <p>I want to build a NAS server to store a bunch of data on. Current problem is lack of a computer to accept multiple SATA connections.</p> <h3 id="problem-1-sata-connectors">Problem 1: SATA connectors</h3> <p>This can be solved by an HBE card. Although they tend to be quite expensive (250+). One decent model that isnt that much is the <a href="https://www.amazon.ca/SAS9211-8I-8PORT-Int-Sata-Pcie/dp/B002RL8I7M/ref=sr_1_2?keywords=9211-8i&amp;qid=1586699707&amp;sr=8-2">LSI 9211-8I</a>. This is ideal for future expansion.</p> <p>A cheaper option is a PCIe multi-SATA connector <a href="https://www.amazon.ca/Rivo-Controller-Expansion-Profile-Non-Raid/dp/B0836MKFCR?ref_=ast_slp_dp">like this</a>.</p> <p>Either work, but one is cheaper and the other is more expandable. The 9211-8I uses two SAS ports, which can be expanded indefinetely. SAS supports splitting. SATA can be connected in a 4:1 ratio to SAS connectors with some <a href="https://www.amazon.com/Cable-Matters-Internal-SFF-8087-Breakout/dp/B012BPLYJC">cheap cables</a>.</p> <h3 id="problem-2-drives">Problem 2: Drives</h3> <p>I do not have enough drives to make this work right now. For the setup I want it would require 5 or 6 drives. I will get 4-5 drives worth of space as one drive worth of space is dedicated to “parity”, making you able to:</p> <ol> <li>Verify data integrity. If anything goes wrong with a write, it will be fixed automatically.</li> <li>If <em>one</em> drive dies, the system can stay online with no problem. Two drives and Im eff-you-see-kay-ed-dee.</li> </ol> <p>My other option is to use two drives worth of space for partiy. This would only have me 3-4 drives of space, but this system can withstand the failure of <em>two</em> drives.</p> <h3 id="problem-3-computer-system">Problem 3: Computer System</h3> <p>I currently have 5 computers.</p> <ol> <li>Celery Stick. An old grey HP laptop with a Braille stickered keyboard. <em>Does not work right now; bad thermal paste job.</em></li> <li>A Dell laptop lent to me by my school during my studies.</li> <li>Houston. A 21-inch 2011 iMac for which the screen does not work under Linux (excep with the <code class="language-plaintext highlighter-rouge">nomodeset</code> kernel option enabled).</li> <li>An Old Toshiba laptop (circa 2010) that I got for $50 to test with OpenBSD (works….sometimes).</li> <li>Main Rig. My main laptop is an ASUS-705 TUF gaming laptop.</li> </ol> <p>None of these have PCIe expansion slots with a case that can handle the new drives.</p> <p>I think its reasonable to say that for hard-drives and low-end tower PCs, I will likely have luck on a place like <a href="https://kijiji.ca">Kijiji</a> (Canadian Craigslist).</p> <p>The search continues :)</p> <p>Im in for a fun ride…. and a few monnies.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/04/12/nas1/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,68 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>rfi: A Simple Linux utility to get a random file from a directory | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">rfi: A Simple Linux utility to get a random file from a directory</h1>
<time datetime="20-04-21" class="post-date">Tuesday, April 21 2020</time>
</header>
<hr>
<p>I made a <a href="https://lbry.tv/@tait:7/rfi:5">little video</a> about this script I wrote:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>rfi: A Simple Linux utility to get a random file from a directory | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">rfi: A Simple Linux utility to get a random file from a directory</h1> <time datetime="20-04-21" class="post-date">Tuesday, April 21 2020</time> </header> <hr> <p>I made a <a href="https://lbry.tv/@tait:7/rfi:5">little video</a> about this script I wrote:</p> <pre class="terminal">
$ rfi
</pre>
<p>This program gets a random file from your current directory
if you do not specify one;
it gets a random file from the specified directory if you give it one like so:</p>
<pre class="terminal">
</pre> <p>This program gets a random file from your current directory if you do not specify one; it gets a random file from the specified directory if you give it one like so:</p> <pre class="terminal">
# rfi /etc/wireguard
</pre>
<p>Which is very useful if you want to start a random VPN configuration :)</p>
<p>The code, comments, etc. are on the <a href="https://github.com/TTWNO/scripts">Github</a>.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/04/21/rfi/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>Which is very useful if you want to start a random VPN configuration :)</p> <p>The code, comments, etc. are on the <a href="https://github.com/TTWNO/scripts">Github</a>.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/04/21/rfi/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,147 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>What is XSS? | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">What is XSS?</h1>
<time datetime="20-04-25" class="post-date">Saturday, April 25 2020</time>
</header>
<hr>
<p>I found a cross-site scripting (XSS) attack
in a well-known quiz hosting website.
I disclosed the vulnerability to them years ago, so I thought
now might be a good time to write about it.</p>
<p>In this first article I will explain what XSS is.</p>
<p>In the next article I will explain how I found this attack.</p>
<h2 id="what-is-cross-site-scripting-xss">What is cross-site scripting (XSS)</h2>
<p>Cross-site scripting, XSS for short,
is a technique to execute arbitrary Javascript code on a user visiting a website
by linking to Javascript code stored on another server.</p>
<p>So for example:</p>
<p>I have a file on my website called <a href="/assets/js/hacked.js">hacked.js</a>.
If I was able to run this javascript file on anybody visiting a certain website <em>that is not mine</em>, this would be called cross-site scripting.</p>
<p>Click the above <code class="language-plaintext highlighter-rouge">hacked.js</code> link to view the code I use to “hack” this website.
Its safe, I promise ;)</p>
<p>Now, how can we get this code to execute when a user visits this site?
To explain, I will start with some of the underlying technologies.</p>
<h3 id="escape-characters">Escape Characters!</h3>
<p>No, this is not a Sherlock Holmes novel!</p>
<p>If we suppose that a website is built with sequences like these (called “tags”):
<code class="language-plaintext highlighter-rouge">&lt;body&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;p&gt;</code> (for paragraph), <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> and <code class="language-plaintext highlighter-rouge">&lt;b&gt;</code> for bold,
then why can you <em>see</em> the left and right angle bracket characters?
Dont they mean something? Shouldnt they be telling the browser:
<em>“Hey! Make me bold!”?</em>
Why <em>doesnt</em> everything after me typing <code class="language-plaintext highlighter-rouge">&lt;b&gt;</code> turn bold?</p>
<p>The answer is:</p>
<p>There are special characters in HTML to type a visible left (&lt;)
and visible right angle bracket (&gt;) in a website.
If I use the left and right brackets on my keyboard however,
things will indeed <b>show up bold</b>.</p>
<p>This is the code for the sentence I wrote above:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>What is XSS? | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">What is XSS?</h1> <time datetime="20-04-25" class="post-date">Saturday, April 25 2020</time> </header> <hr> <p>I found a cross-site scripting (XSS) attack in a well-known quiz hosting website. I disclosed the vulnerability to them years ago, so I thought now might be a good time to write about it.</p> <p>In this first article I will explain what XSS is.</p> <p>In the next article I will explain how I found this attack.</p> <h2 id="what-is-cross-site-scripting-xss">What is cross-site scripting (XSS)</h2> <p>Cross-site scripting, XSS for short, is a technique to execute arbitrary Javascript code on a user visiting a website by linking to Javascript code stored on another server.</p> <p>So for example:</p> <p>I have a file on my website called <a href="/assets/js/hacked.js">hacked.js</a>. If I was able to run this javascript file on anybody visiting a certain website <em>that is not mine</em>, this would be called cross-site scripting.</p> <p>Click the above <code class="language-plaintext highlighter-rouge">hacked.js</code> link to view the code I use to “hack” this website. Its safe, I promise ;)</p> <p>Now, how can we get this code to execute when a user visits this site? To explain, I will start with some of the underlying technologies.</p> <h3 id="escape-characters">Escape Characters!</h3> <p>No, this is not a Sherlock Holmes novel!</p> <p>If we suppose that a website is built with sequences like these (called “tags”): <code class="language-plaintext highlighter-rouge">&lt;body&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;p&gt;</code> (for paragraph), <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> and <code class="language-plaintext highlighter-rouge">&lt;b&gt;</code> for bold, then why can you <em>see</em> the left and right angle bracket characters? Dont they mean something? Shouldnt they be telling the browser: <em>“Hey! Make me bold!”?</em> Why <em>doesnt</em> everything after me typing <code class="language-plaintext highlighter-rouge">&lt;b&gt;</code> turn bold?</p> <p>The answer is:</p> <p>There are special characters in HTML to type a visible left (&lt;) and visible right angle bracket (&gt;) in a website. If I use the left and right brackets on my keyboard however, things will indeed <b>show up bold</b>.</p> <p>This is the code for the sentence I wrote above:</p> <pre class="terminal">
There are special characters in HTML to type a visible left (&amp;lt;)
and visible right angle bracket (&amp;gt;) in a website.
If I use the left and right brackets on my keyboard however,
things will indeed &lt;b&gt;show up bold&lt;/b&gt;.
</pre>
<p>Notice how all visible left angle brackets use an <code class="language-plaintext highlighter-rouge">&amp;lt;</code> to show them?</p>
<p>These are called <a href="https://en.wikipedia.org/wiki/Escape_character">escape characters</a>.
They tell a system, in this case your web browser:
<em>“Hello! Please show me off! I dont want to be hidden.”</em></p>
<h4 id="sanitization">Sanitization</h4>
<p>Most of the time XSS attacks are done using poorly sanitized HTML <code class="language-plaintext highlighter-rouge">&lt;input&gt;</code> elements.</p>
<p>Sanitization is when a program (usually on the server side),
will remove characters like <code class="language-plaintext highlighter-rouge">&lt;</code> and replace them with the aforementioned “escape characters”.
Internally this would be something like <code class="language-plaintext highlighter-rouge">&amp;lt;</code>,
but they would show up to a user as <code class="language-plaintext highlighter-rouge">&lt;</code>.</p>
<p>When inputs are not properly sanitized <em>and</em> the input is shown to the user in another part of the website,
then a malicous user can type in HTML that will run whenever anybody tries to look at what they typed.
For example: a name for a quiz website (input) and the leaderboard for said quiz (display).</p>
<p>HTML, by itself is not very dangerous.
The worst thing you could do is probably put a link on your name,
and then point it to a porn site.
Make your name bold, italic. Maybe make the background a funny color.
Although this may annoy your victim it is not dangerous security wise.</p>
<p>There is one tag however, that <em>is</em> scary…</p>
<h2 id="script"><code class="language-plaintext highlighter-rouge">&lt;script&gt;</code></h2>
<p>The <code class="language-plaintext highlighter-rouge">&lt;script&gt;</code> tag allows you to write code that can:</p>
<ol>
<li>Change the page contents.</li>
<li>Redirect the user to a new page automatically.</li>
<li>Get a users location.</li>
<li>Open a users microphone/webcam.</li>
<li>With the <code class="language-plaintext highlighter-rouge">src</code> <a href="https://www.w3schools.com/htmL/html_attributes.asp">attribute</a> you can also load a script from another site. (This is XSS)</li>
</ol>
<p>Those last two will ask for permission from the user (if their browser isnt insanely insecure).</p>
<p>In my next article Ill talk about a website I found which is vulnerable to this attack.
And, show you how you can run your own XSS attack.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/04/25/xss/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>Notice how all visible left angle brackets use an <code class="language-plaintext highlighter-rouge">&amp;lt;</code> to show them?</p> <p>These are called <a href="https://en.wikipedia.org/wiki/Escape_character">escape characters</a>. They tell a system, in this case your web browser: <em>“Hello! Please show me off! I dont want to be hidden.”</em></p> <h4 id="sanitization">Sanitization</h4> <p>Most of the time XSS attacks are done using poorly sanitized HTML <code class="language-plaintext highlighter-rouge">&lt;input&gt;</code> elements.</p> <p>Sanitization is when a program (usually on the server side), will remove characters like <code class="language-plaintext highlighter-rouge">&lt;</code> and replace them with the aforementioned “escape characters”. Internally this would be something like <code class="language-plaintext highlighter-rouge">&amp;lt;</code>, but they would show up to a user as <code class="language-plaintext highlighter-rouge">&lt;</code>.</p> <p>When inputs are not properly sanitized <em>and</em> the input is shown to the user in another part of the website, then a malicous user can type in HTML that will run whenever anybody tries to look at what they typed. For example: a name for a quiz website (input) and the leaderboard for said quiz (display).</p> <p>HTML, by itself is not very dangerous. The worst thing you could do is probably put a link on your name, and then point it to a porn site. Make your name bold, italic. Maybe make the background a funny color. Although this may annoy your victim it is not dangerous security wise.</p> <p>There is one tag however, that <em>is</em> scary…</p> <h2 id="script"><code class="language-plaintext highlighter-rouge">&lt;script&gt;</code></h2> <p>The <code class="language-plaintext highlighter-rouge">&lt;script&gt;</code> tag allows you to write code that can:</p> <ol> <li>Change the page contents.</li> <li>Redirect the user to a new page automatically.</li> <li>Get a users location.</li> <li>Open a users microphone/webcam.</li> <li>With the <code class="language-plaintext highlighter-rouge">src</code> <a href="https://www.w3schools.com/htmL/html_attributes.asp">attribute</a> you can also load a script from another site. (This is XSS)</li> </ol> <p>Those last two will ask for permission from the user (if their browser isnt insanely insecure).</p> <p>In my next article Ill talk about a website I found which is vulnerable to this attack. And, show you how you can run your own XSS attack.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/04/25/xss/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,55 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to use NGINX as a reverse-proxy server for a Node.js application using socket.io | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">How to use NGINX as a reverse-proxy server for a Node.js application using socket.io</h1>
<time datetime="20-05-01" class="post-date">Friday, May 01 2020</time>
</header>
<hr>
<p>Despite the long name of the article, I have a feeling this may apply to more people than I might think.
If you have a Node.js application which needs socket.io connections that you want to pass throgh nginxs <code class="language-plaintext highlighter-rouge">reverse_proxy</code> directive then this is the article for you!</p>
<p>You <em>must</em> seperate the socket.io sockets and the static resources.</p>
<ul>
<li>The socket connections can be routed through the default <code class="language-plaintext highlighter-rouge">$host/socket.io</code> if you want to ease modifications to the source code.</li>
<li>The connections to your main npm Node.js application can be routed through the relevant directory.</li>
</ul>
<p>Here is the relevant part of my <code class="language-plaintext highlighter-rouge">projects.tait.tech.conf</code> file:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>How to use NGINX as a reverse-proxy server for a Node.js application using socket.io | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">How to use NGINX as a reverse-proxy server for a Node.js application using socket.io</h1> <time datetime="20-05-01" class="post-date">Friday, May 01 2020</time> </header> <hr> <p>Despite the long name of the article, I have a feeling this may apply to more people than I might think. If you have a Node.js application which needs socket.io connections that you want to pass throgh nginxs <code class="language-plaintext highlighter-rouge">reverse_proxy</code> directive then this is the article for you!</p> <p>You <em>must</em> seperate the socket.io sockets and the static resources.</p> <ul> <li>The socket connections can be routed through the default <code class="language-plaintext highlighter-rouge">$host/socket.io</code> if you want to ease modifications to the source code.</li> <li>The connections to your main npm Node.js application can be routed through the relevant directory.</li> </ul> <p>Here is the relevant part of my <code class="language-plaintext highlighter-rouge">projects.tait.tech.conf</code> file:</p> <pre class="terminal">
location /socket.io {
proxy_pass http://localhost:8080/socket.io/;
proxy_set_header Upgrade $http_upgrade;
@ -65,45 +14,8 @@ location /ttrpg {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
</pre>
<h3 id="explaination">Explaination:</h3>
<p>For this application,
I needed the <code class="language-plaintext highlighter-rouge">/ttrpg</code> directory to connect to my main Node.js instance. This was going to be the root of a ttrpg project.
It was to have static files served form my Node.js application.</p>
<p>I also needed <code class="language-plaintext highlighter-rouge">/socket.io</code> to conenct to my running <code class="language-plaintext highlighter-rouge">npm</code> instance.
When I tried to route all the traffic through the <code class="language-plaintext highlighter-rouge">/trrpg</code> location directive
I had no luck whatsoever;
<code class="language-plaintext highlighter-rouge">$host/ttrpg/socket.io/*</code> calls <em>always</em> failed with a 404.</p>
<p>Having two seperate blocks forwarding in different ways seems to fix this.
I am not knowledgable enough to understand how.</p>
<p>For now, the project is alive!!!</p>
<p>Happy hacking!</p>
<p><em>P.S. I forgot to mention I also symbolically linked the <code class="language-plaintext highlighter-rouge">socket.io.js</code> file (that node is supposed to serve automatically) to the static client dir.
For some reson the node instance would not serve this file without that.</em></p>
<pre class="terminal">
</pre> <h3 id="explaination">Explaination:</h3> <p>For this application, I needed the <code class="language-plaintext highlighter-rouge">/ttrpg</code> directory to connect to my main Node.js instance. This was going to be the root of a ttrpg project. It was to have static files served form my Node.js application.</p> <p>I also needed <code class="language-plaintext highlighter-rouge">/socket.io</code> to conenct to my running <code class="language-plaintext highlighter-rouge">npm</code> instance. When I tried to route all the traffic through the <code class="language-plaintext highlighter-rouge">/trrpg</code> location directive I had no luck whatsoever; <code class="language-plaintext highlighter-rouge">$host/ttrpg/socket.io/*</code> calls <em>always</em> failed with a 404.</p> <p>Having two seperate blocks forwarding in different ways seems to fix this. I am not knowledgable enough to understand how.</p> <p>For now, the project is alive!!!</p> <p>Happy hacking!</p> <p><em>P.S. I forgot to mention I also symbolically linked the <code class="language-plaintext highlighter-rouge">socket.io.js</code> file (that node is supposed to serve automatically) to the static client dir. For some reson the node instance would not serve this file without that.</em></p> <pre class="terminal">
$ pwd
/home/user/ttrpg.co/client
$ ln -s ../server/node_modules/socket.io-client/dist/socket.io.js .
</pre>
<p><em>Happy hacking 2.0!</em></p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/05/01/nginx-socket-io-projects/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p><em>Happy hacking 2.0!</em></p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/05/01/nginx-socket-io-projects/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,66 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>New Game: Clue (coming soon) | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">New Game: Clue (coming soon)</h1>
<time datetime="20-05-19" class="post-date">Tuesday, May 19 2020</time>
</header>
<hr>
<p>Ooo! Exciting!
Today I want to announce a new project Ill be working on which should be live within the month of May:
Clue.</p>
<p>The original board game, implemented in an accessible format via the web.</p>
<p>It uses a Node.js backend and standard Javascript/HTML frontend.
Nothing fancy.</p>
<p>All the code will be hosted here: <a href="https://github.com/TTWNO/clue">https://github.com/TTWNO/clue</a></p>
<p>It will be licensed under the BSD-3 license, meaning it can be used for any reason—even commercially and without source-code disclosure—without prior authorization, but it <em>must</em> acknowledge that I helped build the end product.</p>
<p>Once the project is live, it will be located at: <a href="">Lame Games</a> (currently a dead link).</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/05/19/clue-announcement/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>New Game: Clue (coming soon) | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">New Game: Clue (coming soon)</h1> <time datetime="20-05-19" class="post-date">Tuesday, May 19 2020</time> </header> <hr> <p>Ooo! Exciting! Today I want to announce a new project Ill be working on which should be live within the month of May: Clue.</p> <p>The original board game, implemented in an accessible format via the web.</p> <p>It uses a Node.js backend and standard Javascript/HTML frontend. Nothing fancy.</p> <p>All the code will be hosted here: <a href="https://github.com/TTWNO/clue">https://github.com/TTWNO/clue</a></p> <p>It will be licensed under the BSD-3 license, meaning it can be used for any reason—even commercially and without source-code disclosure—without prior authorization, but it <em>must</em> acknowledge that I helped build the end product.</p> <p>Once the project is live, it will be located at: <a href="">Lame Games</a> (currently a dead link).</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/05/19/clue-announcement/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,57 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Site Update | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Site Update</h1>
<time datetime="20-06-04" class="post-date">Thursday, June 04 2020</time>
</header>
<hr>
<p>I updated the site with some easier to identify information about me and my projects :)</p>
<p>Also, Clue has been delayed due to my partner in crime on the project wokring too many hours.</p>
<p>I also posted a new project called <em><a href="https://github.com/TTWNO/caesar-cipher">Caesar Cipher</a></em> in C. It will be an intermediate example of how to use build systems like <code class="language-plaintext highlighter-rouge">make</code>.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/06/04/site-update/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Site Update | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Site Update</h1> <time datetime="20-06-04" class="post-date">Thursday, June 04 2020</time> </header> <hr> <p>I updated the site with some easier to identify information about me and my projects :)</p> <p>Also, Clue has been delayed due to my partner in crime on the project wokring too many hours.</p> <p>I also posted a new project called <em><a href="https://github.com/TTWNO/caesar-cipher">Caesar Cipher</a></em> in C. It will be an intermediate example of how to use build systems like <code class="language-plaintext highlighter-rouge">make</code>.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/06/04/site-update/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,182 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to use tmux to send and receive things from your Minecraft server | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">How to use tmux to send and receive things from your Minecraft server</h1>
<time datetime="20-06-25" class="post-date">Thursday, June 25 2020</time>
</header>
<hr>
<p>So recently I had problem.
I run a Minecraft server on a big Linux computer I have running in my room.
Now, as a system administrator it is very helpful to be able to run some simple commands without needing to login with my key, password, TFA, etc.
It is, frankly, a lot of work.
Especially when I really just want to be playing games but I just need to check something quickly.</p>
<p>So for simple things like finding out of the network, CPU, memory or disk usage is my bottleneck, I wrote this really nifty script to connect the world of Minecraft and the Linux shell.</p>
<p>My completed solution for what I needed can be found at <a href="https://github.com/TTWNO/termcraft/">https://github.com/TTWNO/termcraft</a>.</p>
<p>If you want some of the implementation details, stick around.</p>
<h2 id="solution">Solution</h2>
<p>So to solve this interesting problem, I decided to use <code class="language-plaintext highlighter-rouge">tmux</code>.
<code class="language-plaintext highlighter-rouge">tmux</code> is a <strong>t</strong>terminal <strong>mu</strong>ltiple<strong>x</strong>er.
This allows you to run a terminal session, then detach fromc it while it still runs in the background.</p>
<p>This is very valuable when running command line applications that need to have an active console connection, like a Minecraft server.</p>
<p>So first I looked at the <code class="language-plaintext highlighter-rouge">tmux</code> command <code class="language-plaintext highlighter-rouge">send-keys</code>.</p>
<h4 id="send-keys"><code class="language-plaintext highlighter-rouge">send-keys</code></h4>
<p><code class="language-plaintext highlighter-rouge">send-keys</code> allows you to send text, and key presses to a <code class="language-plaintext highlighter-rouge">tmux</code> session.
Now assuming this <code class="language-plaintext highlighter-rouge">tmux</code> session is attached to a Minecraft server,
there is no reason you could not run a command like this:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>How to use tmux to send and receive things from your Minecraft server | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">How to use tmux to send and receive things from your Minecraft server</h1> <time datetime="20-06-25" class="post-date">Thursday, June 25 2020</time> </header> <hr> <p>So recently I had problem. I run a Minecraft server on a big Linux computer I have running in my room. Now, as a system administrator it is very helpful to be able to run some simple commands without needing to login with my key, password, TFA, etc. It is, frankly, a lot of work. Especially when I really just want to be playing games but I just need to check something quickly.</p> <p>So for simple things like finding out of the network, CPU, memory or disk usage is my bottleneck, I wrote this really nifty script to connect the world of Minecraft and the Linux shell.</p> <p>My completed solution for what I needed can be found at <a href="https://github.com/TTWNO/termcraft/">https://github.com/TTWNO/termcraft</a>.</p> <p>If you want some of the implementation details, stick around.</p> <h2 id="solution">Solution</h2> <p>So to solve this interesting problem, I decided to use <code class="language-plaintext highlighter-rouge">tmux</code>. <code class="language-plaintext highlighter-rouge">tmux</code> is a <strong>t</strong>terminal <strong>mu</strong>ltiple<strong>x</strong>er. This allows you to run a terminal session, then detach fromc it while it still runs in the background.</p> <p>This is very valuable when running command line applications that need to have an active console connection, like a Minecraft server.</p> <p>So first I looked at the <code class="language-plaintext highlighter-rouge">tmux</code> command <code class="language-plaintext highlighter-rouge">send-keys</code>.</p> <h4 id="send-keys"><code class="language-plaintext highlighter-rouge">send-keys</code></h4> <p><code class="language-plaintext highlighter-rouge">send-keys</code> allows you to send text, and key presses to a <code class="language-plaintext highlighter-rouge">tmux</code> session. Now assuming this <code class="language-plaintext highlighter-rouge">tmux</code> session is attached to a Minecraft server, there is no reason you could not run a command like this:</p> <pre class="terminal">
$ tmux send-keys "tell @a This is a Test" Enter
</pre>
<p>This will send the text “tell @a This is a Test” to the Minecraft server.
Then, it will hit the newline character, this will execute the command.</p>
<p>So now we can send information to the server and have it tell the users something.</p>
<p>But how do we get information about who is typing what in the Minecraft chat?</p>
<h3 id="tmuxs-capture-pane-is-painful"><code class="language-plaintext highlighter-rouge">tmux</code>s <code class="language-plaintext highlighter-rouge">capture-pane</code> is painful</h3>
<p>So in the manual page for <code class="language-plaintext highlighter-rouge">tmux</code> I can see a section recorded below for options I can give to the <code class="language-plaintext highlighter-rouge">capture-pane</code> subcommand.</p>
<pre class="terminal">
</pre> <p>This will send the text “tell @a This is a Test” to the Minecraft server. Then, it will hit the newline character, this will execute the command.</p> <p>So now we can send information to the server and have it tell the users something.</p> <p>But how do we get information about who is typing what in the Minecraft chat?</p> <h3 id="tmuxs-capture-pane-is-painful"><code class="language-plaintext highlighter-rouge">tmux</code>s <code class="language-plaintext highlighter-rouge">capture-pane</code> is painful</h3> <p>So in the manual page for <code class="language-plaintext highlighter-rouge">tmux</code> I can see a section recorded below for options I can give to the <code class="language-plaintext highlighter-rouge">capture-pane</code> subcommand.</p> <pre class="terminal">
-S and -E specify the starting and ending line numbers,
zero is the first line of the visible pane and negative
numbers are lines in the history. - to -S is the start
of the history and to -E the end of the visible pane. The
default is to capture only the visible contents of the pane.
</pre>
<p>What it seems to be saying is I can start at line <code class="language-plaintext highlighter-rouge">-S n</code> and end at line <code class="language-plaintext highlighter-rouge">-E n</code>.
Negative numbers start from the bottom, so <em>in theory</em> I can do the following: <code class="language-plaintext highlighter-rouge">tmux capture-pane -S -1</code> should capture only the last line, because Im starting from the last line. Right?</p>
<p>No. It just doesnt work. Negative numbers do <em>not</em> work with the <code class="language-plaintext highlighter-rouge">tmux capture-pane</code> subcommand.</p>
<p>So I did some simple UNIX piping, like so, to get just the last thing in the chat.</p>
<pre class="terminal">
</pre> <p>What it seems to be saying is I can start at line <code class="language-plaintext highlighter-rouge">-S n</code> and end at line <code class="language-plaintext highlighter-rouge">-E n</code>. Negative numbers start from the bottom, so <em>in theory</em> I can do the following: <code class="language-plaintext highlighter-rouge">tmux capture-pane -S -1</code> should capture only the last line, because Im starting from the last line. Right?</p> <p>No. It just doesnt work. Negative numbers do <em>not</em> work with the <code class="language-plaintext highlighter-rouge">tmux capture-pane</code> subcommand.</p> <p>So I did some simple UNIX piping, like so, to get just the last thing in the chat.</p> <pre class="terminal">
$ tmux capture-pane -p -t steve | tail -n1
[SERVER] [ExtraDebuggingInfoHere]: &lt;TaterTheTot&gt; MY_MESSAGE
</pre>
<p>TaterTheTot is my Minecraft username :)</p>
<p><code class="language-plaintext highlighter-rouge">-p</code> prints the result to the terminal/stdout.</p>
<p><code class="language-plaintext highlighter-rouge">steve</code> is the name of the tmux session Im trying to pull form.</p>
<p>So thats done! Beauty!</p>
<p>Now that we have that, how can we extract the username and the message from the latest line?</p>
<h3 id="grep"><code class="language-plaintext highlighter-rouge">grep</code></h3>
<p><code class="language-plaintext highlighter-rouge">grep</code> is a command to find patterns of text.
<code class="language-plaintext highlighter-rouge">grep</code> has an option to only show a matching pattern of text.
This option is <code class="language-plaintext highlighter-rouge">-o</code>.</p>
<p>Lets see how we can use this in conjunction with our latest line of server output to get our results.</p>
<pre class="terminal">
</pre> <p>TaterTheTot is my Minecraft username :)</p> <p><code class="language-plaintext highlighter-rouge">-p</code> prints the result to the terminal/stdout.</p> <p><code class="language-plaintext highlighter-rouge">steve</code> is the name of the tmux session Im trying to pull form.</p> <p>So thats done! Beauty!</p> <p>Now that we have that, how can we extract the username and the message from the latest line?</p> <h3 id="grep"><code class="language-plaintext highlighter-rouge">grep</code></h3> <p><code class="language-plaintext highlighter-rouge">grep</code> is a command to find patterns of text. <code class="language-plaintext highlighter-rouge">grep</code> has an option to only show a matching pattern of text. This option is <code class="language-plaintext highlighter-rouge">-o</code>.</p> <p>Lets see how we can use this in conjunction with our latest line of server output to get our results.</p> <pre class="terminal">
$ echo "[DEBUG] [SERVER] blah blah: &lt;TaterTheTot&gt; MY_MESAGE" | grep -o "&lt;.&ast;&gt;"
&lt;TaterTheTot&gt;
</pre>
<p>Now, thats my name with the &lt; and &gt; attached. Not bad!
We can use the <code class="language-plaintext highlighter-rouge">sed</code> command to clean it up a bit.</p>
<p>The syntax is like so: <code class="language-plaintext highlighter-rouge">select/somepattern/replacewith/global</code></p>
<p>So the following command is: <code class="language-plaintext highlighter-rouge">s/[&lt;&gt;]//g</code></p>
<p>Select any characters that are either &lt; or &gt;.
Replace with nothing.
Do so globally (as in, dont stop after you replace only one character).</p>
<p>Take two!</p>
<pre class="terminal">
</pre> <p>Now, thats my name with the &lt; and &gt; attached. Not bad! We can use the <code class="language-plaintext highlighter-rouge">sed</code> command to clean it up a bit.</p> <p>The syntax is like so: <code class="language-plaintext highlighter-rouge">select/somepattern/replacewith/global</code></p> <p>So the following command is: <code class="language-plaintext highlighter-rouge">s/[&lt;&gt;]//g</code></p> <p>Select any characters that are either &lt; or &gt;. Replace with nothing. Do so globally (as in, dont stop after you replace only one character).</p> <p>Take two!</p> <pre class="terminal">
$ echo "[DEBUG] [SERVER] blah blah: &lt;TaterTheTot&gt; MY_MESAGE" | grep -o "&lt;.&ast;&gt;" | sed 's/[&lt;&gt;]//g'
TaterTheTot
</pre>
<p>Beautiful!</p>
<p>Now what about that pesky message?</p>
<h3 id="more-grep-more-sed">more <code class="language-plaintext highlighter-rouge">grep</code>; more <code class="language-plaintext highlighter-rouge">sed</code></h3>
<p>Simple: capture everything after the &gt;. Leaving the users message entirely in tact.</p>
<pre class="terminal">
</pre> <p>Beautiful!</p> <p>Now what about that pesky message?</p> <h3 id="more-grep-more-sed">more <code class="language-plaintext highlighter-rouge">grep</code>; more <code class="language-plaintext highlighter-rouge">sed</code></h3> <p>Simple: capture everything after the &gt;. Leaving the users message entirely in tact.</p> <pre class="terminal">
$ echo "[DEBUG] [SERVER] blah blah: &lt;TaterTheTot&gt; MY_MESAGE" | grep -o "&gt;.&ast;$" | sed 's/&gt; //'
MY_MESSAGE
</pre>
<p>So now we have a way to get the username of someone typing in the Minecraft server chat.
We have a way to find out what they said.
And, we have a way to respond.</p>
<p>You can imagine how these might go together for your own use case.</p>
<h3 id="conclusion">Conclusion</h3>
<p>This shows some pretty fun stuff you can do with a few simple Linux commands and a Minecraft server.</p>
<p>I hope you learned something and found my explanations not horrific haha!</p>
<p>Remember to checkout the git repository to see what I did with it: <a href="https://github.com/TTWNO/termcraft">https://github.com/TTWNO/termcraft</a>.</p>
<p>Happy hacking!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/06/25/tmux-minecraft/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>So now we have a way to get the username of someone typing in the Minecraft server chat. We have a way to find out what they said. And, we have a way to respond.</p> <p>You can imagine how these might go together for your own use case.</p> <h3 id="conclusion">Conclusion</h3> <p>This shows some pretty fun stuff you can do with a few simple Linux commands and a Minecraft server.</p> <p>I hope you learned something and found my explanations not horrific haha!</p> <p>Remember to checkout the git repository to see what I did with it: <a href="https://github.com/TTWNO/termcraft">https://github.com/TTWNO/termcraft</a>.</p> <p>Happy hacking!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/06/25/tmux-minecraft/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,90 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Independence | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Independence</h1>
<time datetime="20-07-12" class="post-date">Sunday, July 12 2020</time>
</header>
<hr>
<blockquote>
<p>“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</p>
</blockquote>
<p>Whatever you may believe about the YouTube personality Luke Smith,
the quote above summarizes a core principle of mine.
Much like many people have religious principles, I have <em>Independence</em>.</p>
<p>My choice to use Linux as my primary operating system,
host my own website,
own my own domain name—all of these are directly related to this core principle of independence.</p>
<p>I never want a man, or a company to have too much power over my life.
Just like I would not trust just any person to be able to read my emails,
know where I live, where I am going, who are my friends, what do I believe; in the same way, I do not trust a company with that same information.</p>
<blockquote>
<p>“If you want to find out what a man is to the bottom, give him power. Any man can stand adversity — only a great man can stand prosperity.”—Robert Ingersoll</p>
</blockquote>
<p>Take control of your own digital life:</p>
<ol>
<li>Own your own domain.</li>
<li>Hookup an email and a website to that.</li>
</ol>
<p>Thats it!</p>
<p>Without this, any of your internet privileges can be revoked at any time by Google, Facebook, YouTube, Twitter, or even an angry Twitter Mob. Maybe because they hate your skin colour, maybe they hate your religious/political views, or maybe you got caught on a technicality.</p>
<p>If you own your own domain, however:</p>
<p>Your email provider goes down/bans you: change your provider; keep the email.</p>
<p>Your website is pulled for controversial views: switch hosts.</p>
<p>Protect yourself; give yourself choices.
Why give others that power when you could have it for yourself?</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/07/12/independence/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Independence | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Independence</h1> <time datetime="20-07-12" class="post-date">Sunday, July 12 2020</time> </header> <hr> <blockquote> <p>“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</p> </blockquote> <p>Whatever you may believe about the YouTube personality Luke Smith, the quote above summarizes a core principle of mine. Much like many people have religious principles, I have <em>Independence</em>.</p> <p>My choice to use Linux as my primary operating system, host my own website, own my own domain name—all of these are directly related to this core principle of independence.</p> <p>I never want a man, or a company to have too much power over my life. Just like I would not trust just any person to be able to read my emails, know where I live, where I am going, who are my friends, what do I believe; in the same way, I do not trust a company with that same information.</p> <blockquote> <p>“If you want to find out what a man is to the bottom, give him power. Any man can stand adversity — only a great man can stand prosperity.”—Robert Ingersoll</p> </blockquote> <p>Take control of your own digital life:</p> <ol> <li>Own your own domain.</li> <li>Hookup an email and a website to that.</li> </ol> <p>Thats it!</p> <p>Without this, any of your internet privileges can be revoked at any time by Google, Facebook, YouTube, Twitter, or even an angry Twitter Mob. Maybe because they hate your skin colour, maybe they hate your religious/political views, or maybe you got caught on a technicality.</p> <p>If you own your own domain, however:</p> <p>Your email provider goes down/bans you: change your provider; keep the email.</p> <p>Your website is pulled for controversial views: switch hosts.</p> <p>Protect yourself; give yourself choices. Why give others that power when you could have it for yourself?</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/07/12/independence/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,67 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Installing MultiCraft on Gentoo Linux | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Installing MultiCraft on Gentoo Linux</h1>
<time datetime="20-07-19" class="post-date">Sunday, July 19 2020</time>
</header>
<hr>
<p>In a very odd combination of requirements,
I needed to install <a href="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system.
The PHP <code class="language-plaintext highlighter-rouge">USE</code> flags are important so you dont have to recompile it three times like I did.</p>
<p>Here are some useful tips I came across:</p>
<h3 id="php-use-flags">PHP <code class="language-plaintext highlighter-rouge">USE</code> flags</h3>
<p>In <code class="language-plaintext highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Installing MultiCraft on Gentoo Linux | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Installing MultiCraft on Gentoo Linux</h1> <time datetime="20-07-19" class="post-date">Sunday, July 19 2020</time> </header> <hr> <p>In a very odd combination of requirements, I needed to install <a href="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system. The PHP <code class="language-plaintext highlighter-rouge">USE</code> flags are important so you dont have to recompile it three times like I did.</p> <p>Here are some useful tips I came across:</p> <h3 id="php-use-flags">PHP <code class="language-plaintext highlighter-rouge">USE</code> flags</h3> <p>In <code class="language-plaintext highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p> <pre class="terminal">
dev-lang/php cgi mysql mysqli fpm pdo gd truetype
</pre>
<p>This should give you enough for a mysql backended MultiCraft installation.
The <code class="language-plaintext highlighter-rouge">cgi</code> option may not be required as <code class="language-plaintext highlighter-rouge">fpm</code> stands for <em>FastCGI Process Managment</em>.
I dont know for sure though.</p>
<h3 id="paper">Paper</h3>
<p>This will grab the latest version of the Paper jar file using <a href="https://yivesmirror.com">YivesMirror</a>.
Im not sure how reputable it is,
but my buddy who works with this stuff more often than me seemed to recognize it.</p>
<pre class="terminal">
</pre> <p>This should give you enough for a mysql backended MultiCraft installation. The <code class="language-plaintext highlighter-rouge">cgi</code> option may not be required as <code class="language-plaintext highlighter-rouge">fpm</code> stands for <em>FastCGI Process Managment</em>. I dont know for sure though.</p> <h3 id="paper">Paper</h3> <p>This will grab the latest version of the Paper jar file using <a href="https://yivesmirror.com">YivesMirror</a>. Im not sure how reputable it is, but my buddy who works with this stuff more often than me seemed to recognize it.</p> <pre class="terminal">
## See the default craftbukkit.jar.conf for a detailed documentation of the
## format of this file.
[config]
@ -76,36 +15,12 @@ category = Mods
[start]
command = "{JAVA}" -Xmx{MAX_MEMORY}M -Xms{START_MEMORY}M -XX:MaxPermSize=128M -Djline.terminal=jline.UnsupportedTerminal -jar "{JAR}" nogui
</pre>
<h3 id="other-tips">Other Tips</h3>
<p>Do not use the option to setup a separate user for each server.
This completely stalled any work getting done with a ton of permission denied errors.</p>
<h4 id="security">Security</h4>
<p>If the panel is in the root directory of your NGINX web server,
use the following in your server block to deny access to the <code class="language-plaintext highlighter-rouge">/protected</code> directory.</p>
<pre class="terminal">
</pre> <h3 id="other-tips">Other Tips</h3> <p>Do not use the option to setup a separate user for each server. This completely stalled any work getting done with a ton of permission denied errors.</p> <h4 id="security">Security</h4> <p>If the panel is in the root directory of your NGINX web server, use the following in your server block to deny access to the <code class="language-plaintext highlighter-rouge">/protected</code> directory.</p> <pre class="terminal">
location /protected {
deny all;
return 404;
}
</pre>
<h5 id="mysql">MySQL</h5>
<p>It is always good practice to separate privileges.
The MultiCraft daemon should have one SQL login,
with one database allocated to it.
The MultiCraft panel should have a separate SQL login,
with a separate database allocated to it.</p>
<p>You can do this with the following commands in your MySQL prompt:</p>
<pre class="terminal">
</pre> <h5 id="mysql">MySQL</h5> <p>It is always good practice to separate privileges. The MultiCraft daemon should have one SQL login, with one database allocated to it. The MultiCraft panel should have a separate SQL login, with a separate database allocated to it.</p> <p>You can do this with the following commands in your MySQL prompt:</p> <pre class="terminal">
sql&gt; CREATE DATABASE multicraft_daemon_database;
Query OK, 0 rows affected (0.01 sec)
@ -124,22 +39,4 @@ Query OK, 0 rows affected (0.01 sec)
sql&gt; GRANT ALL PRIVILEGES ON multicraft_panel_database . * TO 'mutlicraft_panel'@'localhost';
Query OK, 0 rows affected (0.01 sec)
</pre>
<p>During setup, make sure the proper credentials are used for each step.
Database 1 is the panel database.
Database 2 is the daemon database.</p>
<p>Happy hacking :)</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/07/19/multicraft-php-gentoo/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>During setup, make sure the proper credentials are used for each step. Database 1 is the panel database. Database 2 is the daemon database.</p> <p>Happy hacking :)</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/07/19/multicraft-php-gentoo/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,96 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Know How Your Representative Votes In Parliament | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Know How Your Representative Votes In Parliament</h1>
<time datetime="20-07-30" class="post-date">Thursday, July 30 2020</time>
</header>
<hr>
<p>As an advocate for openness, I had an idea to make a project out of the government of Canadas <a href="https://open.canada.ca/en/open-data">Open Data</a>
initiative to take a look at how my local MP voted on various pieces of legislation.
It turns out though that this was not necessary due to how easy it was to find this information on the governments own website.
In this article, I will explain how you can do the same.</p>
<h3 id="1-find-your-representative">1. Find Your Representative</h3>
<p>The first step in this process is to find who your representative is.
To do so, go to the governments own website
<a href="https://www.ourcommons.ca/Members/en">ourcommons.cas search tool</a>.</p>
<p>Simply type in your postal code in the search box to find out who your MP is.</p>
<h3 id="2-their-voting-record">2. Their Voting Record</h3>
<p>Every MPs voting record is public knowledge,
and it is available nice and simple in a table on that MPs page.
For example, this is a link to
<a href="https://www.ourcommons.ca/Members/en/pierre-poilievre(25524)/votes">Pierre Poilievres voting record</a>.</p>
<p>To find your MPs voting record, do step one, then:
After the <strong>Overview</strong>, and <strong>Seat in The House</strong> sections,
there are three tabs, <strong>Roles</strong>, <strong>Work</strong>, and <strong>Contact</strong>.
Click on work.
At the bottom of that tab is a link which says <strong>Chamber Votes</strong>.
This will open a small window with some recent votes by this politician.
If you want to see all their votes, there is a button at the bottom named <strong>All Votes by This Member</strong>.</p>
<p>Tada! You can now keep your local MP accountable for anything you do or do not support.</p>
<h3 id="3-bill-details">3. Bill Details</h3>
<p>If you want to get into the nitty gritty,
once you open a specific bill, you can actually find out the status of said bill,
or read the actual text by clicking the <strong>View this Bill on LEGISinfo</strong> button.</p>
<p>Both the status of the bill, and a link to a PDF document containing the bilingual text of the bill are visible in the main body of the page.</p>
<h4 id="conclusion">Conclusion</h4>
<p>I thought this was pretty cool!
It was <em>way</em> simpler than I thought it would be.</p>
<p>Thanks, Canada!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/07/30/canadian-parliament/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Know How Your Representative Votes In Parliament | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Know How Your Representative Votes In Parliament</h1> <time datetime="20-07-30" class="post-date">Thursday, July 30 2020</time> </header> <hr> <p>As an advocate for openness, I had an idea to make a project out of the government of Canadas <a href="https://open.canada.ca/en/open-data">Open Data</a> initiative to take a look at how my local MP voted on various pieces of legislation. It turns out though that this was not necessary due to how easy it was to find this information on the governments own website. In this article, I will explain how you can do the same.</p> <h3 id="1-find-your-representative">1. Find Your Representative</h3> <p>The first step in this process is to find who your representative is. To do so, go to the governments own website <a href="https://www.ourcommons.ca/Members/en">ourcommons.cas search tool</a>.</p> <p>Simply type in your postal code in the search box to find out who your MP is.</p> <h3 id="2-their-voting-record">2. Their Voting Record</h3> <p>Every MPs voting record is public knowledge, and it is available nice and simple in a table on that MPs page. For example, this is a link to <a href="https://www.ourcommons.ca/Members/en/pierre-poilievre(25524)/votes">Pierre Poilievres voting record</a>.</p> <p>To find your MPs voting record, do step one, then: After the <strong>Overview</strong>, and <strong>Seat in The House</strong> sections, there are three tabs, <strong>Roles</strong>, <strong>Work</strong>, and <strong>Contact</strong>. Click on work. At the bottom of that tab is a link which says <strong>Chamber Votes</strong>. This will open a small window with some recent votes by this politician. If you want to see all their votes, there is a button at the bottom named <strong>All Votes by This Member</strong>.</p> <p>Tada! You can now keep your local MP accountable for anything you do or do not support.</p> <h3 id="3-bill-details">3. Bill Details</h3> <p>If you want to get into the nitty gritty, once you open a specific bill, you can actually find out the status of said bill, or read the actual text by clicking the <strong>View this Bill on LEGISinfo</strong> button.</p> <p>Both the status of the bill, and a link to a PDF document containing the bilingual text of the bill are visible in the main body of the page.</p> <h4 id="conclusion">Conclusion</h4> <p>I thought this was pretty cool! It was <em>way</em> simpler than I thought it would be.</p> <p>Thanks, Canada!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/07/30/canadian-parliament/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,85 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BSD Journey, Part 1 | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">BSD Journey, Part 1</h1>
<time datetime="20-08-15" class="post-date">Saturday, August 15 2020</time>
</header>
<hr>
<p>As Linux becomes controlled by corporate sponsors and becomes more full of proprietary blobs, drivers, and even closed-source software like Steam,
One may wonder if there are other options out there.
For me, somebody that is intensely interested in security, there is one option: OpenBSD.</p>
<p>Now, my interest in OpenBSD has been going on for a long time.
I started poking around for Linux alternatives way back a few years ago when Linus Torvalds decided to leave after he got in trouble for some
<a href="https://arstechnica.com/information-technology/2013/07/linus-torvalds-defends-his-right-to-shame-linux-kernel-developers/">unprofessional behaviour</a>.
That said, Linus did come back to Linux development,
but I knew that his abrasive style is what brought good code to the Linux kernel.
I also knew that his ability to be critical would be hurt by the new
<a href="https://itsfoss.com/linux-code-of-conduct/">code of conduct</a>.
It would become a tool for the SJW types to hammer on Linus for being a “white male, et al.”;
It would become a tool for the easily offended to use to get their dumb code into Linux;
It would become a tool for the corporatization, the HR-ification of Linux.
Frankly, this does not interest me.</p>
<p>Now Im sure that OpenBSD has its own internal policies that I disagree with.
That said, Theo De Raadt is still at least known for calling Firefox an “amorphous peace of garbage” due to its lack of privilege separation.
And, in their <a href="https://openbsd.org/goals.html">project goals</a> page, they specifically mention:</p>
<blockquote>
<p>Be as politics-free as possible; solutions should be decided on the basis of technical merit.</p>
</blockquote>
<p>Now thats something I can get behind!
Bet you thats not in the Linux COC?</p>
<p>He also went to university in my hometown, so thats pretty cool!
I can support a local madman who thinks he can make a better operating system than all those corporations.
Maybe he was right, maybe not. What I know is I am excited to find out!</p>
<p>Wish my luck on my OpenBSD journey. I will post updates here along the way.</p>
<p>Happy hacking!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/08/15/openbsd1/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BSD Journey, Part 1 | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">BSD Journey, Part 1</h1> <time datetime="20-08-15" class="post-date">Saturday, August 15 2020</time> </header> <hr> <p>As Linux becomes controlled by corporate sponsors and becomes more full of proprietary blobs, drivers, and even closed-source software like Steam, One may wonder if there are other options out there. For me, somebody that is intensely interested in security, there is one option: OpenBSD.</p> <p>Now, my interest in OpenBSD has been going on for a long time. I started poking around for Linux alternatives way back a few years ago when Linus Torvalds decided to leave after he got in trouble for some <a href="https://arstechnica.com/information-technology/2013/07/linus-torvalds-defends-his-right-to-shame-linux-kernel-developers/">unprofessional behaviour</a>. That said, Linus did come back to Linux development, but I knew that his abrasive style is what brought good code to the Linux kernel. I also knew that his ability to be critical would be hurt by the new <a href="https://itsfoss.com/linux-code-of-conduct/">code of conduct</a>. It would become a tool for the SJW types to hammer on Linus for being a “white male, et al.”; It would become a tool for the easily offended to use to get their dumb code into Linux; It would become a tool for the corporatization, the HR-ification of Linux. Frankly, this does not interest me.</p> <p>Now Im sure that OpenBSD has its own internal policies that I disagree with. That said, Theo De Raadt is still at least known for calling Firefox an “amorphous peace of garbage” due to its lack of privilege separation. And, in their <a href="https://openbsd.org/goals.html">project goals</a> page, they specifically mention:</p> <blockquote> <p>Be as politics-free as possible; solutions should be decided on the basis of technical merit.</p> </blockquote> <p>Now thats something I can get behind! Bet you thats not in the Linux COC?</p> <p>He also went to university in my hometown, so thats pretty cool! I can support a local madman who thinks he can make a better operating system than all those corporations. Maybe he was right, maybe not. What I know is I am excited to find out!</p> <p>Wish my luck on my OpenBSD journey. I will post updates here along the way.</p> <p>Happy hacking!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/08/15/openbsd1/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,87 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to Solve The Django Deployment Puzzle | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">How to Solve The Django Deployment Puzzle</h1>
<time datetime="20-08-18" class="post-date">Tuesday, August 18 2020</time>
</header>
<hr>
<p>A few days ago I had a Django project I wanted to put on a real server.
This project is still in its infancy, but I thought it would be nice to put it on my resume and show my friends.
Little did I know the headache coming my way.
Here are some tips to help you not make the same mistakes as me.</p>
<h3 id="asgi-servers">ASGI Servers</h3>
<p>Because my project used the ASGI (Asynchronous webServer Gateway Interface),
I needed to find a good production ASGI server to handle all the incoming requests.
The best thing I found was <a href="http://www.uvicorn.org/">uvicorn</a>.
It focuses on speed, which is a priority, especially when using the ASGI protocol.</p>
<p>To run uvicorn on the command line for testing purposes, use something like the following:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>How to Solve The Django Deployment Puzzle | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">How to Solve The Django Deployment Puzzle</h1> <time datetime="20-08-18" class="post-date">Tuesday, August 18 2020</time> </header> <hr> <p>A few days ago I had a Django project I wanted to put on a real server. This project is still in its infancy, but I thought it would be nice to put it on my resume and show my friends. Little did I know the headache coming my way. Here are some tips to help you not make the same mistakes as me.</p> <h3 id="asgi-servers">ASGI Servers</h3> <p>Because my project used the ASGI (Asynchronous webServer Gateway Interface), I needed to find a good production ASGI server to handle all the incoming requests. The best thing I found was <a href="http://www.uvicorn.org/">uvicorn</a>. It focuses on speed, which is a priority, especially when using the ASGI protocol.</p> <p>To run uvicorn on the command line for testing purposes, use something like the following:</p> <pre class="terminal">
$ uvicorn --reload myapp.asgi:application
</pre>
<p>The <code class="language-plaintext highlighter-rouge">--reload</code> option says to reload the server if any of the files get updated.
This is not recommended in production.
Sadly, I thought this meant I would need to do a hard shutdown of the server process every time I wanted to update.
This turned out to not be the case.</p>
<h3 id="workload-managers">Workload Managers</h3>
<p>There is another equine-named program called <a href="https://gunicorn.org/">gunicorn</a>
which can hold a number of processes under its control.
An interesting feature of <code class="language-plaintext highlighter-rouge">gunicorn</code> is that it will gracefully switch from an old to a new deployment,
replacing the subprocesses one-by-one and eventually having only the new deployment active on all subprocesses.
The greatest part? Zero down time.
The server keeps any old processes open if there is communication with them,
then shift and new connections to the new deployment.
This was a very cool feature I wanted to take advantage of.</p>
<p>“Now hold on!” you might protest.
“gunicorn is a WSGI server!” … oh you got me there!
Yes, thats right, <code class="language-plaintext highlighter-rouge">gunicorn</code> is paired with <code class="language-plaintext highlighter-rouge">uvicorn</code> to serve my files.</p>
<h3 id="systemd">systemd</h3>
<p>Love it or hate it, the majority of Linux distributions use the <code class="language-plaintext highlighter-rouge">systemd</code> init system.
I decided it would be very convenient to have a .service file for my Django application to run automatically at boot.
<code class="language-plaintext highlighter-rouge">Systemd</code> allows me to do this with a file like the following one I stored in <code class="language-plaintext highlighter-rouge">/lib/systemd/system/lamegames.service</code>.</p>
<pre class="file">
</pre> <p>The <code class="language-plaintext highlighter-rouge">--reload</code> option says to reload the server if any of the files get updated. This is not recommended in production. Sadly, I thought this meant I would need to do a hard shutdown of the server process every time I wanted to update. This turned out to not be the case.</p> <h3 id="workload-managers">Workload Managers</h3> <p>There is another equine-named program called <a href="https://gunicorn.org/">gunicorn</a> which can hold a number of processes under its control. An interesting feature of <code class="language-plaintext highlighter-rouge">gunicorn</code> is that it will gracefully switch from an old to a new deployment, replacing the subprocesses one-by-one and eventually having only the new deployment active on all subprocesses. The greatest part? Zero down time. The server keeps any old processes open if there is communication with them, then shift and new connections to the new deployment. This was a very cool feature I wanted to take advantage of.</p> <p>“Now hold on!” you might protest. “gunicorn is a WSGI server!” … oh you got me there! Yes, thats right, <code class="language-plaintext highlighter-rouge">gunicorn</code> is paired with <code class="language-plaintext highlighter-rouge">uvicorn</code> to serve my files.</p> <h3 id="systemd">systemd</h3> <p>Love it or hate it, the majority of Linux distributions use the <code class="language-plaintext highlighter-rouge">systemd</code> init system. I decided it would be very convenient to have a .service file for my Django application to run automatically at boot. <code class="language-plaintext highlighter-rouge">Systemd</code> allows me to do this with a file like the following one I stored in <code class="language-plaintext highlighter-rouge">/lib/systemd/system/lamegames.service</code>.</p> <pre class="file">
[Unit]
Description=Gunicorn/Uvicorn (lamegames.io)
@ -95,28 +14,7 @@ Restart=always
[Install]
WantedBy=multi-user.target
</pre>
<h3 id="nginx">nginx</h3>
<p>NGINX (pronounced engine-X) is a performance web server designed for speed and simplicity.
For the front facing side of the site, I do need a production web server like nginx.
Gunicorn simply doesnt need all the features that nginx provides, but I do.
To configure my nginx installation, I used the following few directives to:</p>
<ol>
<li>Redirect most traffic towards the gunicorn server.</li>
<li>Redirect statically served files (CSS, JS, images) to the directory specified in the STATIC_ROOT variable of my <code class="language-plaintext highlighter-rouge">settings.py</code> file.</li>
<li>Use TLS to enable https://</li>
</ol>
<p>Serving the static files from nginx as opposed to the <code class="language-plaintext highlighter-rouge">gunicorn</code> server is necessary.
Gunicorn and other production A/WSGI web server will not set the proper MIME type over TLS.
This will cause your browser to not load the Javascript/CSS.</p>
<p>This is the important part of my nginx config.</p>
<pre class="file">
</pre> <h3 id="nginx">nginx</h3> <p>NGINX (pronounced engine-X) is a performance web server designed for speed and simplicity. For the front facing side of the site, I do need a production web server like nginx. Gunicorn simply doesnt need all the features that nginx provides, but I do. To configure my nginx installation, I used the following few directives to:</p> <ol> <li>Redirect most traffic towards the gunicorn server.</li> <li>Redirect statically served files (CSS, JS, images) to the directory specified in the STATIC_ROOT variable of my <code class="language-plaintext highlighter-rouge">settings.py</code> file.</li> <li>Use TLS to enable https://</li> </ol> <p>Serving the static files from nginx as opposed to the <code class="language-plaintext highlighter-rouge">gunicorn</code> server is necessary. Gunicorn and other production A/WSGI web server will not set the proper MIME type over TLS. This will cause your browser to not load the Javascript/CSS.</p> <p>This is the important part of my nginx config.</p> <pre class="file">
server {
location / {
proxy_set_header Host $http_host;
@ -137,36 +35,6 @@ server {
alias /home/lame/lamegames.io/static_generated;
}
}
</pre>
<h3 id="setup">Setup</h3>
<p>After all that, I was able to do the following:</p>
<pre class="terminal">
</pre> <h3 id="setup">Setup</h3> <p>After all that, I was able to do the following:</p> <pre class="terminal">
# systemctl enable lamegames
</pre>
<p>This enabled my <code class="language-plaintext highlighter-rouge">gunicorn</code> server to run once the server started.
NGINX is that way be default.</p>
<p>And tada! You now have a working Django project on a production server!</p>
<h4 id="notes">Notes</h4>
<ul>
<li>If using ws:// websockets, change them to wss:// for secure web sockets.</li>
<li>Make sure to use channels.routing.get_default_application() instead of django.get_asgi_application() if yourre wanting to use channels/redis WebSockets.</li>
</ul>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/08/18/django-deployment/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>This enabled my <code class="language-plaintext highlighter-rouge">gunicorn</code> server to run once the server started. NGINX is that way be default.</p> <p>And tada! You now have a working Django project on a production server!</p> <h4 id="notes">Notes</h4> <ul> <li>If using ws:// websockets, change them to wss:// for secure web sockets.</li> <li>Make sure to use channels.routing.get_default_application() instead of django.get_asgi_application() if yourre wanting to use channels/redis WebSockets.</li> </ul> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/08/18/django-deployment/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,60 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lamegames.tait.tech | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">lamegames.tait.tech</h1>
<time datetime="20-09-09" class="post-date">Wednesday, September 09 2020</time>
</header>
<hr>
<p>This is an announcement for a new project of mine:
<a href="https://lamegames.tait.tech">lamegames.tait.tech</a>.</p>
<p>This is something Im really excited to work on!</p>
<p>Right now, Ive just got a rock-paper-scissors game.
A chat function, and a few simple card games to come.</p>
<p>Check out the repository on my <a href="https://github.com/TTWNO/lamegames.io">Github</a>.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/09/09/lamegames/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>lamegames.tait.tech | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">lamegames.tait.tech</h1> <time datetime="20-09-09" class="post-date">Wednesday, September 09 2020</time> </header> <hr> <p>This is an announcement for a new project of mine: <a href="https://lamegames.tait.tech">lamegames.tait.tech</a>.</p> <p>This is something Im really excited to work on!</p> <p>Right now, Ive just got a rock-paper-scissors game. A chat function, and a few simple card games to come.</p> <p>Check out the repository on my <a href="https://github.com/TTWNO/lamegames.io">Github</a>.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/09/09/lamegames/">beta.tait.tech</a>. </footer> </div> </body> </html>

File diff suppressed because one or more lines are too long

@ -1,123 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Curiosity | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Curiosity</h1>
<time datetime="20-10-26" class="post-date">Monday, October 26 2020</time>
</header>
<hr>
<p>Curiosity is fundamental to a deep understanding of any subject.
Masters, Ph.Ds, and other fancy name suffixes will never help you
if you dont have the spirit of curiosity burning inside of you.</p>
<p>I was speaking to someone from a journalism major at my school when the subject of hacking arose.
I expected her to know nothing about it, being a journalism student and all, but surprisingly she had something to say about it:</p>
<blockquote>
<p>“The best hackers are the ones who are curious.”</p>
</blockquote>
<p>That struck a cord with me.
It seems to me she has nailed down the difference between the students who care about grades,
and those who want to learn.
These are not necessarily mutually exclusive, but in my experience they often are due to the way education is structured.</p>
<h2 id="my-anecdote">My Anecdote</h2>
<p>In my second semester at SAIT Polytechnic, I took a class entitled <em>Emerging Trends In Technology</em>.
This class was probably the best class I have ever taken.
We had to combine two things:</p>
<ul>
<li><strong>Hard skills</strong>: learning a new hard skill like Angular, Django, or GPG encryption.</li>
<li><strong>Soft skills</strong>: public speaking and presentation of our ideas.</li>
</ul>
<p>Soft skills are not usually my area, but I can do public speaking.
I grew up quite religious, so public speaking was drilled into me young.
I liked to go off script and talk about interesting things I found along the way to the actual point.
My creativity was not usually encouraged.
That said, going off script is useful when teaching and presenting ideas;
it gives a natural air to your breath and an unquestionable confidence in your speech.</p>
<p>This is how we learn: in relationships.
Try explaining ancient Japanese history to a computer science major, or UNIX sockets to an English major and youll see what I mean.
If there is nothing for us to connect the knowledge to, it dissipates.</p>
<p>So why did I do so well in this class?</p>
<p>Our task for the semester was as follows:</p>
<ol>
<li>Learn a new subject (any <em>emerging trend in technology</em>) which you find fascinating.</li>
<li>Give a one minute introduction by week three.</li>
<li>Give a 10 minute non-technical overview by week 8.</li>
<li>Give a 20 minute technical explaination and demo by week 13.</li>
</ol>
<p>This is the only course I have ever taken which lets students imagination run wild.
Their presentation, their rules.
They treated the students like adults who know what they are doing.
What happened? Everyone stopped coming because “Oh no! Presentations!”?</p>
<p>No, exactly the opposite.
There was never more than one student missing.
Every single presentation was at least moderately interesting,
and most students were excited to come to that class.
You could see it in their faces, the way they carried themselves.
Every student picked something unique to their tastes, leaving every student more educated than before.</p>
<p>This class, unlike many others, encouraged the curiosity of the students.
It rewarded those who had unique interests and an ability to sell others on their ideas.</p>
<p>The curiosity and the grades were one.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Although its nice to have a course where these goals align here and there, anyone who has been to collage or university can tell you that is far from the norm.</p>
<p>On the other hand, I never would have started this site if it wasnt for that class alone.
So I thank you, Kitty Wong, for getting me started running my own “research blog” (?)</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/10/26/curiosity/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Curiosity | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Curiosity</h1> <time datetime="20-10-26" class="post-date">Monday, October 26 2020</time> </header> <hr> <p>Curiosity is fundamental to a deep understanding of any subject. Masters, Ph.Ds, and other fancy name suffixes will never help you if you dont have the spirit of curiosity burning inside of you.</p> <p>I was speaking to someone from a journalism major at my school when the subject of hacking arose. I expected her to know nothing about it, being a journalism student and all, but surprisingly she had something to say about it:</p> <blockquote> <p>“The best hackers are the ones who are curious.”</p> </blockquote> <p>That struck a cord with me. It seems to me she has nailed down the difference between the students who care about grades, and those who want to learn. These are not necessarily mutually exclusive, but in my experience they often are due to the way education is structured.</p> <h2 id="my-anecdote">My Anecdote</h2> <p>In my second semester at SAIT Polytechnic, I took a class entitled <em>Emerging Trends In Technology</em>. This class was probably the best class I have ever taken. We had to combine two things:</p> <ul> <li><strong>Hard skills</strong>: learning a new hard skill like Angular, Django, or GPG encryption.</li> <li><strong>Soft skills</strong>: public speaking and presentation of our ideas.</li> </ul> <p>Soft skills are not usually my area, but I can do public speaking. I grew up quite religious, so public speaking was drilled into me young. I liked to go off script and talk about interesting things I found along the way to the actual point. My creativity was not usually encouraged. That said, going off script is useful when teaching and presenting ideas; it gives a natural air to your breath and an unquestionable confidence in your speech.</p> <p>This is how we learn: in relationships. Try explaining ancient Japanese history to a computer science major, or UNIX sockets to an English major and youll see what I mean. If there is nothing for us to connect the knowledge to, it dissipates.</p> <p>So why did I do so well in this class?</p> <p>Our task for the semester was as follows:</p> <ol> <li>Learn a new subject (any <em>emerging trend in technology</em>) which you find fascinating.</li> <li>Give a one minute introduction by week three.</li> <li>Give a 10 minute non-technical overview by week 8.</li> <li>Give a 20 minute technical explaination and demo by week 13.</li> </ol> <p>This is the only course I have ever taken which lets students imagination run wild. Their presentation, their rules. They treated the students like adults who know what they are doing. What happened? Everyone stopped coming because “Oh no! Presentations!”?</p> <p>No, exactly the opposite. There was never more than one student missing. Every single presentation was at least moderately interesting, and most students were excited to come to that class. You could see it in their faces, the way they carried themselves. Every student picked something unique to their tastes, leaving every student more educated than before.</p> <p>This class, unlike many others, encouraged the curiosity of the students. It rewarded those who had unique interests and an ability to sell others on their ideas.</p> <p>The curiosity and the grades were one.</p> <h2 id="conclusion">Conclusion</h2> <p>Although its nice to have a course where these goals align here and there, anyone who has been to collage or university can tell you that is far from the norm.</p> <p>On the other hand, I never would have started this site if it wasnt for that class alone. So I thank you, Kitty Wong, for getting me started running my own “research blog” (?)</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/10/26/curiosity/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,87 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZFS NAS Box, Part 2 | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="How to get ZFS working on a Linux machine and how to try it yourself!">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">ZFS NAS Box, Part 2</h1>
<time datetime="20-11-15" class="post-date">Sunday, November 15 2020</time>
</header>
<hr>
<p>Back in <a href="/2020/04/12/nas1/">part one of my NAS project</a> I discussed how I wanted to set up my hardware.
Today, I set up the NAS (almost).</p>
<p>There were some hiccup along the way, like learning that M.2 slots can disable some of your SATA ports or waiting a month for a host bus adapter to come in from China.</p>
<h2 id="why-did-it-take-so-long">Why Did It Take So Long</h2>
<p>So it turns out I was going to spend a lot more on this project than I originally anticipated.
I ended up getting a server machine instead of a sleek NAS box.
Here are some of the quick specs:</p>
<ul>
<li>Standard ATX case by Thermaltake.</li>
<li>LSI 9211-8i.</li>
<li>The cheapest HDMI graphics card I could find on Kijiji.</li>
<li>6x 3TB Segate HDDs.</li>
<li>1x 250G Kingston SSD.</li>
<li>AMD Ryzen 5 3600.</li>
<li>MSI B450 Gaming Plus Max.</li>
<li>2x 8GB FlareX 3200Mhz RAM.</li>
<li>1x 16GB Kingston 3200Mhz RAM.</li>
</ul>
<h2 id="zfs">ZFS</h2>
<p>This is how I decided to configure my storage pools.
In hindsight, this was not the best choice for upgrading.
I may change it in the future to a 0+1 setup, but it works for now.</p>
<p>I have 5x 3TB in a RAIDZ2 with one drive not attached for redundancys sake.
How does one setup a ZFS pool. Check this out:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ZFS NAS Box, Part 2 | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content="How to get ZFS working on a Linux machine and how to try it yourself!"> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">ZFS NAS Box, Part 2</h1> <time datetime="20-11-15" class="post-date">Sunday, November 15 2020</time> </header> <hr> <p>Back in <a href="/2020/04/12/nas1/">part one of my NAS project</a> I discussed how I wanted to set up my hardware. Today, I set up the NAS (almost).</p> <p>There were some hiccup along the way, like learning that M.2 slots can disable some of your SATA ports or waiting a month for a host bus adapter to come in from China.</p> <h2 id="why-did-it-take-so-long">Why Did It Take So Long</h2> <p>So it turns out I was going to spend a lot more on this project than I originally anticipated. I ended up getting a server machine instead of a sleek NAS box. Here are some of the quick specs:</p> <ul> <li>Standard ATX case by Thermaltake.</li> <li>LSI 9211-8i.</li> <li>The cheapest HDMI graphics card I could find on Kijiji.</li> <li>6x 3TB Segate HDDs.</li> <li>1x 250G Kingston SSD.</li> <li>AMD Ryzen 5 3600.</li> <li>MSI B450 Gaming Plus Max.</li> <li>2x 8GB FlareX 3200Mhz RAM.</li> <li>1x 16GB Kingston 3200Mhz RAM.</li> </ul> <h2 id="zfs">ZFS</h2> <p>This is how I decided to configure my storage pools. In hindsight, this was not the best choice for upgrading. I may change it in the future to a 0+1 setup, but it works for now.</p> <p>I have 5x 3TB in a RAIDZ2 with one drive not attached for redundancys sake. How does one setup a ZFS pool. Check this out:</p> <pre class="terminal">
# zpool create poolname raidz2 \
/dev/by-id/blahblahblah1 \
/dev/by-id/blahblahblah2 \
/dev/by-id/blahblahblah3 \
/dev/by-id/blahblahblah4 \
/dev/by-id/blahblahblah5
</pre>
<p>And zippidy-doo! Weve got a ZFS pool!
We can check its status with <code class="language-plaintext highlighter-rouge">zpool status</code>.</p>
<pre class="terminal">
</pre> <p>And zippidy-doo! Weve got a ZFS pool! We can check its status with <code class="language-plaintext highlighter-rouge">zpool status</code>.</p> <pre class="terminal">
$ zfs status
pool: raid
state: ONLINE
@ -100,46 +24,4 @@ config:
ata-HGST_HUS724030ALA640_PN2234P8JXP77Y ONLINE 0 0 0
errors: No known data errors
</pre>
<p>I had run a scrub right before this, so theres some extra detail in that.
This is really fun! I will be doing more home storage projects soon.
Perhaps Raspberry Pi NAS using all 4 USB ports to load SATA drives on it.
Now that would be fun!</p>
<h2 id="so-i-kinda-have-a-nas-now">So I Kinda Have A NAS Now…?</h2>
<p>So right now I can only copy files with <code class="language-plaintext highlighter-rouge">rsync</code>, <code class="language-plaintext highlighter-rouge">scp</code> and moving data via a physical drive.
The one major disadvantage this has is speed.</p>
<p>Due to this machine being connected directly outside my network and pulling DHCP like a normal router would, I need to send my data through the WAN connection to get my files to it.
This is rather unfortunate as my upload speed is capped at 20 megabits per second, despite my upload being in the 300+ range.</p>
<p>Part 3 will involve a LAN card so I can connect both to the DHCP server of my ISP and my local router.
This way my transfer speeds should be in the range of 1 gigabit per second.
This will make my life much easier, at least on the local network.</p>
<h2 id="fun-fact">Fun Fact!</h2>
<p>Do not try to use the M.2 slot on a consumer motherboard where you are also using all the SATA ports.
On my consumer gaming motherboard, the SATA ports next to the M.2 slot became <em>disabled</em> when I attached the M.2 SSD.
I found this out form my motherboard documentation, which I read only after a week of thinking my motherboard itself was defective, and sending it in for repairs that did absolutely nothing.</p>
<h2 id="thoughts">Thoughts</h2>
<p>I like having all this space. I plan on using it up pretty fast, so Im already looking at how to expand.
Hopefully that gives a decent overview of how I set up my drives.</p>
<p>Happy hacking!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/11/15/nas2/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>I had run a scrub right before this, so theres some extra detail in that. This is really fun! I will be doing more home storage projects soon. Perhaps Raspberry Pi NAS using all 4 USB ports to load SATA drives on it. Now that would be fun!</p> <h2 id="so-i-kinda-have-a-nas-now">So I Kinda Have A NAS Now…?</h2> <p>So right now I can only copy files with <code class="language-plaintext highlighter-rouge">rsync</code>, <code class="language-plaintext highlighter-rouge">scp</code> and moving data via a physical drive. The one major disadvantage this has is speed.</p> <p>Due to this machine being connected directly outside my network and pulling DHCP like a normal router would, I need to send my data through the WAN connection to get my files to it. This is rather unfortunate as my upload speed is capped at 20 megabits per second, despite my upload being in the 300+ range.</p> <p>Part 3 will involve a LAN card so I can connect both to the DHCP server of my ISP and my local router. This way my transfer speeds should be in the range of 1 gigabit per second. This will make my life much easier, at least on the local network.</p> <h2 id="fun-fact">Fun Fact!</h2> <p>Do not try to use the M.2 slot on a consumer motherboard where you are also using all the SATA ports. On my consumer gaming motherboard, the SATA ports next to the M.2 slot became <em>disabled</em> when I attached the M.2 SSD. I found this out form my motherboard documentation, which I read only after a week of thinking my motherboard itself was defective, and sending it in for repairs that did absolutely nothing.</p> <h2 id="thoughts">Thoughts</h2> <p>I like having all this space. I plan on using it up pretty fast, so Im already looking at how to expand. Hopefully that gives a decent overview of how I set up my drives.</p> <p>Happy hacking!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/11/15/nas2/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,127 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Getting Pacaur Working on a Raspberry Pi 4 with Manjaro ARM or Arch Linux | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Getting Pacaur Working on a Raspberry Pi 4 with Manjaro ARM or Arch Linux</h1>
<time datetime="20-12-01" class="post-date">Tuesday, December 01 2020</time>
</header>
<hr>
<p>I recently installed Manjaro ARM (based on Arch Linux ARM) on a Raspberry Pi 4.
I used some standard commands to start to add the <code class="language-plaintext highlighter-rouge">pacaur</code> package so I can easily retrieve <a href="https://wiki.archlinux.org/index.php/Arch_User_Repository">AUR packages</a> without needing to do it manually.
Unfortunately, there is a small problem with compiling this on ARM.</p>
<h2 id="always_inline">always_inline</h2>
<p>To setup the install for <code class="language-plaintext highlighter-rouge">pacaur</code>, I first needed to download <a href="https://aur.archlinux.org/packages/auracle-git">auracle-git</a> AUR package manually.
I ran into an error when compiling this package.</p>
<p>But first, my setup:</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Getting Pacaur Working on a Raspberry Pi 4 with Manjaro ARM or Arch Linux | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Getting Pacaur Working on a Raspberry Pi 4 with Manjaro ARM or Arch Linux</h1> <time datetime="20-12-01" class="post-date">Tuesday, December 01 2020</time> </header> <hr> <p>I recently installed Manjaro ARM (based on Arch Linux ARM) on a Raspberry Pi 4. I used some standard commands to start to add the <code class="language-plaintext highlighter-rouge">pacaur</code> package so I can easily retrieve <a href="https://wiki.archlinux.org/index.php/Arch_User_Repository">AUR packages</a> without needing to do it manually. Unfortunately, there is a small problem with compiling this on ARM.</p> <h2 id="always_inline">always_inline</h2> <p>To setup the install for <code class="language-plaintext highlighter-rouge">pacaur</code>, I first needed to download <a href="https://aur.archlinux.org/packages/auracle-git">auracle-git</a> AUR package manually. I ran into an error when compiling this package.</p> <p>But first, my setup:</p> <pre class="terminal">
$ git clone https://aur.archlinux.org/auracle-git
$ cd auracle-git
$ makepkg -sri
</pre>
<p>Around half way through compiling this project, I got this cryptic message telling me there was a “target specific option mismatch”…Whatever that means.
The full error is below, hopefully that helps my chances on the search engines.</p>
<pre class="terminal">
</pre> <p>Around half way through compiling this project, I got this cryptic message telling me there was a “target specific option mismatch”…Whatever that means. The full error is below, hopefully that helps my chances on the search engines.</p> <pre class="terminal">
In file included from ../subprojects/abseil-cpp-20200225.2/absl/random/internal/randen_hwaes.cc:225:
/usr/lib/gcc/aarch64-unknown-linux-gnu/9.3.0/include/arm_neon.h: In function 'Vector128 {anonymous}::AesRound(const Vector128&amp;, const Vector128&amp;)':
/usr/lib/gcc/aarch64-unknown-linux-gnu/9.3.0/include/arm_neon.h:12452:1: error: inlining failed in call to always_inline 'uint8x16_t vaesmcq_u8(uint8x16_t)': target specific option mismatch
12452 | vaesmcq_u8 (uint8x16_t data)
</pre>
<p>Luckily, there is a very easy fix for this.
The user redfish <a href="https://aur.archlinux.org/packages/auracle-git#comment-762117">helpfully pointed out</a>
on the <code class="language-plaintext highlighter-rouge">auracle-git</code> package page that you need to add a special make option to your <code class="language-plaintext highlighter-rouge">/etc/make.conf</code> file to make this work.</p>
<p>His solution, as commented is like so:</p>
<blockquote>
<p>If you get this error when building for ARM aarch64:</p>
<p>(insert error message from before)</p>
<p>Then check that in /etc/makepkg.conf CFLAGS and CXXFLAGS have the +crypto suffix in -march flag, like -march=armv8-a+crypto (the base identifier may very depending on your hardware)</p>
</blockquote>
<p>Basically, there is a file on Linux: <code class="language-plaintext highlighter-rouge">/etc/makepkg.conf</code> which tells your computer how to compile <em>all</em> programs on the system.
By default the Manjaro ARM (RPi4) edition has the following relevant lines in <code class="language-plaintext highlighter-rouge">makepkg.conf</code>.</p>
<pre class="file">
</pre> <p>Luckily, there is a very easy fix for this. The user redfish <a href="https://aur.archlinux.org/packages/auracle-git#comment-762117">helpfully pointed out</a> on the <code class="language-plaintext highlighter-rouge">auracle-git</code> package page that you need to add a special make option to your <code class="language-plaintext highlighter-rouge">/etc/make.conf</code> file to make this work.</p> <p>His solution, as commented is like so:</p> <blockquote> <p>If you get this error when building for ARM aarch64:</p> <p>(insert error message from before)</p> <p>Then check that in /etc/makepkg.conf CFLAGS and CXXFLAGS have the +crypto suffix in -march flag, like -march=armv8-a+crypto (the base identifier may very depending on your hardware)</p> </blockquote> <p>Basically, there is a file on Linux: <code class="language-plaintext highlighter-rouge">/etc/makepkg.conf</code> which tells your computer how to compile <em>all</em> programs on the system. By default the Manjaro ARM (RPi4) edition has the following relevant lines in <code class="language-plaintext highlighter-rouge">makepkg.conf</code>.</p> <pre class="file">
CFLAGS="-march=armv8-a -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=armv8-a -O2 -pipe -fstack-protector-strong -fno-plt"
</pre>
<p>What Mr. redfish is telling us is that we must add +crypto to the end of the -march compiler flag so that our compiler will know how to inline that pesky vaesmcq_u8 function.</p>
<p>So in the end, your <code class="language-plaintext highlighter-rouge">makepkg.conf</code>s relevant lines will look like so:</p>
<pre class="file">
</pre> <p>What Mr. redfish is telling us is that we must add +crypto to the end of the -march compiler flag so that our compiler will know how to inline that pesky vaesmcq_u8 function.</p> <p>So in the end, your <code class="language-plaintext highlighter-rouge">makepkg.conf</code>s relevant lines will look like so:</p> <pre class="file">
CFLAGS="-march=armv8-a+crypto -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=armv8-a+crypto -O2 -pipe -fstack-protector-strong -fno-plt"
</pre>
<h2 id="why">Why?</h2>
<p>Redfish continues:</p>
<blockquote>
<p>Build of abseil-cpp package works because it uses CMake which adds the correct -march flag regardless of makepkg.conf, whereas when abseil-cpp is build as a subproject within this package, it uses meson, which does not add the flag and thus fails with the above error.</p>
</blockquote>
<p>In other words, one of the dependencies pulled in with auracle is not compiling without this special compiler flag enabled.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Thanks to redfish for posting this solution to the forums!
Wouldve been quite the rabbit hole for me to figure out how to do that.
In fact, it is very likely I would have never figured that one out.</p>
<p>After this issue is resolved, the installation of <code class="language-plaintext highlighter-rouge">pacaur</code> goes as expected. Nice and easy!
Pacuar will compile on any architecture so its smooth sailing from here.</p>
<p>Happy hacking!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/12/01/pacaur-rpi/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <h2 id="why">Why?</h2> <p>Redfish continues:</p> <blockquote> <p>Build of abseil-cpp package works because it uses CMake which adds the correct -march flag regardless of makepkg.conf, whereas when abseil-cpp is build as a subproject within this package, it uses meson, which does not add the flag and thus fails with the above error.</p> </blockquote> <p>In other words, one of the dependencies pulled in with auracle is not compiling without this special compiler flag enabled.</p> <h2 id="conclusion">Conclusion</h2> <p>Thanks to redfish for posting this solution to the forums! Wouldve been quite the rabbit hole for me to figure out how to do that. In fact, it is very likely I would have never figured that one out.</p> <p>After this issue is resolved, the installation of <code class="language-plaintext highlighter-rouge">pacaur</code> goes as expected. Nice and easy! Pacuar will compile on any architecture so its smooth sailing from here.</p> <p>Happy hacking!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/12/01/pacaur-rpi/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,190 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Orca, Emacspeak and Chromium Accessibility on A Raspberry Pi Running Manjaro ARM | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="orca linux raspberry-pi rpi raspberry pi screen reader screen-reader 64 bit 64-bit 64bit aarch64 emacs emacspeak manjaro manjaro-arm manjaro-aarch64">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Orca, Emacspeak and Chromium Accessibility on A Raspberry Pi Running Manjaro ARM</h1>
<time datetime="20-12-14" class="post-date">Monday, December 14 2020</time>
</header>
<hr>
<p>I wanted to get a gift for my blind friend who has been interested in learning Linux for a while now.
Just when I was about to start looking for something I decided to take a look at <a href="https://lbry.tv/@Lunduke:e/raspberry-pi-400-looks-rad:c">Brian Lundukes newest video</a> featuring the <a href="https://www.raspberrypi.org/products/raspberry-pi-400/?resellerType=home">Raspberry Pi 400</a>.
The Raspberry Pi 400 has come full circle in terms of computing.
It is a keyboard. All the computing is done from within the keyboard.
Much like the Comodore64, this computer comes without a screen but is still technically fully functional without one.
I had my Aha! moment, and decided that the Raspberry Pi 400 would be a very cool present.</p>
<h2 id="no-headphone-jack">No Headphone Jack</h2>
<p>My first problem was that the Raspberry Pi 400 does not come with a headphone jack,
even though every other Raspberry Pi A/B/B+ board with the exception of the compute modules and Zero series have included one.
That said, the Raspberry Pi audio jacks are also known to crackle and pop due to either bad drivers or cheap manufacturing.</p>
<p>To compensate, I got an external USB audio card.
I ended up going with the <a href="https://www.amazon.ca/DuKabel-ProSeries-Mic-Supported-Headphone-External/dp/B07RS11M1T/">DuKabel USB to 3.5mm Jack Adapter (Amazon)</a>.</p>
<p>There are cheaper options for sure, but when I was looking around Raspberry Pi forums and Amazon reviews, this specific model seemed to come out on top in terms of performance.
It costed me around 40 Canadian dollars.
I figure this isnt too bad considering my friend doesnt need a screen, haha!</p>
<h2 id="distribution">Distribution</h2>
<p>I wanted to choose something which will age well, and run the latest and greatest.
For visually impaired users, the most important piece of software is the screen reader. If the screen reader doesnt work, the rest of the work is toast!
Some Raspberry Pi Orca installation guides <a href="https://techesoterica.com/getting-the-orca-screen-reader-working-on-a-raspberry-pi-4-with-raspbian-buster-and-the-mate-desktop/">like this one</a>,
have actually asked the user to <em>compile Orca from source</em> to get the latest version due to how out-of-date Debians package repositories are.
A distribution which has none of these fusses was top priority,
especially because Orca receives frequent updates.</p>
<p>I decided to go with <a href="https://manjaro.org/download/#raspberry-pi-4-xfce">Manjaro ARM Xfce</a>:</p>
<ul>
<li>Xfce is lightweight.</li>
<li>Runs a 64-bit kernel.</li>
<li>Is based on Arch Linux, so receives very frequent package updates.</li>
<li>Has the AUR (<a href="#aur">with some effort</a>, as well see).</li>
</ul>
<p>The only downside of Manjaro ARM, and likewise other Aarch64 (ARM 64-bit) architecture kernels is that it did not have HEVC nor H264 hardware decoding available.
Apparently, support for the Raspberry Pis VC4 graphics is getting mainlined <a href="https://www.debugpoint.com/2020/12/linux-kernel-5-10-features/">in Linux kernel 5.10</a>.
Unfortunately, running the release candidate (RC) kernel did not make the Raspberry Pi 400 use hardware decoding.
Perhaps other applications like <code class="language-plaintext highlighter-rouge">ffmpeg</code> and Chromium need to add support as well before this works.</p>
<h2 id="orca">Orca</h2>
<p>As stated before, minimum requirement for a visually impaired desktop Linux user is a screen reader.
The most used screen reader for Linux is Orca, headed by the <a href="https://wiki.gnome.org/Projects/Orca">GNOME Project</a>.
This is relatively easy to install with a standard <code class="language-plaintext highlighter-rouge">pacman</code> command.</p>
<pre class="terminal">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Orca, Emacspeak and Chromium Accessibility on A Raspberry Pi Running Manjaro ARM | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content="orca linux raspberry-pi rpi raspberry pi screen reader screen-reader 64 bit 64-bit 64bit aarch64 emacs emacspeak manjaro manjaro-arm manjaro-aarch64"> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Orca, Emacspeak and Chromium Accessibility on A Raspberry Pi Running Manjaro ARM</h1> <time datetime="20-12-14" class="post-date">Monday, December 14 2020</time> </header> <hr> <p>I wanted to get a gift for my blind friend who has been interested in learning Linux for a while now. Just when I was about to start looking for something I decided to take a look at <a href="https://lbry.tv/@Lunduke:e/raspberry-pi-400-looks-rad:c">Brian Lundukes newest video</a> featuring the <a href="https://www.raspberrypi.org/products/raspberry-pi-400/?resellerType=home">Raspberry Pi 400</a>. The Raspberry Pi 400 has come full circle in terms of computing. It is a keyboard. All the computing is done from within the keyboard. Much like the Comodore64, this computer comes without a screen but is still technically fully functional without one. I had my Aha! moment, and decided that the Raspberry Pi 400 would be a very cool present.</p> <h2 id="no-headphone-jack">No Headphone Jack</h2> <p>My first problem was that the Raspberry Pi 400 does not come with a headphone jack, even though every other Raspberry Pi A/B/B+ board with the exception of the compute modules and Zero series have included one. That said, the Raspberry Pi audio jacks are also known to crackle and pop due to either bad drivers or cheap manufacturing.</p> <p>To compensate, I got an external USB audio card. I ended up going with the <a href="https://www.amazon.ca/DuKabel-ProSeries-Mic-Supported-Headphone-External/dp/B07RS11M1T/">DuKabel USB to 3.5mm Jack Adapter (Amazon)</a>.</p> <p>There are cheaper options for sure, but when I was looking around Raspberry Pi forums and Amazon reviews, this specific model seemed to come out on top in terms of performance. It costed me around 40 Canadian dollars. I figure this isnt too bad considering my friend doesnt need a screen, haha!</p> <h2 id="distribution">Distribution</h2> <p>I wanted to choose something which will age well, and run the latest and greatest. For visually impaired users, the most important piece of software is the screen reader. If the screen reader doesnt work, the rest of the work is toast! Some Raspberry Pi Orca installation guides <a href="https://techesoterica.com/getting-the-orca-screen-reader-working-on-a-raspberry-pi-4-with-raspbian-buster-and-the-mate-desktop/">like this one</a>, have actually asked the user to <em>compile Orca from source</em> to get the latest version due to how out-of-date Debians package repositories are. A distribution which has none of these fusses was top priority, especially because Orca receives frequent updates.</p> <p>I decided to go with <a href="https://manjaro.org/download/#raspberry-pi-4-xfce">Manjaro ARM Xfce</a>:</p> <ul> <li>Xfce is lightweight.</li> <li>Runs a 64-bit kernel.</li> <li>Is based on Arch Linux, so receives very frequent package updates.</li> <li>Has the AUR (<a href="#aur">with some effort</a>, as well see).</li> </ul> <p>The only downside of Manjaro ARM, and likewise other Aarch64 (ARM 64-bit) architecture kernels is that it did not have HEVC nor H264 hardware decoding available. Apparently, support for the Raspberry Pis VC4 graphics is getting mainlined <a href="https://www.debugpoint.com/2020/12/linux-kernel-5-10-features/">in Linux kernel 5.10</a>. Unfortunately, running the release candidate (RC) kernel did not make the Raspberry Pi 400 use hardware decoding. Perhaps other applications like <code class="language-plaintext highlighter-rouge">ffmpeg</code> and Chromium need to add support as well before this works.</p> <h2 id="orca">Orca</h2> <p>As stated before, minimum requirement for a visually impaired desktop Linux user is a screen reader. The most used screen reader for Linux is Orca, headed by the <a href="https://wiki.gnome.org/Projects/Orca">GNOME Project</a>. This is relatively easy to install with a standard <code class="language-plaintext highlighter-rouge">pacman</code> command.</p> <pre class="terminal">
# pacman -S orca
</pre>
<p>If logged in via SSH, you can start Orca with the <code class="language-plaintext highlighter-rouge">orca</code> command. This will start reading the screen to you so you can do the next parts.</p>
<p>To activate Orca on login with LightDM, enable it in the LightDM GTK+ Greeter Settings application. The Misc. tab will have a drop-down for asking which screen reader you want to use.
This will start Orca when the LightDM login system starts.</p>
<p>LightDMs Orca will not help us once we are logged in however.
To activate Orca on login, open the Session And Startup application program, then add Orca to the “startup” list of apps.</p>
<p>And now Orca will be activated on boot and login.</p>
<h2 id="aur">AUR</h2>
<p>The AUR, or the Arch User Repository has community maintained and distributed packages.
Basically, you download a file which will tell your computer how to download, build and install a package for you.</p>
<p>To get the AUR working in a more automatic way, we need to install the <code class="language-plaintext highlighter-rouge">pacaur</code> helper.
This merited its own article, so check that out here:
<a href="/2020/12/01/pacaur-rpi/">How to Install Pacaur on Manjaro ARM</a></p>
<p>The TL;DR is that we need to open the <code class="language-plaintext highlighter-rouge">/etc/makepkg.conf</code> file and replace any mention of <code class="language-plaintext highlighter-rouge">-march=armv8-a</code> with <code class="language-plaintext highlighter-rouge">-march=armv8-a+crypto</code>.</p>
<p>This can be done as a oneliner, thanks to the <code class="language-plaintext highlighter-rouge">sed</code> command.</p>
<pre class="terminal">
</pre> <p>If logged in via SSH, you can start Orca with the <code class="language-plaintext highlighter-rouge">orca</code> command. This will start reading the screen to you so you can do the next parts.</p> <p>To activate Orca on login with LightDM, enable it in the LightDM GTK+ Greeter Settings application. The Misc. tab will have a drop-down for asking which screen reader you want to use. This will start Orca when the LightDM login system starts.</p> <p>LightDMs Orca will not help us once we are logged in however. To activate Orca on login, open the Session And Startup application program, then add Orca to the “startup” list of apps.</p> <p>And now Orca will be activated on boot and login.</p> <h2 id="aur">AUR</h2> <p>The AUR, or the Arch User Repository has community maintained and distributed packages. Basically, you download a file which will tell your computer how to download, build and install a package for you.</p> <p>To get the AUR working in a more automatic way, we need to install the <code class="language-plaintext highlighter-rouge">pacaur</code> helper. This merited its own article, so check that out here: <a href="/2020/12/01/pacaur-rpi/">How to Install Pacaur on Manjaro ARM</a></p> <p>The TL;DR is that we need to open the <code class="language-plaintext highlighter-rouge">/etc/makepkg.conf</code> file and replace any mention of <code class="language-plaintext highlighter-rouge">-march=armv8-a</code> with <code class="language-plaintext highlighter-rouge">-march=armv8-a+crypto</code>.</p> <p>This can be done as a oneliner, thanks to the <code class="language-plaintext highlighter-rouge">sed</code> command.</p> <pre class="terminal">
# sed -i 's/-march=armv8-a/-march=armv8-a+crypto/' /etc/makepkg.conf
</pre>
<h2 id="emacspeak">Emacspeak</h2>
<p><a href="https://www.gnu.org/software/emacs/">Emacs</a> is a scriptable document editor run by the <a href="https://gnu.org/">GNU Project</a>.
Infamous for its high learning curve though it may be,
there is a very extensive speech extension for it called <a href="http://emacspeak.sourceforge.net/">Emacspeak</a>.
Emacspeak is built entirely by <a href="https://tvraman.github.io/vita/resume.html">T. V. Ramen</a> and has been freely available since its inception in 1999.
Due to its age (and thus maturity), Emacspeak is an important tool in any “eyes-free” software developer toolkit.</p>
<p>Lucky for me, Emacspeak appears to not only to be available in the AUR,
but also compilable with the Aarch64 architecture—the architecture of the Raspberry Pi 400.
So this is as easy to install as:</p>
<pre class="terminal">
</pre> <h2 id="emacspeak">Emacspeak</h2> <p><a href="https://www.gnu.org/software/emacs/">Emacs</a> is a scriptable document editor run by the <a href="https://gnu.org/">GNU Project</a>. Infamous for its high learning curve though it may be, there is a very extensive speech extension for it called <a href="http://emacspeak.sourceforge.net/">Emacspeak</a>. Emacspeak is built entirely by <a href="https://tvraman.github.io/vita/resume.html">T. V. Ramen</a> and has been freely available since its inception in 1999. Due to its age (and thus maturity), Emacspeak is an important tool in any “eyes-free” software developer toolkit.</p> <p>Lucky for me, Emacspeak appears to not only to be available in the AUR, but also compilable with the Aarch64 architecture—the architecture of the Raspberry Pi 400. So this is as easy to install as:</p> <pre class="terminal">
$ pacaur -S emacspeak
</pre>
<h2 id="web-browsers">Web Browsers</h2>
<p>Ill cover a couple web browsers here based on how they worked.</p>
<h3 id="firefox">Firefox</h3>
<p>Firefox will run in accessibility mode with <a href="https://en.wikipedia.org/wiki/Caret_navigation">caret browsing</a> enabled automatically when it detects Orca is running.
This makes Firefox <em>by far</em> the best browser for the job.</p>
<h3 id="chromium">Chromium</h3>
<p>Chromium… Ugh. So it works, sort of.
You need to enable two special flags, and add an environment variable.</p>
<p>To do this, I suggest editing the main profile in <code class="language-plaintext highlighter-rouge">/etc/profile</code>.
Add the following line to the end of that file:</p>
<pre class="file">
</pre> <h2 id="web-browsers">Web Browsers</h2> <p>Ill cover a couple web browsers here based on how they worked.</p> <h3 id="firefox">Firefox</h3> <p>Firefox will run in accessibility mode with <a href="https://en.wikipedia.org/wiki/Caret_navigation">caret browsing</a> enabled automatically when it detects Orca is running. This makes Firefox <em>by far</em> the best browser for the job.</p> <h3 id="chromium">Chromium</h3> <p>Chromium… Ugh. So it works, sort of. You need to enable two special flags, and add an environment variable.</p> <p>To do this, I suggest editing the main profile in <code class="language-plaintext highlighter-rouge">/etc/profile</code>. Add the following line to the end of that file:</p> <pre class="file">
export ENABLE_ACCESSIBILITY=1
</pre>
<p>Next, add two flags to the <code class="language-plaintext highlighter-rouge">$HOME/.config/chromium-flags.conf</code> file.</p>
<pre class="file">
</pre> <p>Next, add two flags to the <code class="language-plaintext highlighter-rouge">$HOME/.config/chromium-flags.conf</code> file.</p> <pre class="file">
--force-renderer-accessibility
--enable-caret-browsing
</pre>
<p>You will need to relog to set the ENABLE_ACCESSIBILITY environment variable. Now Chromium should work with Orca.</p>
<h3 id="badwolf">Badwolf</h3>
<p>The <a href="https://www.mankier.com/1/badwolf">Badwolf browser</a>
is based on the WebkitGTK engine, as opposed to Firefoxs Gecko and Googles Blink engines.
It <em>almost</em> works out of the box. It is really fast compared to the other two,
but it lacks some features like announcing a page is done loading and it doesnt appear to support caret browsing,
which will cause some other problems.
Interesting though for such a young browser to have a minimal level of accessibility so early!</p>
<p>I would be interested where this goes in the future.</p>
<h2 id="ps">P.S.</h2>
<p>Somehow I forgot that you would need to setup the dummy display driver to work with the graphics without a display attached.
To do this, install the <code class="language-plaintext highlighter-rouge">xf86-video-dummy</code> pacakge:</p>
<pre class="terminal">
</pre> <p>You will need to relog to set the ENABLE_ACCESSIBILITY environment variable. Now Chromium should work with Orca.</p> <h3 id="badwolf">Badwolf</h3> <p>The <a href="https://www.mankier.com/1/badwolf">Badwolf browser</a> is based on the WebkitGTK engine, as opposed to Firefoxs Gecko and Googles Blink engines. It <em>almost</em> works out of the box. It is really fast compared to the other two, but it lacks some features like announcing a page is done loading and it doesnt appear to support caret browsing, which will cause some other problems. Interesting though for such a young browser to have a minimal level of accessibility so early!</p> <p>I would be interested where this goes in the future.</p> <h2 id="ps">P.S.</h2> <p>Somehow I forgot that you would need to setup the dummy display driver to work with the graphics without a display attached. To do this, install the <code class="language-plaintext highlighter-rouge">xf86-video-dummy</code> pacakge:</p> <pre class="terminal">
# pacman -S xf86-video-dummy
</pre>
<p>Next, override any <code class="language-plaintext highlighter-rouge">/etc/X11/xorg.conf</code> you may have with this:</p>
<pre class="file">
</pre> <p>Next, override any <code class="language-plaintext highlighter-rouge">/etc/X11/xorg.conf</code> you may have with this:</p> <pre class="file">
Section "Monitor"
Identifier "Monitor0"
HorizSync 28.0-80.0
@ -210,25 +37,4 @@ Section "Screen"
Modes "1920x1080_60.00"
EndSubSection
EndSection
</pre>
<p>Now, when you boot, you should head Screen reader on.</p>
<h2 id="conclusion">Conclusion</h2>
<p>It took a bit of messing around to get this working, but Im glad I did!
Now I can nerd out with another Linux friend and given how well they seem to find problems with accessibility, hopefully a few upstream patches can be made.</p>
<p>Happy hacking, for everyone!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/12/14/orca-raspberry-pi-manjaro/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>Now, when you boot, you should head Screen reader on.</p> <h2 id="conclusion">Conclusion</h2> <p>It took a bit of messing around to get this working, but Im glad I did! Now I can nerd out with another Linux friend and given how well they seem to find problems with accessibility, hopefully a few upstream patches can be made.</p> <p>Happy hacking, for everyone!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/12/14/orca-raspberry-pi-manjaro/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,76 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to Deploy Lichess's Lila With Nginx | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">How to Deploy Lichess's Lila With Nginx</h1>
<time datetime="20-12-20" class="post-date">Sunday, December 20 2020</time>
</header>
<hr>
<p>I was getting ready to have a public test of some changes I made to <a href="https://lichess.org">lichess.org</a>s <a href="https://lichess.org/source">open source chess platform</a>.
In preperation, I got my Lets Encrypt certificates and nginx configurations setup…
and it wouldnt work.
Here are some tips for myself and future Lichess developers.</p>
<h2 id="reasoning">Reasoning</h2>
<p>My pull request involves accessibility.
It will extend Lichesss NVUI (Non-Visual User Interface) to be more accessible to beginner level chess players.
At the time of writing this, Lichesss NVUI only supports searching pieces by type, rank and file.
It does not support any kind of interactive board.</p>
<p>I wanted to play chess with a friend of mine who uses a screen reader.
Even though Lichess does indeed have a separate rendering of the page for visually impaired users,
I have heard from a few people that it is not the best.</p>
<p>I dont use a screen reader myself, so I thought having a public latest changes deployed server would work better for testing.
It would certainly work better than getting some of my less computer literate friends to connect to me via VSCode/VPN and view my local repository.</p>
<p>So here is how to deploy it:</p>
<h2 id="setup-a-development-environment">Setup a development environment</h2>
<p>This is described <a href="https://github.com/ornicar/lila/wiki/Lichess-Development-Onboarding">in Lichesss documentation itself</a>.
I will not elaborate further as it is not necessary.</p>
<h2 id="setup-nginx">Setup nginx</h2>
<p>This is the part that stumps most people.
Getting a local development server usually works alright, but once you want to reverse proxy it for security and professionalism purposes, it get more interesting.</p>
<p>Here is the relevant portion of my nginx configuration for lila:</p>
<pre class="file">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>How to Deploy Lichess's Lila With Nginx | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">How to Deploy Lichess's Lila With Nginx</h1> <time datetime="20-12-20" class="post-date">Sunday, December 20 2020</time> </header> <hr> <p>I was getting ready to have a public test of some changes I made to <a href="https://lichess.org">lichess.org</a>s <a href="https://lichess.org/source">open source chess platform</a>. In preperation, I got my Lets Encrypt certificates and nginx configurations setup… and it wouldnt work. Here are some tips for myself and future Lichess developers.</p> <h2 id="reasoning">Reasoning</h2> <p>My pull request involves accessibility. It will extend Lichesss NVUI (Non-Visual User Interface) to be more accessible to beginner level chess players. At the time of writing this, Lichesss NVUI only supports searching pieces by type, rank and file. It does not support any kind of interactive board.</p> <p>I wanted to play chess with a friend of mine who uses a screen reader. Even though Lichess does indeed have a separate rendering of the page for visually impaired users, I have heard from a few people that it is not the best.</p> <p>I dont use a screen reader myself, so I thought having a public latest changes deployed server would work better for testing. It would certainly work better than getting some of my less computer literate friends to connect to me via VSCode/VPN and view my local repository.</p> <p>So here is how to deploy it:</p> <h2 id="setup-a-development-environment">Setup a development environment</h2> <p>This is described <a href="https://github.com/ornicar/lila/wiki/Lichess-Development-Onboarding">in Lichesss documentation itself</a>. I will not elaborate further as it is not necessary.</p> <h2 id="setup-nginx">Setup nginx</h2> <p>This is the part that stumps most people. Getting a local development server usually works alright, but once you want to reverse proxy it for security and professionalism purposes, it get more interesting.</p> <p>Here is the relevant portion of my nginx configuration for lila:</p> <pre class="file">
server_name chess.tait.tech;
location / {
@ -80,11 +8,7 @@ location / {
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Real-IP $remote_addr;
}
</pre>
<p>This is the config for the lila-ws websocket subdomain:</p>
<pre class="file">
</pre> <p>This is the config for the lila-ws websocket subdomain:</p> <pre class="file">
server_name ws.chess.tait.tech;
location / {
@ -93,15 +17,7 @@ location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
</pre>
<p>You will need to deploy these on two virtual hosts.</p>
<h2 id="lila">Lila</h2>
<p><a href="https://github.com/ornicar/lila/">Lila</a> is the name for the main chess server, we need to change a few settings. Here is my git diff for the <code class="language-plaintext highlighter-rouge">conf/base.conf</code> file:</p>
<pre class="file">
</pre> <p>You will need to deploy these on two virtual hosts.</p> <h2 id="lila">Lila</h2> <p><a href="https://github.com/ornicar/lila/">Lila</a> is the name for the main chess server, we need to change a few settings. Here is my git diff for the <code class="language-plaintext highlighter-rouge">conf/base.conf</code> file:</p> <pre class="file">
- domain = "localhost:9663"
- socket.domains = [ "localhost:9664" ]
+ domain = "chess.tait.tech"
@ -112,37 +28,7 @@ location / {
asset.minified = false
- base_url = "http://"${net.domain}
+ base_url = "https://"${net.domain}
</pre>
<h3 id="lila-ws">Lila-ws</h3>
<p><a href="https://github.com/ornicar/lila-ws/">Lila-ws</a> is the websocket component of Lila.</p>
<p>The most common complaint amongst aspiring Lichess developers is websockets not working.
They constantly get these 101 responses from the websocket,
and it also seems that the websocket returns instead of staying in the pending state as it should be.</p>
<p>Here is how to fix that (in diff format):</p>
<pre class="file">
</pre> <h3 id="lila-ws">Lila-ws</h3> <p><a href="https://github.com/ornicar/lila-ws/">Lila-ws</a> is the websocket component of Lila.</p> <p>The most common complaint amongst aspiring Lichess developers is websockets not working. They constantly get these 101 responses from the websocket, and it also seems that the websocket returns instead of staying in the pending state as it should be.</p> <p>Here is how to fix that (in diff format):</p> <pre class="file">
-csrf.origin = "http://127.0.0.1:9000"
+csrf.origin = "https://chess.tait.tech"
</pre>
<p>You need to tell lila-ws where the websocket requests will be coming from. This is how to do that.</p>
<h2 id="conclusion">Conclusion</h2>
<p>This is not a long article, but just some notes for future me and Lila developers.</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2020/12/20/deploy-lichess/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</pre> <p>You need to tell lila-ws where the websocket requests will be coming from. This is how to do that.</p> <h2 id="conclusion">Conclusion</h2> <p>This is not a long article, but just some notes for future me and Lila developers.</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2020/12/20/deploy-lichess/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,116 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Lichess Accessibility | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Lichess Accessibility</h1>
<time datetime="21-01-31" class="post-date">Sunday, January 31 2021</time>
</header>
<hr>
<p>I wanted to play chess with somebody who used a screen reader, without requiring a screen reader myself;
some sites, like QuintenCs Playroom have a rather poor visual interface for anyone who would like the play the game visually.
<a href="https://lichess.org">Lichess</a> is an free and open-source website for chess players;
it bridges this gap by having two “modes” on the site:
standard mode and accessibility mode.</p>
<h2 id="accessibility-mode">Accessibility Mode</h2>
<p>Accessibility mode is far from perfect on lichess.org.
That said, the idea to separate the sites into different modes was a good call.
It stops the inevitable “this would work well for screen readers but cause visual issues” shenanigans,
or, vice-verse “this looks great but it might be weird with a screen reader”.
This way all the things which affect the visual interface are in one place,
and all things which affect the non-visual user interface (NVUI) are written in another.</p>
<p>In my quest to play chess with visual and non-visual players with both having optimal experiences, I tried Lichess with my friend from <a href="https://melly.tech/">melly.tech</a>.
She pointed out that the method to interface with the board previously was rather poor.
This is because it required an “enter” at the end of each command and the commands tended to read out a row or column of a chessboard not just an individual square.</p>
<p>For example, to list all pieces (or lack thereof) on the e file, I would type the command:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s e
</code></pre></div></div>
<p>Although this seems good in theory, and its great when you need an entire file, there was no way to get only one square.
In addition, imagine typing to navigate around the board:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s e1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Lichess Accessibility | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Lichess Accessibility</h1> <time datetime="21-01-31" class="post-date">Sunday, January 31 2021</time> </header> <hr> <p>I wanted to play chess with somebody who used a screen reader, without requiring a screen reader myself; some sites, like QuintenCs Playroom have a rather poor visual interface for anyone who would like the play the game visually. <a href="https://lichess.org">Lichess</a> is an free and open-source website for chess players; it bridges this gap by having two “modes” on the site: standard mode and accessibility mode.</p> <h2 id="accessibility-mode">Accessibility Mode</h2> <p>Accessibility mode is far from perfect on lichess.org. That said, the idea to separate the sites into different modes was a good call. It stops the inevitable “this would work well for screen readers but cause visual issues” shenanigans, or, vice-verse “this looks great but it might be weird with a screen reader”. This way all the things which affect the visual interface are in one place, and all things which affect the non-visual user interface (NVUI) are written in another.</p> <p>In my quest to play chess with visual and non-visual players with both having optimal experiences, I tried Lichess with my friend from <a href="https://melly.tech/">melly.tech</a>. She pointed out that the method to interface with the board previously was rather poor. This is because it required an “enter” at the end of each command and the commands tended to read out a row or column of a chessboard not just an individual square.</p> <p>For example, to list all pieces (or lack thereof) on the e file, I would type the command:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s e
</code></pre></div></div> <p>Although this seems good in theory, and its great when you need an entire file, there was no way to get only one square. In addition, imagine typing to navigate around the board:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s e1
s f1
s e2
</code></pre></div></div>
<p>For the inexperienced player, it seems to be more convenient to bind some keys and have the user bounce to various buttons, which they can push to say “I want to move this piece”.
This is what I was told anyway.
So I want to work making a system so you could use the following basic keys:</p>
<ul>
<li>left/right/up/down arrow: move on the board.</li>
<li>k/q/r/b/n/p: move to next piece represented by its character in chess notation.</li>
<li>shift + k/q/r/b/n/p: move back to the last piece represented by its character in chess notation.</li>
<li>click/enter/space: select piece to move.</li>
<li>click/enter/space again: move piece here.</li>
<li>m: show where I can move with this piece.</li>
<li>shift+m: show where I can capture with this piece.</li>
<li>1-8: move to rank 1-8; stay on same file.</li>
<li>shift + 1-8: move to file a-h; stay on same rank.</li>
</ul>
<p>This gives a pretty solid basis for playing the game.
One caveat is after you have moved a pawn all the way to the farthest rank, only the destination tile will accept your promotion choice.
Therefore, all the other keys still work on other square, but if you are on the destination square of a promotion q/r/b/n will promote your piece, not jump you to the next/previous one.</p>
<p>This pull request was merged earlier this month:</p>
<h2 id="more-to-come">More To Come</h2>
<p>Next thing I want to do is implement the analysis board.
Right now it is not accessible whatsoever.</p>
<h2 id="help-me">Help Me</h2>
<p>If you are a screen reader user or know about accessibility and want to help make Lichess an awesome chess site for sighted and unsighted players alike,
then send me an email at <a href="mailto:tait@tait.tech">tait@tait.tech</a> and Ill BCC you once I start testing the analysis board.</p>
<p>Happy hacking, yall!</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2021/01/31/lichess/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
</code></pre></div></div> <p>For the inexperienced player, it seems to be more convenient to bind some keys and have the user bounce to various buttons, which they can push to say “I want to move this piece”. This is what I was told anyway. So I want to work making a system so you could use the following basic keys:</p> <ul> <li>left/right/up/down arrow: move on the board.</li> <li>k/q/r/b/n/p: move to next piece represented by its character in chess notation.</li> <li>shift + k/q/r/b/n/p: move back to the last piece represented by its character in chess notation.</li> <li>click/enter/space: select piece to move.</li> <li>click/enter/space again: move piece here.</li> <li>m: show where I can move with this piece.</li> <li>shift+m: show where I can capture with this piece.</li> <li>1-8: move to rank 1-8; stay on same file.</li> <li>shift + 1-8: move to file a-h; stay on same rank.</li> </ul> <p>This gives a pretty solid basis for playing the game. One caveat is after you have moved a pawn all the way to the farthest rank, only the destination tile will accept your promotion choice. Therefore, all the other keys still work on other square, but if you are on the destination square of a promotion q/r/b/n will promote your piece, not jump you to the next/previous one.</p> <p>This pull request was merged earlier this month:</p> <h2 id="more-to-come">More To Come</h2> <p>Next thing I want to do is implement the analysis board. Right now it is not accessible whatsoever.</p> <h2 id="help-me">Help Me</h2> <p>If you are a screen reader user or know about accessibility and want to help make Lichess an awesome chess site for sighted and unsighted players alike, then send me an email at <a href="mailto:tait@tait.tech">tait@tait.tech</a> and Ill BCC you once I start testing the analysis board.</p> <p>Happy hacking, yall!</p> </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/2021/01/31/lichess/">beta.tait.tech</a>. </footer> </div> </body> </html>

File diff suppressed because one or more lines are too long

@ -1,108 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Lichess Accessibility | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<article>
<header>
<h1 class="post-title">Lichess Accessibility</h1>
<time datetime="" class="post-date"></time>
</header>
<hr>
I wanted to play chess with somebody who used a screen reader, without requiring a screen reader myself;
some sites, like QuintenC's Playroom have a rather poor visual interface for anyone who would like the play the game visually.
[Lichess](https://lichess.org) is an free and open-source website for chess players;
it bridges this gap by having two "modes" on the site:
standard mode and accessibility mode.
## Accessibility Mode
Accessibility mode is far from perfect on lichess.org.
That said, the idea to separate the sites into different modes was a good call.
It stops the inevitable "this would work well for screen readers but cause visual issues" shenanigans,
or, vice-verse "this looks great but it might be weird with a screen reader".
This way all the things which affect the visual interface are in one place,
and all things which affect the non-visual user interface (NVUI) are written in another.
In my quest to play chess with visual and non-visual players with both having optimal experiences, I tried Lichess with my friend from [melly.tech](https://melly.tech/).
She pointed out that the method to interface with the board previously was rather poor.
This is because it required an "enter" at the end of each command and the commands tended to read out a row or column of a chessboard not just an individual square.
For example, to list all pieces (or lack thereof) on the e file, I would type the command:
```
s e
```
Although this seems good in theory, and it's great when you need an entire file, there was no way to get only one square.
In addition, imagine typing to navigate around the board:
```
s e1
s f1
s e2
```
For the inexperienced player, it seems to be more convenient to bind some keys and have the user bounce to various buttons, which they can push to say "I want to move this piece".
This is what I was told anyway.
So I want to work making a system so you could use the following basic keys:
* left/right/up/down arrow: move on the board.
* k/q/r/b/n/p: move to next piece represented by its character in chess notation.
* shift + k/q/r/b/n/p: move back to the last piece represented by its character in chess notation.
* click/enter/space: select piece to move.
* click/enter/space again: move piece here.
* m: show where I can move with this piece.
* shift+m: show where I can capture with this piece.
* 1-8: move to rank 1-8; stay on same file.
* shift + 1-8: move to file a-h; stay on same rank.
This gives a pretty solid basis for playing the game.
One caveat is after you have moved a pawn all the way to the farthest rank, only the destination tile will accept your promotion choice.
Therefore, all the other keys still work on other square, but if you are on the destination square of a promotion q/r/b/n will promote your piece, not jump you to the next/previous one.
This pull request was merged earlier this month:
## More To Come
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/3q">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Lichess Accessibility | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <article> <header> <h1 class="post-title">Lichess Accessibility</h1> <time datetime="" class="post-date"></time> </header> <hr> I wanted to play chess with somebody who used a screen reader, without requiring a screen reader myself; some sites, like QuintenC's Playroom have a rather poor visual interface for anyone who would like the play the game visually. [Lichess](https://lichess.org) is an free and open-source website for chess players; it bridges this gap by having two "modes" on the site: standard mode and accessibility mode. ## Accessibility Mode Accessibility mode is far from perfect on lichess.org. That said, the idea to separate the sites into different modes was a good call. It stops the inevitable "this would work well for screen readers but cause visual issues" shenanigans, or, vice-verse "this looks great but it might be weird with a screen reader". This way all the things which affect the visual interface are in one place, and all things which affect the non-visual user interface (NVUI) are written in another. In my quest to play chess with visual and non-visual players with both having optimal experiences, I tried Lichess with my friend from [melly.tech](https://melly.tech/). She pointed out that the method to interface with the board previously was rather poor. This is because it required an "enter" at the end of each command and the commands tended to read out a row or column of a chessboard not just an individual square. For example, to list all pieces (or lack thereof) on the e file, I would type the command: ``` s e ``` Although this seems good in theory, and it's great when you need an entire file, there was no way to get only one square. In addition, imagine typing to navigate around the board: ``` s e1 s f1 s e2 ``` For the inexperienced player, it seems to be more convenient to bind some keys and have the user bounce to various buttons, which they can push to say "I want to move this piece". This is what I was told anyway. So I want to work making a system so you could use the following basic keys: * left/right/up/down arrow: move on the board. * k/q/r/b/n/p: move to next piece represented by its character in chess notation. * shift + k/q/r/b/n/p: move back to the last piece represented by its character in chess notation. * click/enter/space: select piece to move. * click/enter/space again: move piece here. * m: show where I can move with this piece. * shift+m: show where I can capture with this piece. * 1-8: move to rank 1-8; stay on same file. * shift + 1-8: move to file a-h; stay on same rank. This gives a pretty solid basis for playing the game. One caveat is after you have moved a pawn all the way to the farthest rank, only the destination tile will accept your promotion choice. Therefore, all the other keys still work on other square, but if you are on the destination square of a promotion q/r/b/n will promote your piece, not jump you to the next/previous one. This pull request was merged earlier this month: ## More To Come </article> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/3q">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,45 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>About | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<h1 id="tait-hoyem">Tait Hoyem</h1>
<p>I believe in three fundamentals</p>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/about/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>About | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <h1 id="tait-hoyem">Tait Hoyem</h1> <p>I believe in three fundamentals</p> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/about/">beta.tait.tech</a>. </footer> </div> </body> </html>

File diff suppressed because one or more lines are too long

@ -1,285 +1 @@
body { background-color: #fefefe; padding: 16px; font-family: -apple-system, helvetica, arial, sans-serif; font-size: 16px; color: #444444; line-height: 1.5em; overflow-wrap: break-word; }
#wrapper { max-width: 800px; margin: auto; }
#wrapper > header { text-align: center; }
.clear-list { list-style-type: none; margin: 0; padding: 0; }
.clear-list li { margin: 0; padding: 0; }
.projects a { font-weight: bold; }
h1, h2, h3, h4, h5, h6 { line-height: 1em; }
header { margin-bottom: 32px; }
hr { border: none; border-bottom: 1px solid #999; }
a { text-decoration: underline; color: #47a; }
a:visited { color: #941452; }
a.nav-link, a.post-title-link { color: #333; text-decoration: none; }
.post-title { line-height: 1.5em; color: #333; }
a.citation-link { text-decoration: none; }
nav { text-align: center; padding: 1em 0px; }
nav a { margin: 1em; color: #333; font-weight: bold; font-style: none; }
nav a:hover { text-decoration: underline; }
li { margin: .5em; }
p { padding: .1em 0; }
table, table tr, table td, table th { border: 1px solid #aaa; border-collapse: collapse; padding: 5px; font-weight: normal; }
table th { font-weight: bold; }
table { width: 75%; margin: auto; }
img { display: block; width: 55%; margin-left: auto; margin-right: auto; }
blockquote { font-style: italic; }
address { font-style: normal; }
@media screen and (max-width: 600px) { body { width: 90%; } #info { margin: 0 7px; } .menu-content { max-height: 0; overflow: hidden; } nav { text-align: left; width: 100%; } nav a { display: block; text-align: left; padding-left: 0; margin-left: 0; } }
.mono { font-family: monospace; }
.bold { font-weight: bold; }
sup { margin: 0; padding: 0; }
figcaption { margin-top: 10px; font-style: italic; }
footer { padding-top: 16px; margin-bottom: 100px; }
.terminal { line-height: 1em; overflow: scroll; padding: 10px; color: #00FF41; margin: 0px; background-color: #151515; }
.file { overflow: scroll; padding: 10px; margin: 0px; line-height: 1.2em; background-color: #dfdfdf; color: #000; }
.small-image { width: 100%; }
.post-date { font-size: 18px; text-transform: uppercase; font-weight: bold; color: #555; }
.post-excerpt { margin: 16px; margin-bottom: 0; }
/* code highlghting */
.highlight .hll { background-color: #ffffcc; }
.highlight { background: #f0f0f0; }
.highlight .c { color: #60a0b0; font-style: italic; }
/* Comment */
.highlight .err { border: 1px solid #FF0000; }
/* Error */
.highlight .k { color: #007020; font-weight: bold; }
/* Keyword */
.highlight .o { color: #666666; }
/* Operator */
.highlight .ch { color: #60a0b0; font-style: italic; }
/* Comment.Hashbang */
.highlight .cm { color: #60a0b0; font-style: italic; }
/* Comment.Multiline */
.highlight .cp { color: #007020; }
/* Comment.Preproc */
.highlight .cpf { color: #60a0b0; font-style: italic; }
/* Comment.PreprocFile */
.highlight .c1 { color: #60a0b0; font-style: italic; }
/* Comment.Single */
.highlight .cs { color: #60a0b0; background-color: #fff0f0; }
/* Comment.Special */
.highlight .gd { color: #A00000; }
/* Generic.Deleted */
.highlight .ge { font-style: italic; }
/* Generic.Emph */
.highlight .gr { color: #FF0000; }
/* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold; }
/* Generic.Heading */
.highlight .gi { color: #00A000; }
/* Generic.Inserted */
.highlight .go { color: #888888; }
/* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold; }
/* Generic.Prompt */
.highlight .gs { font-weight: bold; }
/* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold; }
/* Generic.Subheading */
.highlight .gt { color: #0044DD; }
/* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold; }
/* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold; }
/* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold; }
/* Keyword.Namespace */
.highlight .kp { color: #007020; }
/* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold; }
/* Keyword.Reserved */
.highlight .kt { color: #902000; }
/* Keyword.Type */
.highlight .m { color: #40a070; }
/* Literal.Number */
.highlight .s { color: #4070a0; }
/* Literal.String */
.highlight .na { color: #4070a0; }
/* Name.Attribute */
.highlight .nb { color: #007020; }
/* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold; }
/* Name.Class */
.highlight .no { color: #60add5; }
/* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold; }
/* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold; }
/* Name.Entity */
.highlight .ne { color: #007020; }
/* Name.Exception */
.highlight .nf { color: #06287e; }
/* Name.Function */
.highlight .nl { color: #002070; font-weight: bold; }
/* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold; }
/* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold; }
/* Name.Tag */
.highlight .nv { color: #bb60d5; }
/* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold; }
/* Operator.Word */
.highlight .w { color: #bbbbbb; }
/* Text.Whitespace */
.highlight .mb { color: #40a070; }
/* Literal.Number.Bin */
.highlight .mf { color: #40a070; }
/* Literal.Number.Float */
.highlight .mh { color: #40a070; }
/* Literal.Number.Hex */
.highlight .mi { color: #40a070; }
/* Literal.Number.Integer */
.highlight .mo { color: #40a070; }
/* Literal.Number.Oct */
.highlight .sa { color: #4070a0; }
/* Literal.String.Affix */
.highlight .sb { color: #4070a0; }
/* Literal.String.Backtick */
.highlight .sc { color: #4070a0; }
/* Literal.String.Char */
.highlight .dl { color: #4070a0; }
/* Literal.String.Delimiter */
.highlight .sd { color: #4070a0; font-style: italic; }
/* Literal.String.Doc */
.highlight .s2 { color: #4070a0; }
/* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold; }
/* Literal.String.Escape */
.highlight .sh { color: #4070a0; }
/* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic; }
/* Literal.String.Interpol */
.highlight .sx { color: #c65d09; }
/* Literal.String.Other */
.highlight .sr { color: #235388; }
/* Literal.String.Regex */
.highlight .s1 { color: #4070a0; }
/* Literal.String.Single */
.highlight .ss { color: #517918; }
/* Literal.String.Symbol */
.highlight .bp { color: #007020; }
/* Name.Builtin.Pseudo */
.highlight .fm { color: #06287e; }
/* Name.Function.Magic */
.highlight .vc { color: #bb60d5; }
/* Name.Variable.Class */
.highlight .vg { color: #bb60d5; }
/* Name.Variable.Global */
.highlight .vi { color: #bb60d5; }
/* Name.Variable.Instance */
.highlight .vm { color: #bb60d5; }
/* Name.Variable.Magic */
.highlight .il { color: #40a070; }
/* Literal.Number.Integer.Long */
/* ADDED CUSTOM */
.highlight .n { color: #000; }
/* General name */
div.highlight { padding: 0px 5px; width: 85%; margin: auto; overflow-x: scroll; }
/*# sourceMappingURL=style.css.map */
body{background-color:#fefefe;padding:16px;font-family:-apple-system,helvetica,arial,sans-serif;font-size:16px;color:#444;line-height:1.5em;overflow-wrap:break-word}#wrapper{max-width:800px;margin:auto}#wrapper>header{text-align:center}.clear-list{list-style-type:none;margin:0;padding:0}.clear-list li{margin:0;padding:0}.projects a{font-weight:bold}h1,h2,h3,h4,h5,h6{line-height:1em}header{margin-bottom:32px}hr{border:0;border-bottom:1px solid #999}a{text-decoration:underline;color:#47a}a:visited{color:#941452}a.nav-link,a.post-title-link{color:#333;text-decoration:none}.post-title{line-height:1.5em;color:#333}a.citation-link{text-decoration:none}nav{text-align:center;padding:1em 0}nav a{margin:1em;color:#333;font-weight:bold;font-style:none}nav a:hover{text-decoration:underline}li{margin:.5em}p{padding:.1em 0}table,table tr,table td,table th{border:1px solid #aaa;border-collapse:collapse;padding:5px;font-weight:normal}table th{font-weight:bold}table{width:75%;margin:auto}img{display:block;width:55%;margin-left:auto;margin-right:auto}blockquote{font-style:italic}address{font-style:normal}@media screen and (max-width:600px){body{width:90%}#info{margin:0 7px}.menu-content{max-height:0;overflow:hidden}nav{text-align:left;width:100%}nav a{display:block;text-align:left;padding-left:0;margin-left:0}}.mono{font-family:monospace}.bold{font-weight:bold}sup{margin:0;padding:0}figcaption{margin-top:10px;font-style:italic}footer{padding-top:16px;margin-bottom:100px}.terminal{line-height:1em;overflow:scroll;padding:10px;color:#00ff41;margin:0;background-color:#151515}.file{overflow:scroll;padding:10px;margin:0;line-height:1.2em;background-color:#dfdfdf;color:#000}.small-image{width:100%}.post-date{font-size:18px;text-transform:uppercase;font-weight:bold;color:#555}.post-excerpt{margin:16px;margin-bottom:0}.highlight .hll{background-color:#ffc}.highlight{background:#f0f0f0}.highlight .c{color:#60a0b0;font-style:italic}.highlight .err{border:1px solid #f00}.highlight .k{color:#007020;font-weight:bold}.highlight .o{color:#666}.highlight .ch{color:#60a0b0;font-style:italic}.highlight .cm{color:#60a0b0;font-style:italic}.highlight .cp{color:#007020}.highlight .cpf{color:#60a0b0;font-style:italic}.highlight .c1{color:#60a0b0;font-style:italic}.highlight .cs{color:#60a0b0;background-color:#fff0f0}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:#f00}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:#c65d09;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#04d}.highlight .kc{color:#007020;font-weight:bold}.highlight .kd{color:#007020;font-weight:bold}.highlight .kn{color:#007020;font-weight:bold}.highlight .kp{color:#007020}.highlight .kr{color:#007020;font-weight:bold}.highlight .kt{color:#902000}.highlight .m{color:#40a070}.highlight .s{color:#4070a0}.highlight .na{color:#4070a0}.highlight .nb{color:#007020}.highlight .nc{color:#0e84b5;font-weight:bold}.highlight .no{color:#60add5}.highlight .nd{color:#555;font-weight:bold}.highlight .ni{color:#d55537;font-weight:bold}.highlight .ne{color:#007020}.highlight .nf{color:#06287e}.highlight .nl{color:#002070;font-weight:bold}.highlight .nn{color:#0e84b5;font-weight:bold}.highlight .nt{color:#062873;font-weight:bold}.highlight .nv{color:#bb60d5}.highlight .ow{color:#007020;font-weight:bold}.highlight .w{color:#bbb}.highlight .mb{color:#40a070}.highlight .mf{color:#40a070}.highlight .mh{color:#40a070}.highlight .mi{color:#40a070}.highlight .mo{color:#40a070}.highlight .sa{color:#4070a0}.highlight .sb{color:#4070a0}.highlight .sc{color:#4070a0}.highlight .dl{color:#4070a0}.highlight .sd{color:#4070a0;font-style:italic}.highlight .s2{color:#4070a0}.highlight .se{color:#4070a0;font-weight:bold}.highlight .sh{color:#4070a0}.highlight .si{color:#70a0d0;font-style:italic}.highlight .sx{color:#c65d09}.highlight .sr{color:#235388}.highlight .s1{color:#4070a0}.highlight .ss{color:#517918}.highlight .bp{color:#007020}.highlight .fm{color:#06287e}.highlight .vc{color:#bb60d5}.highlight .vg{color:#bb60d5}.highlight .vi{color:#bb60d5}.highlight .vm{color:#bb60d5}.highlight .il{color:#40a070}.highlight .n{color:#000}div.highlight{padding:0 5px;width:85%;margin:auto;overflow-x:scroll}

File diff suppressed because one or more lines are too long

@ -1,2 +1 @@
alert("Warning! This site is insecure and open to an attack called XSS. You are now being redirected to an article about this vulnerability.");
window.href = "https://tait.tech/2020/04/22/quiz-your-friends.html";
alert("Warning! This site is insecure and open to an attack called XSS. You are now being redirected to an article about this vulnerability."),window.href="https://tait.tech/2020/04/22/quiz-your-friends.html";

File diff suppressed because one or more lines are too long

@ -1,56 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<p>Here are my contact details if you would like to contact me professionally or personally.</p>
<div>Personal Email - tait.hoyem@protonmail.com</div>
<p><br /></p>
<div>Work Email - tait@tait.tech</div>
<p><br /></p>
<div>School Email - tait.hoyem@edu.sait.ca</div>
<p><br /></p>
<div>Phone - +1 (403) 771-4754</div>
<p><br /></p>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/contact/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <p>Here are my contact details if you would like to contact me professionally or personally.</p> <div>Personal Email - tait.hoyem@protonmail.com</div> <p><br/></p> <div>Work Email - tait@tait.tech</div> <p><br/></p> <div>School Email - tait.hoyem@edu.sait.ca</div> <p><br/></p> <div>Phone - +1 (403) 771-4754</div> <p><br/></p> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/contact/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,40 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cover Letter - VCC | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<main>
<div id="wrapper">
<h2 id="tait-hoyem">Tait Hoyem</h2>
<p>Hello, Alice</p>
<p>This will be short and sweet.</p>
<p>Copying and explaining information in accessible ways is something I have been doing my entire life—sometimes without realizing it.
As a partially-sighted student,
I know what information makes sense without visuals and what information will be completely meaningless without additional context or description.</p>
<p>I also have some background in computer science.
This allows me to transcribe and explain only what is important.
Somebody without this background may not know when a number being shown on screen is important or when it is genuinely meaningless.
I also do not need to go back and forth to the text I am copying from to be one-hundered percent sure I have the right paranthasies, brackets, less-than signs, et cetera.
All these patterns make sense to me when I read them.</p>
<p>Although I would prefer to work with computer science students,
I am willing to be used more broadly if that is of use to you.</p>
<p>Thank you for your consideration,</p>
<p>—Tait Hoyem</p>
<footer>
</footer>
</div>
</main>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Cover Letter - VCC | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <main> <div id="wrapper"> <h2 id="tait-hoyem">Tait Hoyem</h2> <p>Hello, Alice</p> <p>This will be short and sweet.</p> <p>Copying and explaining information in accessible ways is something I have been doing my entire life—sometimes without realizing it. As a partially-sighted student, I know what information makes sense without visuals and what information will be completely meaningless without additional context or description.</p> <p>I also have some background in computer science. This allows me to transcribe and explain only what is important. Somebody without this background may not know when a number being shown on screen is important or when it is genuinely meaningless. I also do not need to go back and forth to the text I am copying from to be one-hundered percent sure I have the right paranthasies, brackets, less-than signs, et cetera. All these patterns make sense to me when I read them.</p> <p>Although I would prefer to work with computer science students, I am willing to be used more broadly if that is of use to you.</p> <p>Thank you for your consideration,</p> <p>—Tait Hoyem</p> <footer> </footer> </div> </main> </body> </html>

@ -1,15 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cover Letter | Bloombase | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<main>
<div id="wrapper">
<pre class="line-under">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Cover Letter | Bloombase | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <main> <div id="wrapper"> <pre class="line-under">
To: Bloombase
128 W Hastings St #350
@ -17,43 +6,4 @@ Vancouver, British Columbia
V6B 1G8, Canada
Job Number: 620145
</pre>
<p>I am a student at the Southern Alberta Institute of Technology (SAIT),
in Calgary, Alberta
where I am taking a general IT diploma with a software development major.</p>
<p>The simple way of explaining my relationship with security is that it is <em>exactly</em> what I want to be doing with my career.
When given an assignment to chose any technology related topic,
I chose to talk about Edward Snowden;
for an emerging trend topic, I delved into public-key encryption and the Curve25519 eliptic crytographic method.</p>
<p>I run Linux as my primary operating system, and I use an offline password manager. My browser clears cookies every time I restart it.
These are some basic things I do personally to protect myself.</p>
<p>I think everybody has things they should be keeping secure,
and I am very motivated to help them achieve the messure of security needed.</p>
<p>Security is build right into my goals for my programming career. I have two goals:</p>
<ol>
<li>Create ease of use for strong crytography, security and privacy tools.</li>
<li>Accessibility of software to the visually impaired.</li>
</ol>
<p>These goals are intertwined in: “If you make something good, make it for everyone.”</p>
<p>Ive included my resume for your review, and would like to note that I would be pleased to relocate to Vancouver for this position.</p>
<p>Thank you for your time in considering me for this position!</p>
<p>Sincerely,</p>
<p>Tait Hoyem</p>
<footer>
</footer>
</div>
</main>
</body>
</html>
</pre> <p>I am a student at the Southern Alberta Institute of Technology (SAIT), in Calgary, Alberta where I am taking a general IT diploma with a software development major.</p> <p>The simple way of explaining my relationship with security is that it is <em>exactly</em> what I want to be doing with my career. When given an assignment to chose any technology related topic, I chose to talk about Edward Snowden; for an emerging trend topic, I delved into public-key encryption and the Curve25519 eliptic crytographic method.</p> <p>I run Linux as my primary operating system, and I use an offline password manager. My browser clears cookies every time I restart it. These are some basic things I do personally to protect myself.</p> <p>I think everybody has things they should be keeping secure, and I am very motivated to help them achieve the messure of security needed.</p> <p>Security is build right into my goals for my programming career. I have two goals:</p> <ol> <li>Create ease of use for strong crytography, security and privacy tools.</li> <li>Accessibility of software to the visually impaired.</li> </ol> <p>These goals are intertwined in: “If you make something good, make it for everyone.”</p> <p>Ive included my resume for your review, and would like to note that I would be pleased to relocate to Vancouver for this position.</p> <p>Thank you for your time in considering me for this position!</p> <p>Sincerely,</p> <p>Tait Hoyem</p> <footer> </footer> </div> </main> </body> </html>

@ -1,15 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cover Letter | Proton Technologies | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<main>
<div id="wrapper">
<pre class="line-under">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Cover Letter | Proton Technologies | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <main> <div id="wrapper"> <pre class="line-under">
To: Proton Technologies AG
Route de la Galaise 32,
@ -17,42 +6,4 @@ Route de la Galaise 32,
Geneva, Switzerland
Job Description: Front-End Developer
</pre>
<h1 id="why-i-want-to-work-for-proton">Why I Want To Work For Proton</h1>
<p>Hello,</p>
<p>You may notice from the email address that I personally use a Protonmail email address. That in itself may not prove anything.
That said, security and privacy is what I live for.
Everybody deserves access to secure communication away from the prying eyes of the NSA, its global partners in spymenship and other governments and special interest groups around the world.</p>
<p>Proton embodies, to me, what email—and other internet services in general—<em>should</em> be. A service you pay for with your money, not your data.</p>
<h2 id="what-i-plan-to-achieve">What I Plan To Achieve</h2>
<p>My specialty is in improving accessibility with screen readers and other blind-friendly devices.
The recent addition of key bindings to navigate the interface will go a <em>long</em> way towards accessibility for the visually impaired.
Awesome work!</p>
<p>I want to help Protonmail be the best secure, accessible email platform in the world.</p>
<h2 id="why-i-applied-despite-lack-of-experience">Why I Applied Despite Lack Of Experience</h2>
<p>I have been writing websites since high-school; I went to collage to learn what real software development is like. Despite this, I put more time and effort into my off-school hours to learn what people are actually using on a large scale: Django, Ruby On Rails, Redis, Docker, ES6 Javascript. None of which was taught in class.
Since leaving school I have had the opportunity to use everything I learned out of class in real-world scenarios and I trust that I can take this information to Proton where I can help make the software better for everyone.</p>
<p>I am a self-starter and a go-getter. Nothing proves it like how much I learned outside of my classes compared to inside.</p>
<hr />
<p>I would be honoured to work for a company I truly believe in.</p>
<p>—Tait Hoyem</p>
<footer>
</footer>
</div>
</main>
</body>
</html>
</pre> <h1 id="why-i-want-to-work-for-proton">Why I Want To Work For Proton</h1> <p>Hello,</p> <p>You may notice from the email address that I personally use a Protonmail email address. That in itself may not prove anything. That said, security and privacy is what I live for. Everybody deserves access to secure communication away from the prying eyes of the NSA, its global partners in spymenship and other governments and special interest groups around the world.</p> <p>Proton embodies, to me, what email—and other internet services in general—<em>should</em> be. A service you pay for with your money, not your data.</p> <h2 id="what-i-plan-to-achieve">What I Plan To Achieve</h2> <p>My specialty is in improving accessibility with screen readers and other blind-friendly devices. The recent addition of key bindings to navigate the interface will go a <em>long</em> way towards accessibility for the visually impaired. Awesome work!</p> <p>I want to help Protonmail be the best secure, accessible email platform in the world.</p> <h2 id="why-i-applied-despite-lack-of-experience">Why I Applied Despite Lack Of Experience</h2> <p>I have been writing websites since high-school; I went to collage to learn what real software development is like. Despite this, I put more time and effort into my off-school hours to learn what people are actually using on a large scale: Django, Ruby On Rails, Redis, Docker, ES6 Javascript. None of which was taught in class. Since leaving school I have had the opportunity to use everything I learned out of class in real-world scenarios and I trust that I can take this information to Proton where I can help make the software better for everyone.</p> <p>I am a self-starter and a go-getter. Nothing proves it like how much I learned outside of my classes compared to inside.</p> <hr/> <p>I would be honoured to work for a company I truly believe in.</p> <p>—Tait Hoyem</p> <footer> </footer> </div> </main> </body> </html>

File diff suppressed because one or more lines are too long

@ -1,62 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Ideas | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" class="on-page" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<h1 id="ideas">Ideas</h1>
<h2 id="1-accessible-bios">1. Accessible BIOS</h2>
<p>Some server motherboards include serial UART/I<sup>2</sup>C ports which can be used to manage a BIOS via serial.
If this is possible, would it be able to attach to a braille display via an intermediary like a Rockchip/Pi SBC or Arduino compatible chip using <a href="https://brltty.app">BRLTTY</a> and serial input from the motherboard?
Maybe not as it <a href="https://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/rhl-biosserial.html">appears to require</a> a full Unicode terminal, which I have the suspicion that BRLTTY will not be able to automatically filter out the formatting characters.</p>
<p>Just an idea.</p>
<h2 id="2-terminal-oriented-browser">2. Terminal-oriented browser</h2>
<p>Use selenium to allow a cross-engine compatible terminal-browser with JS support. Yes, sure, it has all the bloat of the modern web as it uses the full code of Chrome/Firefox/Webkit—but at least it can be used in the terminal.
Guaranteed to be accessible.</p>
<p>Im thinking of similar key commands to Orca/NVDA but output is send to the terminal. Unsure of how to handle aria-live regions, but perhaps a queue could be used to print text. Unsure how to calculate delay as the user may be using a screen reader at different speeds and/or a braille display.</p>
<p>Change backend on-the-fly with a page reload. So if a website doesnt work with Webkit, load it in Firefox with a key command.</p>
<p>Just an idea.</p>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/ideas/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ideas | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link" class="on-page">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <h1 id="ideas">Ideas</h1> <h2 id="1-accessible-bios">1. Accessible BIOS</h2> <p>Some server motherboards include serial UART/I<sup>2</sup>C ports which can be used to manage a BIOS via serial. If this is possible, would it be able to attach to a braille display via an intermediary like a Rockchip/Pi SBC or Arduino compatible chip using <a href="https://brltty.app">BRLTTY</a> and serial input from the motherboard? Maybe not as it <a href="https://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/rhl-biosserial.html">appears to require</a> a full Unicode terminal, which I have the suspicion that BRLTTY will not be able to automatically filter out the formatting characters.</p> <p>Just an idea.</p> <h2 id="2-terminal-oriented-browser">2. Terminal-oriented browser</h2> <p>Use selenium to allow a cross-engine compatible terminal-browser with JS support. Yes, sure, it has all the bloat of the modern web as it uses the full code of Chrome/Firefox/Webkit—but at least it can be used in the terminal. Guaranteed to be accessible.</p> <p>Im thinking of similar key commands to Orca/NVDA but output is send to the terminal. Unsure of how to handle aria-live regions, but perhaps a queue could be used to print text. Unsure how to calculate delay as the user may be using a screen reader at different speeds and/or a braille display.</p> <p>Change backend on-the-fly with a page reload. So if a website doesnt work with Webkit, load it in Firefox with a key command.</p> <p>Just an idea.</p> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/ideas/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,118 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="UNIX Design, Tait Hoyem, security, privacy, software developer, Calgary, Alberta, Canada, independent, web developer">
<meta name="description" content="Tait Hoyem's website. The home of accessible, simple and secure computing.">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" class="on-page" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<h1>Tait Hoyem</h1>
<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>
<li>Security, privacy, and anonymity of the internet.</li>
<li>Accessibility of technology to the visually impaired.</li>
</ol>
<p>Some of my projects reflect these goals;
others are just fun along the way.
I have all of my code projects hosted on <a href="https://github.com/TTWNO">my Github</a>.</p>
<h2>Projects</h2>
<p>Here is some of my best work:</p>
<ul class="clear-list projects">
<li>
<p>
<a href="https://github.com/ornicar/lila/pull/7772">Lichess</a> &mdash; A patch for Lichess.org which vastly extends support for screen reader users. The website has millions of active users.
</p>
</li>
<li>
<p>
<a href="https://github.com/TTWNO/quote_pdf">Quote Retrieval System</a> &mdash; Written for a local roofing business to securely distribute quotes.
</p>
</li>
<li>
<p>
<a href="https://github.com/TTWNO/epub-with-pinyin">epub-with-pinyin</a> &mdash; A program to add Pinyin above Chinese characters in .epub files to assist those learning Mandarin Chinese.
</p>
</li>
<li>
<p>
<a href="https://github.com/TTWNO/lamegames.io">lamegames</a> &mdash; A little games website I made for some demonstrations of Django and websocket functionality. Very, very lame. Would not recommend.
</p>
</li>
<li>
<p>
<a href="https://github.com/TTWNO/chess">chess</a> &mdash; A command-line chess game in C++. It is compileable on nearly any system.
</p>
</li>
<li>
<p>
<a href="https://github.com/TTWNO/subnetting">subnetting</a> &mdash; One-night write of a subnet calculation tool.
</p>
</li>
<li>
<p>
<a href="">Payroll</a> &mdash; A payroll system written in PHP.
</p>
</li>
<li>
<p>
<a href="https://bytetools.ca">Bytetools</a> &mdash; I have my own company called Bytetools. We make websites, data archiving and custom applications. 10% discount for open-source or community-oriented projects.
</p>
</li>
</ul>
<p>I also occasionally put some content on <a href="/blog">my blog</a></p>
<h2>Contact</h2>
<address>
<p>You can reach me via email at <a href="mailto:tait@tait.tech">tait@tait.tech</a>.</p>
</address>
<p>If you use PGP, download my <a href="/public-key.asc">public key</a>.</p>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content="UNIX Design, Tait Hoyem, security, privacy, software developer, Calgary, Alberta, Canada, independent, web developer"> <meta name="description" content="Tait Hoyem's website. The home of accessible, simple and secure computing."> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link" class="on-page">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <h1>Tait Hoyem</h1> <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> <li>Security, privacy, and anonymity of the internet.</li> <li>Accessibility of technology to the visually impaired.</li> </ol> <p>Some of my projects reflect these goals; others are just fun along the way. I have all of my code projects hosted on <a href="https://github.com/TTWNO">my Github</a>.</p> <h2>Projects</h2> <p>Here is some of my best work:</p> <ul class="clear-list projects"> <li> <p> <a href="https://github.com/ornicar/lila/pull/7772">Lichess</a> &mdash; A patch for Lichess.org which vastly extends support for screen reader users. The website has millions of active users. </p> </li> <li> <p> <a href="https://github.com/TTWNO/quote_pdf">Quote Retrieval System</a> &mdash; Written for a local roofing business to securely distribute quotes. </p> </li> <li> <p> <a href="https://github.com/TTWNO/epub-with-pinyin">epub-with-pinyin</a> &mdash; A program to add Pinyin above Chinese characters in .epub files to assist those learning Mandarin Chinese. </p> </li> <li> <p> <a href="https://github.com/TTWNO/lamegames.io">lamegames</a> &mdash; A little games website I made for some demonstrations of Django and websocket functionality. Very, very lame. Would not recommend. </p> </li> <li> <p> <a href="https://github.com/TTWNO/chess">chess</a> &mdash; A command-line chess game in C++. It is compileable on nearly any system. </p> </li> <li> <p> <a href="https://github.com/TTWNO/subnetting">subnetting</a> &mdash; One-night write of a subnet calculation tool. </p> </li> <li> <p> <a href="">Payroll</a> &mdash; A payroll system written in PHP. </p> </li> <li> <p> <a href="https://bytetools.ca">Bytetools</a> &mdash; I have my own company called Bytetools. We make websites, data archiving and custom applications. 10% discount for open-source or community-oriented projects. </p> </li> </ul> <p>I also occasionally put some content on <a href="/blog">my blog</a></p> <h2>Contact</h2> <address> <p>You can reach me via email at <a href="mailto:tait@tait.tech">tait@tait.tech</a>.</p> </address> <p>If you use PGP, download my <a href="/public-key.asc">public key</a>.</p> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,313 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Links | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" class="on-page" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<section>
<header>
<h2>Find Me Other Places</h2>
</header>
<ul>
<li>
<span class="bold">Main Site</span> -
<a href="https://tait.tech/" class="mono">
tait.tech
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Backup/Mirror Site</span> -
<a href="https://beta.tait.tech/" class="mono">
beta.tait.tech
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Email</span> -
<a href="mailto:tait@tait.tech" class="mono">
tait@tait.tech
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Public Key</span> -
<a href="/public-key.asc" class="mono">
public-key.asc
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Github</span> -
<a href="https://github.com/TTWNO" class="mono">
github.com/TTWNO
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>Secure Service Links</h2>
</header>
<ul>
<li>
<span class="bold">Signal</span> -
<a href="https://signal.org" class="mono">
https://signal.org
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Protonmail</span> -
<a href="https://protonmail.com" class="mono">
https://protonmail.com
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>Linux Links</h2>
</header>
<ul>
<li>
<span class="bold">Arch Linux Wiki</span> -
<a href="https://wiki.archlinux.org/" class="mono">
https://wiki.archlinux.org/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Speakup Project [Unencrypted]</span> -
<a href="http://linux-speakup.org/" class="mono">
http://linux-speakup.org/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Luke Smith</span> -
<a href="https://lukesmith.xyz/" class="mono">
https://lukesmith.xyz/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Brian Lunduke</span> -
<a href="https://lunduke.com/" class="mono">
https://lunduke.com/
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>Interesting Links</h2>
</header>
<ul>
<li>
<span class="bold">Suckless</span> -
<a href="https://suckless.org/" class="mono">
https://suckless.org/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">cat -v considered harmful [Unencrypted]</span> -
<a href="http://cat-v.org/" class="mono">
http://cat-v.org/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Edward Snowden</span> -
<a href="https://www.biography.com/activist/edward-snowden/" class="mono">
https://www.biography.com/activist/edward-snowden/
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>Inspiration Comes From</h2>
</header>
<ul>
<li>
<span class="bold">Gregory Gundersen</span> -
<a href="https://gregorygundersen.com/" class="mono">
https://gregorygundersen.com/
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>The "This Is A Website" Series</h2>
</header>
<ul>
<li>
<span class="bold">Website</span> -
<a href="https://motherfuckingwebsite.com/" class="mono">
https://motherfuckingwebsite.com/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Better Website</span> -
<a href="http://bettermotherfuckingwebsite.com/" class="mono">
http://bettermotherfuckingwebsite.com/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">The Best Website</span> -
<a href="https://thebestmotherfucking.website/" class="mono">
https://thebestmotherfucking.website/
</a>
</li>
</ul>
</section>
<section>
<header>
<h2>Friends' Websites</h2>
</header>
<ul>
<li>
<span class="bold">Justin Pilon</span> -
<a href="https://justinpilon.ca/" class="mono">
https://justinpilon.ca/
</a>
</li>
</ul>
<ul>
<li>
<span class="bold">Melody Shih</span> -
<a href="https://melly.tech/" class="mono">
https://melly.tech/
</a>
</li>
</ul>
</section>
<p>All my big projects are on my <a href="/">homepage</a>.</p>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/links/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Links | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link" class="on-page">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <section> <header> <h2>Find Me Other Places</h2> </header> <ul> <li> <span class="bold">Main Site</span> - <a href="https://tait.tech/" class="mono"> tait.tech </a> </li> </ul> <ul> <li> <span class="bold">Backup/Mirror Site</span> - <a href="https://beta.tait.tech/" class="mono"> beta.tait.tech </a> </li> </ul> <ul> <li> <span class="bold">Email</span> - <a href="mailto:tait@tait.tech" class="mono"> tait@tait.tech </a> </li> </ul> <ul> <li> <span class="bold">Public Key</span> - <a href="/public-key.asc" class="mono"> public-key.asc </a> </li> </ul> <ul> <li> <span class="bold">Github</span> - <a href="https://github.com/TTWNO" class="mono"> github.com/TTWNO </a> </li> </ul> </section> <section> <header> <h2>Secure Service Links</h2> </header> <ul> <li> <span class="bold">Signal</span> - <a href="https://signal.org" class="mono"> https://signal.org </a> </li> </ul> <ul> <li> <span class="bold">Protonmail</span> - <a href="https://protonmail.com" class="mono"> https://protonmail.com </a> </li> </ul> </section> <section> <header> <h2>Linux Links</h2> </header> <ul> <li> <span class="bold">Arch Linux Wiki</span> - <a href="https://wiki.archlinux.org/" class="mono"> https://wiki.archlinux.org/ </a> </li> </ul> <ul> <li> <span class="bold">Speakup Project [Unencrypted]</span> - <a href="http://linux-speakup.org/" class="mono"> http://linux-speakup.org/ </a> </li> </ul> <ul> <li> <span class="bold">Luke Smith</span> - <a href="https://lukesmith.xyz/" class="mono"> https://lukesmith.xyz/ </a> </li> </ul> <ul> <li> <span class="bold">Brian Lunduke</span> - <a href="https://lunduke.com/" class="mono"> https://lunduke.com/ </a> </li> </ul> </section> <section> <header> <h2>Interesting Links</h2> </header> <ul> <li> <span class="bold">Suckless</span> - <a href="https://suckless.org/" class="mono"> https://suckless.org/ </a> </li> </ul> <ul> <li> <span class="bold">cat -v considered harmful [Unencrypted]</span> - <a href="http://cat-v.org/" class="mono"> http://cat-v.org/ </a> </li> </ul> <ul> <li> <span class="bold">Edward Snowden</span> - <a href="https://www.biography.com/activist/edward-snowden/" class="mono"> https://www.biography.com/activist/edward-snowden/ </a> </li> </ul> </section> <section> <header> <h2>Inspiration Comes From</h2> </header> <ul> <li> <span class="bold">Gregory Gundersen</span> - <a href="https://gregorygundersen.com/" class="mono"> https://gregorygundersen.com/ </a> </li> </ul> </section> <section> <header> <h2>The "This Is A Website" Series</h2> </header> <ul> <li> <span class="bold">Website</span> - <a href="https://motherfuckingwebsite.com/" class="mono"> https://motherfuckingwebsite.com/ </a> </li> </ul> <ul> <li> <span class="bold">Better Website</span> - <a href="http://bettermotherfuckingwebsite.com/" class="mono"> http://bettermotherfuckingwebsite.com/ </a> </li> </ul> <ul> <li> <span class="bold">The Best Website</span> - <a href="https://thebestmotherfucking.website/" class="mono"> https://thebestmotherfucking.website/ </a> </li> </ul> </section> <section> <header> <h2>Friends' Websites</h2> </header> <ul> <li> <span class="bold">Justin Pilon</span> - <a href="https://justinpilon.ca/" class="mono"> https://justinpilon.ca/ </a> </li> </ul> <ul> <li> <span class="bold">Melody Shih</span> - <a href="https://melly.tech/" class="mono"> https://melly.tech/ </a> </li> </ul> </section> <p>All my big projects are on my <a href="/">homepage</a>.</p> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/links/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,125 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Resume | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<main>
<div id="wrapper">
<h1 id="tait-hoyem">Tait Hoyem</h1>
<h3 id="experience">Experience</h3>
<p><strong>Bytetools Technologies Inc.</strong><em>Founder</em> (2020-present)</p>
<p>Providing small businesses with simple, secure software solutions.</p>
<p><strong>Independent</strong><em>Tutoring</em> (2019-present)</p>
<p>Working with computer science students explaining introductory to advanced concepts.</p>
<p><strong>Total Impact Signs</strong><em>Technical Advisor</em> (2014-2016)</p>
<p>Implemented a semi-automatic payroll system replacing the manual sign in book used before.</p>
<h3 id="education">Education</h3>
<p><strong>The Linux Foundation</strong>—Certification / <em>Certified Linux System Administrator</em> (2016)</p>
<p>Certified in Linux system administration tasks. Running web servers, maintaining mass storage systems, running secure remote control tools. Certificate no longer valid.</p>
<p><strong>Southern Alberta Institute of Technology</strong>—Diploma / <em>Information Technology-Software Development Major</em> (2019-2021)</p>
<p>Full-stack two year software development diploma. Focusing on databases, interface design and enterprise solutions.</p>
<h3 id="professional-development">Professional Development</h3>
<p><strong>Dartmouth College (Open Corseware)</strong>—Professional Certificate / <em>C Programming with Linux</em> (2020)</p>
<p>A certification in C programming, the <code class="language-plaintext highlighter-rouge">gcc</code> compiler, and the <code class="language-plaintext highlighter-rouge">make</code> compilation system. 100% mark.</p>
<h3 id="projects">Projects</h3>
<p><strong><a href="https://github.com/ornicar/lila/pull/7772">Lichess</a></strong></p>
<p><em>A patch for Lichess.org which vastly extends support for screen reader users. The website has millions of active users.</em></p>
<p><strong><a href="https://github.com/TTWNO/quote_pdf">Quote Retrieval System</a></strong></p>
<p><em>Written for a local roofing business to securely distribute quotes.</em></p>
<p><strong><a href="https://github.com/TTWNO/epub-with-pinyin">epub-with-pinyin</a></strong></p>
<p><em>A program to add Pinyin above Chinese characters in .epub files to assist those learning Mandarin Chinese.</em></p>
<p><strong><a href="https://github.com/TTWNO/lamegames.io">lamegames</a></strong></p>
<p><em>A little games website I made for some demonstrations of Django and websocket functionality. Very, very lame. Would not recommend.</em></p>
<p><strong><a href="https://github.com/TTWNO/chess">chess</a></strong></p>
<p><em>A command-line chess game in C++. It is compileable on nearly any system.</em></p>
<p><strong><a href="https://github.com/TTWNO/subnetting">subnetting</a></strong></p>
<p><em>One-night write of a subnet calculation tool.</em></p>
<p><strong><a href="">Payroll</a></strong></p>
<p><em>A payroll system written in PHP.</em></p>
<p><strong><a href="https://bytetools.ca">Bytetools</a></strong></p>
<p><em>I have my own company called Bytetools. We make websites, data archiving and custom applications. 10% discount for open-source or community-oriented projects.</em></p>
<h3 id="languages">Languages</h3>
<h5 id="human">Human</h5>
<ul>
<li>
<p>English (Native)</p>
</li>
<li>
<p>Mandarin Chinese (Novice)</p>
</li>
</ul>
<h5 id="computer">Computer</h5>
<ul>
<li>
<p>C</p>
</li>
<li>
<p>C++</p>
</li>
<li>
<p>Python</p>
</li>
<li>
<p>Javscript</p>
</li>
<li>
<p>HTML/CSS</p>
</li>
<li>
<p>Bash</p>
</li>
<li>
<p>PHP</p>
</li>
<li>
<p>Java EE</p>
</li>
</ul>
<footer>
</footer>
</div>
</main>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Resume | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <main> <div id="wrapper"> <h1 id="tait-hoyem">Tait Hoyem</h1> <h3 id="experience">Experience</h3> <p><strong>Bytetools Technologies Inc.</strong><em>Founder</em> (2020-present)</p> <p>Providing small businesses with simple, secure software solutions.</p> <p><strong>Independent</strong><em>Tutoring</em> (2019-present)</p> <p>Working with computer science students explaining introductory to advanced concepts.</p> <p><strong>Total Impact Signs</strong><em>Technical Advisor</em> (2014-2016)</p> <p>Implemented a semi-automatic payroll system replacing the manual sign in book used before.</p> <h3 id="education">Education</h3> <p><strong>The Linux Foundation</strong>—Certification / <em>Certified Linux System Administrator</em> (2016)</p> <p>Certified in Linux system administration tasks. Running web servers, maintaining mass storage systems, running secure remote control tools. Certificate no longer valid.</p> <p><strong>Southern Alberta Institute of Technology</strong>—Diploma / <em>Information Technology-Software Development Major</em> (2019-2021)</p> <p>Full-stack two year software development diploma. Focusing on databases, interface design and enterprise solutions.</p> <h3 id="professional-development">Professional Development</h3> <p><strong>Dartmouth College (Open Corseware)</strong>—Professional Certificate / <em>C Programming with Linux</em> (2020)</p> <p>A certification in C programming, the <code class="language-plaintext highlighter-rouge">gcc</code> compiler, and the <code class="language-plaintext highlighter-rouge">make</code> compilation system. 100% mark.</p> <h3 id="projects">Projects</h3> <p><strong><a href="https://github.com/ornicar/lila/pull/7772">Lichess</a></strong></p> <p><em>A patch for Lichess.org which vastly extends support for screen reader users. The website has millions of active users.</em></p> <p><strong><a href="https://github.com/TTWNO/quote_pdf">Quote Retrieval System</a></strong></p> <p><em>Written for a local roofing business to securely distribute quotes.</em></p> <p><strong><a href="https://github.com/TTWNO/epub-with-pinyin">epub-with-pinyin</a></strong></p> <p><em>A program to add Pinyin above Chinese characters in .epub files to assist those learning Mandarin Chinese.</em></p> <p><strong><a href="https://github.com/TTWNO/lamegames.io">lamegames</a></strong></p> <p><em>A little games website I made for some demonstrations of Django and websocket functionality. Very, very lame. Would not recommend.</em></p> <p><strong><a href="https://github.com/TTWNO/chess">chess</a></strong></p> <p><em>A command-line chess game in C++. It is compileable on nearly any system.</em></p> <p><strong><a href="https://github.com/TTWNO/subnetting">subnetting</a></strong></p> <p><em>One-night write of a subnet calculation tool.</em></p> <p><strong><a href="">Payroll</a></strong></p> <p><em>A payroll system written in PHP.</em></p> <p><strong><a href="https://bytetools.ca">Bytetools</a></strong></p> <p><em>I have my own company called Bytetools. We make websites, data archiving and custom applications. 10% discount for open-source or community-oriented projects.</em></p> <h3 id="languages">Languages</h3> <h5 id="human">Human</h5> <ul> <li> <p>English (Native)</p> </li> <li> <p>Mandarin Chinese (Novice)</p> </li> </ul> <h5 id="computer">Computer</h5> <ul> <li> <p>C</p> </li> <li> <p>C++</p> </li> <li> <p>Python</p> </li> <li> <p>Javscript</p> </li> <li> <p>HTML/CSS</p> </li> <li> <p>Bash</p> </li> <li> <p>PHP</p> </li> <li> <p>Java EE</p> </li> </ul> <footer> </footer> </div> </main> </body> </html>

@ -1 +1 @@
Sitemap: http://localhost:4000/sitemap.xml
Sitemap: /sitemap.xml

@ -1,74 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CNIB Scholarship Essay 2020 | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<main>
<div id="wrapper">
<h1 id="cnib-scholarship-essay">CNIB Scholarship Essay</h1>
<h3 id="intro">Intro</h3>
<p><em>Question:</em>
How will this scholarship change what it is to be blind for you as you pursue your post-secondary education?</p>
<p><em>Answer:</em>
I have taken every opportunity of my short life to deny being defined solely by any disability.
This essay will focus more on my educational goals and career aspirations on their own merit.</p>
<p>I would love your support in accomplishing these goals!</p>
<h2 id="goals">Goals</h2>
<p>My current educational path involves finishing a diploma program,
then transfering to a Bachelors of Technology program in cybersecurity and digital forensics at BCIT.</p>
<p>Cybersecurity was not an overnight choice.
It became interesting to me over time as I saw ordinary people give up their privacy because they wanted their phone to tell them the weather—or some such other minor life enhancement.</p>
<p>Of course, it is a exaggeration to say that this is the reason people give up privacy,
but consider the extreme case:
You have your phone location on at all times;
you own an Alexa which listens to everything you say at home;
you text and call others using a service that <em>openly</em> collects the contents of your messages.</p>
<p>Would you want every single text you have sent to appear on the front page of the newspaper?
What about every thing you have said in the privacy of your own home?
Do you want just anyone to know where you were today?</p>
<p>If any one person had access to all this information about you, it would likely make you uneasy.
I know it makes me a bit nervous at least.</p>
<p>One of the primary goals of my career is to build tools that empower the individual.
Tools that make the individual <em>more</em> independent, not less.
These tools must be for the average consumer.
They must appeal to a mass market without compromising the secure, private foundations.
This is my goal:
Allow normal people, non-techies and techies alike, to just be able to send a text message without the world watching over their shoulder.</p>
<p>The second goal I have is to make this technology accessible to everyone.
Security-focused apps need to be fast so they will run on less expensive phones.
They need to be simple so that screen readers can process them correctly.</p>
<p>These are not hard things to do.
In fact, I would argue that designing software this way: independent of third parties, simple, able to run on cheap devices—is actually easier than designing it the way large companies seem to design software.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I have a vision for how to build open, secure, private and accessible applications.
Your help in moving that goal forward would be much appreciated.</p>
<p>Without you I can do it.</p>
<p>With you I can do it better.</p>
<footer>
</footer>
</div>
</main>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CNIB Scholarship Essay 2020 | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <main> <div id="wrapper"> <h1 id="cnib-scholarship-essay">CNIB Scholarship Essay</h1> <h3 id="intro">Intro</h3> <p><em>Question:</em> How will this scholarship change what it is to be blind for you as you pursue your post-secondary education?</p> <p><em>Answer:</em> I have taken every opportunity of my short life to deny being defined solely by any disability. This essay will focus more on my educational goals and career aspirations on their own merit.</p> <p>I would love your support in accomplishing these goals!</p> <h2 id="goals">Goals</h2> <p>My current educational path involves finishing a diploma program, then transfering to a Bachelors of Technology program in cybersecurity and digital forensics at BCIT.</p> <p>Cybersecurity was not an overnight choice. It became interesting to me over time as I saw ordinary people give up their privacy because they wanted their phone to tell them the weather—or some such other minor life enhancement.</p> <p>Of course, it is a exaggeration to say that this is the reason people give up privacy, but consider the extreme case: You have your phone location on at all times; you own an Alexa which listens to everything you say at home; you text and call others using a service that <em>openly</em> collects the contents of your messages.</p> <p>Would you want every single text you have sent to appear on the front page of the newspaper? What about every thing you have said in the privacy of your own home? Do you want just anyone to know where you were today?</p> <p>If any one person had access to all this information about you, it would likely make you uneasy. I know it makes me a bit nervous at least.</p> <p>One of the primary goals of my career is to build tools that empower the individual. Tools that make the individual <em>more</em> independent, not less. These tools must be for the average consumer. They must appeal to a mass market without compromising the secure, private foundations. This is my goal: Allow normal people, non-techies and techies alike, to just be able to send a text message without the world watching over their shoulder.</p> <p>The second goal I have is to make this technology accessible to everyone. Security-focused apps need to be fast so they will run on less expensive phones. They need to be simple so that screen readers can process them correctly.</p> <p>These are not hard things to do. In fact, I would argue that designing software this way: independent of third parties, simple, able to run on cheap devices—is actually easier than designing it the way large companies seem to design software.</p> <h2 id="conclusion">Conclusion</h2> <p>I have a vision for how to build open, secure, private and accessible applications. Your help in moving that goal forward would be much appreciated.</p> <p>Without you I can do it.</p> <p>With you I can do it better.</p> <footer> </footer> </div> </main> </body> </html>

@ -1,151 +1 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://localhost:4000/2020/01/22/padding-and-margin/</loc>
<lastmod>2020-01-22T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/01/26/rsa1/</loc>
<lastmod>2020-01-26T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/02/19/rsa2/</loc>
<lastmod>2020-02-19T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/04/02/rsa3/</loc>
<lastmod>2020-04-02T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/04/06/rsa4/</loc>
<lastmod>2020-04-06T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/04/12/nas1/</loc>
<lastmod>2020-04-12T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/04/21/rfi/</loc>
<lastmod>2020-04-21T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/04/25/xss/</loc>
<lastmod>2020-04-25T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/05/01/nginx-socket-io-projects/</loc>
<lastmod>2020-05-01T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/05/19/clue-announcement/</loc>
<lastmod>2020-05-19T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/06/04/site-update/</loc>
<lastmod>2020-06-04T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/06/25/tmux-minecraft/</loc>
<lastmod>2020-06-25T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/07/12/independence/</loc>
<lastmod>2020-07-12T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/07/19/multicraft-php-gentoo/</loc>
<lastmod>2020-07-19T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/07/30/canadian-parliament/</loc>
<lastmod>2020-07-30T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/08/15/openbsd1/</loc>
<lastmod>2020-08-15T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/08/18/django-deployment/</loc>
<lastmod>2020-08-18T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/09/09/lamegames/</loc>
<lastmod>2020-09-09T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/09/12/minesweeper/</loc>
<lastmod>2020-09-12T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/10/26/curiosity/</loc>
<lastmod>2020-10-26T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/11/15/nas2/</loc>
<lastmod>2020-11-15T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/12/01/pacaur-rpi/</loc>
<lastmod>2020-12-01T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/12/14/orca-raspberry-pi-manjaro/</loc>
<lastmod>2020-12-14T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/12/20/deploy-lichess/</loc>
<lastmod>2020-12-20T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2021/01/31/lichess/</loc>
<lastmod>2021-01-31T00:00:00-07:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020-04-27-quiz-your-friends-xss/</loc>
</url>
<url>
<loc>http://localhost:4000/tests/live-label/</loc>
</url>
<url>
<loc>http://localhost:4000/tests/chess/</loc>
</url>
<url>
<loc>http://localhost:4000/blog/</loc>
</url>
<url>
<loc>http://localhost:4000/</loc>
</url>
<url>
<loc>http://localhost:4000/about/</loc>
</url>
<url>
<loc>http://localhost:4000/resume/</loc>
</url>
<url>
<loc>http://localhost:4000/contact/</loc>
</url>
<url>
<loc>http://localhost:4000/links/</loc>
</url>
<url>
<loc>http://localhost:4000/scholarships/2020/cnib/</loc>
</url>
<url>
<loc>http://localhost:4000/tutoring/</loc>
</url>
<url>
<loc>http://localhost:4000/cover-letter-vcc/</loc>
</url>
<url>
<loc>http://localhost:4000/ideas/</loc>
</url>
<url>
<loc>http://localhost:4000/cover-letters/bloombase/</loc>
</url>
<url>
<loc>http://localhost:4000/cover-letters/protonmail/</loc>
</url>
<url>
<loc>http://localhost:4000/test/</loc>
</url>
</urlset>
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>/2020/01/22/padding-and-margin/</loc> <lastmod>2020-01-22T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/01/26/rsa1/</loc> <lastmod>2020-01-26T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/02/19/rsa2/</loc> <lastmod>2020-02-19T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/04/02/rsa3/</loc> <lastmod>2020-04-02T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/04/06/rsa4/</loc> <lastmod>2020-04-06T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/04/12/nas1/</loc> <lastmod>2020-04-12T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/04/21/rfi/</loc> <lastmod>2020-04-21T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/04/25/xss/</loc> <lastmod>2020-04-25T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/05/01/nginx-socket-io-projects/</loc> <lastmod>2020-05-01T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/05/19/clue-announcement/</loc> <lastmod>2020-05-19T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/06/04/site-update/</loc> <lastmod>2020-06-04T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/06/25/tmux-minecraft/</loc> <lastmod>2020-06-25T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/07/12/independence/</loc> <lastmod>2020-07-12T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/07/19/multicraft-php-gentoo/</loc> <lastmod>2020-07-19T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/07/30/canadian-parliament/</loc> <lastmod>2020-07-30T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/08/15/openbsd1/</loc> <lastmod>2020-08-15T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/08/18/django-deployment/</loc> <lastmod>2020-08-18T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/09/09/lamegames/</loc> <lastmod>2020-09-09T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/09/12/minesweeper/</loc> <lastmod>2020-09-12T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/10/26/curiosity/</loc> <lastmod>2020-10-26T00:00:00-06:00</lastmod> </url> <url> <loc>/2020/11/15/nas2/</loc> <lastmod>2020-11-15T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/12/01/pacaur-rpi/</loc> <lastmod>2020-12-01T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/12/14/orca-raspberry-pi-manjaro/</loc> <lastmod>2020-12-14T00:00:00-07:00</lastmod> </url> <url> <loc>/2020/12/20/deploy-lichess/</loc> <lastmod>2020-12-20T00:00:00-07:00</lastmod> </url> <url> <loc>/2021/01/31/lichess/</loc> <lastmod>2021-01-31T00:00:00-07:00</lastmod> </url> <url> <loc>/2021/04/04/quiz-your-friends-xss/</loc> <lastmod>2021-04-04T00:00:00-06:00</lastmod> </url> <url> <loc>/blog/</loc> </url> <url> <loc>/tests/live-label/</loc> </url> <url> <loc>/tests/chess/</loc> </url> <url> <loc>/</loc> </url> <url> <loc>/ideas/</loc> </url> <url> <loc>/tutoring/</loc> </url> <url> <loc>/cover-letters/bloombase/</loc> </url> <url> <loc>/cover-letters/protonmail/</loc> </url> <url> <loc>/resume/</loc> </url> <url> <loc>/links/</loc> </url> <url> <loc>/cover-letter-vcc/</loc> </url> <url> <loc>/contact/</loc> </url> <url> <loc>/about/</loc> </url> <url> <loc>/scholarships/2020/cnib/</loc> </url> </urlset>

@ -1,14 +0,0 @@
ttv = '3.3v'
fv = '5v'
headers = ['WiringPi Pin', 'BCM GPIO', 'Name', 'Header', 'Header', 'Name', 'BCM GPIO', 'WiringPi Pin']
data = [
['', '', ttv, '1', '2', '5v', '', ''],
['8', 'Rv1:0 - Rv2:2', 'SDA', '3', '4', fv, '', ''],
['9', 'Rv1:1 - Rv2:3', 'SCL', '5', '6', '0v', '', ''],
['7', '4', 'GPIO7', '7', '8', 'TxD', '14', '15'],
['', '', '0v', '9', '10', 'RxD', '15', '16'],
['0', '17', 'GPIO0', '11', '12', 'GPIO1', '18', '1'],
[],
]

@ -1,47 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<table>
<thead>
<tr>
<td>WiringPi Pin</td>
<td>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/test/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>

@ -1,148 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chessboard | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<!-- https://www.w3.org/WAI/tutorials/tables/two-headers/ -->
<table>
<caption>Chess board</caption>
<thead>
<td></td>
<th scopre="col">A</th>
<th scopre="col">B</th>
<th scopre="col">C</th>
<th scopre="col">D</th>
<th scopre="col">E</th>
<th scopre="col">F</th>
<th scopre="col">G</th>
<th scopre="col">H</th>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>R</td>
<td>K</td>
<td>B</td>
<td>K</td>
<td>Q</td>
<td>B</td>
<td>K</td>
<td>R</td>
</tr>
<tr>
<th scope="row">2</th>
<td>P</td>
<td>P</td>
<td>P</td>
<td>P</td>
<td>P</td>
<td>P</td>
<td>P</td>
<td>P</td>
</tr>
<tr>
<th scope="row">3</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th scope="row">4</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th scope="row">5</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th scope="row">6</th>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<th scope="row">7</th>
<td>p</td>
<td>p</td>
<td>p</td>
<td>p</td>
<td>p</td>
<td>p</td>
<td>p</td>
<td>p</td>
</tr>
<tr>
<th scope="row">8</th>
<td>r</td>
<td>k</td>
<td>b</td>
<td>k</td>
<td>q</td>
<td>b</td>
<td>k</td>
<td>r</td>
</tr>
</tbody>
</table>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/tests/chess/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Chessboard | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <table> <caption>Chess board</caption> <thead> <td></td> <th scopre="col">A</th> <th scopre="col">B</th> <th scopre="col">C</th> <th scopre="col">D</th> <th scopre="col">E</th> <th scopre="col">F</th> <th scopre="col">G</th> <th scopre="col">H</th> </thead> <tbody> <tr> <th scope="row">1</th> <td>R</td> <td>K</td> <td>B</td> <td>K</td> <td>Q</td> <td>B</td> <td>K</td> <td>R</td> </tr> <tr> <th scope="row">2</th> <td>P</td> <td>P</td> <td>P</td> <td>P</td> <td>P</td> <td>P</td> <td>P</td> <td>P</td> </tr> <tr> <th scope="row">3</th> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <th scope="row">4</th> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <th scope="row">5</th> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <th scope="row">6</th> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <th scope="row">7</th> <td>p</td> <td>p</td> <td>p</td> <td>p</td> <td>p</td> <td>p</td> <td>p</td> <td>p</td> </tr> <tr> <th scope="row">8</th> <td>r</td> <td>k</td> <td>b</td> <td>k</td> <td>q</td> <td>b</td> <td>k</td> <td>r</td> </tr> </tbody> </table> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/tests/chess/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,61 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test ARIA-live region with label | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<div id="test-aria" aria-live="polite" aria-label="Test label">
I am some text.
</div>
<button id="btn">Update labled ARIA region.</button>
<button id="btn2">Delete text</button>
<p>Test</p>
<script>
ALDIV = document.getElementById("test-aria");
NEW_TEXT = "new text;";
UPDATE_BTN = document.getElementById("btn");
DELETE_BTN = document.getElementById("btn2");
UPDATE_BTN.addEventListener('click', function(e) {
ALDIV.innerText = 'Updating... Hello world!';
});
DELETE_BTN.addEventListener('click', function(e) {
ALDIV.innerText = '';
});
</script>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/tests/live-label/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test ARIA-live region with label | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <div id="test-aria" aria-live="polite" aria-label="Test label"> I am some text. </div> <button id="btn">Update labled ARIA region.</button> <button id="btn2">Delete text</button> <p>Test</p> <script>ALDIV=document.getElementById("test-aria"),NEW_TEXT="new text;",UPDATE_BTN=document.getElementById("btn"),DELETE_BTN=document.getElementById("btn2"),UPDATE_BTN.addEventListener("click",function(){ALDIV.innerText="Updating... Hello world!"}),DELETE_BTN.addEventListener("click",function(){ALDIV.innerText=""});</script> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/tests/live-label/">beta.tait.tech</a>. </footer> </div> </body> </html>

@ -1,76 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tutoring | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Tait Hoyem">
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<div id="wrapper">
<header>
<h1>tait.tech</h1>
<nav>
<a href="/" class="nav-link" >Home</a>
<a href="/blog/" class="nav-link" >Blog</a>
<a href="/ideas/" class="nav-link" >Ideas</a>
<a href="/links/" class="nav-link" >Links</a>
<a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer" >Github</a>
</nav>
</header>
<main>
<h2 id="tutoring">Tutoring</h2>
<p>I believe in solving problems.
Learn how to solve your own unique computer-related problems by learning how they work underneath all the fancy buttons you see.</p>
<p>Contact me at <a href="mailto:tutoring@tait.tech">tutoring@tait.tech</a> for more info.</p>
<h3 id="rateshour">Rates/hour</h3>
<p><strong><em>C$25</em></strong> for a programming language I am comfortable with already.</p>
<ul>
<li>C, C++, Java, Python, HTML/CSS/JS.</li>
</ul>
<p><strong><em>C$20 + 1 week prep. time</em></strong> for a programming language I am not very comfortable with already.</p>
<ul>
<li>Rust, Go, Node.js.</li>
</ul>
<p><strong><em>C$35</em></strong> for Linux system administration.</p>
<ul>
<li>Paritioning disks, install and configure software and automate tasks via the command line interface (CLI).</li>
</ul>
<p>I offer group discounts for 2+ students.</p>
<h5 id="resources">Resources:</h5>
<p>My favourite resources are the following:</p>
<ul>
<li><a href="https://www.youtube.com/user/thenewboston">thenewboston (Youtube)</a></li>
<li><a href="https://cppreference.com">cppreference.com</a> (also has C references)</li>
</ul>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/tutoring/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Tutoring | tait.tech</title> <link rel="stylesheet" href="/assets/css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Tait Hoyem"> <meta name="keywords" content=""> <meta name="description" content=""> </head> <body> <div id="wrapper"> <header> <h1>tait.tech</h1> <nav> <a href="/" class="nav-link">Home</a> <a href="/blog/" class="nav-link">Blog</a> <a href="/ideas/" class="nav-link">Ideas</a> <a href="/links/" class="nav-link">Links</a> <a href="https://github.com/TTWNO/" class="nav-link" target="_blank" rel="noopener noreferrer">Github</a> </nav> </header> <main> <h2 id="tutoring">Tutoring</h2> <p>I believe in solving problems. Learn how to solve your own unique computer-related problems by learning how they work underneath all the fancy buttons you see.</p> <p>Contact me at <a href="mailto:tutoring@tait.tech">tutoring@tait.tech</a> for more info.</p> <h3 id="rateshour">Rates/hour</h3> <p><strong><em>C$25</em></strong> for a programming language I am comfortable with already.</p> <ul> <li>C, C++, Java, Python, HTML/CSS/JS.</li> </ul> <p><strong><em>C$20 + 1 week prep. time</em></strong> for a programming language I am not very comfortable with already.</p> <ul> <li>Rust, Go, Node.js.</li> </ul> <p><strong><em>C$35</em></strong> for Linux system administration.</p> <ul> <li>Paritioning disks, install and configure software and automate tasks via the command line interface (CLI).</li> </ul> <p>I offer group discounts for 2+ students.</p> <h5 id="resources">Resources:</h5> <p>My favourite resources are the following:</p> <ul> <li><a href="https://www.youtube.com/user/thenewboston">thenewboston (Youtube)</a></li> <li><a href="https://cppreference.com">cppreference.com</a> (also has C references)</li> </ul> </main> <hr> <footer> This page is mirrored on <a href="https://beta.tait.tech/tutoring/">beta.tait.tech</a>. </footer> </div> </body> </html>
Loading…
Cancel
Save