update _site

master
Tait Hoyem 3 years ago
commit d83de03bac

@ -1,7 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.7.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
backports (3.18.2)
colorator (1.1.0)
@ -59,7 +59,7 @@ GEM
json (2.3.1)
json-minify (0.0.3)
json (> 0)
kramdown (2.3.0)
kramdown (2.3.1)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
@ -80,7 +80,7 @@ GEM
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.4)
rexml (3.2.5)
rouge (3.23.0)
safe_yaml (1.0.5)
sassc (2.4.0)

@ -0,0 +1,59 @@
---
layout: post
title: "UEFI Audio Protocol & UEFI BIOS Accessibility"
---
Good news about the state of accessibility in the BIOS!
## Preamble
On my [ideas page](/ideas/), I have always had up the idea of an accessibility layer for blind people to be able to use their BIOS.
Although it targets a very small percentage of the population,
computer programming is often at least a hobby of visually imapired individuals as it is (mostly) a text-based job:
You write code in plain text, then run it to get either plain text or some kind of HTML output.
Mostly an accessible career for those who cannot see.
That said, there has always been an issue with low-level computer infrastructure (i.e. the BIOS/UEFI).
These menus---which let you edit your boot order, RAM timings, CPU and GPU overclocking and sometimes even fan speed---they were completely inaccessible to those who could not see them.
Well, until... soon. I had a talk with one of the big bois working on EDK2, the UEFI implementation which is used by most motherboard vendors to create their firmware.
I thought I would share the info I understand, and the conversation in full.
## News
Here is what I know:
1. This year, the GSoC (Google Summer of Code) project had [a submission of Ethin Probst](https://summerofcode.withgoogle.com/projects/#6499615798460416) to implement VirtIO audio drivers for EDK2.
2. [QEMU](https://qemu.org), the emulator that was chosen to test for this project does not have VirtIO support (yet). I haven't found info on when this will be done.
3. Because of 2, Ethin and his mentors for his project, Ray Ni and Leif Lindholm decided to first implement USB-dongle audio support first, as this is a) supported in QEMU, and b) is good enough to start squashing bugs at the audio level.
4. Because GSoC is usually over around September, there will likely be some more news coming soon!
## The IRC Chat
Here is the log of the IRC chat for anyone who is interested in anything I might have missed:
<pre class="terminal">
tait_dot_tech: Hello there, I'm new to IRC so just checking my messages are coming through.
tait_dot_tech: Looks light it's alright. Ok so I have a question: does anyone know of an active project looking at making UEFI accessible to the blind (i.e. speec) [sic] from within the UEFI environment? Main concern is having blind users be able to boot Linux USBs (I know, very niche thing), but depending on how good it is, could potentially be used to allow blind individuals to change their overclocking,
tait_dot_tech: hardware RAID, boot order, RAM timings, etc. all on their own. Just wondering if there is any project doing this? I have tried my best to find anything, and am just trying not to duplicate effort. Thanks :)
leiflindholm: tait_dot_tech: we have a google summer of code project running this year, prototyping a standard for audio output. To hopefully be added to the UEFI specification in the future.
leiflindholm: once we have a standard for audio output, we can work on adding support for audio output to the Human Interface Infrastructure
leiflindholm: which is the thing that lets menus be loaded and displayed independent of specific graphical implementation
tait_dot_tech: Oh wow! Glad to hear there is progress on this! Is there a link to the Google summer of code project, or anything else where I can keep tabs?
leiflindholm: tait_dot_tech: there isn't much yet, we're only on week 3 of GSoC.
leiflindholm: https://summerofcode.withgoogle.com/projects/#6499615798460416 is the link if it's something you want to point others to, but any discussion/reporting is likely to hapen [sic] on our mailing lists
tait_dot_tech: By "our" mailing list, do you mean GSoC, or Edk2?
leiflindholm: edk2
leiflindholm: although, on average, at least 99% of edk2-devel will *not* be about audio support
leiflindholm: When we have anything interesting to say, we'll also post to edk2-discuss/edk2-announce
tait_dot_tech: Sweet! I'll join that one just in case! I'd be happy to test anything in beta-ish state and report back with any device I can get my hands on. Is that the right list to watch for hepling test it out?
leiflindholm: I'd say so.
leiflindholm: The original plan was to start with wirtio [sic] audio support, so anyone could help out anywhere, but that support is not yet upstream in qemu. So for now we're working on an [sic] USB audio class driver. That will certainly be useful to have more people testing with different equipment once we have something working.
tait_dot_tech: Ahh! So if I want to test, I should get a USB audio dongle. Gotcha! Thank you so much! You've been super helpful!
leiflindholm: np :)
</pre>
Things are (slowly) looking up for audio (and eventually screen-reader support) in UEFI!
Phew! Glad I'm not the only one thinking about this!
Happy UEFI hacking :)

