<p>While filling in one of my friend’s surveys I thought it would be
<p>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.
funny for them to know it is me without anyone else knowing.
We were young and had <codeclass="highlighter-rouge">Inspect Element</code>ed a few things together,
We were young and had <codeclass="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>
so it was a safe bet that an HTML joke would let them know.</p>
<p>I decided to write my name like so: <codeclass="highlighter-rouge"><b>Steve</b></code>.
<p>I decided to write my name like so: <codeclass="language-plaintext highlighter-rouge"><b>Steve</b></code>.
Steve is in reference to the <ahref="https://minecraft.gamepedia.com/Player">main character</a> in the video game Minecraft.</p>
Steve is in reference to the <ahref="https://minecraft.gamepedia.com/Player">main character</a> in the video game Minecraft.</p>
<figure>
<figure>
@ -69,13 +69,13 @@ How did this happen? You might wonder.</p>
<p>Here is a great demonstration why you should do most of your validation on the server side.
<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>
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 <codeclass="highlighter-rouge">maxlength=20</code> HTML attribute on the name input field.
<p>Quiz your friends uses the <codeclass="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! Don’t forget that includes the <codeclass="highlighter-rouge"><script></code> tag.
Imagine trying to fit in a script tag doing anything useful with 20 characters! Don’t forget that includes the <codeclass="language-plaintext highlighter-rouge"><script></code> tag.
That would leave 13 characters for Javascript.
That would leave 13 characters for Javascript.
Although I’m sure a genius would be able to <ahref="https://code.golf/">code golf</a> that, I know I couldn’t.</p>
Although I’m sure a genius would be able to <ahref="https://code.golf/">code golf</a> that, I know I couldn’t.</p>
<p>Now obviously I can edit any HTML that a server has sent to me.
<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 <codeclass="highlighter-rouge">maxlength</code> attribute to anything I want.
If I open up my inspect element window, I can go ahead and change that <codeclass="language-plaintext highlighter-rouge">maxlength</code> attribute to anything I want.
Let’s change it to 100!</p>
Let’s change it to 100!</p>
<figure>
<figure>
@ -96,9 +96,9 @@ Imagine being able to send entire executable programs as your “name” in one
<p>So I went on my merry way thinking about ways to use malicious javascript.
<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.
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 <codeclass="highlighter-rouge">alert()</code> to warn the user about this site.</p>
I filled in the name with a script tag and a call to <codeclass="language-plaintext highlighter-rouge">alert()</code> to warn the user about this site.</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>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 <codeclass="highlighter-rouge"><link></code> on your navigation bar has 10 pixels of margin, then there would be 20 pixels in between each <codeclass="highlighter-rouge"><link></code> that would <em>not</em> be clickable by the user.</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 <codeclass="language-plaintext highlighter-rouge"><link></code> on your navigation bar has 10 pixels of margin, then there would be 20 pixels in between each <codeclass="language-plaintext highlighter-rouge"><link></code> that would <em>not</em> be clickable by the user.</p>
<p>If you have <codeclass="highlighter-rouge"><link></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 <codeclass="highlighter-rouge"><link></code> text where the user <em>is</em> able to click.</p>
<p>If you have <codeclass="language-plaintext highlighter-rouge"><link></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 <codeclass="language-plaintext highlighter-rouge"><link></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 <codeclass="highlighter-rouge">background-color</code> would apply.</p>
<p>If that part is confusing, try thinking about it in terms of whether <codeclass="language-plaintext highlighter-rouge">background-color</code> would apply.</p>
<li><strong>Padding</strong>: the space within a tag which is still part of the same tag. <codeclass="highlighter-rouge">background-color</code> applies.</li>
<li><strong>Padding</strong>: the space within a tag which is still part of the same tag. <codeclass="language-plaintext highlighter-rouge">background-color</code> applies.</li>
<li><strong>Margin</strong>: the space in between two seperate tags. <codeclass="highlighter-rouge">background-color</code> does not apply; it is empty space.</li>
<li><strong>Margin</strong>: the space in between two seperate tags. <codeclass="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. <codeclass="highlighter-rouge">background-color</code> does not apply.</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. <codeclass="language-plaintext highlighter-rouge">background-color</code> does not apply.</li>
</ul>
</ul>
<p>I hope this covers the basics of margin and padding! Happy coding!</p>
<p>I hope this covers the basics of margin and padding! Happy coding!</p>
<p>We will be using the utility <codeclass="highlighter-rouge">gpg</code> for this tutorial.</p>
<p>We will be using the utility <codeclass="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.
<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>
It simply indicates that you do not need administrative privilages to run these commands.</p>
@ -84,7 +84,7 @@ License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html
<p>To encrypt a document with somebody’s public key, you need to first obtain it.
<p>To encrypt a document with somebody’s public key, you need to first obtain it.
My public key is available <ahref="/public-key.asc">at this link</a>, and you can use it to send me encrypted stuff.</p>
My public key is available <ahref="/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 <codeclass="highlighter-rouge">curl</code> or <codeclass="highlighter-rouge">wget</code> command to download it.</p>
<p>If you are on a linux terminal, you can use the <codeclass="language-plaintext highlighter-rouge">curl</code> or <codeclass="language-plaintext highlighter-rouge">wget</code> command to download it.</p>
<p>wget:</p>
<p>wget:</p>
<preclass="terminal">
<preclass="terminal">
@ -130,7 +130,7 @@ Please select what kind of key you want:
Your selection?
Your selection?
</pre>
</pre>
<p>Select the option <codeclass="highlighter-rouge">1</code>. You want two keys, both RSA.</p>
<p>Select the option <codeclass="language-plaintext highlighter-rouge">1</code>. You want two keys, both RSA.</p>
<p>Next we will select the key size:</p>
<p>Next we will select the key size:</p>
<preclass="terminal">
<preclass="terminal">
@ -164,9 +164,9 @@ Key expires at Tue Apr 7 02:24:23 2020 UTC
Is this correct? (y/N)
Is this correct? (y/N)
</pre>
</pre>
<p>Type <codeclass="highlighter-rouge">y</code> to confirm your choice.</p>
<p>Type <codeclass="language-plaintext highlighter-rouge">y</code> to confirm your choice.</p>
<p>Now <codeclass="highlighter-rouge">gpg</code> is going to ask you to create a user id to indetify this key.
<p>Now <codeclass="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.
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>
User input is in bold, feel free to follow along or to put your own test data in.</p>
@ -190,7 +190,7 @@ If you are simply using this for test purposes,
then you can feel free to set it to something like “test”.
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>
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, <codeclass="highlighter-rouge">gpg</code> may warn you with this message:</p>
<p>During the process of creating your key, <codeclass="language-plaintext highlighter-rouge">gpg</code> may warn you with this message:</p>
<preclass="terminal">
<preclass="terminal">
We need to generate a lot of random bytes. It is a good idea to perform
We need to generate a lot of random bytes. It is a good idea to perform
<h2id="step-2-import-public-key">Step 2: Import Public Key</h2>
<h2id="step-2-import-public-key">Step 2: Import Public Key</h2>
<p>This list of keys that <codeclass="highlighter-rouge">gpg</code> keeps on tap so to speak, is called our “keyring”.
<p>This list of keys that <codeclass="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 <codeclass="highlighter-rouge">gpg</code>.</p>
Your will need to import a new public key to encrypt files with <codeclass="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>
<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>
@ -248,7 +248,7 @@ Your will need to import a new public key to encrypt files with <code class="hig
</figcaption>
</figcaption>
</figure>
</figure>
<p>To import a public key to use for encrypting files, use the <codeclass="highlighter-rouge">--import</code> option of <codeclass="highlighter-rouge">gpg</code>. Like so:</p>
<p>To import a public key to use for encrypting files, use the <codeclass="language-plaintext highlighter-rouge">--import</code> option of <codeclass="language-plaintext highlighter-rouge">gpg</code>. Like so:</p>
<preclass="terminal">
<preclass="terminal">
$ gpg --import public-key.asc
$ gpg --import public-key.asc
@ -262,7 +262,7 @@ gpg: imported: 1
<h2id="step-3-have-a-message-to-encrypt">Step 3: Have A Message To Encrypt</h2>
<h2id="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.
<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, <codeclass="highlighter-rouge">nano</code> works alright too.</p>
Feel free to use a graphical editor if you have one, if not, <codeclass="language-plaintext highlighter-rouge">nano</code> works alright too.</p>
<preclass="terminal">
<preclass="terminal">
Rules Of A Good Life:
Rules Of A Good Life:
@ -273,21 +273,21 @@ Feel free to use a graphical editor if you have one, if not, <code class="highli
5. Have good friends!
5. Have good friends!
</pre>
</pre>
<p>Save this file as something like <codeclass="highlighter-rouge">test-pgp.txt</code>, and we’ll use that name later.</p>
<p>Save this file as something like <codeclass="language-plaintext highlighter-rouge">test-pgp.txt</code>, and we’ll use that name later.</p>
<h2id="step-4-encrypt-a-message">Step 4: Encrypt A Message</h2>
<h2id="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,
<p>Now that we have a message to send and person to send to,
all we have to do is encrypt this message and it’ll be on its merry way!
all we have to do is encrypt this message and it’ll be on its merry way!
To do so, we must specify two new options to <codeclass="highlighter-rouge">gpg</code>.</p>
To do so, we must specify two new options to <codeclass="language-plaintext highlighter-rouge">gpg</code>.</p>
<p>The first is <codeclass="highlighter-rouge">--recipient</code>.
<p>The first is <codeclass="language-plaintext highlighter-rouge">--recipient</code>.
This tells <codeclass="highlighter-rouge">gpg</code> to encrypt using a certin public key that we have in our keyring.
This tells <codeclass="language-plaintext highlighter-rouge">gpg</code> to encrypt using a certin public key that we have in our keyring.
You can use the person’s name, email address, or the key’s uid.</p>
You can use the person’s name, email address, or the key’s uid.</p>
<p>The second is <codeclass="highlighter-rouge">--encrypt</code>.</p>
<p>The second is <codeclass="language-plaintext highlighter-rouge">--encrypt</code>.</p>
<p>You will also specify the <codeclass="highlighter-rouge">--armour</code> option to use ASCII armoured files. Put this option after <codeclass="highlighter-rouge">--encrypt</code>, and put the file name after <codeclass="highlighter-rouge">--armour</code>. See below.</p>
<p>You will also specify the <codeclass="language-plaintext highlighter-rouge">--armour</code> option to use ASCII armoured files. Put this option after <codeclass="language-plaintext highlighter-rouge">--encrypt</code>, and put the file name after <codeclass="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),
<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).
or you can use my public key that we imported earlier (allowing only me to decrypt it).
@ -69,7 +69,7 @@ this system can withstand the failure of <em>two</em> drives.</p>
<ol>
<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>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>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 <codeclass="highlighter-rouge">nomodeset</code> kernel option enabled).</li>
<li>Houston. A 21-inch 2011 iMac for which the screen does not work under Linux (excep with the <codeclass="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>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>
<li>Main Rig. My main laptop is an ASUS-705 TUF gaming laptop.</li>
@ -51,7 +51,7 @@ by linking to Javascript code stored on another server.</p>
<p>I have a file on my website called <ahref="/assets/js/hacked.js">hacked.js</a>.
<p>I have a file on my website called <ahref="/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>
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 <codeclass="highlighter-rouge">hacked.js</code> link to view the code I use to “hack” this website.
<p>Click the above <codeclass="language-plaintext highlighter-rouge">hacked.js</code> link to view the code I use to “hack” this website.
It’s safe, I promise ;)</p>
It’s safe, I promise ;)</p>
<p>Now, how can we get this code to execute when a user visits this site?
<p>Now, how can we get this code to execute when a user visits this site?
@ -62,11 +62,11 @@ To explain, I will start with some of the underlying technologies.</p>
<p>No, this is not a Sherlock Holmes novel!</p>
<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”):
<p>If we suppose that a website is built with sequences like these (called “tags”):
<codeclass="highlighter-rouge"><body></code>, <codeclass="highlighter-rouge"><p></code> (for paragraph), <codeclass="highlighter-rouge"><link></code> and <codeclass="highlighter-rouge"><b></code> for bold,
<codeclass="language-plaintext highlighter-rouge"><body></code>, <codeclass="language-plaintext highlighter-rouge"><p></code> (for paragraph), <codeclass="language-plaintext highlighter-rouge"><link></code> and <codeclass="language-plaintext highlighter-rouge"><b></code> for bold,
then why can you <em>see</em> the left and right angle bracket characters?
then why can you <em>see</em> the left and right angle bracket characters?
Don’t they mean something? Shouldn’t they be telling the browser:
Don’t they mean something? Shouldn’t they be telling the browser:
<em>“Hey! Make me bold!”?</em>
<em>“Hey! Make me bold!”?</em>
Why <em>doesn’t</em> everything after me typing <codeclass="highlighter-rouge"><b></code> turn bold?</p>
Why <em>doesn’t</em> everything after me typing <codeclass="language-plaintext highlighter-rouge"><b></code> turn bold?</p>
<p>The answer is:</p>
<p>The answer is:</p>
@ -83,7 +83,7 @@ If I use the left and right brackets on my keyboard however,
things will indeed <b>show up bold</b>.
things will indeed <b>show up bold</b>.
</pre>
</pre>
<p>Notice how all visible left angle brackets use an <codeclass="highlighter-rouge">&lt;</code> to show them?</p>
<p>Notice how all visible left angle brackets use an <codeclass="language-plaintext highlighter-rouge">&lt;</code> to show them?</p>
<p>These are called <ahref="https://en.wikipedia.org/wiki/Escape_character">escape characters</a>.
<p>These are called <ahref="https://en.wikipedia.org/wiki/Escape_character">escape characters</a>.
They tell a system, in this case your web browser:
They tell a system, in this case your web browser:
@ -91,12 +91,12 @@ They tell a system, in this case your web browser:
<h4id="sanitization">Sanitization</h4>
<h4id="sanitization">Sanitization</h4>
<p>Most of the time XSS attacks are done using poorly sanitized HTML <codeclass="highlighter-rouge"><input></code> elements.</p>
<p>Most of the time XSS attacks are done using poorly sanitized HTML <codeclass="language-plaintext highlighter-rouge"><input></code> elements.</p>
<p>Sanitization is when a program (usually on the server side),
<p>Sanitization is when a program (usually on the server side),
will remove characters like <codeclass="highlighter-rouge"><</code> and replace them with the aforementioned “escape characters”.
will remove characters like <codeclass="language-plaintext highlighter-rouge"><</code> and replace them with the aforementioned “escape characters”.
Internally this would be something like <codeclass="highlighter-rouge">&lt;</code>,
Internally this would be something like <codeclass="language-plaintext highlighter-rouge">&lt;</code>,
but they would show up to a user as <codeclass="highlighter-rouge"><</code>.</p>
but they would show up to a user as <codeclass="language-plaintext highlighter-rouge"><</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,
<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.
then a malicous user can type in HTML that will run whenever anybody tries to look at what they typed.
@ -110,16 +110,16 @@ 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>
<p>There is one tag however, that <em>is</em> scary…</p>
<p>The <codeclass="highlighter-rouge"><script></code> tag allows you to write code that can:</p>
<p>The <codeclass="language-plaintext highlighter-rouge"><script></code> tag allows you to write code that can:</p>
<ol>
<ol>
<li>Change the page contents.</li>
<li>Change the page contents.</li>
<li>Redirect the user to a new page automatically.</li>
<li>Redirect the user to a new page automatically.</li>
<li>Get a user’s location.</li>
<li>Get a user’s location.</li>
<li>Open a user’s microphone/webcam.</li>
<li>Open a user’s microphone/webcam.</li>
<li>With the <codeclass="highlighter-rouge">src</code><ahref="https://www.w3schools.com/htmL/html_attributes.asp">attribute</a> you can also load a script from another site. (This is XSS)</li>
<li>With the <codeclass="language-plaintext highlighter-rouge">src</code><ahref="https://www.w3schools.com/htmL/html_attributes.asp">attribute</a> you can also load a script from another site. (This is XSS)</li>
</ol>
</ol>
<p>Those last two will ask for permission from the user (if their browser isn’t insanely insecure).</p>
<p>Those last two will ask for permission from the user (if their browser isn’t insanely insecure).</p>
<p>Despite the long name of the article, I have a feeling this may apply to more people than I might think.
<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 nginx’s <codeclass="highlighter-rouge">reverse_proxy</code> directive then this is the article for you!</p>
If you have a Node.js application which needs socket.io connections that you want to pass throgh nginx’s <codeclass="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>
<p>You <em>must</em> seperate the socket.io sockets and the static resources.</p>
<ul>
<ul>
<li>The socket connections can be routed through the default <codeclass="highlighter-rouge">$host/socket.io</code> if you want to ease modifications to the source code.</li>
<li>The socket connections can be routed through the default <codeclass="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>
<li>The connections to your main npm Node.js application can be routed through the relevant directory.</li>
</ul>
</ul>
<p>Here is the relevant part of my <codeclass="highlighter-rouge">projects.tait.tech.conf</code> file:</p>
<p>Here is the relevant part of my <codeclass="language-plaintext highlighter-rouge">projects.tait.tech.conf</code> file:</p>
<preclass="terminal">
<preclass="terminal">
location /socket.io {
location /socket.io {
@ -64,13 +64,13 @@ location /ttrpg {
<h3id="explaination">Explaination:</h3>
<h3id="explaination">Explaination:</h3>
<p>For this application,
<p>For this application,
I needed the <codeclass="highlighter-rouge">/ttrpg</code> directory to connect to my main Node.js instance. This was going to be the root of a ttrpg project.
I needed the <codeclass="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>
It was to have static files served form my Node.js application.</p>
<p>I also needed <codeclass="highlighter-rouge">/socket.io</code> to conenct to my running <codeclass="highlighter-rouge">npm</code> instance.
<p>I also needed <codeclass="language-plaintext highlighter-rouge">/socket.io</code> to conenct to my running <codeclass="language-plaintext highlighter-rouge">npm</code> instance.
When I tried to route all the traffic through the <codeclass="highlighter-rouge">/trrpg</code> location directive
When I tried to route all the traffic through the <codeclass="language-plaintext highlighter-rouge">/trrpg</code> location directive
I had no luck whatsoever;
I had no luck whatsoever;
<codeclass="highlighter-rouge">$host/ttrpg/socket.io/*</code> calls <em>always</em> failed with a 404.</p>
<codeclass="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.
<p>Having two seperate blocks forwarding in different ways seems to fix this.
I am not knowledgable enough to understand how.</p>
I am not knowledgable enough to understand how.</p>
@ -79,7 +79,7 @@ I am not knowledgable enough to understand how.</p>
<p>Happy hacking!</p>
<p>Happy hacking!</p>
<p><em>P.S. I forgot to mention I also symbolically linked the <codeclass="highlighter-rouge">socket.io.js</code> file (that node is supposed to serve automatically) to the static client dir.
<p><em>P.S. I forgot to mention I also symbolically linked the <codeclass="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>
For some reson the node instance would not serve this file without that.</em></p>
<p>Also, Clue has been delayed due to my partner in crime on the project wokring too many hours.</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><ahref="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 <codeclass="highlighter-rouge">make</code>.</p>
<p>I also posted a new project called <em><ahref="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 <codeclass="language-plaintext highlighter-rouge">make</code>.</p>
@ -45,18 +45,18 @@ Especially when I really just want to be playing games but I just need to check
<h2id="solution">Solution</h2>
<h2id="solution">Solution</h2>
<p>So to solve this interesting problem, I decided to use <codeclass="highlighter-rouge">tmux</code>.
<p>So to solve this interesting problem, I decided to use <codeclass="language-plaintext highlighter-rouge">tmux</code>.
<codeclass="highlighter-rouge">tmux</code> is a <strong>t</strong>terminal <strong>mu</strong>ltiple<strong>x</strong>er.
<codeclass="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>
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>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 <codeclass="highlighter-rouge">tmux</code> command <codeclass="highlighter-rouge">send-keys</code>.</p>
<p>So first I looked at the <codeclass="language-plaintext highlighter-rouge">tmux</code> command <codeclass="language-plaintext highlighter-rouge">send-keys</code>.</p>
<p><codeclass="highlighter-rouge">send-keys</code> allows you to send text, and key presses to a <codeclass="highlighter-rouge">tmux</code> session.
<p><codeclass="language-plaintext highlighter-rouge">send-keys</code> allows you to send text, and key presses to a <codeclass="language-plaintext highlighter-rouge">tmux</code> session.
Now assuming this <codeclass="highlighter-rouge">tmux</code> session is attached to a Minecraft server,
Now assuming this <codeclass="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>
there is no reason you could not run a command like this:</p>
<preclass="terminal">
<preclass="terminal">
@ -70,9 +70,9 @@ Then, it will hit the newline character, this will execute the command.</p>
<p>But how do we get information about who is typing what in the Minecraft chat?</p>
<p>But how do we get information about who is typing what in the Minecraft chat?</p>
<h3id="tmuxs-capture-pane-is-painful"><codeclass="highlighter-rouge">tmux</code>’s <codeclass="highlighter-rouge">capture-pane</code> is painful</h3>
<h3id="tmuxs-capture-pane-is-painful"><codeclass="language-plaintext highlighter-rouge">tmux</code>’s <codeclass="language-plaintext highlighter-rouge">capture-pane</code> is painful</h3>
<p>So in the manual page for <codeclass="highlighter-rouge">tmux</code> I can see a section recorded below for options I can give to the <codeclass="highlighter-rouge">capture-pane</code> subcommand.</p>
<p>So in the manual page for <codeclass="language-plaintext highlighter-rouge">tmux</code> I can see a section recorded below for options I can give to the <codeclass="language-plaintext highlighter-rouge">capture-pane</code> subcommand.</p>
<preclass="terminal">
<preclass="terminal">
-S and -E specify the starting and ending line numbers,
-S and -E specify the starting and ending line numbers,
@ -82,10 +82,10 @@ Then, it will hit the newline character, this will execute the command.</p>
default is to capture only the visible contents of the pane.
default is to capture only the visible contents of the pane.
</pre>
</pre>
<p>What it seems to be saying is I can start at line <codeclass="highlighter-rouge">-S n</code> and end at line <codeclass="highlighter-rouge">-E n</code>.
<p>What it seems to be saying is I can start at line <codeclass="language-plaintext highlighter-rouge">-S n</code> and end at line <codeclass="language-plaintext highlighter-rouge">-E n</code>.
Negative numbers start from the bottom, so <em>in theory</em> I can do the following: <codeclass="highlighter-rouge">tmux capture-pane -S -1</code> should capture only the last line, because I’m starting from the last line. Right?</p>
Negative numbers start from the bottom, so <em>in theory</em> I can do the following: <codeclass="language-plaintext highlighter-rouge">tmux capture-pane -S -1</code> should capture only the last line, because I’m starting from the last line. Right?</p>
<p>No. It just doesn’t work. Negative numbers do <em>not</em> work with the <codeclass="highlighter-rouge">tmux capture-pane</code> subcommand.</p>
<p>No. It just doesn’t work. Negative numbers do <em>not</em> work with the <codeclass="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>
<p>So I did some simple UNIX piping, like so, to get just the last thing in the chat.</p>
<p>In <codeclass="highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p>
<p>In <codeclass="language-plaintext highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p>
<preclass="terminal">
<preclass="terminal">
dev-lang/php cgi mysql mysqli fpm pdo gd truetype
dev-lang/php cgi mysql mysqli fpm pdo gd truetype
</pre>
</pre>
<p>This should give you enough for a mysql backended MultiCraft installation.
<p>This should give you enough for a mysql backended MultiCraft installation.
The <codeclass="highlighter-rouge">cgi</code> option may not be required as <codeclass="highlighter-rouge">fpm</code> stands for <em>FastCGI Process Managment</em>.
The <codeclass="language-plaintext highlighter-rouge">cgi</code> option may not be required as <codeclass="language-plaintext highlighter-rouge">fpm</code> stands for <em>FastCGI Process Managment</em>.
I don’t know for sure though.</p>
I don’t know for sure though.</p>
<h3id="paper">Paper</h3>
<h3id="paper">Paper</h3>
@ -80,7 +80,7 @@ This completely stalled any work getting done with a ton of ‘permission denied
<h4id="security">Security</h4>
<h4id="security">Security</h4>
<p>If the panel is in the root directory of your NGINX web server,
<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 <codeclass="highlighter-rouge">/protected</code> directory.</p>
use the following in your server block to deny access to the <codeclass="language-plaintext highlighter-rouge">/protected</code> directory.</p>
@ -49,7 +49,7 @@ It focuses on speed, which is a priority, especially when using the ASGI protoco
$ uvicorn --reload myapp.asgi:application
$ uvicorn --reload myapp.asgi:application
</pre>
</pre>
<p>The <codeclass="highlighter-rouge">--reload</code> option says to reload the server if any of the files get updated.
<p>The <codeclass="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.
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.
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>
This turned out to not be the case.</p>
@ -58,7 +58,7 @@ This turned out to not be the case.</p>
<p>There is another equine-named program called <ahref="https://gunicorn.org/">gunicorn</a>
<p>There is another equine-named program called <ahref="https://gunicorn.org/">gunicorn</a>
which can hold a number of processes under its control.
which can hold a number of processes under its control.
An interesting feature of <codeclass="highlighter-rouge">gunicorn</code> is that it will gracefully switch from an old to a new deployment,
An interesting feature of <codeclass="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.
replacing the subprocesses one-by-one and eventually having only the new deployment active on all subprocesses.
The greatest part? Zero down time.
The greatest part? Zero down time.
The server keeps any old processes open if there is communication with them,
The server keeps any old processes open if there is communication with them,
@ -67,13 +67,13 @@ This was a very cool feature I wanted to take advantage of.</p>
<p>“Now hold on!” you might protest.
<p>“Now hold on!” you might protest.
“gunicorn is a WSGI server!” … oh you got me there!
“gunicorn is a WSGI server!” … oh you got me there!
Yes, that’s right, <codeclass="highlighter-rouge">gunicorn</code> is paired with <codeclass="highlighter-rouge">uvicorn</code> to serve my files.</p>
Yes, that’s right, <codeclass="language-plaintext highlighter-rouge">gunicorn</code> is paired with <codeclass="language-plaintext highlighter-rouge">uvicorn</code> to serve my files.</p>
<h3id="systemd">systemd</h3>
<h3id="systemd">systemd</h3>
<p>Love it or hate it, the majority of Linux distributions use the <codeclass="highlighter-rouge">systemd</code> init system.
<p>Love it or hate it, the majority of Linux distributions use the <codeclass="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.
I decided it would be very convenient to have a .service file for my Django application to run automatically at boot.
<codeclass="highlighter-rouge">Systemd</code> allows me to do this with a file like the following one I stored in <codeclass="highlighter-rouge">/lib/systemd/system/lamegames.service</code>.</p>
<codeclass="language-plaintext highlighter-rouge">Systemd</code> allows me to do this with a file like the following one I stored in <codeclass="language-plaintext highlighter-rouge">/lib/systemd/system/lamegames.service</code>.</p>
<preclass="file">
<preclass="file">
[Unit]
[Unit]
@ -100,11 +100,11 @@ To configure my nginx installation, I used the following few directives to:</p>
<ol>
<ol>
<li>Redirect most traffic towards the gunicorn server.</li>
<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 <codeclass="highlighter-rouge">settings.py</code> file.</li>
<li>Redirect statically served files (CSS, JS, images) to the directory specified in the STATIC_ROOT variable of my <codeclass="language-plaintext highlighter-rouge">settings.py</code> file.</li>
<li>Use TLS to enable https://</li>
<li>Use TLS to enable https://</li>
</ol>
</ol>
<p>Serving the static files from nginx as opposed to the <codeclass="highlighter-rouge">gunicorn</code> server is necessary.
<p>Serving the static files from nginx as opposed to the <codeclass="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.
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>
This will cause your browser to not load the Javascript/CSS.</p>
@ -141,7 +141,7 @@ server {
# systemctl enable lamegames
# systemctl enable lamegames
</pre>
</pre>
<p>This enabled my <codeclass="highlighter-rouge">gunicorn</code> server to run once the server started.
<p>This enabled my <codeclass="language-plaintext highlighter-rouge">gunicorn</code> server to run once the server started.
NGINX is that way be default.</p>
NGINX is that way be default.</p>
<p>And tada! You now have a working Django project on a production server!</p>
<p>And tada! You now have a working Django project on a production server!</p>
@ -91,7 +91,7 @@ In this article, I will explain how you can do the same.</p>
<spanclass="post-date">19 July 2020</span>
<spanclass="post-date">19 July 2020</span>
<divclass="post-excerpt"><p>In a very odd combination of requirements,
<divclass="post-excerpt"><p>In a very odd combination of requirements,
I needed to install <ahref="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system.
I needed to install <ahref="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system.
The PHP <codeclass="highlighter-rouge">USE</code> flags are important so you don’t have to recompile it three times like I did.</p>
The PHP <codeclass="language-plaintext highlighter-rouge">USE</code> flags are important so you don’t have to recompile it three times like I did.</p>
</div>
</div>
</td>
</td>
</tr>
</tr>
@ -145,7 +145,7 @@ Clue.</p>
<h3class="post-title"><aclass="post-title-link"href="/2020/05/01/nginx-socket-io-projects.html">How to use NGINX as a reverse-proxy server for a Node.js application using socket.io</a></h2>
<h3class="post-title"><aclass="post-title-link"href="/2020/05/01/nginx-socket-io-projects.html">How to use NGINX as a reverse-proxy server for a Node.js application using socket.io</a></h2>
<spanclass="post-date">01 May 2020</span>
<spanclass="post-date">01 May 2020</span>
<divclass="post-excerpt"><p>Despite the long name of the article, I have a feeling this may apply to more people than I might think.
<divclass="post-excerpt"><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 nginx’s <codeclass="highlighter-rouge">reverse_proxy</code> directive then this is the article for you!</p>
If you have a Node.js application which needs socket.io connections that you want to pass throgh nginx’s <codeclass="language-plaintext highlighter-rouge">reverse_proxy</code> directive then this is the article for you!</p>
<?xml version="1.0" encoding="utf-8"?><feedxmlns="http://www.w3.org/2005/Atom"><generatoruri="https://jekyllrb.com/"version="4.0.0">Jekyll</generator><linkhref="http://192.168.1.101:4000/feed.xml" rel="self"type="application/atom+xml"/><linkhref="http://192.168.1.101:4000/" rel="alternate"type="text/html"/><updated>2020-09-13T01:20:44+00:00</updated><id>http://192.168.1.101:4000/feed.xml</id><entry><titletype="html">Minesweeper Bomb Generation And Tile Revealing</title><linkhref="http://192.168.1.101:4000/2020/09/12/minesweeper.html" rel="alternate"type="text/html"title="Minesweeper Bomb Generation And Tile Revealing"/><published>2020-09-12T00:00:00+00:00</published><updated>2020-09-12T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/09/12/minesweeper</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/09/12/minesweeper.html"><p>When I was creating a little Minesweeper game, I got confused at some points.
<?xml version="1.0" encoding="utf-8"?><feedxmlns="http://www.w3.org/2005/Atom"><generatoruri="https://jekyllrb.com/"version="4.1.1">Jekyll</generator><linkhref="http://localhost:4000/feed.xml" rel="self"type="application/atom+xml"/><linkhref="http://localhost:4000/" rel="alternate"type="text/html"/><updated>2020-09-13T01:36:31+00:00</updated><id>http://localhost:4000/feed.xml</id><entry><titletype="html">Minesweeper Bomb Generation And Tile Revealing</title><linkhref="http://localhost:4000/2020/09/12/minesweeper.html" rel="alternate"type="text/html"title="Minesweeper Bomb Generation And Tile Revealing"/><published>2020-09-12T00:00:00+00:00</published><updated>2020-09-12T00:00:00+00:00</updated><id>http://localhost:4000/2020/09/12/minesweeper</id><contenttype="html"xml:base="http://localhost:4000/2020/09/12/minesweeper.html"><p>When I was creating a little Minesweeper game, I got confused at some points.
My bomb generation didn’t look quite right, and I for sure didn’t quite get the whole cascading tile reveal thing.
My bomb generation didn’t look quite right, and I for sure didn’t quite get the whole cascading tile reveal thing.
With a bit of internet research, I found what I was looking for.
With a bit of internet research, I found what I was looking for.
I’ll explain it all in one place for my own research purposes.</p>
I’ll explain it all in one place for my own research purposes.</p>
@ -31,7 +31,7 @@ there will be code equivalents to the math.</p>
@ -88,7 +88,7 @@ I hope that this helps you with getting the general idea of a Minesweeper game.
The completed version of this game is available on my <a href="https://lamegames.tait.tech/">lamegames</a> site.
The completed version of this game is available on my <a href="https://lamegames.tait.tech/">lamegames</a> site.
Let me know what you think!</p>
Let me know what you think!</p>
<p>Happy hacking!</p></content><author><name></name></author><summarytype="html">When I was creating a little Minesweeper game, I got confused at some points. My bomb generation didn’t look quite right, and I for sure didn’t quite get the whole cascading tile reveal thing. With a bit of internet research, I found what I was looking for. I’ll explain it all in one place for my own research purposes.</summary></entry><entry><titletype="html">lamegames.tait.tech</title><linkhref="http://192.168.1.101:4000/2020/09/09/lamegames.html" rel="alternate"type="text/html"title="lamegames.tait.tech"/><published>2020-09-09T00:00:00+00:00</published><updated>2020-09-09T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/09/09/lamegames</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/09/09/lamegames.html"><p>This is an announcement for a new project of mine:
<p>Happy hacking!</p></content><author><name></name></author><summarytype="html">When I was creating a little Minesweeper game, I got confused at some points. My bomb generation didn’t look quite right, and I for sure didn’t quite get the whole cascading tile reveal thing. With a bit of internet research, I found what I was looking for. I’ll explain it all in one place for my own research purposes.</summary></entry><entry><titletype="html">lamegames.tait.tech</title><linkhref="http://localhost:4000/2020/09/09/lamegames.html" rel="alternate"type="text/html"title="lamegames.tait.tech"/><published>2020-09-09T00:00:00+00:00</published><updated>2020-09-09T00:00:00+00:00</updated><id>http://localhost:4000/2020/09/09/lamegames</id><contenttype="html"xml:base="http://localhost:4000/2020/09/09/lamegames.html"><p>This is an announcement for a new project of mine:
<p>This is something I’m really excited to work on!</p>
<p>This is something I’m really excited to work on!</p>
@ -96,7 +96,7 @@ Let me know what you think!</p>
<p>Right now, I’ve just got a rock-paper-scissors game.
<p>Right now, I’ve just got a rock-paper-scissors game.
A chat function, and a few simple card games to come.</p>
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></content><author><name></name></author><summarytype="html">This is an announcement for a new project of mine: lamegames.tait.tech.</summary></entry><entry><titletype="html">How to Solve The Django Deployment Puzzle</title><linkhref="http://192.168.1.101:4000/2020/08/18/django-deployment.html" rel="alternate"type="text/html"title="How to Solve The Django Deployment Puzzle"/><published>2020-08-18T00:00:00+00:00</published><updated>2020-08-18T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/08/18/django-deployment</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/08/18/django-deployment.html"><p>A few days ago I had a Django project I wanted to put on a real server.
<p>Check out the repository on my <a href="https://github.com/TTWNO/lamegames.io">Github</a>.</p></content><author><name></name></author><summarytype="html">This is an announcement for a new project of mine: lamegames.tait.tech.</summary></entry><entry><titletype="html">How to Solve The Django Deployment Puzzle</title><linkhref="http://localhost:4000/2020/08/18/django-deployment.html" rel="alternate"type="text/html"title="How to Solve The Django Deployment Puzzle"/><published>2020-08-18T00:00:00+00:00</published><updated>2020-08-18T00:00:00+00:00</updated><id>http://localhost:4000/2020/08/18/django-deployment</id><contenttype="html"xml:base="http://localhost:4000/2020/08/18/django-deployment.html"><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.
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.
Little did I know the headache coming my way.
Here are some tips to help you not make the same mistakes as me.</p>
Here are some tips to help you not make the same mistakes as me.</p>
@ -114,7 +114,7 @@ It focuses on speed, which is a priority, especially when using the ASGI protoco
$ uvicorn --reload myapp.asgi:application
$ uvicorn --reload myapp.asgi:application
</pre>
</pre>
<p>The <code class="highlighter-rouge">--reload</code> option says to reload the server if any of the files get updated.
<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.
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.
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>
This turned out to not be the case.</p>
@ -123,7 +123,7 @@ This turned out to not be the case.</p>
<p>There is another equine-named program called <a href="https://gunicorn.org/">gunicorn</a>
<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.
which can hold a number of processes under its control.
An interesting feature of <code class="highlighter-rouge">gunicorn</code> is that it will gracefully switch from an old to a new deployment,
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.
replacing the subprocesses one-by-one and eventually having only the new deployment active on all subprocesses.
The greatest part? Zero down time.
The greatest part? Zero down time.
The server keeps any old processes open if there is communication with them,
The server keeps any old processes open if there is communication with them,
@ -132,13 +132,13 @@ This was a very cool feature I wanted to take advantage of.</p>
<p>“Now hold on!” you might protest.
<p>“Now hold on!” you might protest.
“gunicorn is a WSGI server!” … oh you got me there!
“gunicorn is a WSGI server!” … oh you got me there!
Yes, that’s right, <code class="highlighter-rouge">gunicorn</code> is paired with <code class="highlighter-rouge">uvicorn</code> to serve my files.</p>
Yes, that’s 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>
<p>Love it or hate it, the majority of Linux distributions use the <code class="highlighter-rouge">systemd</code> init system.
<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.
I decided it would be very convenient to have a .service file for my Django application to run automatically at boot.
<code class="highlighter-rouge">Systemd</code> allows me to do this with a file like the following one I stored in <code class="highlighter-rouge">/lib/systemd/system/lamegames.service</code>.</p>
<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 class="file">
[Unit]
[Unit]
@ -165,11 +165,11 @@ To configure my nginx installation, I used the following few directives to:</
<ol>
<ol>
<li>Redirect most traffic towards the gunicorn server.</li>
<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="highlighter-rouge">settings.py</code> file.</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>
<li>Use TLS to enable https://</li>
</ol>
</ol>
<p>Serving the static files from nginx as opposed to the <code class="highlighter-rouge">gunicorn</code> server is necessary.
<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.
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>
This will cause your browser to not load the Javascript/CSS.</p>
@ -206,7 +206,7 @@ server {
# systemctl enable lamegames
# systemctl enable lamegames
</pre>
</pre>
<p>This enabled my <code class="highlighter-rouge">gunicorn</code> server to run once the server started.
<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>
NGINX is that way be default.</p>
<p>And tada! You now have a working Django project on a production server!</p>
<p>And tada! You now have a working Django project on a production server!</p>
@ -216,7 +216,7 @@ NGINX is that way be default.</p>
<ul>
<ul>
<li>If using ws:// websockets, change them to wss:// for secure web sockets.</li>
<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 your’re wanting to use channels/redis WebSockets.</li>
<li>Make sure to use channels.routing.get_default_application() instead of django.get_asgi_application() if your’re wanting to use channels/redis WebSockets.</li>
</ul></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">BSD Journey, Part 1</title><linkhref="http://192.168.1.101:4000/2020/08/15/openbsd1.html" rel="alternate"type="text/html"title="BSD Journey, Part 1"/><published>2020-08-15T00:00:00+00:00</published><updated>2020-08-15T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/08/15/openbsd1</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/08/15/openbsd1.html"><p>As Linux becomes controlled by corporate sponsors and becomes more full of proprietary blobs, drivers, and even closed-source software like Steam,
</ul></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">BSD Journey, Part 1</title><linkhref="http://localhost:4000/2020/08/15/openbsd1.html" rel="alternate"type="text/html"title="BSD Journey, Part 1"/><published>2020-08-15T00:00:00+00:00</published><updated>2020-08-15T00:00:00+00:00</updated><id>http://localhost:4000/2020/08/15/openbsd1</id><contenttype="html"xml:base="http://localhost:4000/2020/08/15/openbsd1.html"><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.
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>
For me, somebody that is intensely interested in security, there is one option: OpenBSD.</p>
@ -249,7 +249,7 @@ 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>Wish my luck on my OpenBSD journey. I will post updates here along the way.</p>
<p>Happy hacking!</p></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">Know How Your Representative Votes In Parliament</title><linkhref="http://192.168.1.101:4000/2020/07/30/canadian-parliament.html" rel="alternate"type="text/html"title="Know How Your Representative Votes In Parliament"/><published>2020-07-30T00:00:00+00:00</published><updated>2020-07-30T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/07/30/canadian-parliament</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/07/30/canadian-parliament.html"><p>As an advocate for openness, I had an idea to make a project out of the government of Canada’s <a href="https://open.canada.ca/en/open-data">Open Data</a>
<p>Happy hacking!</p></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">Know How Your Representative Votes In Parliament</title><linkhref="http://localhost:4000/2020/07/30/canadian-parliament.html" rel="alternate"type="text/html"title="Know How Your Representative Votes In Parliament"/><published>2020-07-30T00:00:00+00:00</published><updated>2020-07-30T00:00:00+00:00</updated><id>http://localhost:4000/2020/07/30/canadian-parliament</id><contenttype="html"xml:base="http://localhost:4000/2020/07/30/canadian-parliament.html"><p>As an advocate for openness, I had an idea to make a project out of the government of Canada’s <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.
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 government’s own website.
It turns out though that this was not necessary due to how easy it was to find this information on the government’s own website.
In this article, I will explain how you can do the same.</p>
In this article, I will explain how you can do the same.</p>
@ -292,22 +292,22 @@ or read the actual text by clicking the <strong>View this Bill on LEGISinf
<p>I thought this was pretty cool!
<p>I thought this was pretty cool!
It was <em>way</em> simpler than I thought it would be.</p>
It was <em>way</em> simpler than I thought it would be.</p>
<p>Thanks, Canada!</p></content><author><name></name></author><summarytype="html">As an advocate for openness, I had an idea to make a project out of the government of Canada’s Open Data 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 government’s own website. In this article, I will explain how you can do the same.</summary></entry><entry><titletype="html">Installing MultiCraft on Gentoo Linux</title><linkhref="http://192.168.1.101:4000/2020/07/19/multicraft-php-gentoo.html" rel="alternate"type="text/html"title="Installing MultiCraft on Gentoo Linux"/><published>2020-07-19T00:00:00+00:00</published><updated>2020-07-19T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/07/19/multicraft-php-gentoo</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/07/19/multicraft-php-gentoo.html"><p>In a very odd combination of requirements,
<p>Thanks, Canada!</p></content><author><name></name></author><summarytype="html">As an advocate for openness, I had an idea to make a project out of the government of Canada’s Open Data 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 government’s own website. In this article, I will explain how you can do the same.</summary></entry><entry><titletype="html">Installing MultiCraft on Gentoo Linux</title><linkhref="http://localhost:4000/2020/07/19/multicraft-php-gentoo.html" rel="alternate"type="text/html"title="Installing MultiCraft on Gentoo Linux"/><published>2020-07-19T00:00:00+00:00</published><updated>2020-07-19T00:00:00+00:00</updated><id>http://localhost:4000/2020/07/19/multicraft-php-gentoo</id><contenttype="html"xml:base="http://localhost:4000/2020/07/19/multicraft-php-gentoo.html"><p>In a very odd combination of requirements,
I needed to install <a href="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system.
I needed to install <a href="https://multicraft.org">MultiCraft</a> on a Gentoo Linux system.
The PHP <code class="highlighter-rouge">USE</code> flags are important so you don’t have to recompile it three times like I did.</p>
The PHP <code class="language-plaintext highlighter-rouge">USE</code> flags are important so you don’t have to recompile it three times like I did.</p>
<p>Here are some useful tips I came across:</p>
<p>Here are some useful tips I came across:</p>
<p>In <code class="highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p>
<p>In <code class="language-plaintext highlighter-rouge">/etc/portage/package.use/php</code> I placed the following line:</p>
<pre class="terminal">
<pre class="terminal">
dev-lang/php cgi mysql mysqli fpm pdo gd truetype
dev-lang/php cgi mysql mysqli fpm pdo gd truetype
</pre>
</pre>
<p>This should give you enough for a mysql backended MultiCraft installation.
<p>This should give you enough for a mysql backended MultiCraft installation.
The <code class="highlighter-rouge">cgi</code> option may not be required as <code class="highlighter-rouge">fpm</code> stands for <em>FastCGI Process Managment</em>.
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 don’t know for sure though.</p>
I don’t know for sure though.</p>
<h3 id="paper">Paper</h3>
<h3 id="paper">Paper</h3>
@ -341,7 +341,7 @@ This completely stalled any work getting done with a ton of ‘permission denied
<p>If the panel is in the root directory of your NGINX web server,
<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="highlighter-rouge">/protected</code> directory.</p>
use the following in your server block to deny access to the <code class="language-plaintext highlighter-rouge">/protected</code> directory.</p>
<p>Happy hacking :)</p></content><author><name></name></author><summarytype="html">In a very odd combination of requirements, I needed to install MultiCraft on a Gentoo Linux system. The PHP USE flags are important so you don’t have to recompile it three times like I did.</summary></entry><entry><titletype="html">Independence</title><linkhref="http://192.168.1.101:4000/2020/07/12/independence.html" rel="alternate"type="text/html"title="Independence"/><published>2020-07-12T00:00:00+00:00</published><updated>2020-07-12T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/07/12/independence</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/07/12/independence.html"><blockquote>
<p>Happy hacking :)</p></content><author><name></name></author><summarytype="html">In a very odd combination of requirements, I needed to install MultiCraft on a Gentoo Linux system. The PHP USE flags are important so you don’t have to recompile it three times like I did.</summary></entry><entry><titletype="html">Independence</title><linkhref="http://localhost:4000/2020/07/12/independence.html" rel="alternate"type="text/html"title="Independence"/><published>2020-07-12T00:00:00+00:00</published><updated>2020-07-12T00:00:00+00:00</updated><id>http://localhost:4000/2020/07/12/independence</id><contenttype="html"xml:base="http://localhost:4000/2020/07/12/independence.html"><blockquote>
<p>“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</p>
<p>“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</p>
</blockquote>
</blockquote>
@ -423,7 +423,7 @@ know where I live, where I am going, who are my friends, what do I believe; in t
<p>Your website is pulled for controversial views: switch hosts.</p>
<p>Your website is pulled for controversial views: switch hosts.</p>
<p>Protect yourself; give yourself choices.
<p>Protect yourself; give yourself choices.
Why give others that power when you could have it for yourself?</p></content><author><name></name></author><summarytype="html">“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</summary></entry><entry><titletype="html">How to use tmux to send and receive things from your Minecraft server</title><linkhref="http://192.168.1.101:4000/2020/06/25/tmux-minecraft.html" rel="alternate"type="text/html"title="How to use tmux to send and receive things from your Minecraft server"/><published>2020-06-25T00:00:00+00:00</published><updated>2020-06-25T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/06/25/tmux-minecraft</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/06/25/tmux-minecraft.html"><p>So recently I had problem.
Why give others that power when you could have it for yourself?</p></content><author><name></name></author><summarytype="html">“When given a choice between independence and dependence, always choose independence; you will never regret that choice!”—Luke Smith</summary></entry><entry><titletype="html">How to use tmux to send and receive things from your Minecraft server</title><linkhref="http://localhost:4000/2020/06/25/tmux-minecraft.html" rel="alternate"type="text/html"title="How to use tmux to send and receive things from your Minecraft server"/><published>2020-06-25T00:00:00+00:00</published><updated>2020-06-25T00:00:00+00:00</updated><id>http://localhost:4000/2020/06/25/tmux-minecraft</id><contenttype="html"xml:base="http://localhost:4000/2020/06/25/tmux-minecraft.html"><p>So recently I had problem.
I run a Minecraft server on a big Linux computer I have running in my room.
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.
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.
It is, frankly, a lot of work.
@ -437,18 +437,18 @@ Especially when I really just want to be playing games but I just need to check
<p>So to solve this interesting problem, I decided to use <code class="highlighter-rouge">tmux</code>.
<p>So to solve this interesting problem, I decided to use <code class="language-plaintext highlighter-rouge">tmux</code>.
<code class="highlighter-rouge">tmux</code> is a <strong>t</strong>terminal <strong>mu</strong>ltiple<strong>x</strong>er.
<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>
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>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="highlighter-rouge">tmux</code> command <code class="highlighter-rouge">send-keys</code>.</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>
<p><code class="highlighter-rouge">send-keys</code> allows you to send text, and key presses to a <code class="highlighter-rouge">tmux</code> session.
<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="highlighter-rouge">tmux</code> session is attached to a Minecraft server,
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>
there is no reason you could not run a command like this:</p>
<pre class="terminal">
<pre class="terminal">
@ -462,9 +462,9 @@ Then, it will hit the newline character, this will execute the command.</p>
<p>But how do we get information about who is typing what in the Minecraft chat?</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="highlighter-rouge">tmux</code>’s <code class="highlighter-rouge">capture-pane</code> is painful</h3>
<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="highlighter-rouge">tmux</code> I can see a section recorded below for options I can give to the <code class="highlighter-rouge">capture-pane</code> subcommand.</p>
<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 class="terminal">
-S and -E specify the starting and ending line numbers,
-S and -E specify the starting and ending line numbers,
@ -474,10 +474,10 @@ Then, it will hit the newline character, this will execute the command.</p>
default is to capture only the visible contents of the pane.
default is to capture only the visible contents of the pane.
</pre>
</pre>
<p>What it seems to be saying is I can start at line <code class="highlighter-rouge">-S n</code> and end at line <code class="highlighter-rouge">-E n</code>.
<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="highlighter-rouge">tmux capture-pane -S -1</code> should capture only the last line, because I’m starting from the last line. Right?</p>
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 I’m starting from the last line. Right?</p>
<p>No. It just doesn’t work. Negative numbers do <em>not</em> work with the <code class="highlighter-rouge">tmux capture-pane</code> subcommand.</p>
<p>No. It just doesn’t 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>
<p>So I did some simple UNIX piping, like so, to get just the last thing in the chat.</p>
<p>TaterTheTot is my Minecraft username :)</p>
<p>TaterTheTot is my Minecraft username :)</p>
<p><code class="highlighter-rouge">-p</code> prints the result to the terminal/stdout.</p>
<p><code class="language-plaintext highlighter-rouge">-p</code> prints the result to the terminal/stdout.</p>
<p><code class="highlighter-rouge">steve</code> is the name of the tmux session I’m trying to pull form.</p>
<p><code class="language-plaintext highlighter-rouge">steve</code> is the name of the tmux session I’m trying to pull form.</p>
<p>So that’s done! Beauty!</p>
<p>So that’s done! Beauty!</p>
<p>Now that we have that, how can we extract the username and the message from the latest line?</p>
<p>Now that we have that, how can we extract the username and the message from the latest line?</p>
<p>Now, that’s my name with the &lt; and &gt; attached. Not bad!
<p>Now, that’s my name with the &lt; and &gt; attached. Not bad!
We can use the <code class="highlighter-rouge">sed</code> command to clean it up a bit.</p>
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="highlighter-rouge">select/somepattern/replacewith/global</code></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="highlighter-rouge">s/[&lt;&gt;]//g</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;.
<p>Select any characters that are either &lt; or &gt;.
Replace with nothing.
Replace with nothing.
@ -530,7 +530,7 @@ TaterTheTot
<p>Now what about that pesky message?</p>
<p>Now what about that pesky message?</p>
<h3 id="more-grep-more-sed">more <code class="highlighter-rouge">grep</code>; more <code class="highlighter-rouge">sed</code></h3>
<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 user’s message entirely in tact.</p>
<p>Simple: capture everything after the &gt;. Leaving the user’s message entirely in tact.</p>
@ -553,11 +553,11 @@ And, we have a way to respond.</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>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></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">Site Update</title><linkhref="http://192.168.1.101:4000/2020/06/04/site-update.html" rel="alternate"type="text/html"title="Site Update"/><published>2020-06-04T00:00:00+00:00</published><updated>2020-06-04T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/06/04/site-update</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/06/04/site-update.html"><p>I updated the site with some easier to identify information about me and my projects :)</p>
<p>Happy hacking!</p></content><author><name></name></author><summarytype="html">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.</summary></entry><entry><titletype="html">Site Update</title><linkhref="http://localhost:4000/2020/06/04/site-update.html" rel="alternate"type="text/html"title="Site Update"/><published>2020-06-04T00:00:00+00:00</published><updated>2020-06-04T00:00:00+00:00</updated><id>http://localhost:4000/2020/06/04/site-update</id><contenttype="html"xml:base="http://localhost:4000/2020/06/04/site-update.html"><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>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="highlighter-rouge">make</code>.</p></content><author><name></name></author><summarytype="html">I updated the site with some easier to identify information about me and my projects :)</summary></entry><entry><titletype="html">New Game: Clue (coming soon)</title><linkhref="http://192.168.1.101:4000/2020/05/19/clue-announcement.html" rel="alternate"type="text/html"title="New Game: Clue (coming soon)"/><published>2020-05-19T00:00:00+00:00</published><updated>2020-05-19T00:00:00+00:00</updated><id>http://192.168.1.101:4000/2020/05/19/clue-announcement</id><contenttype="html"xml:base="http://192.168.1.101:4000/2020/05/19/clue-announcement.html"><p>Ooo! Exciting!
<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></content><author><name></name></author><summarytype="html">I updated the site with some easier to identify information about me and my projects :)</summary></entry><entry><titletype="html">New Game: Clue (coming soon)</title><linkhref="http://localhost:4000/2020/05/19/clue-announcement.html" rel="alternate"type="text/html"title="New Game: Clue (coming soon)"/><published>2020-05-19T00:00:00+00:00</published><updated>2020-05-19T00:00:00+00:00</updated><id>http://localhost:4000/2020/05/19/clue-announcement</id><contenttype="html"xml:base="http://localhost:4000/2020/05/19/clue-announcement.html"><p>Ooo! Exciting!
Today I want to announce a new project I’ll be working on which should be live within the month of May:
Today I want to announce a new project I’ll be working on which should be live within the month of May:
<p><strong>Dartmouth College (Open Corseware)</strong>—Professional Certificate / <em>C Programming with Linux</em> (2020)</p>
<p><strong>Dartmouth College (Open Corseware)</strong>—Professional Certificate / <em>C Programming with Linux</em> (2020)</p>
<p>A certification in C programming, the <codeclass="highlighter-rouge">gcc</code> compiler, and the <codeclass="highlighter-rouge">make</code> compilation system.</p>
<p>A certification in C programming, the <codeclass="language-plaintext highlighter-rouge">gcc</code> compiler, and the <codeclass="language-plaintext highlighter-rouge">make</code> compilation system.</p>