Update idea

master
Tait Hoyem 3 years ago
parent c7e44f1e93
commit b89b20d544

@ -0,0 +1,162 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Idea For A VPN Service | 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=""><link rel="stylesheet" href="/assets/css/katex.css">
</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">Idea For A VPN Service</h1>
<time datetime="21-08-17" class="post-date">Tuesday, August 17 2021</time>
</header>
<hr>
<p>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 by encrypted VPN service.</p>
<p>I would license all the code and scripts under the AGPLv3.
This creates an environment where I could allow my company to use this code, and any other company for that matter but no company would be allowed to take it into their own hands and use it without contributing back to the project.</p>
<h2 id="e2ee-vpn">E2EE VPN</h2>
<p>I want this service in many ways to copy <a href="https://protonmail.com">ProtonMail</a>:
end-to-end encrypted (E2EE), and with a focus in data security for the user of the service.</p>
<p>Full encryption, so that even me, the writer and the deployer of the service, cannot view any information about the user: this is the utmost security.
The bad news is that this is very hard to do in a convenient way.
Ive decided for now that the best thing to do is to target the Linux nerd.
Target the user who is familiar with these advanced security practices, then make them available to the general public as the layers on top of the robust security are refined.</p>
<h2 id="why">Why?</h2>
<p>End-to-end encryption is necessary in a country like Canada, where I may be sent a subpoena to provide customer data.
This is the case especially in the <a href="https://en.wikipedia.org/wiki/Five_Eyes">Five Eyes</a> anglophone group of countries, who essentially spy on each others citizens for their allies.
In essence, any data in the hand of one government agency may be shared between the Five, Nine, and 14 Eyes countries.</p>
<h2 id="what-we-need">What We Need</h2>
<p>A VPN service needs access to some basic information:</p>
<ol>
<li>Service discontinue time (the amount of time until the customer must renew).</li>
<li>Active connections.</li>
</ol>
<p>The client needs access to some information from the server as well:</p>
<ol>
<li>A list of VPNs able to be connected to (with filters).</li>
<li>For every VPN:
<ol>
<li>IP Address.</li>
<li>Maximum bandwidth.</li>
<li>Number of connected users or connection saturation percentage.</li>
<li>Supported protocols.</li>
</ol>
</li>
</ol>
<p>Can we do this in a end-to-end encrypted fashion?
Im honestly not sure. But here are my ideas so far as to how <em>some</em> of these functions might work.</p>
<h2 id="how-to-do-it">How To Do It</h2>
<h3 id="usernames">“Usernames”</h3>
<p>There will be one button to create your account: <em>“Generate username”</em>
The username, or unique identifier for a user will be generated for them by a random generator.
I plan to generate a username from a list of <a href="https://en.wikipedia.org/wiki/Base64">Base 64</a> characters; it will be a guaranteed length of 16.
This gives a total of: <code class="language-plaintext highlighter-rouge">79228162514264337593543950336</code> or <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>7.9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mn>28</mn></msup></mrow><annotation encoding="application/x-tex">7.9 \times 10^{28}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">7</span><span class="mord">.</span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mtight">8</span></span></span></span></span></span></span></span></span></span></span></span> posibilities.
This is sufficient for a username.</p>
<p>The other option is to use a standard “username” field that uses a modern hash function like <a href="https://en.wikipedia.org/wiki/Secure_Hash_Algorithms">SHA512</a> to store it in the database.
This is less secure as it is vulnerable to a brute-force attack of finding users,
but this is also a very easy attack to defend against, i.e. IP banning after 10-ish tries of not finding a username.</p>
<p>A <em>non-unique, universal</em> salt will also be used on each username to make it more secure.
This decreases the possibility of an advanced attacker being able to find usernames in a leaked database.
That said, the fact that it is a fixed salt makes it much more vulnerable to an attack.
Although it would be known only by the server machine, it would still be somewhat of a vulnerability.
The operator may also store the salt in an encrypted password store of their own in case the server is erased, broken into, etc.
It would be fairly easy, if they have access to the active salt, to migrate to a new salt every few days/months, or perhaps every time a server change happens.
In the end, they would need a backup of this salt, otherwise login times would become linear to the number of users as the database checks every users salt to see if it matches the hash made with the username input.</p>
<p>So, heres the overview:
The username will be generated, then stored <em>after</em> being salted and hashed.
The salt will be a fixed or rolling salt across all usernames to avoid linear scaling of searching for a user.
The server will only see the username once, when sending it to the user for them to save for the first time;
there will be no database entry with the original username in it.</p>
<p>This does mean that if the username is lost, the account is lost too. There is no way to recover the account.</p>
<h3 id="passwords">“Passwords”</h3>
<p>There are a few options for passwords/secret keys.</p>
<p>I think the best is to treat it similarly to the username is above, except it will <em>not</em> be generated for you.
When a new account is generated, you will be taken to a password reset screen where you will set your password to whatever your want, using your own secure system to handle it.
This is ideal for Linux and tech enthusiasts as they generally already have a password management system setup.</p>
<p>This will also be salted, with its own unique salt, then hashed and stored alongside the username.</p>
<h3 id="active-time-remaining">Active Time Remaining</h3>
<p>It is easy and ideal to have a field connected to a user with their expiry date for their account.
When a payment is made, this date will be increased by the number of days, hours and minutes proportional to the payment received.</p>
<p>This is the second biggest threat to the users data privacy, as this, by definition, cannot be encrypted as my server needs access to this data to decide whether a user should be allowed to: view a list of VPN nodes available to them or connect to a VPN.
The best I can do in this case is make sure the database and root hard disk are fully encrypted with a password on boot so if asked for data I can simply shut it down.</p>
<p>This is not a fantastic solution, and still has the threat of a service provider snooping in on the database.
The truth is: a service provider has root access to any machine it hosts.
This necessitates that the <em>physical</em> infrastructure hosting the central database server must by physically owned and operated by the VPN operator.
In addition, it means top security root passwords, tamper resistant cases (in the case of a co-hosting or server room environment), sensors to indicate it has been opened or touched.
If you thoughts this was bad, wait until the next part.</p>
<h3 id="active-connections">Active Connections</h3>
<p>In order to stop a user from simply using the entire bandwidth of all my VPN nodes available to them, I need a way to know how many active connections the user has.
This is <em>by far</em> the biggest issue in terms of user privacy.
There are a few options here:</p>
<ol>
<li>Do not have a limit on the number of connections a user may have. This is dangerous from a DDoS (distributed denial of service) perspective.</li>
<li>Have a list of connected users sent to the central server every 15 to 30 seconds. This is fairly efficient, but more privacy invasive.</li>
<li>???</li>
</ol>
</article>
</main>
<hr>
<footer>
This page is mirrored on <a href="https://beta.tait.tech/2021/08/17/vpns-api/">beta.tait.tech</a>.
</footer>
</div>
</body>
</html>

