migrates ghost blog to hugo
@@ -0,0 +1,237 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>InterPlanetary File System | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="What will the Internet look like for colonists on Mars? It seems like a silly question since we’re far away from having boots on the ground on our red planet neighbor. We’ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/06/interplanetary-file-system/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
InterPlanetary File System
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-06-25 00:00:00 +0000 UTC'>June 25, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/orbit-model.jpg" alt="Solar system model" />
|
||||
</p>
|
||||
<p>What will the Internet look like for colonists on Mars? It seems like a silly question since we’re far away from having boots on the ground on our red planet neighbor. We’ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip. So if you want to check your Twitter and the servers are here on Earth.. you’re going to wait a very long time between page loads.</p>
|
||||
<p>Enter the <a href="https://ipfs.io/">InterPlanetary File System</a>. IPFS, designed by <a href="https://protocol.ai/">Protocol Labs</a>, is part of a growing movement to decentralize the Internet which has wide reaching implications from resiliency to durability to availability and with that protection from censorship.</p>
|
||||
<p>Simply, IPFS is a protocol that allows content-addressing instead of location-addressing. What that means is you make a request for specific files and you could get them from someone across the world or it could come from someone in your neighborhood. Additionally, each user of IPFS is another node in the network which can serve content. So in our Mars colony thought experiment, if anyone on Mars has downloaded content from Earth they become the closest seed for that content to all the users on Mars. Here on Earth, that means we can reduce loading times for content by fetching from nodes close to us. It also means that if one node is unreachable, you’ll simply reach out to the next closest node for your content. IPFS can replace a portion of the HTTP traffic of the internet today since IPFS is particularly well suited for static content. However, it doesn’t have to exclusively replace it. IPFS is just another tool in the toolbox to be used when applications or content need to be highly available, resilient and durable.</p>
|
||||
<p><img loading="lazy" src="/img/geometric-3d.jpg" alt="Photo by <a href="https://unsplash.com/@alinnnaaaa?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Alina Grubnyak</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<h3 id="architecture">Architecture<a hidden class="anchor" aria-hidden="true" href="#architecture">#</a></h3>
|
||||
<p>I’ll keep this pretty high-level since the <a href="https://dhl-space.sfo2.digitaloceanspaces.com/assets/ipfs-p2p-file-system.pdf">IPFS white paper</a> goes in-depth of how the protocol works. IPFS relies on several key technologies born and evolved since the introduction of HTTP.</p>
|
||||
<h3 id="coordination">Coordination<a hidden class="anchor" aria-hidden="true" href="#coordination">#</a></h3>
|
||||
<p>Looking up which nodes are serving the content you want is powered by <a href="https://en.wikipedia.org/wiki/Distributed_hash_table">distributed hash tables</a> or DHTs. DHTs have been used in other widely distributed systems such as BitTorrent to track peers.</p>
|
||||
<h3 id="hashing">Hashing<a hidden class="anchor" aria-hidden="true" href="#hashing">#</a></h3>
|
||||
<p><a href="https://en.wikipedia.org/wiki/Distributed_hash_table">Hashing</a> is at the heart of what makes IPFS tick. Hashes are generated from file contents that uniquely describe what a file is. Hashes are exceptional for this because a single bit changed in a file will drastically change the hash output. This means we can uniquely describe an entire file with a short string of characters.</p>
|
||||
<h3 id="merkle-trees">Merkle Trees<a hidden class="anchor" aria-hidden="true" href="#merkle-trees">#</a></h3>
|
||||
<p><a href="https://en.wikipedia.org/wiki/Merkle_tree">Merkle trees</a> are the core technology used in version control systems for history tracking. IPFS uses them to similar ends as well as some interesting emergent features.</p>
|
||||
<p>Everything in IPFS is described by a cryptographic hash. Folders are hashed by their contents and if that folder contains other folders they will be described by hashes of their contents. So on and so forth. Since all objects in the Merkle tree are described by their hashes, all files in IPFS are immutable. When a file is changed the previous version remains and the updated version is added. Both versions will have their own addresses.</p>
|
||||
<p>Finally, since files are described by their hashes it’s trivial to check that a file has been altered, whether maliciously or not. You simply hash the file and if the checksums do not match, you throw the file away.</p>
|
||||
<h3 id="installing-and-using-ipfs">Installing and Using IPFS<a hidden class="anchor" aria-hidden="true" href="#installing-and-using-ipfs">#</a></h3>
|
||||
<p>There’s an excellent primer on installing and using IPFS <a href="https://github.com/ipfs-shipyard/ipfs-primer/tree/master">here</a>. Protocol Labs have done an excellent job creating useful command line tools as well as desktop applications for making accessing the network seamless and easy. <a href="https://github.com/ipfs-shipyard/ipfs-desktop">IPFS Desktop</a> is a convenient application which runs a local IPFS node which you use to access ipfs://, ipns:// and dweb: links as well as serve your own content to the network.</p>
|
||||
<p><a href="https://brave.com/">Brave</a>, which I highly recommend for their privacy protection focused browser, have added an IPFS Companion toggle in their settings to enable IPFS… no need to install anything.</p>
|
||||
<h3 id="ipfs-based-dapps">IPFS-Based DApps<a hidden class="anchor" aria-hidden="true" href="#ipfs-based-dapps">#</a></h3>
|
||||
<p>Since IPFS is still relatively new discovery on the network is still difficult. There are no great search engines just yet. <a href="https://awesome.ipfs.io/">Awesome IPFS</a> is a neat place to find new tools and content hosted on IPFS.</p>
|
||||
<p>Some cool applications I’ve come across:</p>
|
||||
<h3 id="dtubehttpsdtube"><a href="https://d.tube/">DTube</a><a hidden class="anchor" aria-hidden="true" href="#dtubehttpsdtube">#</a></h3>
|
||||
<p>A distributed YouTube alternative. There’s not a lot of content yet but as a PoC it shows that we definitely don’t need Google for a video service like YouTube.</p>
|
||||
<h3 id="killcordhttpskillcordio"><a href="https://killcord.io/">killcord</a><a hidden class="anchor" aria-hidden="true" href="#killcordhttpskillcordio">#</a></h3>
|
||||
<p>Not sure I really have use of a deadman’s switch but the concept is very cool!</p>
|
||||
<h3 id="diffusehttpsdiffusesh"><a href="https://diffuse.sh/">Diffuse</a><a hidden class="anchor" aria-hidden="true" href="#diffusehttpsdiffusesh">#</a></h3>
|
||||
<p>A cool in browser music player that supports playing content from IPFS as well as S3, Blockstack, Dropbox and other remote storage.</p>
|
||||
<h3 id="openbazaarhttpswwwopenbazaarorg"><a href="https://www.openbazaar.org/">OpenBazaar</a><a hidden class="anchor" aria-hidden="true" href="#openbazaarhttpswwwopenbazaarorg">#</a></h3>
|
||||
<p>OpenBazaar is a decentralized e-commerce platform built on IPFS which allows you to buy and sell with Bitcoin.</p>
|
||||
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
|
||||
<p>I’ve only started scratching the surface of what IPFS can do. It makes me really excited for the future of the Internet. If it takes off it has the potential to wrench control of the Internet away from the few super large companies and put it back into the hands of the users. The worst case scenario for IPFS is it’s used to make the Internet more durable, resilient and available. I’m brainstorming project ideas to build on top of the protocol. I’ll write a post later when I have something cool to show off and in the meantime, I’m excited to see what others come up with!</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,275 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Running a Bitcoin Full Node | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don’t if you like sleep at all…) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I’d ever had at once and turned it off.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Running a Bitcoin Full Node
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-06-13 00:00:00 +0000 UTC'>June 13, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/bitcoin-cpu.jpg" alt="Bitcoin on CPU" />
|
||||
</p>
|
||||
<p>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don’t if you like sleep at all…) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I’d ever had at once and turned it off.</p>
|
||||
<p>During the run up at the end of 2014 I sold out of my position a little before the peak. It was dumb luck, trust me I was no genius trader by any means and that’s still true. I told myself the volatility was too much for me, and it was… I lost a lot of sleep that year. But I never stopped checking up on how Bitcoin was doing and recently I’ve gotten back in the game. This year with the corona epidemic and the unprecedented amount of money being created, the multiple other currencies that have experienced hyper-inflation recently, Bitcoin’s raison d’être for existing is back in center-view.</p>
|
||||
<p>I believe in Bitcoin and want to contribute to the network somehow. Mining is out of the question. It was out of the question even back in 2014 when ASICs started coming onto the scene. Another option is running a Bitcoin full node.</p>
|
||||
<h3 id="what-is-a-full-node">What is a full node?<a hidden class="anchor" aria-hidden="true" href="#what-is-a-full-node">#</a></h3>
|
||||
<p>To answer that question, let’s take a step back and look at how the Bitcoin protocol works. Miners collect new transactions from the network together in blocks and then hash them over and over. They’re looking for a hash that has a specific number of preceding zeroes, called the difficulty. This process is called proof of work and it’s the heart of what makes Bitcoin work. The process of finding a hash that matches the difficulty takes a lot of computing power but checking that hash is trivially easy even for a low-powered computer.</p>
|
||||
<p>Bitcoin is trust-less at every layer so we don’t blindly trust the blocks miners give us; we verify. This is the work that full nodes do. They enforce the rules of Bitcoin always. If a miner produces a block that doesn’t follow the rules it is ignored and if it happens enough that miner is also ignored. This gives miners a financial incentive to behave. If you don’t follow the rules you don’t receive the transaction fees or the block bounty. Full nodes are a check on the [51% attack.</p>
|
||||
<p>Full nodes also give you a voting voice in the case of a hard-fork. The software you run determines the rules followed. This happened with <a href="https://www.investopedia.com/news/all-about-bitcoin-cash-hard-fork/">Bitcoin Cash</a> in 2019. Developers attempted to alter the Bitcoin consensus rules in a way that would defy Bitcoin’s core tenant of limited supply – scarcity. Contributors running full nodes voted on which fork to follow by running one version of the full node software or the other and overwhelmingly chose BTC. You can see that in the price of both today: BTC - $9450 vs. BCH - $240.</p>
|
||||
<h3 id="tutorial">Tutorial<a hidden class="anchor" aria-hidden="true" href="#tutorial">#</a></h3>
|
||||
<p>I have a home server which is my lab of sorts. I use it for all kinds of things and there are various tasks it runs for me and it has enough storage for this. You don’t have to have a dedicated computer to run a full node. Lots of contributors run full nodes on Raspberry Pi’s or other single-board computers. There are only a few requirements to run a full node:</p>
|
||||
<ul>
|
||||
<li>You are going to download the entire blockchain so you will need a sizable amount of free storage. The blockchain is 282GB as of this post. Each block is around 1MB and new blocks are mined every 10 minutes so the blockchain size grows linearly with time.</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/blockchain-size-graph-2020.png" alt="Blockchain size graph" />
|
||||
</p>
|
||||
<ul>
|
||||
<li>Obviously you’ll need to download the blockchain in its entirety so you’ll want an unmetered internet connection. After the initial blockchain download you will download 20GB and upload 200GB per month on average.</li>
|
||||
<li>You need the full node to run at least 6 hours per day. Running it all the time is better.</li>
|
||||
<li>You probably don’t want this running on a high powered gaming computer unless you like paying your energy company for electricity. This is a big reason a lot of people opt for a Raspberry Pi.</li>
|
||||
</ul>
|
||||
<p>Getting the full node up and running is actually very easy. There’s a GUI version you can use but I run my Linux server headless so we’ll go through the CLI version. The installation instructions found here are very good. The verification of the file integrity and the signing keys may not be obvious to novice users so I’ll go through the steps here:</p>
|
||||
<ol>
|
||||
<li>First off, you need to <a href="https://bitcoin.org/en/download">download</a> the Linux tarball, the SHA256SUMS file and the release signing key corresponding to your version.</li>
|
||||
<li>Now verify the download files integrity with the SHA256SUMS file. Run the following command and you should see an OK corresponding to the tarball you downloaded.</li>
|
||||
</ol>
|
||||
<pre tabindex="0"><code>~/Downloads$ sha256sum --ignore-missing -c SHA256SUMS.asc
|
||||
bitcoin-0.20.0-x86_64-linux-gnu.tar.gz: OK
|
||||
sha256sum: WARNING: 20 lines are improperly formatted
|
||||
</code></pre><ol start="3">
|
||||
<li>Import the public key into your GPG keyring. I installed version 0.20.0 so in my case the signing key was laanwj-releases.asc.</li>
|
||||
</ol>
|
||||
<pre tabindex="0"><code>~/Downloads$ gpg --import laanwj-releases.asc
|
||||
gpg: key 90C8019E36C2E964: 51 signatures not checked due to missing keys
|
||||
gpg: key 90C8019E36C2E964: public key "Wladimir J. van der Laan (Bitcoin Core binary release signing key) <laanwj@gmail.com>" imported
|
||||
gpg: Total number processed: 1
|
||||
gpg: imported: 1
|
||||
gpg: no ultimately trusted keys found
|
||||
</code></pre><ol start="4">
|
||||
<li>Now verify the SHA256SUMS.asc file. If you are an extra cautious person you can go a step further and ask one of the project developers to verify the fingerprint.</li>
|
||||
</ol>
|
||||
<pre tabindex="0"><code>~/Downloads$ gpg --verify SHA256SUMS.asc
|
||||
gpg: Signature made Wed 03 Jun 2020 05:59:52 AM EDT
|
||||
gpg: using RSA key 90C8019E36C2E964
|
||||
gpg: Good signature from "Wladimir J. van der Laan (Bitcoin Core binary release signing key) <laanwj@gmail.com>" [unknown]
|
||||
gpg: WARNING: This key is not certified with a trusted signature!
|
||||
gpg: There is no indication that the signature belongs to the owner.
|
||||
Primary key fingerprint: 01EA 5486 DE18 A882 D4C2 6845 90C8 019E 36C2 E964
|
||||
</code></pre><ol start="5">
|
||||
<li>Now that we’ve verified the download you can follow along with the installation instructions.</li>
|
||||
</ol>
|
||||
<h3 id="networkingfirewall">Networking/Firewall<a hidden class="anchor" aria-hidden="true" href="#networkingfirewall">#</a></h3>
|
||||
<p>You’ll also need to open the 8333 port for your full node. The process for this is very dependent on your set up. In my case, I needed to set up port forwarding through my router as well as open the port in my iptables firewall. I have my firewall set up to DROP any incoming traffic not explicitly allowed so I simply added an INPUT rule like this:</p>
|
||||
<pre tabindex="0"><code>iptables -A INPUT -p tcp --dport 8333 -j ACCEPT
|
||||
</code></pre><h3 id="starting-up">Starting up<a hidden class="anchor" aria-hidden="true" href="#starting-up">#</a></h3>
|
||||
<p>I went the init script route for starting my full node using systemd instead of a crontab. If you want to use systemd:</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>Add this <a href="https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service">init script</a> to your /usr/lib/systemd/system folder.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Test by starting the script: systemctl start bitcoind</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If bitcoind started successfully you can start it at boot time: systemctl enable bitcoind</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h3 id="initial-block-download">Initial Block Download<a hidden class="anchor" aria-hidden="true" href="#initial-block-download">#</a></h3>
|
||||
<p>The inital block download will take a while to complete depending on your connection. I have a gigabit fiber connection and it still took the majority of 24 hours to complete. You are downloading a full copy of the blockchain from other contributors running a full node so even if you have a fast connection you will likely be limited by others upload speeds.</p>
|
||||
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
|
||||
<p>I hope this helps others get their full nodes up and running. It genuinely feels good to contribute to the network and keep Bitcoin safe. If this helped let me know on <a href="https://twitter.com/DalaiComma">Twitter</a> or if you did get stuck along the way, I’d be happy to help you along if I can and I’ll update this guide for others.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,223 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Hardware Wallets | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Let’s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. Trezor and Ledger are the two I have experience with personally.
|
||||
Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/07/hardware-wallets/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Hardware Wallets
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-07-24 00:00:00 +0000 UTC'>July 24, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/open-wallet.jpg" alt="Wallet open with cards" />
|
||||
</p>
|
||||
<p>Let’s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. <a href="https://trezor.io/">Trezor</a> and <a href="https://www.ledger.com/">Ledger</a> are the two I have experience with personally.</p>
|
||||
<p><img loading="lazy" src="/img/trezor-card-passport.jpg" alt="Photo by <a href="https://unsplash.com/@jankolar?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Jan Antonin Kolar</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<p>Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back. During this process your keys never leave the device, which is important because you want to limit your exposure as much as possible. The devices even generate your 24-word seed phrase within the device and display them on the screen for you to write down just so no device that has ever or will ever be network connected has seen your keys.</p>
|
||||
<p>Hardware wallets fill in a gap between hot wallets (where your keys are stored on the device, think Electrum, Wasabi) and proper cold wallets (remember paper wallets?) In effect, a hardware wallet is the same as installing Electrum on an air-gapped laptop which has had it’s NIC and WiFi cards ripped out. To use that wallet you would generate your transaction on a network equipped computer, save it on a USB drive, load it into the laptop where you would sign the transaction with your private keys. Then save the signed transaction to the USB, load it back into the networked computer, and broadcast your transaction from there. Hardware wallets are the same workflow just much more accessible and user friendly.</p>
|
||||
<p>In my opinion, these devices are the best blend of security and convenience that you can get. Ledger also has their <a href="https://shop.ledger.com/products/ledger-nano-x">Nano X</a> wallet which is even Bluetooth enabled allowing you to use it through their mobile app on the go, I can highly recommend this one. I bought mine after initially buying the <a href="https://shop.trezor.io/product/trezor-one-white">Trezor One</a> because it’s the old guard hardware wallet; it’s been around a while and it’s well reviewed and well trusted. But haven’t touched the Trezor since.</p>
|
||||
<p>If you have more than $200 of Bitcoin, it’s time to buy a hardware wallet. Do you research to find out which one works best for you. But whichever you choose be conscious of security. Here’s my advice:</p>
|
||||
<ul>
|
||||
<li>Do <strong><!-- raw HTML omitted -->not<!-- raw HTML omitted --></strong> order your wallet from a third party source. It will probably be fine, but it could also not be fine at all. You don’t want to put your hard earned crypto on a compromised device and lose it all.</li>
|
||||
<li>Check your respective devices documentation about their shipping security features. Trezor will have holographic stickers. Ledger does a firmware check during initialization. If anything seems weird or off, contact the company and <strong><!-- raw HTML omitted -->don’t<!-- raw HTML omitted --></strong> use the device.</li>
|
||||
<li>Remember, your Bitcoin is not stored on the device itself your private keys are. You <strong><!-- raw HTML omitted -->must<!-- raw HTML omitted --></strong> keep these safe at all costs. So that means if your 24 word seed phrase is compromised no amount of cool wallet tech is going to keep you from getting robbed. A 25th word passphrase is your best protection against this. Treat this like a password: it must be random, it must be long, and you should not store it anywhere near your wallet.</li>
|
||||
<li>Even better than a 25th word is using a 2-of-3 or even 3-of-5 multi-sig wallet. This provides the added benefit of resiliency in the event of a lost seed. In 2-of-3 you have a loss threshold of 1 seed. 3-of-5 is event better with a loss threshold of 2. If you have your seed phrases geographically distributed and lose more than 1, your Bitcoins are probably the least of your worries.</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/open-safety-deposit-boxes.jpg" alt="Photo by <a href="https://unsplash.com/@emielmaters?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Emiel Maters</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<p>Bitcoin is a money revolution. It’s convenient, <a href="https://hardmoneyfilm.com/">hard</a>, and secure.. but not by default and it’s up to you to take the care to make it secure.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,211 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Switched to Arch Linux (...Again) | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="I have probably installed Arch Linux ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There’s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.
|
||||
My main computer for a long time was a 2014 13-inch Macbook Pro.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Switched to Arch Linux (...Again)
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/arch-linux-logo.png" alt="Arch Linux logo" />
|
||||
</p>
|
||||
<p>I have probably installed <a href="https://archlinux.org/">Arch Linux</a> ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There’s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.</p>
|
||||
<p>My main computer for a long time was a 2014 13-inch Macbook Pro. I didn’t have space in a one bedroom apartment for a desktop so I made the most with what I had. This year I moved into a two bedroom with my girlfriend and I have an office now so I built my dream gaming computer. I was in such a hurry to play some games that I picked a distro that was easy to install, but close enough to Arch, and that was Manjaro. Overall, I was very happy with the experience Manjaro has: it was easy to install, had some cool layouts for Gnome, it had some good programs installed by default. It still just didn’t feel like it was mine.</p>
|
||||
<p>Bonus: my entire system runs idle with 1.25GB memory which is roughly 50% lower than in Manjaro. I’m not sure what was using up that much RAM before but but it feels good to know now.</p>
|
||||
<p>So… btw I run arch</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,234 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>UFW VPN Kill Switch | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="NetworkManager unfortunately doesn’t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I’m using ufw here but you can achieve the same using iptables or firewall-cmd. I haven’t looked into automating this when VPN connects yet but opening Gufw and switching the profile hasn’t become annoying yet either. If I ever get around to that I’ll post an update.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
UFW VPN Kill Switch
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/old-switch.jpg" alt="Old wall switch" />
|
||||
</p>
|
||||
<p>NetworkManager unfortunately doesn’t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I’m using <a href="https://wiki.archlinux.org/index.php/Uncomplicated_Firewall">ufw</a> here but you can achieve the same using iptables or firewall-cmd. I haven’t looked into automating this when VPN connects yet but opening <a href="https://gufw.org/">Gufw</a> and switching the profile hasn’t become annoying yet either. If I ever get around to that I’ll post an update.</p>
|
||||
<p>Gufw’s UI is very good and the advanced tab in it’s rules creator has everything I need: interface, direction, to/from IP and port ranges so I use that over setting rules from the command line.</p>
|
||||
<ul>
|
||||
<li>First, set up the kill switch profile to easily turn rules on and off as needed. You’ll want to set incoming and outgoing to deny:</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/gufw-kill-switch.png" alt="Gufw Kill Switch Profile" />
|
||||
</p>
|
||||
<ul>
|
||||
<li>Optionally, create rules to allow traffic out (and in from if you like) to the local network. You can use CIDR notation here to add your whole subnet:</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/firewall-rule-wizard-local-out.png" alt="Firewall Rule Wizard" />
|
||||
</p>
|
||||
<ul>
|
||||
<li>If you would like to allow local traffic into your machine be sure to switch your from to be your local CIDR and your <code>to</code> to be <code>any</code>:</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/firewall-rule-wizard-local-in.png" alt="Firewall Rule Wizard" />
|
||||
</p>
|
||||
<ul>
|
||||
<li>In order for your VPN to be able to reconnect if the connection drops, <code>allow</code> any connections out to your VPN servers:</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/firewall-rule-wizard-reconnect.png" alt="Firewall Rule Wizard" />
|
||||
</p>
|
||||
<ul>
|
||||
<li>Finally, <code>allow</code> any traffic out (and in if you like) on the <code>tun0</code> interface. Since we’re blocking all traffic by default this rule is the magic that makes sure that only VPN traffic makes it out (or in):</li>
|
||||
</ul>
|
||||
<p><img loading="lazy" src="/img/firewall-rule-wizard-allow.png" alt="Firewall rule wizard" />
|
||||
</p>
|
||||
<p>That’s it! If you’ve used a VPN client with a kill switch before, ultimately this is how it works under the hood. They’ll have some automation on top to only apply these rules when the VPN is active but the concepts are the same.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,223 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Decrypting a Headless Server on Boot... Remotely | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Like the title says, how do you decrypt a headless server at boot time that has it’s root partition LUKS encrypted.. while not on site? I’ve been running my server for almost two years and I knew this problem would come up eventually so it’s been at the back of my mind for a while. And you know it had to come up at the most inopportune time… 15 minutes before I leave town for a weekend away.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Decrypting a Headless Server on Boot... Remotely
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2020-11-21 00:00:00 +0000 UTC'>November 21, 2020</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/server-room.jpg" alt="" />
|
||||
</p>
|
||||
<p>Like the title says, how do you decrypt a headless server at boot time that has it’s root partition LUKS encrypted.. while not on site? I’ve been running my server for almost two years and I knew this problem would come up eventually so it’s been at the back of my mind for a while. And you know it had to come up at the most inopportune time… 15 minutes before I leave town for a weekend away. After a weekend without access to my network or any of the services I host I finally started working on solving this.</p>
|
||||
<p>Quick primer on the typical Linux boot process: when you start your computer it loads a minimal OS called <code>initramfs</code> that knows how to decrypt your root and data partitions and start the boot process. <code>initramfs</code> is configured a few different ways, I’m on a RHEL based distro so I used dracut to configure it. Arch based distros use <code>mkinitramfs</code>. Unsure about Ubuntu since I prefer real operating systems ;)</p>
|
||||
<p>There’s really two routes to take to solving this problem: fully automatic (bad security posture) and manual intervention (good security but inconvenient). The automatic path means writing the keys in plain text in the <code>initramfs</code> and the thought of plain text keys makes me full body cringe. It’s like having a safe with your combination on a Sticky Note next to the dial: why even have a safe? So I knew I needed to find a way to reach my box remotely during the initial boot process.</p>
|
||||
<p>Luckily, this was fairly easy to implement. I found a very good Github repo <a href="https://github.com/gsauthof/dracut-sshd">https://github.com/gsauthof/dracut-sshd</a> with full instructions. It does have a couple different options so here’s what I did:</p>
|
||||
<p>I initially tried to go the systemd-networkd path but was not able to get it working. I instead had to add a network module to <code>initramfs</code>:</p>
|
||||
<pre tabindex="0"><code>~$ echo 'add_dracutmodules+=" network "' >> /etc/dracut.conf.d/90-networkd.conf
|
||||
</code></pre><p>Next you’ll want to put your public key in <code>/root/.ssh/authorized_keys</code>. You should generally generate a new public/private keypair for each new user/service:</p>
|
||||
<pre tabindex="0"><code>~$ ssh-keygen -t ed25519 && cat ~/.ssh/id_ed25519.pub >> /root/.ssh/authorized_keys
|
||||
</code></pre><p>Then it was as simple as adding the <code>46sshd</code> folder from the <code>dracut-sshd</code> repo to <code>/usr/lib/dracut/modules.d/</code> and rebuilding <code>initramfs</code>:</p>
|
||||
<pre tabindex="0"><code>~$ git clone https://github.com/gsauthof/dracut-sshd.git ~/dracut-sshd
|
||||
~$ mv ~/dracut-sshd/46sshd /usr/lib/dracut/modules.d
|
||||
~$ dracut -v -f
|
||||
</code></pre><p>The <code>Permission denied (public key)</code> issue described in the FAQ happened to me. Fixed by:</p>
|
||||
<pre tabindex="0"><code>~$ usermod -p '*' root
|
||||
</code></pre><p>That’s it! Restart your server and SSH in, run the Systemd ask password agent:</p>
|
||||
<pre tabindex="0"><code>~$ systemd-tty-ask-password-agent
|
||||
</code></pre><p>I hope this helps someone. If I would’ve known it was this easy I would’ve done it two years ago and never worried about how to reach home after the power goes out!</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,220 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Containers, Home Labs, and AI | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="It’s been a while since I’ve posted! Thought I’d give an update on a recent change I made in my home lab I’m calling “The Great VM Migration” but do it as a thinly veiled demonstration of something far cooler, ChatGPT. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying “Not quite what I meant, …” and explaining where it got it wrong.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Containers, Home Labs, and AI
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2023-01-14 00:00:00 +0000 UTC'>January 14, 2023</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/stacked-containers.jpg" alt="Photo by <a href="https://unsplash.com/@guibolduc?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Guillaume Bolduc</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<p>It’s been a while since I’ve posted! Thought I’d give an update on a recent change I made in my home lab I’m calling “The Great VM Migration” but do it as a thinly veiled demonstration of something far cooler, <a href="https://chat.openai.com/">ChatGPT</a>. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying “Not quite what I meant, …” and explaining where it got it wrong. And it fixed it… we’ll all be out of a job someday because of this but here we go. What follows is ChatGPT talking about updates I made to my home lab.</p>
|
||||
<blockquote>
|
||||
<p>It’s been a while since I’ve posted about my home lab, but I wanted to share some exciting news. I recently made the switch from using virtual machines (VMs) to containerization with Docker, and it’s been a game-changer.</p>
|
||||
<p>As a senior engineer, I understand the importance of a well-maintained home lab. It’s a valuable tool for experimenting with new technologies, testing out configurations, and honing our skills. However, managing multiple VMs can be a real headache. That’s why I made the switch to Docker, and it’s been a huge improvement.</p>
|
||||
<p>Docker allows developers to create, deploy, and run applications in containers. These containers are lightweight, portable, and share the host system’s kernel, making it more efficient in terms of resources. In contrast, VMs are heavyweight and require more resources to run. With Docker, I can run more services on the same hardware, making it more resource-efficient.</p>
|
||||
<p>One of the biggest advantages of using Docker over VMs is the ease of maintenance. With VMs, updating, patching and troubleshooting each individual machine can be a tedious and time-consuming task. With Docker, I can update and patch at the container level, making it much simpler to manage. Additionally, because containers are isolated from one another, it’s easy to see which containers are running and what services they are providing. This helps to reduce the clutter and make it easier to understand the overall architecture of my home lab.</p>
|
||||
<p>Another advantage of using Docker is the speed at which I can launch new services. With VMs, the process of setting up a new machine, installing the operating system, configuring the network and so on can be quite time-consuming. With Docker, I can launch new services as containers in a matter of minutes. This is particularly useful when I am experimenting with new technologies or trying out different configurations.</p>
|
||||
<p>But the benefits don’t stop there. To provide secure public access to my services on demand, I set up a cloud-based nginx reverse proxy. This reverse proxy is publicly accessible, but it connects to my home lab over a VPN, only exposing the services that I want to be public. This allows me to access my services remotely, while also keeping them secure behind a VPN connection. This is particularly useful when I need to share my services with colleagues or demonstrate them to clients.</p>
|
||||
<p>In conclusion, upgrading my home lab to use Docker containers was a wise decision. Not only does it provide a more efficient and organized solution, but it also greatly reduces the maintenance burden and decreases time to launch for services. The ease of use, speed, and portability of Docker containers make them a perfect fit for home lab environments. With the added security of a cloud-based nginx reverse proxy connecting over VPN, I am able to access my services securely and on demand. I should have done it sooner, but I’m glad I finally made the switch.</p>
|
||||
</blockquote>
|
||||
<p>I didn’t edit the above text. Any changes were conversational corrections given to ChatGPT itself and it was asked to regenerate the post. I started high level: “write me a blog post about migrating my home lab from VMs to Docker containers.” It spit out a pretty passable blog post but it didn’t have my conversational voice. So I told it, “Write that same post but more conversational and engaging.” And it did. Then I felt like it didn’t have a ton of substance (it still doesn’t but there’s more than there was); so, I asked it to provide more detail and from the perspective of a senior engineer. Now we’re getting somewhere.</p>
|
||||
<p>From there I wanted to make a specific point that by Dockerizing my home lab I’m able to spin up new services much faster. So I asked it to make that change. Added, no problem. Up until now I’m impressed and pretty beside myself that this model was able to handle everything I’d thrown at it so far. So I decided to give it something a bit harder; I asked it to “Include another section about using a cloud nginx reverse proxy over VPN to provide secure public access on demand.” It added the section and did exactly what I told it, which was “the reverse proxy is publicly accessible over the VPN” and that’s not quite right. I explained the difference by telling ChatGPT, “The nginx reverse proxy is public but connects to the home lab over VPN and only exposes the services I want to be public.” And it fixed it.</p>
|
||||
<p>This thing is some kind of arcane wizardry or black magic because it doesn’t feel real. This model is going to change the world. Maybe for the better, maybe for the worse but it is an incredible tool. It’s like having a dedicated assistant who has read every book, visited every website, and can answer any question. Maybe not always correctly, but you can ask it for sources to follow up on. Used in the right way this is a force multiplier like the world has never seen and it’s only going to get better.</p>
|
||||
<p>(And I asked it plagarism rules before posting this which it explained to me and asked me politely to please cite the original source. So thanks for the blog post, ChatGPT.)</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,220 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Sorting Digital Life | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Sorting out your digital life How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right?">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2023/03/sorting-digital-life/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Sorting Digital Life
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2023-03-19 00:00:00 +0000 UTC'>March 19, 2023</span>
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><h2 id="sorting-out-your-digital-life">Sorting out your digital life<a hidden class="anchor" aria-hidden="true" href="#sorting-out-your-digital-life">#</a></h2>
|
||||
<p>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right? Cambridge Analytica was the real kick in the pants I needed to sort out my digital life.</p>
|
||||
<h3 id="cleaning-up">Cleaning up<a hidden class="anchor" aria-hidden="true" href="#cleaning-up">#</a></h3>
|
||||
<p>Starting a privacy journey there’s an overwhelming feeling of “My data is already out there so there’s nothing I can do now.” The value of your data is in the current picture of you, your interests, your thoughts which companies use to make predictions. You don’t have to continue to feed the system; you have to break that link.</p>
|
||||
<p>You have two options:</p>
|
||||
<ul>
|
||||
<li>You can delete the accounts and find ways to solve for the functionality they provided as you go. This is what I did and it was hard but the privacy benefit was immediate. It also kept me accountable and made it difficult to return to the walled gardens.</li>
|
||||
<li>You can find services that replace centralized services and stop using them piecemeal. You may find this easier to do because you don’t hard-cut the functionality you’ve come to rely on. It will take a long time and there will be myriad ways to backslide into giving up.</li>
|
||||
</ul>
|
||||
<p>This first step is probably the biggest benefit you can have by not participating in privacy violating services in the first place. Diminishing returns and the <a href="https://en.wikipedia.org/wiki/Pareto_principle">80/20 rule</a> is in play here: 80% of the benefit can be had with 20% of the work just by deleting and not using the obvious big offenders. The rest of the points here will be 80% of the work (and cost) to claw back that last remaining 10-20% of your privacy.</p>
|
||||
<h3 id="stopping-tracking">Stopping tracking<a hidden class="anchor" aria-hidden="true" href="#stopping-tracking">#</a></h3>
|
||||
<p>Most of you probably haven’t seen the telemetry that your devices are sending. Out of sight; out of mind. Something that was very eye-opening to me was installing a <a href="https://pi-hole.net/">Pi-Hole</a> on my home network. Seeing hundreds of thousands of phone-home requests going out to places all around the Internet was haunting to see. Some devices were contacting tracking services constantly. Pi-Hole is a great device to stop those requests getting out.</p>
|
||||
<p><a href="https://ublockorigin.com">UBlock Origin</a> gets installed on all my browsers, desktop and mobile, with every list enabled. This blocks sites loading scripts. You can go too far with this by blocking all scripts which will break most sites. I tried that for some time and the downsides for usability weren’t worth the few extra percentage points of privacy.</p>
|
||||
<p>One of the easiest things you can do is use Firefox and turn on <a href="https://support.mozilla.org/en-US/kb/enhanced-tracking-protection-firefox-desktop">Enhanced Tracking Protection</a> at it’s strict setting. This blocks most <a href="https://en.wikipedia.org/wiki/Device_fingerprint">device fingerprinting</a>, that can uniquely identify you as you travel around the Internet, and cross site cookies and trackers.</p>
|
||||
<h3 id="device-security">Device security<a hidden class="anchor" aria-hidden="true" href="#device-security">#</a></h3>
|
||||
<p>This deserves a whole series of posts on its own but if you don’t fully control the devices you can’t ever really be secure and private. Windows and MacOS both leak all kinds of data to their parent companies. The telemetry and data collection are baked into the operating systems and you can never really get rid of it.</p>
|
||||
<p>Running Linux is the only way to have full control over your systems. Again, you can go really deep and refuse to run any closed-source software (ahem.. <a href="https://en.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a>). That pesky 80/20 rule shows up here again and you’ll have to decide the trade-offs you’re willing to make for convenience and usability. If you run a mainstream distro like Ubuntu or Fedora you’ll get enough benefit for most people.</p>
|
||||
<p>Privacy with mobile devices has come a long way. I choose to run <a href="https://calyxos.org/">CalyxOS</a> on a Pixel phone for a 100% de-Googled experience. I can download all the apps in the Google Play Store without a Google account with the <a href="https://gitlab.com/AuroraOSS/AuroraStore">Aurora Store</a>. CalyxOS has an option to install with <a href="https://microg.org/">MicroG</a> which is a privacy respecting implementation of Google Play Services which sends as little data as possible to Google. This makes things like push notifications and maps/GPS possible. But I choose apps from the open source <a href="https://f-droid.org/">F-Droid</a> store where ever possible since they’re open source.</p>
|
||||
<h3 id="hosting">Hosting<a hidden class="anchor" aria-hidden="true" href="#hosting">#</a></h3>
|
||||
<p>One of the biggest digital life boons for me has been running a personal server. It lets me host my own privacy respecting FOSS services that replicate all kinds of centralized services. Google Drive replacement? <a href="https://nextcloud.com/">Nextcloud</a>. GitHub replacement? <a href="https://gitea.io/en-us/">Gitea</a>. 1Password/LastPass replacement? <a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a>. Netflix/Hulu/etc replacement? <a href="https://www.plex.tv/">Plex</a> or <a href="https://jellyfin.org/">Jellyfin</a>. News/Feedly replacement? <a href="https://www.freshrss.org/">FreshRSS</a>. FB Messenger replacement? <a href="https://matrix.org/">Matrix</a>. Find My iPhone replacement? <a href="https://github.com/bilde2910/Hauk">Hauk</a>. And dozens of other different services like a <a href="https://dvdt.dev/running-a-bitcoin-full-node/">Bitcoin node</a>, a <a href="https://suredbits.com/lightning-101-what-is-a-lightning-node/">Lightning node</a>, a <a href="https://nostr.com/relays">Nostr relay</a> and so on.</p>
|
||||
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
|
||||
<p>These days I feel like I have largely achieved the level of privacy I set out for. That doesn’t mean I’m a recluse or a luddite; far from it. But it means I can selectively provide information that I want. Our data is atomically who we are, it’s our lives. And my data is under my own control and that’s freedom. It’s been by far the most rewarding, and fulfilling thing I have done in my life. It’s a topic that’s as wide as it is deep, and I know I’ll never be done learning and growing and I’m glad to be on the journey.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
<span>
|
||||
Powered by
|
||||
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
|
||||
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
|
||||
</span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,227 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Sorting Out Your Digital Life | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right?">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Sorting Out Your Digital Life
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2023-03-19 00:00:00 +0000 UTC'>March 19, 2023</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/matrix-code.jpg" alt="Photo by <a href="https://unsplash.com/@markusspiske?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Markus Spiske</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<p>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right? Cambridge Analytica was the real kick in the pants I needed to sort out my digital life.</p>
|
||||
<h3 id="cleaning-up">Cleaning up<a hidden class="anchor" aria-hidden="true" href="#cleaning-up">#</a></h3>
|
||||
<p>Starting a privacy journey there’s an overwhelming feeling of “My data is already out there so there’s nothing I can do now.” The value of your data is in the current picture of you, your interests, your thoughts which companies use to make predictions. You don’t have to continue to feed the system; you have to break that link.</p>
|
||||
<p>You have two options:</p>
|
||||
<ul>
|
||||
<li>You can delete the accounts and find ways to solve for the functionality they provided as you go. This is what I did and it was hard but the privacy benefit was immediate. It also kept me accountable and made it difficult to return to the walled gardens.</li>
|
||||
<li>You can find services that replace centralized services and stop using them piecemeal. You may find this easier to do because you don’t hard-cut the functionality you’ve come to rely on. It will take a long time and there will be myriad ways to backslide into giving up.</li>
|
||||
</ul>
|
||||
<p>This first step is probably the biggest benefit you can have by not participating in privacy violating services in the first place. Diminishing returns and the <a href="https://en.wikipedia.org/wiki/Pareto_principle">80/20 rule</a> is in play here: 80% of the benefit can be had with 20% of the work just by deleting and not using the obvious big offenders. The rest of the points here will be 80% of the work (and cost) to claw back that last remaining 10-20% of your privacy.</p>
|
||||
<h3 id="stopping-tracking">Stopping tracking<a hidden class="anchor" aria-hidden="true" href="#stopping-tracking">#</a></h3>
|
||||
<p>Most of you probably haven’t seen the telemetry that your devices are sending. Out of sight; out of mind. Something that was very eye-opening to me was installing a <a href="https://pi-hole.net/">Pi-Hole</a> on my home network. Seeing hundreds of thousands of phone-home requests going out to places all around the Internet was haunting to see. Some devices were contacting tracking services constantly. Pi-Hole is a great device to stop those requests getting out.</p>
|
||||
<p><a href="https://ublockorigin.com">UBlock Origin</a> gets installed on all my browsers, desktop and mobile, with every list enabled. This blocks sites loading scripts. You can go too far with this by blocking all scripts which will break most sites. I tried that for some time and the downsides for usability weren’t worth the few extra percentage points of privacy.</p>
|
||||
<p>One of the easiest things you can do is use Firefox and turn on <a href="https://support.mozilla.org/en-US/kb/enhanced-tracking-protection-firefox-desktop">Enhanced Tracking Protection</a> at it’s strict setting. This blocks most <a href="https://en.wikipedia.org/wiki/Device_fingerprint">device fingerprinting</a>, that can uniquely identify you as you travel around the Internet, and cross site cookies and trackers.</p>
|
||||
<h3 id="device-security">Device security<a hidden class="anchor" aria-hidden="true" href="#device-security">#</a></h3>
|
||||
<p>This deserves a whole series of posts on its own but if you don’t fully control the devices you can’t ever really be secure and private. Windows and MacOS both leak all kinds of data to their parent companies. The telemetry and data collection are baked into the operating systems and you can never really get rid of it.</p>
|
||||
<p>Running Linux is the only way to have full control over your systems. Again, you can go really deep and refuse to run any closed-source software (ahem.. <a href="https://en.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a>). That pesky 80/20 rule shows up here again and you’ll have to decide the trade-offs you’re willing to make for convenience and usability. If you run a mainstream distro like Ubuntu or Fedora you’ll get enough benefit for most people.</p>
|
||||
<p>Privacy with mobile devices has come a long way. I choose to run <a href="https://calyxos.org/">CalyxOS</a> on a Pixel phone for a 100% de-Googled experience. I can download all the apps in the Google Play Store without a Google account with the <a href="https://gitlab.com/AuroraOSS/AuroraStore">Aurora Store</a>. CalyxOS has an option to install with <a href="https://microg.org/">MicroG</a> which is a privacy respecting implementation of Google Play Services which sends as little data as possible to Google. This makes things like push notifications and maps/GPS possible. But I choose apps from the open source <a href="https://f-droid.org/">F-Droid</a> store where ever possible since they’re open source.</p>
|
||||
<h3 id="hosting">Hosting<a hidden class="anchor" aria-hidden="true" href="#hosting">#</a></h3>
|
||||
<p>One of the biggest digital life boons for me has been running a personal server. It lets me host my own privacy respecting FOSS services that replicate all kinds of centralized services. Google Drive replacement? <a href="https://nextcloud.com/">Nextcloud</a>. GitHub replacement? <a href="https://gitea.io/en-us/">Gitea</a>. 1Password/LastPass replacement? <a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a>. Netflix/Hulu/etc replacement? <a href="https://www.plex.tv/">Plex</a> or <a href="https://jellyfin.org/">Jellyfin</a>. News/Feedly replacement? <a href="https://www.freshrss.org/">FreshRSS</a>. FB Messenger replacement? <a href="https://matrix.org/">Matrix</a>. Find My iPhone replacement? <a href="https://github.com/bilde2910/Hauk">Hauk</a>. And dozens of other different services like a <a href="https://dvdt.dev/running-a-bitcoin-full-node/">Bitcoin node</a>, a <a href="https://suredbits.com/lightning-101-what-is-a-lightning-node/">Lightning node</a>, a <a href="https://nostr.com/relays">Nostr relay</a> and so on.</p>
|
||||
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
|
||||
<p>These days I feel like I have largely achieved the level of privacy I set out for. That doesn’t mean I’m a recluse or a luddite; far from it. But it means I can selectively provide information that I want. Our data is atomically who we are, it’s our lives. And my data is under my own control and that’s freedom. It’s been by far the most rewarding, and fulfilling thing I have done in my life. It’s a topic that’s as wide as it is deep, and I know I’ll never be done learning and growing and I’m glad to be on the journey.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,218 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Freedom Tech | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Freedom dies by people just taking little bit more and a little bit more… we just end up in a situation people are like “How the fuck did we end up here?” And at some point down the line you have to practice civil disobedience and say: “No, I will not fucking comply.”
|
||||
Matt Odell https://odell.xyz
|
||||
Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2023/07/freedom-tech/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
Freedom Tech
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2023-07-18 00:00:00 +0000 UTC'>July 18, 2023</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/nostrich.jpg" alt="Photo by <a href="https://unsplash.com/@photosimon?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Simon Infanger</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<blockquote>
|
||||
<p>Freedom dies by people just taking little bit more and a little bit more… we just end up in a situation people are like “How the fuck did we end up here?” And at some point down the line you have to practice civil disobedience and say: “No, I will not fucking comply.”</p>
|
||||
<p>Matt Odell
|
||||
<a href="https://odell.xyz">https://odell.xyz</a></p>
|
||||
</blockquote>
|
||||
<p>Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important. I really enjoyed the podcast. For years now I’ve been cutting out services that someone else controls. Algorithms can be used to manipulate us. Centralized platforms can censor us. Nostr (Notes and Other Stuff Transmitted by Relays) is Freedom Tech that fixes all of the problems I’ve had with centralized platforms and I am extremely bullish on it’s future.</p>
|
||||
<p>Nostr is very simply a protocol for communicating. That’s it. Like RSS, or SMTP, or HTTP, or IP… It isn’t a platform. It isn’t an application. It doesn’t have content algorithms force feeding you things you don’t want to see. It’s a self curated feed of people you follow. It’s interoperable between clients which means I can use Amethyst and you can use Damus and we can still interact. It means I can decide to switch to another app and all my followers come with me. If app developers decide to behave badly I can write my own application in an afternoon. I host my own relay (wss://nostr.dvdt.dev) which means my notes are available for anyone to read as long as I feel like hosting them and no one can stop them.</p>
|
||||
<p>Nostr is also monetized with Bitcoin. Zaps (lightning network payments) are built into the protocol. You can charge someone satoshis to let them use your relay. You can zap posts you like to support people doing or saying things you like. And all kinds of extensions have been written through NIPs (Nostr Improvement Possibilities) that add functionality to the protocol for marketplaces, communities (Reddit), and even events a la Facebook Events.</p>
|
||||
<p>Nostr is unstoppable and it’s going to eat everything in the next few years. It’s as important and as foundational as IP.</p>
|
||||
<p>You can find this Nostrich here: npub1mcneaunh0n9qy54sse0vr06nwhejzghumfjlmu3r54ugwx83qhlshqwtll</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,209 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>The Filter | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="I don’t publish very frequently and it’s because I feel like this site represents my public image and the things I put here should be somewhat polished since it’s “how the world will see me.” If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it’s not good enough to publish.
|
||||
But in truth, I’m not always polished.">
|
||||
<meta name="author" content="David Lick">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/2023/07/the-filter/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
The Filter
|
||||
</h1>
|
||||
<div class="post-meta"><span title='2023-07-16 00:00:00 +0000 UTC'>July 16, 2023</span> · David Lick
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><p><img loading="lazy" src="/img/camera-filter-city.jpg" alt="Photo by <a href="https://unsplash.com/@eugenechystiakov?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Eugene Chystiakov</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a>" />
|
||||
</p>
|
||||
<p>I don’t publish very frequently and it’s because I feel like this site represents my public image and the things I put here should be somewhat polished since it’s “how the world will see me.” If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it’s not good enough to publish.</p>
|
||||
<p>But in truth, I’m not always polished. I don’t always have popular opinions. I don’t always have the right words to say. Which means I’m not really representing myself but a filtered version of me. And maybe what I should put out there should be a little more stream of conscious. More raw and more authentic. And more me.</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,183 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>404 Page not found | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/404.html">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
<div class="not-found">404</div>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,216 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="about me Hi, my name is David and I’m a software engineering manager and team lead.
|
||||
I believe that information should be free and I’m interested in the technologies that enable it’s delivery. I’ve long been a supporter of the principles of net neutrality and I think they should be enshrined in law. At the same time I’m inspired by all the work that’s gone into enforcing our rights digitally by building systems outside of the legal to protect free speech.">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/about-me/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span class="active">about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
|
||||
</h1>
|
||||
<div class="post-meta">
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><h2 id="about-me">about me<a hidden class="anchor" aria-hidden="true" href="#about-me">#</a></h2>
|
||||
<p><img loading="lazy" src="/img/david-and-izzy.jpg" alt="Me and my dog Izzy." />
|
||||
</p>
|
||||
<p>Hi, my name is David and I’m a software engineering manager and team lead.</p>
|
||||
<p>I believe that information should be free and I’m interested in the technologies that enable it’s delivery. I’ve long been a supporter of the principles of net neutrality and I think they should be enshrined in law. At the same time I’m inspired by all the work that’s gone into enforcing our rights digitally by building systems outside of the legal to protect free speech.</p>
|
||||
<p>I subscribe to <a href="http://sl4.org/crocker.html">Crocker’s Rules</a>.</p>
|
||||
<p><del>The only other social media where you’ll find me is my Mastodon instance: <a href="https://mastodon.dvdt.dev/@david?ref=dvdt.dev">@david on Mastodon</a></del></p>
|
||||
<p>There’s a new decentralized social media built around the <a href="https://nostr.com/">Nostr protocol</a> which solves a lot of the centralization and <a href="https://nostr.com/comparisons/mastodon">censorship problems Mastodon has</a>. Similar also to <a href="https://ssbc.github.io/scuttlebutt-protocol-guide/">Secure ScuttleButt</a> but without the focus on <a href="https://nostr.com/comparisons/ssb">local only asynchronous communication paradigm</a> which solves some core usability problems with SSB. I host a Nostr relay which is locked down to close friends at the moment. If you want to use it get in touch with me and I’m happy to add you.</p>
|
||||
<hr>
|
||||
<p><a href="https://dhl-space.sfo2.digitaloceanspaces.com/David%20Lick%20(C8130C90)%20%E2%80%93%20Public.asc">PGP Public Key</a></p>
|
||||
<p>Fingerprint: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,189 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Categories | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/categories/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<link rel="alternate" type="application/rss+xml" href="https://new.dvdt.dev/categories/index.xml">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
<header class="page-header">
|
||||
<h1>Categories</h1>
|
||||
</header>
|
||||
|
||||
<ul class="terms-tags">
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Categories on dvdt.dev</title>
|
||||
<link>https://new.dvdt.dev/categories/</link>
|
||||
<description>Recent content in Categories on dvdt.dev</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language><atom:link href="https://new.dvdt.dev/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||
</channel>
|
||||
</rss>
|
||||
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 668 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 5.1 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 926 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
@@ -0,0 +1,309 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head>
|
||||
<meta name="generator" content="Hugo 0.111.3"><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>dvdt.dev</title>
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<link rel="alternate" type="application/rss+xml" href="https://new.dvdt.dev/index.xml">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="first-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Freedom Tech
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Freedom dies by people just taking little bit more and a little bit more… we just end up in a situation people are like “How the fuck did we end up here?” And at some point down the line you have to practice civil disobedience and say: “No, I will not fucking comply.”
|
||||
Matt Odell https://odell.xyz
|
||||
Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-07-18 00:00:00 +0000 UTC'>July 18, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Freedom Tech" href="https://new.dvdt.dev/2023/07/freedom-tech/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>The Filter
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I don’t publish very frequently and it’s because I feel like this site represents my public image and the things I put here should be somewhat polished since it’s “how the world will see me.” If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it’s not good enough to publish.
|
||||
But in truth, I’m not always polished....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-07-16 00:00:00 +0000 UTC'>July 16, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to The Filter" href="https://new.dvdt.dev/2023/07/the-filter/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Sorting Out Your Digital Life
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right?...</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-03-19 00:00:00 +0000 UTC'>March 19, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Sorting Out Your Digital Life" href="https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Containers, Home Labs, and AI
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>It’s been a while since I’ve posted! Thought I’d give an update on a recent change I made in my home lab I’m calling “The Great VM Migration” but do it as a thinly veiled demonstration of something far cooler, ChatGPT. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying “Not quite what I meant, …” and explaining where it got it wrong....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-01-14 00:00:00 +0000 UTC'>January 14, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Containers, Home Labs, and AI" href="https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Decrypting a Headless Server on Boot... Remotely
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Like the title says, how do you decrypt a headless server at boot time that has it’s root partition LUKS encrypted.. while not on site? I’ve been running my server for almost two years and I knew this problem would come up eventually so it’s been at the back of my mind for a while. And you know it had to come up at the most inopportune time… 15 minutes before I leave town for a weekend away....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-11-21 00:00:00 +0000 UTC'>November 21, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Decrypting a Headless Server on Boot... Remotely" href="https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Switched to Arch Linux (...Again)
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I have probably installed Arch Linux ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There’s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.
|
||||
My main computer for a long time was a 2014 13-inch Macbook Pro....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Switched to Arch Linux (...Again)" href="https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>UFW VPN Kill Switch
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>NetworkManager unfortunately doesn’t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I’m using ufw here but you can achieve the same using iptables or firewall-cmd. I haven’t looked into automating this when VPN connects yet but opening Gufw and switching the profile hasn’t become annoying yet either. If I ever get around to that I’ll post an update....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to UFW VPN Kill Switch" href="https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Hardware Wallets
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Let’s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. Trezor and Ledger are the two I have experience with personally.
|
||||
Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-07-24 00:00:00 +0000 UTC'>July 24, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Hardware Wallets" href="https://new.dvdt.dev/2020/07/hardware-wallets/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>InterPlanetary File System
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>What will the Internet look like for colonists on Mars? It seems like a silly question since we’re far away from having boots on the ground on our red planet neighbor. We’ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-06-25 00:00:00 +0000 UTC'>June 25, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to InterPlanetary File System" href="https://new.dvdt.dev/2020/06/interplanetary-file-system/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Running a Bitcoin Full Node
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don’t if you like sleep at all…) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I’d ever had at once and turned it off....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-06-13 00:00:00 +0000 UTC'>June 13, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Running a Bitcoin Full Node" href="https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/"></a>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>dvdt.dev</title>
|
||||
<link>https://new.dvdt.dev/</link>
|
||||
<description>Recent content on dvdt.dev</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language>
|
||||
<lastBuildDate>Tue, 18 Jul 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://new.dvdt.dev/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Freedom Tech</title>
|
||||
<link>https://new.dvdt.dev/2023/07/freedom-tech/</link>
|
||||
<pubDate>Tue, 18 Jul 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/07/freedom-tech/</guid>
|
||||
<description>Freedom dies by people just taking little bit more and a little bit more&hellip; we just end up in a situation people are like &ldquo;How the fuck did we end up here?&rdquo; And at some point down the line you have to practice civil disobedience and say: &ldquo;No, I will not fucking comply.&rdquo;
|
||||
Matt Odell https://odell.xyz
|
||||
Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Filter</title>
|
||||
<link>https://new.dvdt.dev/2023/07/the-filter/</link>
|
||||
<pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/07/the-filter/</guid>
|
||||
<description>I don&rsquo;t publish very frequently and it&rsquo;s because I feel like this site represents my public image and the things I put here should be somewhat polished since it&rsquo;s &ldquo;how the world will see me.&rdquo; If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it&rsquo;s not good enough to publish.
|
||||
But in truth, I&rsquo;m not always polished.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Sorting Out Your Digital Life</title>
|
||||
<link>https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/</link>
|
||||
<pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/</guid>
|
||||
<description>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of &ldquo;digital hygiene&rdquo; that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn&rsquo;t quite understand why I should care. Google&rsquo;s motto was &ldquo;Do no evil&rdquo; so they&rsquo;re trustworthy, right?</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Containers, Home Labs, and AI</title>
|
||||
<link>https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/</link>
|
||||
<pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/</guid>
|
||||
<description>It&rsquo;s been a while since I&rsquo;ve posted! Thought I&rsquo;d give an update on a recent change I made in my home lab I&rsquo;m calling &ldquo;The Great VM Migration&rdquo; but do it as a thinly veiled demonstration of something far cooler, ChatGPT. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying &ldquo;Not quite what I meant, &hellip;&rdquo; and explaining where it got it wrong.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Decrypting a Headless Server on Boot... Remotely</title>
|
||||
<link>https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/</link>
|
||||
<pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/</guid>
|
||||
<description>Like the title says, how do you decrypt a headless server at boot time that has it&rsquo;s root partition LUKS encrypted.. while not on site? I&rsquo;ve been running my server for almost two years and I knew this problem would come up eventually so it&rsquo;s been at the back of my mind for a while. And you know it had to come up at the most inopportune time&hellip; 15 minutes before I leave town for a weekend away.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Switched to Arch Linux (...Again)</title>
|
||||
<link>https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/</link>
|
||||
<pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/</guid>
|
||||
<description>I have probably installed Arch Linux ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There&rsquo;s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.
|
||||
My main computer for a long time was a 2014 13-inch Macbook Pro.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>UFW VPN Kill Switch</title>
|
||||
<link>https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/</link>
|
||||
<pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/</guid>
|
||||
<description>NetworkManager unfortunately doesn&rsquo;t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I&rsquo;m using ufw here but you can achieve the same using iptables or firewall-cmd. I haven&rsquo;t looked into automating this when VPN connects yet but opening Gufw and switching the profile hasn&rsquo;t become annoying yet either. If I ever get around to that I&rsquo;ll post an update.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Hardware Wallets</title>
|
||||
<link>https://new.dvdt.dev/2020/07/hardware-wallets/</link>
|
||||
<pubDate>Fri, 24 Jul 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/07/hardware-wallets/</guid>
|
||||
<description>Let&rsquo;s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. Trezor and Ledger are the two I have experience with personally.
|
||||
Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>InterPlanetary File System</title>
|
||||
<link>https://new.dvdt.dev/2020/06/interplanetary-file-system/</link>
|
||||
<pubDate>Thu, 25 Jun 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/06/interplanetary-file-system/</guid>
|
||||
<description>What will the Internet look like for colonists on Mars? It seems like a silly question since we&rsquo;re far away from having boots on the ground on our red planet neighbor. We&rsquo;ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Running a Bitcoin Full Node</title>
|
||||
<link>https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/</link>
|
||||
<pubDate>Sat, 13 Jun 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/</guid>
|
||||
<description>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don&rsquo;t if you like sleep at all&hellip;) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I&rsquo;d ever had at once and turned it off.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://new.dvdt.dev/about-me/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/about-me/</guid>
|
||||
<description>about me Hi, my name is David and I&rsquo;m a software engineering manager and team lead.
|
||||
I believe that information should be free and I&rsquo;m interested in the technologies that enable it&rsquo;s delivery. I&rsquo;ve long been a supporter of the principles of net neutrality and I think they should be enshrined in law. At the same time I&rsquo;m inspired by all the work that&rsquo;s gone into enforcing our rights digitally by building systems outside of the legal to protect free speech.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://new.dvdt.dev/pages/about-me/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/pages/about-me/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://new.dvdt.dev/support/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/support/</guid>
|
||||
<description>support If you like something I write and want to support it please consider sending me whatever amount of sats you think it&rsquo;s worth through the Lightning network.
|
||||
LNURL1DP68GURN8GHJ7MRWVF5HGUEWV3MXGAPWV3JHVTMVDE6HYMRS9A5KVEZTFP6SJ5TUYD
|
||||
LN Address: pay@dvdt.dev</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<title>https://new.dvdt.dev/</title>
|
||||
<link rel="canonical" href="https://new.dvdt.dev/">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="refresh" content="0; url=https://new.dvdt.dev/">
|
||||
</head>
|
||||
</html>
|
||||
@@ -0,0 +1,201 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content=" - dvdt.dev">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/pages/about-me/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
|
||||
</h1>
|
||||
<div class="post-meta">
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,200 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Pages | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Pages - dvdt.dev">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/pages/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<link rel="alternate" type="application/rss+xml" href="https://new.dvdt.dev/pages/index.xml">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
<header class="page-header">
|
||||
<h1>
|
||||
Pages
|
||||
</h1>
|
||||
</header>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p></p>
|
||||
</div>
|
||||
<footer class="entry-footer"></footer>
|
||||
<a class="entry-link" aria-label="post link to " href="https://new.dvdt.dev/pages/about-me/"></a>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Pages on dvdt.dev</title>
|
||||
<link>https://new.dvdt.dev/pages/</link>
|
||||
<description>Recent content in Pages on dvdt.dev</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language><atom:link href="https://new.dvdt.dev/pages/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://new.dvdt.dev/pages/about-me/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/pages/about-me/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<title>https://new.dvdt.dev/pages/</title>
|
||||
<link rel="canonical" href="https://new.dvdt.dev/pages/">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="refresh" content="0; url=https://new.dvdt.dev/pages/">
|
||||
</head>
|
||||
</html>
|
||||
@@ -0,0 +1,313 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Posts | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="Posts - dvdt.dev">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/posts/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<link rel="alternate" type="application/rss+xml" href="https://new.dvdt.dev/posts/index.xml">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
<header class="page-header">
|
||||
<h1>
|
||||
Posts
|
||||
</h1>
|
||||
</header>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Freedom Tech
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Freedom dies by people just taking little bit more and a little bit more… we just end up in a situation people are like “How the fuck did we end up here?” And at some point down the line you have to practice civil disobedience and say: “No, I will not fucking comply.”
|
||||
Matt Odell https://odell.xyz
|
||||
Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-07-18 00:00:00 +0000 UTC'>July 18, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Freedom Tech" href="https://new.dvdt.dev/2023/07/freedom-tech/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>The Filter
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I don’t publish very frequently and it’s because I feel like this site represents my public image and the things I put here should be somewhat polished since it’s “how the world will see me.” If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it’s not good enough to publish.
|
||||
But in truth, I’m not always polished....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-07-16 00:00:00 +0000 UTC'>July 16, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to The Filter" href="https://new.dvdt.dev/2023/07/the-filter/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Sorting Out Your Digital Life
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of “digital hygiene” that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn’t quite understand why I should care. Google’s motto was “Do no evil” so they’re trustworthy, right?...</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-03-19 00:00:00 +0000 UTC'>March 19, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Sorting Out Your Digital Life" href="https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Containers, Home Labs, and AI
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>It’s been a while since I’ve posted! Thought I’d give an update on a recent change I made in my home lab I’m calling “The Great VM Migration” but do it as a thinly veiled demonstration of something far cooler, ChatGPT. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying “Not quite what I meant, …” and explaining where it got it wrong....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2023-01-14 00:00:00 +0000 UTC'>January 14, 2023</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Containers, Home Labs, and AI" href="https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Decrypting a Headless Server on Boot... Remotely
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Like the title says, how do you decrypt a headless server at boot time that has it’s root partition LUKS encrypted.. while not on site? I’ve been running my server for almost two years and I knew this problem would come up eventually so it’s been at the back of my mind for a while. And you know it had to come up at the most inopportune time… 15 minutes before I leave town for a weekend away....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-11-21 00:00:00 +0000 UTC'>November 21, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Decrypting a Headless Server on Boot... Remotely" href="https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Switched to Arch Linux (...Again)
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I have probably installed Arch Linux ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There’s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.
|
||||
My main computer for a long time was a 2014 13-inch Macbook Pro....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Switched to Arch Linux (...Again)" href="https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>UFW VPN Kill Switch
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>NetworkManager unfortunately doesn’t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I’m using ufw here but you can achieve the same using iptables or firewall-cmd. I haven’t looked into automating this when VPN connects yet but opening Gufw and switching the profile hasn’t become annoying yet either. If I ever get around to that I’ll post an update....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-10-11 00:00:00 +0000 UTC'>October 11, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to UFW VPN Kill Switch" href="https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Hardware Wallets
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>Let’s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. Trezor and Ledger are the two I have experience with personally.
|
||||
Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-07-24 00:00:00 +0000 UTC'>July 24, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Hardware Wallets" href="https://new.dvdt.dev/2020/07/hardware-wallets/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>InterPlanetary File System
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>What will the Internet look like for colonists on Mars? It seems like a silly question since we’re far away from having boots on the ground on our red planet neighbor. We’ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-06-25 00:00:00 +0000 UTC'>June 25, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to InterPlanetary File System" href="https://new.dvdt.dev/2020/06/interplanetary-file-system/"></a>
|
||||
</article>
|
||||
|
||||
<article class="post-entry">
|
||||
<header class="entry-header">
|
||||
<h2>Running a Bitcoin Full Node
|
||||
</h2>
|
||||
</header>
|
||||
<div class="entry-content">
|
||||
<p>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don’t if you like sleep at all…) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I’d ever had at once and turned it off....</p>
|
||||
</div>
|
||||
<footer class="entry-footer"><span title='2020-06-13 00:00:00 +0000 UTC'>June 13, 2020</span> · David Lick</footer>
|
||||
<a class="entry-link" aria-label="post link to Running a Bitcoin Full Node" href="https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/"></a>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Posts on dvdt.dev</title>
|
||||
<link>https://new.dvdt.dev/posts/</link>
|
||||
<description>Recent content in Posts on dvdt.dev</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language>
|
||||
<lastBuildDate>Tue, 18 Jul 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://new.dvdt.dev/posts/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Freedom Tech</title>
|
||||
<link>https://new.dvdt.dev/2023/07/freedom-tech/</link>
|
||||
<pubDate>Tue, 18 Jul 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/07/freedom-tech/</guid>
|
||||
<description>Freedom dies by people just taking little bit more and a little bit more&hellip; we just end up in a situation people are like &ldquo;How the fuck did we end up here?&rdquo; And at some point down the line you have to practice civil disobedience and say: &ldquo;No, I will not fucking comply.&rdquo;
|
||||
Matt Odell https://odell.xyz
|
||||
Peter McCormack hosted Matt Odell on What Bitcoin Did with discussion focused around why decentralized technology is so important.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Filter</title>
|
||||
<link>https://new.dvdt.dev/2023/07/the-filter/</link>
|
||||
<pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/07/the-filter/</guid>
|
||||
<description>I don&rsquo;t publish very frequently and it&rsquo;s because I feel like this site represents my public image and the things I put here should be somewhat polished since it&rsquo;s &ldquo;how the world will see me.&rdquo; If I write something here I tend to keep a draft for months. Write it and rewrite it again and save it to reread later and decide it&rsquo;s not good enough to publish.
|
||||
But in truth, I&rsquo;m not always polished.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Sorting Out Your Digital Life</title>
|
||||
<link>https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/</link>
|
||||
<pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/</guid>
|
||||
<description>How many people feel like they have a handle on their digital selves? I remember years ago before I embarked on a journey of &ldquo;digital hygiene&rdquo; that I knew that I was just leaking information everywhere. Facebook, Snapchat, Google/Gmail.. Data everywhere, under control from big corporations. It was a feeling of being bare and vulnerable but I didn&rsquo;t quite understand why I should care. Google&rsquo;s motto was &ldquo;Do no evil&rdquo; so they&rsquo;re trustworthy, right?</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Containers, Home Labs, and AI</title>
|
||||
<link>https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/</link>
|
||||
<pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/</guid>
|
||||
<description>It&rsquo;s been a while since I&rsquo;ve posted! Thought I&rsquo;d give an update on a recent change I made in my home lab I&rsquo;m calling &ldquo;The Great VM Migration&rdquo; but do it as a thinly veiled demonstration of something far cooler, ChatGPT. I asked ChatGPT to write this post through a conversation. It got some things wrong, and I corrected it by saying &ldquo;Not quite what I meant, &hellip;&rdquo; and explaining where it got it wrong.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Decrypting a Headless Server on Boot... Remotely</title>
|
||||
<link>https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/</link>
|
||||
<pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/</guid>
|
||||
<description>Like the title says, how do you decrypt a headless server at boot time that has it&rsquo;s root partition LUKS encrypted.. while not on site? I&rsquo;ve been running my server for almost two years and I knew this problem would come up eventually so it&rsquo;s been at the back of my mind for a while. And you know it had to come up at the most inopportune time&hellip; 15 minutes before I leave town for a weekend away.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Switched to Arch Linux (...Again)</title>
|
||||
<link>https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/</link>
|
||||
<pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/</guid>
|
||||
<description>I have probably installed Arch Linux ten times in as many years. I see other distros every once in a while that I want to try out but I always end up back with Arch. There&rsquo;s something very satisfying in knowing exactly what is running on your system down to the process. Having everything hand picked to be exactly what you want just makes it feel like home.
|
||||
My main computer for a long time was a 2014 13-inch Macbook Pro.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>UFW VPN Kill Switch</title>
|
||||
<link>https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/</link>
|
||||
<pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/</guid>
|
||||
<description>NetworkManager unfortunately doesn&rsquo;t have a kill switch in case your VPN connection drops but you can achieve the same effect through firewall rules. I&rsquo;m using ufw here but you can achieve the same using iptables or firewall-cmd. I haven&rsquo;t looked into automating this when VPN connects yet but opening Gufw and switching the profile hasn&rsquo;t become annoying yet either. If I ever get around to that I&rsquo;ll post an update.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Hardware Wallets</title>
|
||||
<link>https://new.dvdt.dev/2020/07/hardware-wallets/</link>
|
||||
<pubDate>Fri, 24 Jul 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/07/hardware-wallets/</guid>
|
||||
<description>Let&rsquo;s talk about hardware wallets. For the uninitiated, a hardware wallet is a device which keeps your Bitcoin safe while also keeping them easily accessible. There are a few trusted varieties so far. Trezor and Ledger are the two I have experience with personally.
|
||||
Hardware wallets work by storing your private keys in a secure chip in the device. When you use the device, your unsigned transaction is sent from the computer to the wallet which then signs the transaction with your keys and sends it back.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>InterPlanetary File System</title>
|
||||
<link>https://new.dvdt.dev/2020/06/interplanetary-file-system/</link>
|
||||
<pubDate>Thu, 25 Jun 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/06/interplanetary-file-system/</guid>
|
||||
<description>What will the Internet look like for colonists on Mars? It seems like a silly question since we&rsquo;re far away from having boots on the ground on our red planet neighbor. We&rsquo;ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Running a Bitcoin Full Node</title>
|
||||
<link>https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/</link>
|
||||
<pubDate>Sat, 13 Jun 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/</guid>
|
||||
<description>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don&rsquo;t if you like sleep at all&hellip;) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I&rsquo;d ever had at once and turned it off.</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<title>https://new.dvdt.dev/posts/</title>
|
||||
<link rel="canonical" href="https://new.dvdt.dev/posts/">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="refresh" content="0; url=https://new.dvdt.dev/posts/">
|
||||
</head>
|
||||
</html>
|
||||
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>https://new.dvdt.dev/</loc>
|
||||
<lastmod>2023-07-18T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2023/07/freedom-tech/</loc>
|
||||
<lastmod>2023-07-18T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/posts/</loc>
|
||||
<lastmod>2023-07-18T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2023/07/the-filter/</loc>
|
||||
<lastmod>2023-07-16T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2023/03/sorting-out-your-digital-life/</loc>
|
||||
<lastmod>2023-03-19T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2023/01/containers-home-labs-and-ai/</loc>
|
||||
<lastmod>2023-01-14T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/11/decrypting-a-headless-server-on-boot...-remotely/</loc>
|
||||
<lastmod>2020-11-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/10/switched-to-arch-linux-...again/</loc>
|
||||
<lastmod>2020-10-11T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/10/ufw-vpn-kill-switch/</loc>
|
||||
<lastmod>2020-10-11T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/07/hardware-wallets/</loc>
|
||||
<lastmod>2020-07-24T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/06/interplanetary-file-system/</loc>
|
||||
<lastmod>2020-06-25T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/</loc>
|
||||
<lastmod>2020-06-13T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/about-me/</loc>
|
||||
<priority>0</priority>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/pages/about-me/</loc>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/support/</loc>
|
||||
<priority>0</priority>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/categories/</loc>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/pages/</loc>
|
||||
</url><url>
|
||||
<loc>https://new.dvdt.dev/tags/</loc>
|
||||
</url>
|
||||
</urlset>
|
||||
@@ -0,0 +1,212 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="support If you like something I write and want to support it please consider sending me whatever amount of sats you think it’s worth through the Lightning network.
|
||||
LNURL1DP68GURN8GHJ7MRWVF5HGUEWV3MXGAPWV3JHVTMVDE6HYMRS9A5KVEZTFP6SJ5TUYD
|
||||
LN Address: pay@dvdt.dev">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/support/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA="
|
||||
onload="hljs.initHighlightingOnLoad();"></script>
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span class="active">support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
|
||||
<article class="post-single">
|
||||
<header class="post-header">
|
||||
|
||||
<h1 class="post-title">
|
||||
|
||||
</h1>
|
||||
<div class="post-meta">
|
||||
|
||||
</div>
|
||||
</header>
|
||||
<div class="post-content"><h2 id="support">support<a hidden class="anchor" aria-hidden="true" href="#support">#</a></h2>
|
||||
<p>If you like something I write and want to support it please consider sending me whatever amount of <a href="https://bitcoin.stackexchange.com/questions/114/what-is-a-satoshi">sats</a> you think it’s worth through the <a href="https://lightning.network/">Lightning network</a>.</p>
|
||||
<p><img loading="lazy" src="https://dhl-space.sfo2.digitaloceanspaces.com/lnurl-qr.png" alt="LNURL QR" />
|
||||
</p>
|
||||
<p>LNURL1DP68GURN8GHJ7MRWVF5HGUEWV3MXGAPWV3JHVTMVDE6HYMRS9A5KVEZTFP6SJ5TUYD</p>
|
||||
<p><a href="https://github.com/andrerfneves/lightning-address/blob/master/DIY.md">LN Address</a>: <a href="mailto:pay@dvdt.dev">pay@dvdt.dev</a></p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="post-footer">
|
||||
<ul class="post-tags">
|
||||
</ul>
|
||||
</footer>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,189 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="auto">
|
||||
|
||||
<head><meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title>Tags | dvdt.dev</title>
|
||||
<meta name="keywords" content="">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="canonical" href="https://new.dvdt.dev/tags/">
|
||||
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||||
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
|
||||
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
|
||||
<meta name="theme-color" content="#2e2e33">
|
||||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||
<link rel="alternate" type="application/rss+xml" href="https://new.dvdt.dev/tags/index.xml">
|
||||
<noscript>
|
||||
<style>
|
||||
#theme-toggle,
|
||||
.top-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
</style>
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border-color: var(--theme);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
|
||||
<body class="list" id="top">
|
||||
<script>
|
||||
if (localStorage.getItem("pref-theme") === "dark") {
|
||||
document.body.classList.add('dark');
|
||||
} else if (localStorage.getItem("pref-theme") === "light") {
|
||||
document.body.classList.remove('dark')
|
||||
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
document.body.classList.add('dark');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="header">
|
||||
<nav class="nav">
|
||||
<div class="logo">
|
||||
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
|
||||
<div class="logo-switches">
|
||||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||
</svg>
|
||||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||
stroke-linejoin="round">
|
||||
<circle cx="12" cy="12" r="5"></circle>
|
||||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul id="menu">
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/about-me/" title="about me">
|
||||
<span>about me</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://new.dvdt.dev/support" title="support">
|
||||
<span>support</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
<main class="main">
|
||||
<header class="page-header">
|
||||
<h1>Tags</h1>
|
||||
</header>
|
||||
|
||||
<ul class="terms-tags">
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="footer">
|
||||
<span>© 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
|
||||
</footer>
|
||||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||
<path d="M12 6H0l6-6z" />
|
||||
</svg>
|
||||
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
|
||||
|
||||
|
||||
<script>
|
||||
let menu = document.getElementById('menu')
|
||||
if (menu) {
|
||||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||
menu.onscroll = function () {
|
||||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
var id = this.getAttribute("href").substr(1);
|
||||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||
behavior: "smooth"
|
||||
});
|
||||
} else {
|
||||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||
}
|
||||
if (id === "top") {
|
||||
history.replaceState(null, null, " ");
|
||||
} else {
|
||||
history.pushState(null, null, `#${id}`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
var mybutton = document.getElementById("top-link");
|
||||
window.onscroll = function () {
|
||||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||
mybutton.style.visibility = "visible";
|
||||
mybutton.style.opacity = "1";
|
||||
} else {
|
||||
mybutton.style.visibility = "hidden";
|
||||
mybutton.style.opacity = "0";
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||
if (document.body.className.includes("dark")) {
|
||||
document.body.classList.remove('dark');
|
||||
localStorage.setItem("pref-theme", 'light');
|
||||
} else {
|
||||
document.body.classList.add('dark');
|
||||
localStorage.setItem("pref-theme", 'dark');
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Tags on dvdt.dev</title>
|
||||
<link>https://new.dvdt.dev/tags/</link>
|
||||
<description>Recent content in Tags on dvdt.dev</description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<language>en-us</language><atom:link href="https://new.dvdt.dev/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
</channel>
|
||||
</rss>
|
||||