First commit
24
_config.yml
@ -13,36 +13,36 @@ baseurl: ""
|
||||
lang: en
|
||||
|
||||
# Change to your timezone › https://kevinnovak.github.io/Time-Zone-Picker
|
||||
timezone:
|
||||
timezone: America/Chicago
|
||||
|
||||
# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
|
||||
# ↓ --------------------------
|
||||
|
||||
title: Chirpy # the main title
|
||||
title: Post Oak Lab # the main title
|
||||
|
||||
tagline: A text-focused Jekyll theme # it will display as the sub-title
|
||||
tagline: Welcome to my IT Lab # it will display as the sub-title
|
||||
|
||||
description: >- # used by seo meta and the atom feed
|
||||
A minimal, responsive and feature-rich Jekyll theme for technical writing.
|
||||
A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.
|
||||
|
||||
# fill in the protocol & hostname for your site, e.g., 'https://username.github.io'
|
||||
url: ""
|
||||
url: "postoaklab.github.io"
|
||||
|
||||
github:
|
||||
username: github_username # change to your github username
|
||||
username: PostOakLab # change to your github username
|
||||
|
||||
twitter:
|
||||
username: twitter_username # change to your twitter username
|
||||
username: PostOakLab # change to your twitter username
|
||||
|
||||
social:
|
||||
# Change to your full name.
|
||||
# It will be displayed as the default author of the posts and the copyright owner in the Footer
|
||||
name: your_full_name
|
||||
email: example@domain.com # change to your email address
|
||||
name: Ryan Alderson
|
||||
email: ryan@postoaklab.com # change to your email address
|
||||
links:
|
||||
# The first element serves as the copyright owner's link
|
||||
- https://twitter.com/username # change to your twitter homepage
|
||||
- https://github.com/username # change to your github homepage
|
||||
- https://x.com/PostOakLab # change to your twitter homepage
|
||||
- https://github.com/PostOakLab # change to your github homepage
|
||||
# Uncomment below to add more social links
|
||||
# - https://www.facebook.com/username
|
||||
# - https://www.linkedin.com/in/username
|
||||
@ -76,7 +76,7 @@ theme_mode: # [light|dark]
|
||||
img_cdn:
|
||||
|
||||
# the avatar on sidebar, support local or CORS resources
|
||||
avatar:
|
||||
avatar: "https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true"
|
||||
|
||||
# boolean type, the global switch for TOC in posts.
|
||||
toc: true
|
||||
|
10
_posts/2023-09-27-title.md
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Hello Everyone!
|
||||
date: 2023-09-27 13:12:00 -500
|
||||
categories: [homelab,general]
|
||||
tags: [homelab]
|
||||
---
|
||||
|
||||
# Hello There!
|
||||
|
||||
Welcome to Post Oak Lab! My name is Ryan and I am studying networking and IT. This site is a place to document my projects and homelab.
|
@ -4,5 +4,12 @@ icon: fas fa-info-circle
|
||||
order: 4
|
||||
---
|
||||
|
||||
> Add Markdown syntax content to file `_tabs/about.md`{: .filepath } and it will show up on this page.
|
||||
{: .prompt-tip }
|
||||
Welcome to Post Oak Lab! My name is Ryan and this is where I document my IT and homelab projects.
|
||||
|
||||
### Why Post Oak?
|
||||
I love oaks and post oak (*Quercus stellata*) is one of my favorites. Also "post" has a variety of meanings, so the meaning of "post oak" is somewhat ambiguous.
|
||||
|
||||
I'll leave you with this quote from Valentin Tomberg:
|
||||
>Imagine, not an explosion, but rather the blossoming out of a constructive "atomic bomb"...each little acorn is such a "constructive bomb" and the oak is only the visibl result of the "slow explosion"--or blossoming oak--of this bomb.
|
||||
|
||||