@ -32,6 +32,20 @@
<main>
<h1>Blog</h1>
<article>
<header class="post-header">
<h2 class="post-title">
<a class="post-title-link" href="/2021/08/17/vpns-api/">Idea For A VPN Service</a>
</h2>
<time class="post-date" datetime="21-08-17">
17 August 2021
</time>
</header>
<div class="post-excerpt"><p>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 by encrypted VPN service.</p>
</div>
</article>
<article>
<header class="post-header">
<h2 class="post-title">

@ -1,4 +1,113 @@
<?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-06-17T15:52:35-06:00</updated><id>http://localhost:4000/feed.xml</id><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.
<?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-22T22:17:19-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/17/vpns-api/" rel="alternate" type="text/html" title="Idea For A VPN Service" /><published>2021-08-17T00:00:00-06:00</published><updated>2021-08-17T00:00:00-06:00</updated><id>http://localhost:4000/2021/08/17/vpns-api</id><content type="html" xml:base="http://localhost:4000/2021/08/17/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 by encrypted VPN service.&lt;/p&gt;
&lt;p&gt;I would license all the code and scripts under the AGPLv3.
This creates an environment where I could allow my company to use this code, and any other company for that matter but no company would be allowed to take it into their own hands and use it without contributing back to the project.&lt;/p&gt;
&lt;h2 id=&quot;e2ee-vpn&quot;&gt;E2EE VPN&lt;/h2&gt;
&lt;p&gt;I want this service in many ways to copy &lt;a href=&quot;https://protonmail.com&quot;&gt;ProtonMail&lt;/a&gt;:
end-to-end encrypted (E2EE), and with a focus in data security for the user of the service.&lt;/p&gt;
&lt;p&gt;Full encryption, so that even me, the writer and the deployer of the service, cannot view any information about the user: this is the utmost security.
The bad news is that this is very hard to do in a convenient way.
Ive decided for now that the best thing to do is to target the Linux nerd.
Target the user who is familiar with these advanced security practices, then make them available to the general public as the layers on top of the robust security are refined.&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why?&lt;/h2&gt;
&lt;p&gt;End-to-end encryption is necessary in a country like Canada, where I may be sent a subpoena to provide customer data.
This is the case especially in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Five_Eyes&quot;&gt;Five Eyes&lt;/a&gt; anglophone group of countries, who essentially spy on each others citizens for their allies.
In essence, any data in the hand of one government agency may be shared between the Five, Nine, and 14 Eyes countries.&lt;/p&gt;
&lt;h2 id=&quot;what-we-need&quot;&gt;What We Need&lt;/h2&gt;
&lt;p&gt;A VPN service needs access to some basic information:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Service discontinue time (the amount of time until the customer must renew).&lt;/li&gt;
&lt;li&gt;Active connections.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The client needs access to some information from the server as well:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A list of VPNs able to be connected to (with filters).&lt;/li&gt;
&lt;li&gt;For every VPN:
&lt;ol&gt;
&lt;li&gt;IP Address.&lt;/li&gt;
&lt;li&gt;Maximum bandwidth.&lt;/li&gt;
&lt;li&gt;Number of connected users or connection saturation percentage.&lt;/li&gt;
&lt;li&gt;Supported protocols.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Can we do this in a end-to-end encrypted fashion?
Im honestly not sure. But here are my ideas so far as to how &lt;em&gt;some&lt;/em&gt; of these functions might work.&lt;/p&gt;
&lt;h2 id=&quot;how-to-do-it&quot;&gt;How To Do It&lt;/h2&gt;
&lt;h3 id=&quot;usernames&quot;&gt;“Usernames”&lt;/h3&gt;
&lt;p&gt;There will be one button to create your account: &lt;em&gt;“Generate username”&lt;/em&gt;
The username, or unique identifier for a user will be generated for them by a random generator.
I plan to generate a username from a list of &lt;a href=&quot;https://en.wikipedia.org/wiki/Base64&quot;&gt;Base 64&lt;/a&gt; characters; it will be a guaranteed length of 16.
This gives a total of: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;79228162514264337593543950336&lt;/code&gt; or &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&gt;7.9&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;msup&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mn&gt;28&lt;/mn&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;7.9 \times 10^{28}&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.72777em;vertical-align:-0.08333em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;9&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&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8141079999999999em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141079999999999em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;8&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;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; posibilities.
This is sufficient for a username.&lt;/p&gt;
&lt;p&gt;The other option is to use a standard “username” field that uses a modern hash function like &lt;a href=&quot;https://en.wikipedia.org/wiki/Secure_Hash_Algorithms&quot;&gt;SHA512&lt;/a&gt; to store it in the database.
This is less secure as it is vulnerable to a brute-force attack of finding users,
but this is also a very easy attack to defend against, i.e. IP banning after 10-ish tries of not finding a username.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;non-unique, universal&lt;/em&gt; salt will also be used on each username to make it more secure.
This decreases the possibility of an advanced attacker being able to find usernames in a leaked database.
That said, the fact that it is a fixed salt makes it much more vulnerable to an attack.
Although it would be known only by the server machine, it would still be somewhat of a vulnerability.
The operator may also store the salt in an encrypted password store of their own in case the server is erased, broken into, etc.
It would be fairly easy, if they have access to the active salt, to migrate to a new salt every few days/months, or perhaps every time a server change happens.
In the end, they would need a backup of this salt, otherwise login times would become linear to the number of users as the database checks every users salt to see if it matches the hash made with the username input.&lt;/p&gt;
&lt;p&gt;So, heres the overview:
The username will be generated, then stored &lt;em&gt;after&lt;/em&gt; being salted and hashed.
The salt will be a fixed or rolling salt across all usernames to avoid linear scaling of searching for a user.
The server will only see the username once, when sending it to the user for them to save for the first time;
there will be no database entry with the original username in it.&lt;/p&gt;
&lt;p&gt;This does mean that if the username is lost, the account is lost too. There is no way to recover the account.&lt;/p&gt;
&lt;h3 id=&quot;passwords&quot;&gt;“Passwords”&lt;/h3&gt;
&lt;p&gt;There are a few options for passwords/secret keys.&lt;/p&gt;
&lt;p&gt;I think the best is to treat it similarly to the username is above, except it will &lt;em&gt;not&lt;/em&gt; be generated for you.
When a new account is generated, you will be taken to a password reset screen where you will set your password to whatever your want, using your own secure system to handle it.
This is ideal for Linux and tech enthusiasts as they generally already have a password management system setup.&lt;/p&gt;
&lt;p&gt;This will also be salted, with its own unique salt, then hashed and stored alongside the username.&lt;/p&gt;
&lt;h3 id=&quot;active-time-remaining&quot;&gt;Active Time Remaining&lt;/h3&gt;
&lt;p&gt;It is easy and ideal to have a field connected to a user with their expiry date for their account.
When a payment is made, this date will be increased by the number of days, hours and minutes proportional to the payment received.&lt;/p&gt;
&lt;p&gt;This is the second biggest threat to the users data privacy, as this, by definition, cannot be encrypted as my server needs access to this data to decide whether a user should be allowed to: view a list of VPN nodes available to them or connect to a VPN.
The best I can do in this case is make sure the database and root hard disk are fully encrypted with a password on boot so if asked for data I can simply shut it down.&lt;/p&gt;
&lt;p&gt;This is not a fantastic solution, and still has the threat of a service provider snooping in on the database.
The truth is: a service provider has root access to any machine it hosts.
This necessitates that the &lt;em&gt;physical&lt;/em&gt; infrastructure hosting the central database server must by physically owned and operated by the VPN operator.
In addition, it means top security root passwords, tamper resistant cases (in the case of a co-hosting or server room environment), sensors to indicate it has been opened or touched.
If you thoughts this was bad, wait until the next part.&lt;/p&gt;
&lt;h3 id=&quot;active-connections&quot;&gt;Active Connections&lt;/h3&gt;
&lt;p&gt;In order to stop a user from simply using the entire bandwidth of all my VPN nodes available to them, I need a way to know how many active connections the user has.
This is &lt;em&gt;by far&lt;/em&gt; the biggest issue in terms of user privacy.
There are a few options here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do not have a limit on the number of connections a user may have. This is dangerous from a DDoS (distributed denial of service) perspective.&lt;/li&gt;
&lt;li&gt;Have a list of connected users sent to the central server every 15 to 30 seconds. This is fairly efficient, but more privacy invasive.&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;/ol&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 by 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.
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;
@ -864,12 +973,4 @@ 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><entry><title type="html">lamegames.tait.tech</title><link href="http://localhost:4000/2020/09/09/lamegames/" rel="alternate" type="text/html" title="lamegames.tait.tech" /><published>2020-09-09T00:00:00-06:00</published><updated>2020-09-09T00:00:00-06:00</updated><id>http://localhost:4000/2020/09/09/lamegames</id><content type="html" xml:base="http://localhost:4000/2020/09/09/lamegames/">&lt;p&gt;This is an announcement for a new project of mine:
&lt;a href=&quot;https://lamegames.tait.tech&quot;&gt;lamegames.tait.tech&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is something Im really excited to work on!&lt;/p&gt;
&lt;p&gt;Right now, Ive just got a rock-paper-scissors game.
A chat function, and a few simple card games to come.&lt;/p&gt;
&lt;p&gt;Check out the repository on my &lt;a href=&quot;https://github.com/TTWNO/lamegames.io&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;</content><author><name></name></author><summary type="html">This is an announcement for a new project of mine: lamegames.tait.tech.</summary></entry></feed>
&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>