@ -185,7 +185,7 @@ footer {
.terminal,
.file {
padding: 10px;
overflow-x: wrap;
overflow-x: scroll;
}
.terminal {

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UEFI Audio Protocol & UEFI BIOS 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">UEFI Audio Protocol & UEFI BIOS Accessibility</h1>
<time datetime="21-06-21" class="post-date">Monday, June 21 2021</time>
</header>
<hr>
<p>Good news about the state of accessibility in the BIOS!</p>
<h2 id="preamble">Preamble</h2>
<p>On my <a href="/ideas/">ideas page</a>, I have always had up the idea of an accessibility layer for blind people to be able to use their BIOS.
Although it targets a very small percentage of the population,
computer programming is often at least a hobby of visually imapired individuals as it is (mostly) a text-based job:
You write code in plain text, then run it to get either plain text or some kind of HTML output.
Mostly an accessible career for those who cannot see.
That said, there has always been an issue with low-level computer infrastructure (i.e. the BIOS/UEFI).
These menus—which let you edit your boot order, RAM timings, CPU and GPU overclocking and sometimes even fan speed—they were completely inaccessible to those who could not see them.
Well, until… soon. I had a talk with one of the big bois working on EDK2, the UEFI implementation which is used by most motherboard vendors to create their firmware.
I thought I would share the info I understand, and the conversation in full.</p>
<h2 id="news">News</h2>
<p>Here is what I know:</p>
<ol>
<li>This year, the GSoC (Google Summer of Code) project had <a href="https://summerofcode.withgoogle.com/projects/#6499615798460416">a submission of Ethin Probst</a> to implement VirtIO audio drivers for EDK2.</li>
<li><a href="https://qemu.org">QEMU</a>, the emulator that was chosen to test for this project does not have VirtIO support (yet). I havent found info on when this will be done.</li>
<li>Because of 2, Ethin and his mentors for his project, Ray Ni and Leif Lindholm decided to first implement USB-dongle audio support first, as this is a) supported in QEMU, and b) is good enough to start squashing bugs at the audio level.</li>
<li>Because GSoC is usually over around September, there will likely be some more news coming soon!</li>
</ol>
<h2 id="the-irc-chat">The IRC Chat</h2>
<p>Here is the log of the IRC chat for anyone who is interested in anything I might have missed:</p>
<pre class="terminal">
tait_dot_tech: Hello there, I'm new to IRC so just checking my messages are coming through.
tait_dot_tech: Looks light it's alright. Ok so I have a question: does anyone know of an active project looking at making UEFI accessible to the blind (i.e. speec) [sic] from within the UEFI environment? Main concern is having blind users be able to boot Linux USBs (I know, very niche thing), but depending on how good it is, could potentially be used to allow blind individuals to change their overclocking,
tait_dot_tech: hardware RAID, boot order, RAM timings, etc. all on their own. Just wondering if there is any project doing this? I have tried my best to find anything, and am just trying not to duplicate effort. Thanks :)
leiflindholm: tait_dot_tech: we have a google summer of code project running this year, prototyping a standard for audio output. To hopefully be added to the UEFI specification in the future.
leiflindholm: once we have a standard for audio output, we can work on adding support for audio output to the Human Interface Infrastructure
leiflindholm: which is the thing that lets menus be loaded and displayed independent of specific graphical implementation
tait_dot_tech: Oh wow! Glad to hear there is progress on this! Is there a link to the Google summer of code project, or anything else where I can keep tabs?
leiflindholm: tait_dot_tech: there isn't much yet, we're only on week 3 of GSoC.
leiflindholm: https://summerofcode.withgoogle.com/projects/#6499615798460416 is the link if it's something you want to point others to, but any discussion/reporting is likely to hapen [sic] on our mailing lists
tait_dot_tech: By "our" mailing list, do you mean GSoC, or Edk2?
leiflindholm: edk2
leiflindholm: although, on average, at least 99% of edk2-devel will *not* be about audio support
leiflindholm: When we have anything interesting to say, we'll also post to edk2-discuss/edk2-announce
tait_dot_tech: Sweet! I'll join that one just in case! I'd be happy to test anything in beta-ish state and report back with any device I can get my hands on. Is that the right list to watch for hepling test it out?
leiflindholm: I'd say so.
leiflindholm: The original plan was to start with wirtio [sic] audio support, so anyone could help out anywhere, but that support is not yet upstream in qemu. So for now we're working on an [sic] USB audio class driver. That will certainly be useful to have more people testing with different equipment once we have something working.
tait_dot_tech: Ahh! So if I want to test, I should get a USB audio dongle. Gotcha! Thank you so much! You've been super helpful!
leiflindholm: np :)
</pre>
<p>Things are (slowly) looking up for audio (and eventually screen-reader support) in UEFI!
Phew! Glad Im not the only one thinking about this!</p>
<p>Happy UEFI hacking :)</p>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2021/06/21/uefi-audio/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>