|
||||
|
876
site/404.html
Normal file
@ -0,0 +1,876 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="404: Page not found" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<meta property="og:description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<link rel="canonical" href="http://localhost:4000/404.html" />
|
||||
<meta property="og:url" content="http://localhost:4000/404.html" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="404: Page not found" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"WebPage","description":"A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.","headline":"404: Page not found","url":"http://localhost:4000/404.html"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>404: Page not found | Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Manific Popup -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/magnific-popup.min.css">
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">
|
||||
Home
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>404: Page not found</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
404: Page not found
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
404: Page not found
|
||||
</h1>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<!-- Refactor the HTML structure -->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
In order to allow a wide table to scroll horizontally,
|
||||
we suround the markdown table with `<div class="table-wrapper">` and `</div>`
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Fixed kramdown code highlight rendering:
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/101
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!-- Change the icon of checkbox -->
|
||||
|
||||
|
||||
<!-- images -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Add header for code snippets -->
|
||||
|
||||
|
||||
|
||||
<!-- Create heading anchors -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- return -->
|
||||
|
||||
|
||||
|
||||
|
||||
<p class="lead">Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.</p>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- image lazy-loading & popup & clipboard -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js,npm/lazysizes@5.3.2/lazysizes.min.js,npm/magnific-popup@1.1.0/dist/jquery.magnific-popup.min.js,npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/page.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
875
site/about/index.html
Normal file
@ -0,0 +1,875 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="About" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="Add Markdown syntax content to file _tabs/about.md and it will show up on this page." />
|
||||
<meta property="og:description" content="Add Markdown syntax content to file _tabs/about.md and it will show up on this page." />
|
||||
<link rel="canonical" href="http://localhost:4000/about/" />
|
||||
<meta property="og:url" content="http://localhost:4000/about/" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="article:published_time" content="2023-09-27T13:33:03-05:00" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="About" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"WebSite","dateModified":"2023-09-27T13:33:03-05:00","datePublished":"2023-09-27T13:33:03-05:00","description":"Add Markdown syntax content to file _tabs/about.md and it will show up on this page.","headline":"About","name":"Ryan Alderson","sameAs":["https://x.com/PostOakLab","https://github.com/PostOakLab"],"url":"http://localhost:4000/about/"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>About | Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Manific Popup -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/magnific-popup.min.css">
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item active">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">
|
||||
Home
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>About</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
About
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
About
|
||||
</h1>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<!-- Refactor the HTML structure -->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
In order to allow a wide table to scroll horizontally,
|
||||
we suround the markdown table with `<div class="table-wrapper">` and `</div>`
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Fixed kramdown code highlight rendering:
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/101
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!-- Change the icon of checkbox -->
|
||||
|
||||
|
||||
<!-- images -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Add header for code snippets -->
|
||||
|
||||
|
||||
|
||||
<!-- Create heading anchors -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- return -->
|
||||
<blockquote class="prompt-tip">
|
||||
<p>Add Markdown syntax content to file <code class="language-plaintext filepath highlighter-rouge">_tabs/about.md</code> and it will show up on this page.</p>
|
||||
</blockquote>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- image lazy-loading & popup & clipboard -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js,npm/lazysizes@5.3.2/lazysizes.min.js,npm/magnific-popup@1.1.0/dist/jquery.magnific-popup.min.js,npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/page.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
43
site/app.js
Normal file
@ -0,0 +1,43 @@
|
||||
const $notification = $('#notification');
|
||||
const $btnRefresh = $('#notification .toast-body>button');
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
/* Registering Service Worker */
|
||||
navigator.serviceWorker.register('/sw.js')
|
||||
.then(registration => {
|
||||
|
||||
/* in case the user ignores the notification */
|
||||
if (registration.waiting) {
|
||||
$notification.toast('show');
|
||||
}
|
||||
|
||||
registration.addEventListener('updatefound', () => {
|
||||
registration.installing.addEventListener('statechange', () => {
|
||||
if (registration.waiting) {
|
||||
if (navigator.serviceWorker.controller) {
|
||||
$notification.toast('show');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$btnRefresh.click(() => {
|
||||
if (registration.waiting) {
|
||||
registration.waiting.postMessage('SKIP_WAITING');
|
||||
}
|
||||
$notification.toast('hide');
|
||||
});
|
||||
});
|
||||
|
||||
let refreshing = false;
|
||||
|
||||
/* Detect controller change and refresh all the opened tabs */
|
||||
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
||||
if (!refreshing) {
|
||||
window.location.reload();
|
||||
refreshing = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
817
site/archives/index.html
Normal file
@ -0,0 +1,817 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="Archives" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<meta property="og:description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<link rel="canonical" href="http://localhost:4000/archives/" />
|
||||
<meta property="og:url" content="http://localhost:4000/archives/" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="article:published_time" content="2023-09-27T13:33:03-05:00" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="Archives" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2023-09-27T13:33:03-05:00","datePublished":"2023-09-27T13:33:03-05:00","description":"A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.","headline":"Archives","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/archives/"},"url":"http://localhost:4000/archives/"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>Archives | Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item active">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">
|
||||
Home
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>Archives</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
Archives
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
Archives
|
||||
</h1>
|
||||
<div class="content">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="archives" class="pl-xl-3">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js,npm/dayjs@1.11.9/dayjs.min.js,npm/dayjs@1.11.9/locale/en.min.js,npm/dayjs@1.11.9/plugin/relativeTime.min.js,npm/dayjs@1.11.9/plugin/localizedFormat.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/misc.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
1
site/assets/css/jekyll-theme-chirpy.css
Normal file
1
site/assets/css/jekyll-theme-chirpy.css.map
Normal file
BIN
site/assets/img/favicons/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
site/assets/img/favicons/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
site/assets/img/favicons/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 14 KiB |
10
site/assets/img/favicons/browserconfig.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square150x150logo src="/assets/img/favicons/mstile-150x150.png" />
|
||||
<TileColor>#da532c</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
||||
|
BIN
site/assets/img/favicons/favicon-16x16.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
site/assets/img/favicons/favicon-32x32.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
site/assets/img/favicons/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
site/assets/img/favicons/mstile-150x150.png
Normal file
After Width: | Height: | Size: 12 KiB |
23
site/assets/img/favicons/site.webmanifest
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
|
||||
{
|
||||
"name": "Post Oak Lab",
|
||||
"short_name": "Post Oak Lab",
|
||||
"description": "A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/favicons/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/favicons/android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}],
|
||||
"start_url": "/index.html",
|
||||
"theme_color": "#2a1e6b",
|
||||
"background_color": "#ffffff",
|
||||
"display": "fullscreen"
|
||||
}
|
||||
|
11
site/assets/index.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US">
|
||||
<meta charset="utf-8">
|
||||
<title>Redirecting…</title>
|
||||
<link rel="canonical" href="http://localhost:4000/404.html">
|
||||
<script>location="http://localhost:4000/404.html"</script>
|
||||
<meta http-equiv="refresh" content="0; url=http://localhost:4000/404.html">
|
||||
<meta name="robots" content="noindex">
|
||||
<h1>Redirecting…</h1>
|
||||
<a href="http://localhost:4000/404.html">Click here if you are not redirected.</a>
|
||||
</html>
|
4
site/assets/js/data/search.json
Normal file
@ -0,0 +1,4 @@
|
||||
[
|
||||
|
||||
]
|
||||
|
57
site/assets/js/data/swcache.js
Normal file
@ -0,0 +1,57 @@
|
||||
const resource = [
|
||||
/* --- CSS --- */
|
||||
'/assets/css/jekyll-theme-chirpy.css',
|
||||
|
||||
/* --- PWA --- */
|
||||
'/app.js',
|
||||
'/sw.js',
|
||||
|
||||
/* --- HTML --- */
|
||||
'/index.html',
|
||||
'/404.html',
|
||||
|
||||
|
||||
'/categories/',
|
||||
|
||||
'/tags/',
|
||||
|
||||
'/archives/',
|
||||
|
||||
'/about/',
|
||||
|
||||
|
||||
/* --- Favicons & compressed JS --- */
|
||||
|
||||
|
||||
'/assets/img/favicons/android-chrome-192x192.png',
|
||||
'/assets/img/favicons/android-chrome-512x512.png',
|
||||
'/assets/img/favicons/apple-touch-icon.png',
|
||||
'/assets/img/favicons/favicon-16x16.png',
|
||||
'/assets/img/favicons/favicon-32x32.png',
|
||||
'/assets/img/favicons/favicon.ico',
|
||||
'/assets/img/favicons/mstile-150x150.png',
|
||||
'/assets/js/dist/categories.min.js',
|
||||
'/assets/js/dist/commons.min.js',
|
||||
'/assets/js/dist/home.min.js',
|
||||
'/assets/js/dist/misc.min.js',
|
||||
'/assets/js/dist/page.min.js',
|
||||
'/assets/js/dist/post.min.js'
|
||||
];
|
||||
|
||||
/* The request url with below domain will be cached */
|
||||
const allowedDomains = [
|
||||
|
||||
|
||||
'localhost:4000',
|
||||
|
||||
|
||||
|
||||
'fonts.gstatic.com',
|
||||
'fonts.googleapis.com',
|
||||
'cdn.jsdelivr.net',
|
||||
'polyfill.io'
|
||||
];
|
||||
|
||||
/* Requests that include the following path will be banned */
|
||||
const denyUrls = [];
|
||||
|
4
site/assets/js/dist/categories.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* Chirpy v6.2.2 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
!function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,i(o.key),o)}}function r(e,r,o){return r&&t(e.prototype,r),o&&t(e,o),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t,r){return(t=i(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=new Array(t);r<t;r++)o[r]=e[r];return o}function i(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,t||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var l=$(".mode-toggle");var s=$("body"),c="sidebar-display",u=function(){function t(){e(this,t)}return r(t,null,[{key:"toggle",value:function(){!1===t.isExpanded?s.attr(c,""):s.removeAttr(c),t.isExpanded=!t.isExpanded}}]),t}();o(u,"isExpanded",!1);var f=$("#sidebar-trigger"),d=$("#search-trigger"),p=$("#search-cancel"),b=$("#main-wrapper>.container>.row"),v=$("#topbar-title"),m=$("search"),g=$("#search-result-wrapper"),y=$("#search-results"),h=$("#search-input"),C=$("#search-hints"),w=$("html,body"),k="loaded",A="unloaded",S="input-focus",T="d-flex",j=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){t.offset=window.scrollY,w.scrollTop(0)}},{key:"off",value:function(){w.scrollTop(t.offset)}}]),t}();o(j,"offset",0),o(j,"resultVisible",!1);var E=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){f.addClass(A),v.addClass(A),d.addClass(A),m.addClass(T),p.addClass(k)}},{key:"off",value:function(){p.removeClass(k),m.removeClass(T),f.removeClass(A),v.removeClass(A),d.removeClass(A)}}]),t}(),O=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){j.resultVisible||(j.on(),g.removeClass(A),b.addClass(A),j.resultVisible=!0)}},{key:"off",value:function(){j.resultVisible&&(y.empty(),C.hasClass(A)&&C.removeClass(A),g.addClass(A),b.removeClass(A),j.off(),h.val(""),j.resultVisible=!1)}}]),t}();function x(){return p.hasClass(k)}var P=$(".collapse");var V,I;$(".code-header>button").children().attr("class"),V=$(window),I=$("#back-to-top"),V.on("scroll",(function(){V.scrollTop()>50?I.fadeIn():I.fadeOut()})),I.on("click",(function(){V.scrollTop(0)})),n(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(e){return new bootstrap.Tooltip(e)})),0!==l.length&&l.off().on("click",(function(e){var t=$(e.target),r=t.prop("tagName")==="button".toUpperCase()?t:t.parent();modeToggle.flipMode(),r.trigger("blur")})),$("#sidebar-trigger").on("click",u.toggle),$("#mask").on("click",u.toggle),d.on("click",(function(){E.on(),O.on(),h.trigger("focus")})),p.on("click",(function(){E.off(),O.off()})),h.on("focus",(function(){m.addClass(S)})),h.on("focusout",(function(){m.removeClass(S)})),h.on("input",(function(){""===h.val()?x()?C.removeClass(A):O.off():(O.on(),x()&&C.addClass(A))})),P.on("hide.bs.collapse",(function(){var e="h_"+$(this).attr("id").substring(2);e&&($("#".concat(e," .far.fa-folder-open")).attr("class","far fa-folder fa-fw"),$("#".concat(e," i.fas")).addClass("rotate"),$("#".concat(e)).removeClass("hide-border-bottom"))})),P.on("show.bs.collapse",(function(){var e="h_"+$(this).attr("id").substring(2);e&&($("#".concat(e," .far.fa-folder")).attr("class","far fa-folder-open fa-fw"),$("#".concat(e," i.fas")).removeClass("rotate"),$("#".concat(e)).addClass("hide-border-bottom"))}))}();
|
4
site/assets/js/dist/commons.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* Chirpy v6.2.2 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
!function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,i(n.key),n)}}function r(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function n(e,t,r){return(t=i(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function i(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var l=$(".mode-toggle");var s=$("body"),u="sidebar-display",c=function(){function t(){e(this,t)}return r(t,null,[{key:"toggle",value:function(){!1===t.isExpanded?s.attr(u,""):s.removeAttr(u),t.isExpanded=!t.isExpanded}}]),t}();n(c,"isExpanded",!1);var f=$("#sidebar-trigger"),d=$("#search-trigger"),p=$("#search-cancel"),b=$("#main-wrapper>.container>.row"),m=$("#topbar-title"),v=$("search"),y=$("#search-result-wrapper"),g=$("#search-results"),h=$("#search-input"),C=$("#search-hints"),w=$("html,body"),k="loaded",A="unloaded",S="input-focus",T="d-flex",j=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){t.offset=window.scrollY,w.scrollTop(0)}},{key:"off",value:function(){w.scrollTop(t.offset)}}]),t}();n(j,"offset",0),n(j,"resultVisible",!1);var E,O,x=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){f.addClass(A),m.addClass(A),d.addClass(A),v.addClass(T),p.addClass(k)}},{key:"off",value:function(){p.removeClass(k),v.removeClass(T),f.removeClass(A),m.removeClass(A),d.removeClass(A)}}]),t}(),P=function(){function t(){e(this,t)}return r(t,null,[{key:"on",value:function(){j.resultVisible||(j.on(),y.removeClass(A),b.addClass(A),j.resultVisible=!0)}},{key:"off",value:function(){j.resultVisible&&(g.empty(),C.hasClass(A)&&C.removeClass(A),y.addClass(A),b.removeClass(A),j.off(),h.val(""),j.resultVisible=!1)}}]),t}();function V(){return p.hasClass(k)}E=$(window),O=$("#back-to-top"),E.on("scroll",(function(){E.scrollTop()>50?O.fadeIn():O.fadeOut()})),O.on("click",(function(){E.scrollTop(0)})),o(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(e){return new bootstrap.Tooltip(e)})),0!==l.length&&l.off().on("click",(function(e){var t=$(e.target),r=t.prop("tagName")==="button".toUpperCase()?t:t.parent();modeToggle.flipMode(),r.trigger("blur")})),$("#sidebar-trigger").on("click",c.toggle),$("#mask").on("click",c.toggle),d.on("click",(function(){x.on(),P.on(),h.trigger("focus")})),p.on("click",(function(){x.off(),P.off()})),h.on("focus",(function(){v.addClass(S)})),h.on("focusout",(function(){v.removeClass(S)})),h.on("input",(function(){""===h.val()?V()?C.removeClass(A):P.off():(P.on(),V()&&C.addClass(A))}))}();
|
4
site/assets/js/dist/home.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* Chirpy v6.2.2 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
!function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,i(n.key),n)}}function r(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}function n(t,e,r){return(e=i(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return a(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function i(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}var l=$(".mode-toggle");var s=$("body"),u="sidebar-display",c=function(){function e(){t(this,e)}return r(e,null,[{key:"toggle",value:function(){!1===e.isExpanded?s.attr(u,""):s.removeAttr(u),e.isExpanded=!e.isExpanded}}]),e}();n(c,"isExpanded",!1);var f=$("#sidebar-trigger"),d=$("#search-trigger"),m=$("#search-cancel"),p=$("#main-wrapper>.container>.row"),g=$("#topbar-title"),v=$("search"),y=$("#search-result-wrapper"),b=$("#search-results"),h=$("#search-input"),C=$("#search-hints"),k=$("html,body"),w="loaded",T="unloaded",j="input-focus",A="d-flex",S=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){e.offset=window.scrollY,k.scrollTop(0)}},{key:"off",value:function(){k.scrollTop(e.offset)}}]),e}();n(S,"offset",0),n(S,"resultVisible",!1);var x=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){f.addClass(T),g.addClass(T),d.addClass(T),v.addClass(A),m.addClass(w)}},{key:"off",value:function(){m.removeClass(w),v.removeClass(A),f.removeClass(T),g.removeClass(T),d.removeClass(T)}}]),e}(),E=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){S.resultVisible||(S.on(),y.removeClass(T),p.addClass(T),S.resultVisible=!0)}},{key:"off",value:function(){S.resultVisible&&(b.empty(),C.hasClass(T)&&C.removeClass(T),y.addClass(T),p.removeClass(T),S.off(),h.val(""),S.resultVisible=!1)}}]),e}();function F(){return m.hasClass(w)}$(".collapse");function O(t){t.parent().removeClass("shimmer")}$(".code-header>button").children().attr("class");var D,P,V,I=function(){function e(){t(this,e)}return r(e,null,[{key:"attrTimestamp",get:function(){return"data-ts"}},{key:"attrDateFormat",get:function(){return"data-df"}},{key:"locale",get:function(){return $("html").attr("lang").substring(0,2)}},{key:"getTimestamp",value:function(t){return Number(t.attr(e.attrTimestamp))}},{key:"getDateFormat",value:function(t){return t.attr(e.attrDateFormat)}}]),e}();D=$(window),P=$("#back-to-top"),D.on("scroll",(function(){D.scrollTop()>50?P.fadeIn():P.fadeOut()})),P.on("click",(function(){D.scrollTop(0)})),o(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new bootstrap.Tooltip(t)})),0!==l.length&&l.off().on("click",(function(t){var e=$(t.target),r=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),r.trigger("blur")})),$("#sidebar-trigger").on("click",c.toggle),$("#mask").on("click",c.toggle),d.on("click",(function(){x.on(),E.on(),h.trigger("focus")})),m.on("click",(function(){x.off(),E.off()})),h.on("focus",(function(){v.addClass(j)})),h.on("focusout",(function(){v.removeClass(j)})),h.on("input",(function(){""===h.val()?F()?C.removeClass(T):E.off():(E.on(),F()&&C.addClass(T))})),dayjs.locale(I.locale),dayjs.extend(window.dayjs_plugin_localizedFormat),$("[".concat(I.attrTimestamp,"]")).each((function(){var t=dayjs.unix(I.getTimestamp($(this))),e=t.format(I.getDateFormat($(this)));$(this).text(e),$(this).removeAttr(I.attrTimestamp),$(this).removeAttr(I.attrDateFormat);var r=$(this).attr("data-bs-toggle");if(void 0!==r&&"tooltip"===r){var n=t.format("llll");$(this).attr("data-bs-title",n),new bootstrap.Tooltip($(this))}})),(V=$("main img[data-src]")).length<=0||(document.addEventListener("lazyloaded",(function(t){O($(t.target))})),V.each((function(){$(this).hasClass("ls-is-cached")&&O($(this))})))}();
|
4
site/assets/js/dist/misc.min.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* Chirpy v6.2.2 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
!function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,i(n.key),n)}}function r(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}function n(t,e,r){return(e=i(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return a(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function i(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}var l=$(".mode-toggle");var s=$("body"),u="sidebar-display",c=function(){function e(){t(this,e)}return r(e,null,[{key:"toggle",value:function(){!1===e.isExpanded?s.attr(u,""):s.removeAttr(u),e.isExpanded=!e.isExpanded}}]),e}();n(c,"isExpanded",!1);var f=$("#sidebar-trigger"),d=$("#search-trigger"),m=$("#search-cancel"),p=$("#main-wrapper>.container>.row"),v=$("#topbar-title"),g=$("search"),y=$("#search-result-wrapper"),b=$("#search-results"),h=$("#search-input"),C=$("#search-hints"),k=$("html,body"),w="loaded",T="unloaded",j="input-focus",A="d-flex",S=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){e.offset=window.scrollY,k.scrollTop(0)}},{key:"off",value:function(){k.scrollTop(e.offset)}}]),e}();n(S,"offset",0),n(S,"resultVisible",!1);var x=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){f.addClass(T),v.addClass(T),d.addClass(T),g.addClass(A),m.addClass(w)}},{key:"off",value:function(){m.removeClass(w),g.removeClass(A),f.removeClass(T),v.removeClass(T),d.removeClass(T)}}]),e}(),E=function(){function e(){t(this,e)}return r(e,null,[{key:"on",value:function(){S.resultVisible||(S.on(),y.removeClass(T),p.addClass(T),S.resultVisible=!0)}},{key:"off",value:function(){S.resultVisible&&(b.empty(),C.hasClass(T)&&C.removeClass(T),y.addClass(T),p.removeClass(T),S.off(),h.val(""),S.resultVisible=!1)}}]),e}();function F(){return m.hasClass(w)}$(".collapse");$(".code-header>button").children().attr("class");var O,D,P=function(){function e(){t(this,e)}return r(e,null,[{key:"attrTimestamp",get:function(){return"data-ts"}},{key:"attrDateFormat",get:function(){return"data-df"}},{key:"locale",get:function(){return $("html").attr("lang").substring(0,2)}},{key:"getTimestamp",value:function(t){return Number(t.attr(e.attrTimestamp))}},{key:"getDateFormat",value:function(t){return t.attr(e.attrDateFormat)}}]),e}();O=$(window),D=$("#back-to-top"),O.on("scroll",(function(){O.scrollTop()>50?D.fadeIn():D.fadeOut()})),D.on("click",(function(){O.scrollTop(0)})),o(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new bootstrap.Tooltip(t)})),0!==l.length&&l.off().on("click",(function(t){var e=$(t.target),r=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),r.trigger("blur")})),$("#sidebar-trigger").on("click",c.toggle),$("#mask").on("click",c.toggle),d.on("click",(function(){x.on(),E.on(),h.trigger("focus")})),m.on("click",(function(){x.off(),E.off()})),h.on("focus",(function(){g.addClass(j)})),h.on("focusout",(function(){g.removeClass(j)})),h.on("input",(function(){""===h.val()?F()?C.removeClass(T):E.off():(E.on(),F()&&C.addClass(T))})),dayjs.locale(P.locale),dayjs.extend(window.dayjs_plugin_localizedFormat),$("[".concat(P.attrTimestamp,"]")).each((function(){var t=dayjs.unix(P.getTimestamp($(this))),e=t.format(P.getDateFormat($(this)));$(this).text(e),$(this).removeAttr(P.attrTimestamp),$(this).removeAttr(P.attrDateFormat);var r=$(this).attr("data-bs-toggle");if(void 0!==r&&"tooltip"===r){var n=t.format("llll");$(this).attr("data-bs-title",n),new bootstrap.Tooltip($(this))}}))}();
|
4
site/assets/js/dist/page.min.js
vendored
Normal file
4
site/assets/js/dist/post.min.js
vendored
Normal file
791
site/categories/index.html
Normal file
@ -0,0 +1,791 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="Categories" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<meta property="og:description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<link rel="canonical" href="http://localhost:4000/categories/" />
|
||||
<meta property="og:url" content="http://localhost:4000/categories/" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="article:published_time" content="2023-09-27T13:33:03-05:00" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="Categories" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2023-09-27T13:33:03-05:00","datePublished":"2023-09-27T13:33:03-05:00","description":"A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.","headline":"Categories","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/categories/"},"url":"http://localhost:4000/categories/"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>Categories | Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item active">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">
|
||||
Home
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>Categories</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
Categories
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
Categories
|
||||
</h1>
|
||||
<div class="content">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/categories.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
23
site/feed.xml
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
|
||||
<feed xmlns="http://www.w3.org/2005/Atom">
|
||||
<id>http://localhost:4000/</id>
|
||||
<title>Post Oak Lab</title>
|
||||
<subtitle>A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.</subtitle>
|
||||
<updated>2023-09-27T13:33:03-05:00</updated>
|
||||
<author>
|
||||
<name>Ryan Alderson</name>
|
||||
<uri>http://localhost:4000/</uri>
|
||||
</author>
|
||||
<link rel="self" type="application/atom+xml" href="http://localhost:4000/feed.xml"/>
|
||||
<link rel="alternate" type="text/html" hreflang="en"
|
||||
href="http://localhost:4000/"/>
|
||||
<generator uri="https://jekyllrb.com/" version="4.3.2">Jekyll</generator>
|
||||
<rights> © 2023 Ryan Alderson </rights>
|
||||
<icon>/assets/img/favicons/favicon.ico</icon>
|
||||
<logo>/assets/img/favicons/favicon-96x96.png</logo>
|
||||
|
||||
|
||||
</feed>
|
||||
|
||||
|
884
site/index.html
Normal file
@ -0,0 +1,884 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="Post Oak Lab" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<meta property="og:description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<link rel="canonical" href="http://localhost:4000/" />
|
||||
<meta property="og:url" content="http://localhost:4000/" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="Post Oak Lab" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"WebSite","description":"A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.","headline":"Post Oak Lab","name":"Ryan Alderson","sameAs":["https://x.com/PostOakLab","https://github.com/PostOakLab"],"url":"http://localhost:4000/"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item active">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
<!-- index page -->
|
||||
<span>Home</span>
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
Post Oak Lab
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Get pinned posts -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Get default posts -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="post-list" class="flex-grow-1 pe-xl-2">
|
||||
<!-- Refactor the HTML structure -->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
In order to allow a wide table to scroll horizontally,
|
||||
we suround the markdown table with `<div class="table-wrapper">` and `</div>`
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Fixed kramdown code highlight rendering:
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/101
|
||||
https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<!-- Change the icon of checkbox -->
|
||||
|
||||
|
||||
<!-- images -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Add header for code snippets -->
|
||||
|
||||
|
||||
|
||||
<!-- Create heading anchors -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- return -->
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<!-- #post-list -->
|
||||
|
||||
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js,npm/lazysizes@5.3.2/lazysizes.min.js,npm/dayjs@1.11.9/dayjs.min.js,npm/dayjs@1.11.9/locale/en.min.js,npm/dayjs@1.11.9/plugin/relativeTime.min.js,npm/dayjs@1.11.9/plugin/localizedFormat.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/home.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
11
site/norobots/index.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US">
|
||||
<meta charset="utf-8">
|
||||
<title>Redirecting…</title>
|
||||
<link rel="canonical" href="http://localhost:4000/404.html">
|
||||
<script>location="http://localhost:4000/404.html"</script>
|
||||
<meta http-equiv="refresh" content="0; url=http://localhost:4000/404.html">
|
||||
<meta name="robots" content="noindex">
|
||||
<h1>Redirecting…</h1>
|
||||
<a href="http://localhost:4000/404.html">Click here if you are not redirected.</a>
|
||||
</html>
|
11
site/posts/index.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-US">
|
||||
<meta charset="utf-8">
|
||||
<title>Redirecting…</title>
|
||||
<link rel="canonical" href="http://localhost:4000/404.html">
|
||||
<script>location="http://localhost:4000/404.html"</script>
|
||||
<meta http-equiv="refresh" content="0; url=http://localhost:4000/404.html">
|
||||
<meta name="robots" content="noindex">
|
||||
<h1>Redirecting…</h1>
|
||||
<a href="http://localhost:4000/404.html">Click here if you are not redirected.</a>
|
||||
</html>
|
1
site/redirects.json
Normal file
@ -0,0 +1 @@
|
||||
{"/norobots/":"http://localhost:4000/404.html","/assets/":"http://localhost:4000/404.html","/posts/":"http://localhost:4000/404.html"}
|
5
site/robots.txt
Normal file
@ -0,0 +1,5 @@
|
||||
User-agent: *
|
||||
|
||||
Disallow: /norobots/
|
||||
|
||||
Sitemap: http://localhost:4000/sitemap.xml
|
22
site/sitemap.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>http://localhost:4000/categories/</loc>
|
||||
<lastmod>2023-09-27T13:33:03-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost:4000/tags/</loc>
|
||||
<lastmod>2023-09-27T13:33:03-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost:4000/archives/</loc>
|
||||
<lastmod>2023-09-27T13:33:03-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost:4000/about/</loc>
|
||||
<lastmod>2023-09-27T13:33:03-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>http://localhost:4000/</loc>
|
||||
</url>
|
||||
</urlset>
|
84
site/sw.js
Normal file
@ -0,0 +1,84 @@
|
||||
self.importScripts('/assets/js/data/swcache.js');
|
||||
|
||||
const cacheName = 'chirpy-20230927.133304';
|
||||
|
||||
function verifyDomain(url) {
|
||||
for (const domain of allowedDomains) {
|
||||
const regex = RegExp(`^http(s)?:\/\/${domain}\/`);
|
||||
if (regex.test(url)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function isExcluded(url) {
|
||||
for (const item of denyUrls) {
|
||||
if (url === item) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
event.waitUntil(
|
||||
caches.open(cacheName).then((cache) => {
|
||||
return cache.addAll(resource);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('activate', (event) => {
|
||||
event.waitUntil(
|
||||
caches.keys().then((keyList) => {
|
||||
return Promise.all(
|
||||
keyList.map((key) => {
|
||||
if (key !== cacheName) {
|
||||
return caches.delete(key);
|
||||
}
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('message', (event) => {
|
||||
if (event.data === 'SKIP_WAITING') {
|
||||
self.skipWaiting();
|
||||
}
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', (event) => {
|
||||
event.respondWith(
|
||||
caches.match(event.request).then((response) => {
|
||||
if (response) {
|
||||
return response;
|
||||
}
|
||||
|
||||
return fetch(event.request).then((response) => {
|
||||
const url = event.request.url;
|
||||
|
||||
if (
|
||||
event.request.method !== 'GET' ||
|
||||
!verifyDomain(url) ||
|
||||
isExcluded(url)
|
||||
) {
|
||||
return response;
|
||||
}
|
||||
|
||||
/* see: <https://developers.google.com/web/fundamentals/primers/service-workers#cache_and_return_requests> */
|
||||
let responseToCache = response.clone();
|
||||
|
||||
caches.open(cacheName).then((cache) => {
|
||||
/* console.log('[sw] Caching new resource: ' + event.request.url); */
|
||||
cache.put(event.request, responseToCache);
|
||||
});
|
||||
|
||||
return response;
|
||||
});
|
||||
})
|
||||
);
|
||||
});
|
||||
|
787
site/tags/index.html
Normal file
@ -0,0 +1,787 @@
|
||||
<!doctype html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- `site.alt_lang` can specify a language different from the UI -->
|
||||
<html lang="en"
|
||||
|
||||
>
|
||||
<!-- The Head -->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Begin Jekyll SEO tag v2.8.0 -->
|
||||
<meta name="generator" content="Jekyll v4.3.2" />
|
||||
<meta property="og:title" content="Tags" />
|
||||
<meta property="og:locale" content="en" />
|
||||
<meta name="description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<meta property="og:description" content="A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown." />
|
||||
<link rel="canonical" href="http://localhost:4000/tags/" />
|
||||
<meta property="og:url" content="http://localhost:4000/tags/" />
|
||||
<meta property="og:site_name" content="Post Oak Lab" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="article:published_time" content="2023-09-27T13:33:03-05:00" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:title" content="Tags" />
|
||||
<meta name="twitter:site" content="@PostOakLab" />
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2023-09-27T13:33:03-05:00","datePublished":"2023-09-27T13:33:03-05:00","description":"A place where I document my IT and networking projects. Also a way for me to learn Git and Markdown.","headline":"Tags","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/tags/"},"url":"http://localhost:4000/tags/"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
|
||||
|
||||
<title>Tags | Post Oak Lab
|
||||
</title>
|
||||
|
||||
<!--
|
||||
The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
|
||||
Generated by: https://realfavicongenerator.net/
|
||||
-->
|
||||
|
||||
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicons/favicon-16x16.png">
|
||||
<link rel="manifest" href="/assets/img/favicons/site.webmanifest">
|
||||
<link rel="shortcut icon" href="/assets/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Post Oak Lab">
|
||||
<meta name="application-name" content="Post Oak Lab">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<!-- GA -->
|
||||
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/jekyll-theme-chirpy.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- JavaScript -->
|
||||
|
||||
|
||||
<!-- Switch the mode between dark and light. -->
|
||||
|
||||
<script type="text/javascript">
|
||||
class ModeToggle {
|
||||
static get MODE_KEY() {
|
||||
return 'mode';
|
||||
}
|
||||
static get MODE_ATTR() {
|
||||
return 'data-mode';
|
||||
}
|
||||
static get DARK_MODE() {
|
||||
return 'dark';
|
||||
}
|
||||
static get LIGHT_MODE() {
|
||||
return 'light';
|
||||
}
|
||||
static get ID() {
|
||||
return 'mode-toggle';
|
||||
}
|
||||
|
||||
constructor() {
|
||||
if (this.hasMode) {
|
||||
if (this.isDarkMode) {
|
||||
if (!this.isSysDarkPrefer) {
|
||||
this.setDark();
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let self = this;
|
||||
|
||||
/* always follow the system prefers */
|
||||
this.sysDarkPrefers.addEventListener('change', () => {
|
||||
if (self.hasMode) {
|
||||
if (self.isDarkMode) {
|
||||
if (!self.isSysDarkPrefer) {
|
||||
self.setDark();
|
||||
}
|
||||
} else {
|
||||
if (self.isSysDarkPrefer) {
|
||||
self.setLight();
|
||||
}
|
||||
}
|
||||
|
||||
self.clearMode();
|
||||
}
|
||||
|
||||
self.notify();
|
||||
});
|
||||
} /* constructor() */
|
||||
|
||||
get sysDarkPrefers() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)');
|
||||
}
|
||||
|
||||
get isSysDarkPrefer() {
|
||||
return this.sysDarkPrefers.matches;
|
||||
}
|
||||
|
||||
get isDarkMode() {
|
||||
return this.mode === ModeToggle.DARK_MODE;
|
||||
}
|
||||
|
||||
get isLightMode() {
|
||||
return this.mode === ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
|
||||
get hasMode() {
|
||||
return this.mode != null;
|
||||
}
|
||||
|
||||
get mode() {
|
||||
return sessionStorage.getItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* get the current mode on screen */
|
||||
get modeStatus() {
|
||||
if (this.isDarkMode || (!this.hasMode && this.isSysDarkPrefer)) {
|
||||
return ModeToggle.DARK_MODE;
|
||||
} else {
|
||||
return ModeToggle.LIGHT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
setDark() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.DARK_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
||||
}
|
||||
|
||||
setLight() {
|
||||
document.documentElement.setAttribute(ModeToggle.MODE_ATTR, ModeToggle.LIGHT_MODE);
|
||||
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
||||
}
|
||||
|
||||
clearMode() {
|
||||
document.documentElement.removeAttribute(ModeToggle.MODE_ATTR);
|
||||
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
||||
}
|
||||
|
||||
/* Notify another plugins that the theme mode has changed */
|
||||
notify() {
|
||||
window.postMessage(
|
||||
{
|
||||
direction: ModeToggle.ID,
|
||||
message: this.modeStatus
|
||||
},
|
||||
'*'
|
||||
);
|
||||
}
|
||||
|
||||
flipMode() {
|
||||
if (this.hasMode) {
|
||||
if (this.isSysDarkPrefer) {
|
||||
if (this.isLightMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setLight();
|
||||
}
|
||||
} else {
|
||||
if (this.isDarkMode) {
|
||||
this.clearMode();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isSysDarkPrefer) {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
}
|
||||
|
||||
this.notify();
|
||||
} /* flipMode() */
|
||||
} /* ModeToggle */
|
||||
|
||||
const modeToggle = new ModeToggle();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- A placeholder to allow defining custom metadata -->
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<!-- The Side Bar -->
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle">
|
||||
|
||||
|
||||
<img src="https://github.com/PostOakLab/assets/blob/master/avatar.png?raw=true" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
|
||||
|
||||
</a>
|
||||
|
||||
<h1 class="site-title">
|
||||
<a href="/">Post Oak Lab</a>
|
||||
</h1>
|
||||
<p class="site-subtitle fst-italic mb-0">Welcome to my IT Lab</p>
|
||||
</header>
|
||||
<!-- .profile-wrapper -->
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
<!-- home -->
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-home"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- the real tabs -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
|
||||
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item active">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
|
||||
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
|
||||
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
|
||||
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- .nav-item -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="mode-toggle btn" aria-label="Switch Mode">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://github.com/PostOakLab"
|
||||
aria-label="github"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/PostOakLab"
|
||||
aria-label="twitter"
|
||||
|
||||
|
||||
|
||||
target="_blank"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fa-brands fa-x-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="javascript:location.href = 'mailto:' + ['ryan','postoaklab.com'].join('@')"
|
||||
aria-label="email"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="/feed.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- .sidebar-bottom -->
|
||||
</aside>
|
||||
<!-- #sidebar -->
|
||||
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container px-xxl-5">
|
||||
<!-- The Top Bar -->
|
||||
|
||||
<header id="topbar-wrapper" aria-label="Top Bar">
|
||||
<div
|
||||
id="topbar"
|
||||
class="d-flex align-items-center justify-content-between px-lg-3 h-100"
|
||||
>
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">
|
||||
Home
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>Tags</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
<!-- endof #breadcrumb -->
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
Tags
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<main
|
||||
aria-label="Main Content"
|
||||
class="col-12 col-lg-11 col-xl-9 px-md-4 pb-5"
|
||||
>
|
||||
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
Tags
|
||||
</h1>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div id="tags" class="d-flex flex-wrap mx-xl-2">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- panel -->
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
<!-- Get the last 5 posts from lastmod list. -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- tail -->
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<!-- The Footer -->
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2023</time>
|
||||
<a href="https://x.com/PostOakLab">Ryan Alderson</a>.
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
|
||||
</p>
|
||||
|
||||
<p>Using the <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a> theme <a href="https://github.com/cotes2020/jekyll-theme-chirpy" target="_blank" rel="noopener">Chirpy</a>
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The Search results -->
|
||||
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center unloaded">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
<!-- The trending tags list -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask"></div>
|
||||
|
||||
|
||||
<aside
|
||||
id="notification"
|
||||
class="toast"
|
||||
role="alert"
|
||||
aria-live="assertive"
|
||||
aria-atomic="true"
|
||||
data-bs-animation="true"
|
||||
data-bs-autohide="false"
|
||||
>
|
||||
<div class="toast-header">
|
||||
<button
|
||||
type="button"
|
||||
class="btn-close ms-auto"
|
||||
data-bs-dismiss="toast"
|
||||
aria-label="Close"
|
||||
></button>
|
||||
</div>
|
||||
<div class="toast-body text-center pt-0">
|
||||
<p class="px-2 mb-3">A new version of content is available.</p>
|
||||
<button type="button" class="btn btn-primary" aria-label="Update">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
|
||||
<!-- JavaScripts -->
|
||||
|
||||
<!-- JS selector for site. -->
|
||||
|
||||
<!-- commons -->
|
||||
|
||||
|
||||
|
||||
<!-- layout specified -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/combine/npm/jquery@3.7.1/dist/jquery.min.js,npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js,npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/assets/js/dist/commons.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Jekyll Simple Search loader
|
||||
See: <https://github.com/christian-fei/Simple-Jekyll-Search>
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
/* Note: dependent library will be loaded in `js-selector.html` */
|
||||
SimpleJekyllSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: '/assets/js/data/search.json',
|
||||
searchResultTemplate: ' <article class="px-1 px-sm-2 px-lg-4 px-xl-0"> <header> <h2><a href="{url}">{title}</a></h2> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1"> {categories} {tags} </div> </header> <p>{snippet}</p> </article>',
|
||||
noResultsText: '<p class="mt-5"></p>',
|
||||
templateMiddleware: function(prop, value, template) {
|
||||
if (prop === 'categories') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (prop === 'tags') {
|
||||
if (value === '') {
|
||||
return `${value}`;
|
||||
} else {
|
||||
return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
8
site/unregister.js
Normal file
@ -0,0 +1,8 @@
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.getRegistrations().then((registrations) => {
|
||||
for (let reg of registrations) {
|
||||
reg.unregister();
|
||||
}
|
||||
});
|
||||
}
|
||||
|