@ -62,6 +62,29 @@ Guaranteed to be accessible.</p>
<p>Just an idea.</p>
<h2 id="3-3d-printing-of-google-mapsopenstreetmaps-data-for-the-visually-impaired">3. 3d printing of Google Maps/OpenStreetMaps data for the visually impaired.</h2>
<p>A larger project, to be sure, but one I think could be of interest.
Imagine being able to download some data from Google or OpenStrretMaps,
then put it into a program and have it generate a 3d map which can be printed.
Unsure what to do, as the braille overlay on top of the streets and important buildings, etc. needs to be of a uniform size (braille cannot be scaled) but the buildings, streets, and parks do need to be scaled in size.</p>
<p>I think for beginning, forget the braille entirely and simply product a map.
This can be done in the STL file format or some intermediary if that is easier.
Roads will have a slight border on the side,
parks will have a diamond texture,
buildings will have slight rectangular borders (slightly wider than the roads),
paths will be a thin line, and the label for the path will need to extend the thin line into a (rounded) rectangle with text on it.</p>
<p>Start with roads.
Get a road, get it to generate the correct shape.
Then add a border around the side.
Then, add 4 more roads and figure out how to intersect them.</p>
<p>If it can be done on a display, it can be done in a file.</p>
<p>Start with that. Wow what a daunting project!</p>
</main>
<hr>
<footer>