@ -58,7 +58,7 @@ figcaption { margin-top: 10px; font-style: italic; }
footer { padding-top: 16px; margin-bottom: 100px; }
.terminal, .file { padding: 10px; overflow-x: wrap; }
.terminal, .file { padding: 10px; overflow-x: scroll; }
.terminal { line-height: 1em; color: #00FF00; background-color: #000000; }

@ -7,8 +7,8 @@
],
"sourcesContent": [
"@import \"main\";\n",
"$normal-text-color: #ffffff;\n$background-color: #222222;\n$lighter-color: #ffffff;\n$nav-link-color: #ffffff;\n$nav-link-hover-color: black;\n$link-color: #7ad;\n$visited-link-color: #ff3492;\n\n$last-p-padd: 1.5em;\n$nav-padd: 1em;\n$line-under: 1px solid #aaa; \n\n$line-height: 1.5em;\n$term-line-height: 1em;\n$file-line-height: 1.2em;\n\n$terminal-bg: #000000;\n$terminal-fg: #00FF00;\n\n$file-bg: #444444;\n$file-fg: #ffffff;\n\nbody {\n background-color: $background-color;\n padding: 16px;\n font-family: -apple-system, helvetica, arial, sans-serif;\n font-size: 16px;\n color: $normal-text-color;\n line-height: $line-height;\n overflow-wrap: break-word;\n}\n\n#wrapper {\n max-width: 800px;\n margin: auto;\n > header {\n text-align: center;\n }\n}\n\n.clear-list {\n list-style-type: none;\n margin: 0;\n padding: 0;\n}\n\n.clear-list li {\n margin: 0;\n padding: 0;\n}\n\n.projects a {\n font-weight: bold;\n}\n\nh1, h2, h3, h4, h5, h6 {\n line-height: 1em;\n}\n\n.center {\n text-align: center;\n}\n\nheader {\n margin-bottom: 18px;\n}\n\nhr {\n border: none;\n border-bottom: 1px solid #999;\n}\n\na {\n text-decoration: underline;\n color: $link-color;\n} \n\na:visited {\n color: $visited-link-color;\n}\n\na.nav-link,\na.post-title-link {\n color: $nav-link-color;\n text-decoration: none;\n}\n\n.post-title {\n line-height: $line-height;\n color: $nav-link-color;\n margin-bottom: 8px;\n}\n\na.citation-link {\n text-decoration: none;\n}\n\nnav {\n text-align: center;\n padding: $nav-padd 0px;\n}\n\nnav a {\n margin: 1em;\n color: $nav-link-color;\n font-weight: bold;\n font-style: none;\n}\n\nnav a:hover,\na.post-title-link:hover {\n text-decoration: underline; \n}\n\nli {\n margin: .5em;\n}\n\ntable,\ntable tr,\ntable td,\ntable th {\n border: 1px solid #aaa;\n border-collapse: collapse;\n padding: 5px;\n font-weight: normal;\n}\ntable th {\n font-weight: bold;\n}\ntable {\n width: 75%;\n margin: auto;\n}\n\nimg {\n display: block;\n width: 55%;\n margin-left: auto;\n margin-right: auto;\n}\n\nblockquote {\n font-style: italic;\n}\n\naddress { \n font-style: normal;\n}\n\n@media screen and (max-width: 600px){\n body {\n width: 90%;\n }\n nav {\n text-align: left;\n width: 100%;\n }\n nav a {\n display: block;\n text-align: left;\n padding-left: 0;\n margin-left: 0;\n }\n}\n\n.mono {\n font-family: monospace;\n}\n\n.bold {\n font-weight: bold;\n}\n\nfigcaption {\n margin-top: 10px;\n font-style: italic;\n}\n\nfooter {\n padding-top: 16px;\n margin-bottom: 100px;\n}\n\n.terminal,\n.file {\n padding: 10px;\n overflow-x: wrap;\n}\n\n.terminal {\n line-height: $term-line-height;\n color: $terminal-fg;\n background-color: $terminal-bg;\n}\n\n.file {\n line-height: $file-line-height;\n background-color: $file-bg;\n color: $file-fg;\n}\n\n.small-image {\n width: 100%;\n}\n\n.post-date {\n text-transform: uppercase;\n font-weight: bold;\n color: $lighter-color;\n}\n\n.post-excerpt {\n margin-left: 24px;\n}\n\n.post-header {\n margin-bottom: 8px;\n}\n"
"$normal-text-color: #ffffff;\n$background-color: #222222;\n$lighter-color: #ffffff;\n$nav-link-color: #ffffff;\n$nav-link-hover-color: black;\n$link-color: #7ad;\n$visited-link-color: #ff3492;\n\n$last-p-padd: 1.5em;\n$nav-padd: 1em;\n$line-under: 1px solid #aaa; \n\n$line-height: 1.5em;\n$term-line-height: 1em;\n$file-line-height: 1.2em;\n\n$terminal-bg: #000000;\n$terminal-fg: #00FF00;\n\n$file-bg: #444444;\n$file-fg: #ffffff;\n\nbody {\n background-color: $background-color;\n padding: 16px;\n font-family: -apple-system, helvetica, arial, sans-serif;\n font-size: 16px;\n color: $normal-text-color;\n line-height: $line-height;\n overflow-wrap: break-word;\n}\n\n#wrapper {\n max-width: 800px;\n margin: auto;\n > header {\n text-align: center;\n }\n}\n\n.clear-list {\n list-style-type: none;\n margin: 0;\n padding: 0;\n}\n\n.clear-list li {\n margin: 0;\n padding: 0;\n}\n\n.projects a {\n font-weight: bold;\n}\n\nh1, h2, h3, h4, h5, h6 {\n line-height: 1em;\n}\n\n.center {\n text-align: center;\n}\n\nheader {\n margin-bottom: 18px;\n}\n\nhr {\n border: none;\n border-bottom: 1px solid #999;\n}\n\na {\n text-decoration: underline;\n color: $link-color;\n} \n\na:visited {\n color: $visited-link-color;\n}\n\na.nav-link,\na.post-title-link {\n color: $nav-link-color;\n text-decoration: none;\n}\n\n.post-title {\n line-height: $line-height;\n color: $nav-link-color;\n margin-bottom: 8px;\n}\n\na.citation-link {\n text-decoration: none;\n}\n\nnav {\n text-align: center;\n padding: $nav-padd 0px;\n}\n\nnav a {\n margin: 1em;\n color: $nav-link-color;\n font-weight: bold;\n font-style: none;\n}\n\nnav a:hover,\na.post-title-link:hover {\n text-decoration: underline; \n}\n\nli {\n margin: .5em;\n}\n\ntable,\ntable tr,\ntable td,\ntable th {\n border: 1px solid #aaa;\n border-collapse: collapse;\n padding: 5px;\n font-weight: normal;\n}\ntable th {\n font-weight: bold;\n}\ntable {\n width: 75%;\n margin: auto;\n}\n\nimg {\n display: block;\n width: 55%;\n margin-left: auto;\n margin-right: auto;\n}\n\nblockquote {\n font-style: italic;\n}\n\naddress { \n font-style: normal;\n}\n\n@media screen and (max-width: 600px){\n body {\n width: 90%;\n }\n nav {\n text-align: left;\n width: 100%;\n }\n nav a {\n display: block;\n text-align: left;\n padding-left: 0;\n margin-left: 0;\n }\n}\n\n.mono {\n font-family: monospace;\n}\n\n.bold {\n font-weight: bold;\n}\n\nfigcaption {\n margin-top: 10px;\n font-style: italic;\n}\n\nfooter {\n padding-top: 16px;\n margin-bottom: 100px;\n}\n\n.terminal,\n.file {\n padding: 10px;\n overflow-x: scroll;\n}\n\n.terminal {\n line-height: $term-line-height;\n color: $terminal-fg;\n background-color: $terminal-bg;\n}\n\n.file {\n line-height: $file-line-height;\n background-color: $file-bg;\n color: $file-fg;\n}\n\n.small-image {\n width: 100%;\n}\n\n.post-date {\n text-transform: uppercase;\n font-weight: bold;\n color: $lighter-color;\n}\n\n.post-excerpt {\n margin-left: 24px;\n}\n\n.post-header {\n margin-bottom: 8px;\n}\n"
],
"names": [],
"mappings": "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"
"mappings": "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"
}

@ -46,6 +46,19 @@ This service has some interesting requirements that I have never seen a VPN serv
</div>
</article>
<article>
<header class="post-header">
<h2 class="post-title">
<a class="post-title-link" href="/2021/06/21/uefi-audio/">UEFI Audio Protocol & UEFI BIOS Accessibility</a>
</h2>
<time class="post-date" datetime="21-06-21">
21 June 2021
</time>
</header>
<div class="post-excerpt"><p>Good news about the state of accessibility in the BIOS!</p>
</div>
</article>
<article>
<header class="post-header">
<h2 class="post-title">

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.1.1">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2021-08-31T21:19:20-06:00</updated><id>http://localhost:4000/feed.xml</id><entry><title type="html">Idea For A VPN Service</title><link href="http://localhost:4000/2021/08/31/vpns-api/" rel="alternate" type="text/html" title="Idea For A VPN Service" /><published>2021-08-31T00:00:00-06:00</published><updated>2021-08-31T00:00:00-06:00</updated><id>http://localhost:4000/2021/08/31/vpns-api</id><content type="html" xml:base="http://localhost:4000/2021/08/31/vpns-api/">&lt;p&gt;Recently Ive been thinking about starting a VPN service.
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.1.1">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2021-08-31T21:20:13-06:00</updated><id>http://localhost:4000/feed.xml</id><entry><title type="html">Idea For A VPN Service</title><link href="http://localhost:4000/2021/08/31/vpns-api/" rel="alternate" type="text/html" title="Idea For A VPN Service" /><published>2021-08-31T00:00:00-06:00</published><updated>2021-08-31T00:00:00-06:00</updated><id>http://localhost:4000/2021/08/31/vpns-api</id><content type="html" xml:base="http://localhost:4000/2021/08/31/vpns-api/">&lt;p&gt;Recently Ive been thinking about starting a VPN service.
This service has some interesting requirements that I have never seen a VPN service do before, so Id like to put down my thoughts as to what might be sensible for a centralized yet encrypted* VPN service.&lt;/p&gt;
&lt;p&gt;I would license all the code and scripts under the AGPLv3.
@ -180,7 +180,60 @@ Doesnt really matter which one, unless youre a nerd—for your average per
&lt;p&gt;Anyway, I think Ive rambled on long enough about VPNs and my crazy ideas, so Im going to leave this one for now.&lt;/p&gt;
&lt;p&gt;Happy VPN hacking :D&lt;/p&gt;</content><author><name></name></author><summary type="html">Recently Ive been thinking about starting a VPN service. This service has some interesting requirements that I have never seen a VPN service do before, so Id like to put down my thoughts as to what might be sensible for a centralized yet encrypted* VPN service.</summary></entry><entry><title type="html">Pinebook Pro, The Ultimate ARM Laptop</title><link href="http://localhost:4000/2021/06/02/pinebook-pro/" rel="alternate" type="text/html" title="Pinebook Pro, The Ultimate ARM Laptop" /><published>2021-06-02T00:00:00-06:00</published><updated>2021-06-02T00:00:00-06:00</updated><id>http://localhost:4000/2021/06/02/pinebook-pro</id><content type="html" xml:base="http://localhost:4000/2021/06/02/pinebook-pro/">&lt;p&gt;I recently got my Pinebook Pro.
&lt;p&gt;Happy VPN hacking :D&lt;/p&gt;</content><author><name></name></author><summary type="html">Recently Ive been thinking about starting a VPN service. This service has some interesting requirements that I have never seen a VPN service do before, so Id like to put down my thoughts as to what might be sensible for a centralized yet encrypted* VPN service.</summary></entry><entry><title type="html">UEFI Audio Protocol &amp;amp; UEFI BIOS Accessibility</title><link href="http://localhost:4000/2021/06/21/uefi-audio/" rel="alternate" type="text/html" title="UEFI Audio Protocol &amp;amp; UEFI BIOS Accessibility" /><published>2021-06-21T00:00:00-06:00</published><updated>2021-06-21T00:00:00-06:00</updated><id>http://localhost:4000/2021/06/21/uefi-audio</id><content type="html" xml:base="http://localhost:4000/2021/06/21/uefi-audio/">&lt;p&gt;Good news about the state of accessibility in the BIOS!&lt;/p&gt;
&lt;h2 id=&quot;preamble&quot;&gt;Preamble&lt;/h2&gt;
&lt;p&gt;On my &lt;a href=&quot;/ideas/&quot;&gt;ideas page&lt;/a&gt;, I have always had up the idea of an accessibility layer for blind people to be able to use their BIOS.
Although it targets a very small percentage of the population,
computer programming is often at least a hobby of visually imapired individuals as it is (mostly) a text-based job:
You write code in plain text, then run it to get either plain text or some kind of HTML output.
Mostly an accessible career for those who cannot see.
That said, there has always been an issue with low-level computer infrastructure (i.e. the BIOS/UEFI).
These menus—which let you edit your boot order, RAM timings, CPU and GPU overclocking and sometimes even fan speed—they were completely inaccessible to those who could not see them.
Well, until… soon. I had a talk with one of the big bois working on EDK2, the UEFI implementation which is used by most motherboard vendors to create their firmware.
I thought I would share the info I understand, and the conversation in full.&lt;/p&gt;
&lt;h2 id=&quot;news&quot;&gt;News&lt;/h2&gt;
&lt;p&gt;Here is what I know:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This year, the GSoC (Google Summer of Code) project had &lt;a href=&quot;https://summerofcode.withgoogle.com/projects/#6499615798460416&quot;&gt;a submission of Ethin Probst&lt;/a&gt; to implement VirtIO audio drivers for EDK2.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qemu.org&quot;&gt;QEMU&lt;/a&gt;, the emulator that was chosen to test for this project does not have VirtIO support (yet). I havent found info on when this will be done.&lt;/li&gt;
&lt;li&gt;Because of 2, Ethin and his mentors for his project, Ray Ni and Leif Lindholm decided to first implement USB-dongle audio support first, as this is a) supported in QEMU, and b) is good enough to start squashing bugs at the audio level.&lt;/li&gt;
&lt;li&gt;Because GSoC is usually over around September, there will likely be some more news coming soon!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-irc-chat&quot;&gt;The IRC Chat&lt;/h2&gt;
&lt;p&gt;Here is the log of the IRC chat for anyone who is interested in anything I might have missed:&lt;/p&gt;
&lt;pre class=&quot;terminal&quot;&gt;
tait_dot_tech: Hello there, I'm new to IRC so just checking my messages are coming through.
tait_dot_tech: Looks light it's alright. Ok so I have a question: does anyone know of an active project looking at making UEFI accessible to the blind (i.e. speec) [sic] from within the UEFI environment? Main concern is having blind users be able to boot Linux USBs (I know, very niche thing), but depending on how good it is, could potentially be used to allow blind individuals to change their overclocking,
tait_dot_tech: hardware RAID, boot order, RAM timings, etc. all on their own. Just wondering if there is any project doing this? I have tried my best to find anything, and am just trying not to duplicate effort. Thanks :)
leiflindholm: tait_dot_tech: we have a google summer of code project running this year, prototyping a standard for audio output. To hopefully be added to the UEFI specification in the future.
leiflindholm: once we have a standard for audio output, we can work on adding support for audio output to the Human Interface Infrastructure
leiflindholm: which is the thing that lets menus be loaded and displayed independent of specific graphical implementation
tait_dot_tech: Oh wow! Glad to hear there is progress on this! Is there a link to the Google summer of code project, or anything else where I can keep tabs?
leiflindholm: tait_dot_tech: there isn't much yet, we're only on week 3 of GSoC.
leiflindholm: https://summerofcode.withgoogle.com/projects/#6499615798460416 is the link if it's something you want to point others to, but any discussion/reporting is likely to hapen [sic] on our mailing lists
tait_dot_tech: By &quot;our&quot; mailing list, do you mean GSoC, or Edk2?
leiflindholm: edk2
leiflindholm: although, on average, at least 99% of edk2-devel will *not* be about audio support
leiflindholm: When we have anything interesting to say, we'll also post to edk2-discuss/edk2-announce
tait_dot_tech: Sweet! I'll join that one just in case! I'd be happy to test anything in beta-ish state and report back with any device I can get my hands on. Is that the right list to watch for hepling test it out?
leiflindholm: I'd say so.
leiflindholm: The original plan was to start with wirtio [sic] audio support, so anyone could help out anywhere, but that support is not yet upstream in qemu. So for now we're working on an [sic] USB audio class driver. That will certainly be useful to have more people testing with different equipment once we have something working.
tait_dot_tech: Ahh! So if I want to test, I should get a USB audio dongle. Gotcha! Thank you so much! You've been super helpful!
leiflindholm: np :)
&lt;/pre&gt;
&lt;p&gt;Things are (slowly) looking up for audio (and eventually screen-reader support) in UEFI!
Phew! Glad Im not the only one thinking about this!&lt;/p&gt;
&lt;p&gt;Happy UEFI hacking :)&lt;/p&gt;</content><author><name></name></author><summary type="html">Good news about the state of accessibility in the BIOS!</summary></entry><entry><title type="html">Pinebook Pro, The Ultimate ARM Laptop</title><link href="http://localhost:4000/2021/06/02/pinebook-pro/" rel="alternate" type="text/html" title="Pinebook Pro, The Ultimate ARM Laptop" /><published>2021-06-02T00:00:00-06:00</published><updated>2021-06-02T00:00:00-06:00</updated><id>http://localhost:4000/2021/06/02/pinebook-pro</id><content type="html" xml:base="http://localhost:4000/2021/06/02/pinebook-pro/">&lt;p&gt;I recently got my Pinebook Pro.
It was more expensive than I was expecting, coming in at (including shipping and handling) C$335.
I always forget the exchange rate and assume its similar to the U.S. dollar, but it never is, haha!
Anyway, this is just my first impressions and what I did to fix a few issues.&lt;/p&gt;
@ -956,94 +1009,4 @@ It rewarded those who had unique interests and an ability to sell others on thei
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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” (?)&lt;/p&gt;</content><author><name></name></author><summary type="html">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.</summary></entry><entry><title type="html">Minesweeper Bomb Generation And Tile Revealing</title><link href="http://localhost:4000/2020/09/12/minesweeper/" rel="alternate" type="text/html" title="Minesweeper Bomb Generation And Tile Revealing" /><published>2020-09-12T00:00:00-06:00</published><updated>2020-09-12T00:00:00-06:00</updated><id>http://localhost:4000/2020/09/12/minesweeper</id><content type="html" xml:base="http://localhost:4000/2020/09/12/minesweeper/">&lt;p&gt;When I was creating a little Minesweeper game, I got confused at some points.
My bomb generation didnt look quite right, and I for sure didnt quite get the whole cascading tile reveal thing.
With a bit of internet research, I found what I was looking for.
Ill explain it all in one place for my own research purposes.&lt;/p&gt;
&lt;h2 id=&quot;bomb-generation&quot;&gt;Bomb Generation&lt;/h2&gt;
&lt;p&gt;When I started this project I attempted to use a random bomb generator.
By this I mean on each square, before it gets generated, give it a one in 15 change of being a bomb.
Personally, Im not sure why this never looked right.
Something about the layout of the bombs did not mimic the classic Minesweeper game.&lt;/p&gt;
&lt;p&gt;After looking at some open source Minesweeper examples, I started to get the idea.
I wrote some mathematical statements describing the generation of bombs and how to get their x,y position from an appropriate number.
For those non-mathy people, dont leave just yet;
there will be code equivalents to the math.&lt;/p&gt;
&lt;p&gt;W and H are the width and height of the board respectively.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn mathvariant=&quot;italic&quot;&gt;0&lt;/mn&gt;&lt;mo&gt;&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;&lt;/mo&gt;&lt;mtext&gt;W&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt;H&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;
\it 0 \leq r \leq \text W \times \text H
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8193em;vertical-align:-0.13597em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathit&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathit&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;W&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;H&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mtext&gt;&lt;/mtext&gt;&lt;mo lspace=&quot;0.22em&quot; rspace=&quot;0.22em&quot;&gt;&lt;mrow&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;m&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;o&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;/mo&gt;&lt;mtext&gt;&lt;/mtext&gt;&lt;mtext&gt;W&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;
\it x = r \bmod \text W
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.69444em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathit&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathit&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.05555555555555555em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathrm&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mord mathrm&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord mathrm&quot;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.05555555555555555em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;W&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence=&quot;true&quot;&gt;&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mtext&gt;H&lt;/mtext&gt;&lt;/mfrac&gt;&lt;mo fence=&quot;true&quot;&gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;
\it y = \left\lfloor\frac{r}{\text H}\right\rfloor
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.8359999999999999em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathit&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;minner&quot;&gt;&lt;span class=&quot;mopen delimcenter&quot; style=&quot;top:0em;&quot;&gt;&lt;span class=&quot;delimsizing size2&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.10756em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;H&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathit&quot;&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose delimcenter&quot; style=&quot;top:0em;&quot;&gt;&lt;span class=&quot;delimsizing size2&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The code equivalent to this in Python is below:&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;random&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# r &amp;lt;= 0 &amp;lt;= W*H
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;H&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# x = r mod W
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;W&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# y = floor(r/H); note the special syntax python has for this operation
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;H&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So thats that, we can put this in a big ol for loop and generate an arbitrary &lt;em&gt;n&lt;/em&gt; number of bombs given a width and height of a Minesweeper board.&lt;/p&gt;
&lt;h2 id=&quot;cascading-tile-revealing&quot;&gt;Cascading Tile Revealing&lt;/h2&gt;
&lt;p&gt;This one is hard to describe;
I am adapting this from &lt;a href=&quot;https://leetcode.com/problems/minesweeper/&quot;&gt;leetcode.com&lt;/a&gt;.
Whenever a player clicks a tile, the following logic should be used:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If a mine is revealed, the game is over. (obviously)&lt;/li&gt;
&lt;li&gt;If a tile with &lt;em&gt;no&lt;/em&gt; adjacent mines is revealed, recursively reveal all eight adjacent tiles.&lt;/li&gt;
&lt;li&gt;If a tile with one or more adjacent mines is revealed, display the number of mines next to it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here is the code in Python for this algorithm.&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;reveal_square&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alread_revealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# if already checked
&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;already_revealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# if it's a bomb
&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'B'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;you_lose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# if the bomb number is more than 0
&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;already_revealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# from -1 to 1
&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xd&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;yd&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# skip if it is this the center tile
&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;yd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# recursively check the adjacent square
&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reveal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;yd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;already_revealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;already_revealed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This has no checks for valid squares, but its the general idea.
This function returns an array of tile coordinates which should be revealed.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I wrote this because in the first place because I was writing my own Minesweeper game.
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 &lt;a href=&quot;https://lamegames.tait.tech/&quot;&gt;lamegames&lt;/a&gt; site.
Let me know what you think!&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;</content><author><name></name></author><summary type="html">When I was creating a little Minesweeper game, I got confused at some points. My bomb generation didnt look quite right, and I for sure didnt quite get the whole cascading tile reveal thing. With a bit of internet research, I found what I was looking for. Ill explain it all in one place for my own research purposes.</summary></entry></feed>
So I thank you, Kitty Wong, for getting me started running my own “research blog” (?)&lt;/p&gt;</content><author><name></name></author><summary type="html">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.</summary></entry></feed>

@ -2,31 +2,31 @@
<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/emacspeak-tutorials/arrays/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/functions/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/loops/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/pointers/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/printing/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/structs/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/user-input/</loc>
<lastmod>2021-08-31T21:19:20-06:00</lastmod>
<lastmod>2021-08-31T21:20:13-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2020/01/22/padding-and-margin/</loc>
@ -141,6 +141,10 @@
<lastmod>2021-06-02T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2021/06/21/uefi-audio/</loc>
<lastmod>2021-06-21T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/2021/08/31/vpns-api/</loc>
<lastmod>2021-08-31T00:00:00-06:00</lastmod>
</url>

Loading…
Cancel
Save