@ -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-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/functions/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/loops/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/pointers/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/printing/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/structs/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/emacspeak-tutorials/user-input/</loc>
<lastmod>2021-06-17T15:52:35-06:00</lastmod>
<lastmod>2021-08-22T22:17:19-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/08/17/vpns-api/</loc>
<lastmod>2021-08-17T00:00:00-06:00</lastmod>
</url>
<url>
<loc>http://localhost:4000/blog/</loc>
</url>
<url>

@ -33,3 +33,26 @@ I'm thinking of similar key commands to Orca/NVDA but output is send to the term
Change backend on-the-fly with a page reload. So if a website doesn't work with Webkit, load it in Firefox with a key command.
Just an idea.
## 3. 3d printing of Google Maps/OpenStreetMaps data for the visually impaired.
A larger project, to be sure, but one I think could be of interest.
Imagine being able to download some data from Google or OpenStrretMaps,
then put it into a program and have it generate a 3d map which can be printed.
Unsure what to do, as the braille overlay on top of the streets and important buildings, etc. needs to be of a uniform size (braille cannot be scaled) but the buildings, streets, and parks do need to be scaled in size.
I think for beginning, forget the braille entirely and simply product a map.
This can be done in the STL file format or some intermediary if that is easier.
Roads will have a slight border on the side,
parks will have a diamond texture,
buildings will have slight rectangular borders (slightly wider than the roads),
paths will be a thin line, and the label for the path will need to extend the thin line into a (rounded) rectangle with text on it.
Start with roads.
Get a road, get it to generate the correct shape.
Then add a border around the side.
Then, add 4 more roads and figure out how to intersect them.
If it can be done on a display, it can be done in a file.
Start with that. Wow what a daunting project!

Loading…
Cancel
Save