Series and tags (#74)
* initial support for tags and series * tagging support * oops * Update main.go
This commit is contained in:
parent
2007492c49
commit
7a302eb69b
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: "OVE-20190623-0001"
|
title: "OVE-20190623-0001"
|
||||||
date: 2019-06-24
|
date: 2019-06-24
|
||||||
|
tags:
|
||||||
|
- v
|
||||||
|
- security
|
||||||
|
- release
|
||||||
---
|
---
|
||||||
|
|
||||||
# OVE-20190623-0001
|
# OVE-20190623-0001
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
title: A Letter to Those That Bullied Me
|
title: A Letter to Those That Bullied Me
|
||||||
date: 2018-06-16
|
date: 2018-06-16
|
||||||
for: Elizabeth
|
for: Elizabeth
|
||||||
|
tags:
|
||||||
|
- offmychest
|
||||||
---
|
---
|
||||||
|
|
||||||
# A Letter to Those Who Bullied Me
|
# A Letter to Those Who Bullied Me
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
---
|
---
|
||||||
title: My Experience with Atom as A Vim User
|
title: My Experience with Atom as A Vim User
|
||||||
date: 2014-11-18
|
date: 2014-11-18
|
||||||
from: medium
|
series: medium-archive
|
||||||
|
tags:
|
||||||
|
- atom
|
||||||
|
- vim
|
||||||
---
|
---
|
||||||
|
|
||||||
My Experience with Atom as A Vim User
|
My Experience with Atom as A Vim User
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
title: The Beautiful in the Ugly
|
title: The Beautiful in the Ugly
|
||||||
date: 2018-04-23
|
date: 2018-04-23
|
||||||
for: Silver
|
for: Silver
|
||||||
|
tags:
|
||||||
|
- shell
|
||||||
---
|
---
|
||||||
|
|
||||||
# The Beautiful in the Ugly
|
# The Beautiful in the Ugly
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: Web Application Development with Beego
|
title: Web Application Development with Beego
|
||||||
date: 2014-11-28
|
date: 2014-11-28
|
||||||
|
tags:
|
||||||
|
- go
|
||||||
|
- beego
|
||||||
---
|
---
|
||||||
|
|
||||||
Web Application Development with Beego
|
Web Application Development with Beego
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Blind Men and an Elephant"
|
title: "Blind Men and an Elephant"
|
||||||
date: 2018-11-29
|
date: 2018-11-29
|
||||||
|
series: conlangs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Blind Men and an Elephant
|
# Blind Men and an Elephant
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: How I Converted my Brain fMRI to a 3D Model
|
title: How I Converted my Brain fMRI to a 3D Model
|
||||||
date: 2019-08-23
|
date: 2019-08-23
|
||||||
|
series: howto
|
||||||
|
tags:
|
||||||
|
- python
|
||||||
|
- blender
|
||||||
---
|
---
|
||||||
|
|
||||||
# How I Converted my Brain fMRI to a 3D Model
|
# How I Converted my Brain fMRI to a 3D Model
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: Advice to People Nurturing a Career in Computering
|
title: Advice to People Nurturing a Career in Computering
|
||||||
date: 2019-06-18
|
date: 2019-06-18
|
||||||
|
tags:
|
||||||
|
- career
|
||||||
---
|
---
|
||||||
|
|
||||||
# Advice to People Nurturing a Career in Computering
|
# Advice to People Nurturing a Career in Computering
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
title: "Chaos Magick Debugging"
|
title: "Chaos Magick Debugging"
|
||||||
date: 2018-11-13
|
date: 2018-11-13
|
||||||
thanks: CelestialBoon
|
thanks: CelestialBoon
|
||||||
|
series: magick
|
||||||
---
|
---
|
||||||
|
|
||||||
# Chaos Magick Debugging
|
# Chaos Magick Debugging
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: CinemaQuestria Orchestration
|
title: CinemaQuestria Orchestration
|
||||||
date: 2015-03-13
|
date: 2015-03-13
|
||||||
|
tags:
|
||||||
|
- cinemaquestria
|
||||||
---
|
---
|
||||||
|
|
||||||
CinemaQuestria Orchestration
|
CinemaQuestria Orchestration
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: Coding on an iPad
|
title: Coding on an iPad
|
||||||
date: 2018-04-14
|
date: 2018-04-14
|
||||||
|
tags:
|
||||||
|
- ipad
|
||||||
---
|
---
|
||||||
|
|
||||||
# Coding on an iPad
|
# Coding on an iPad
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: Coming Out
|
title: Coming Out
|
||||||
date: 2015-12-01
|
date: 2015-12-01
|
||||||
|
tags:
|
||||||
|
- personal
|
||||||
---
|
---
|
||||||
|
|
||||||
Coming Out
|
Coming Out
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: "Crazy Experiment: Ship the Frontend as an asar document"
|
title: "Crazy Experiment: Ship the Frontend as an asar document"
|
||||||
date: "2017-01-09"
|
date: "2017-01-09"
|
||||||
|
tags:
|
||||||
|
- asar
|
||||||
|
- frontend
|
||||||
---
|
---
|
||||||
|
|
||||||
Crazy Experiment: Ship the Frontend as an asar document
|
Crazy Experiment: Ship the Frontend as an asar document
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
title: "Creator's Code"
|
title: "Creator's Code"
|
||||||
author: Christine Dodrill
|
author: Christine Dodrill
|
||||||
date: 2018-09-17
|
date: 2018-09-17
|
||||||
|
tags:
|
||||||
|
- release
|
||||||
|
- coc
|
||||||
---
|
---
|
||||||
|
|
||||||
# [Creator's Code](https://github.com/Xe/creators-code)
|
# [Creator's Code](https://github.com/Xe/creators-code)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: My Experience Cursing Out God
|
title: My Experience Cursing Out God
|
||||||
date: 2018-11-21
|
date: 2018-11-21
|
||||||
|
series: dreams
|
||||||
---
|
---
|
||||||
|
|
||||||
# My Experience Cursing Out God
|
# My Experience Cursing Out God
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
title: Death
|
title: Death
|
||||||
date: 2018-08-19
|
date: 2018-08-19
|
||||||
thanks: Sygma
|
thanks: Sygma
|
||||||
|
series: magick
|
||||||
---
|
---
|
||||||
|
|
||||||
# Death
|
# Death
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: "Deprecation Notice: Elemental-IRCd"
|
title: "Deprecation Notice: Elemental-IRCd"
|
||||||
date: 2019-02-11
|
date: 2019-02-11
|
||||||
|
tags:
|
||||||
|
- release
|
||||||
---
|
---
|
||||||
|
|
||||||
# Deprecation Notice: Elemental-IRCd
|
# Deprecation Notice: Elemental-IRCd
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: Instant Development Environments in Docker
|
title: Instant Development Environments in Docker
|
||||||
date: 2014-10-24
|
date: 2014-10-24
|
||||||
|
tags:
|
||||||
|
- release
|
||||||
---
|
---
|
||||||
|
|
||||||
Instant Development Environments in Docker
|
Instant Development Environments in Docker
|
||||||
|
|
|
@ -3,6 +3,9 @@ title: "Farewell Email - Heroku"
|
||||||
date: 2019-03-08
|
date: 2019-03-08
|
||||||
for: Herokai
|
for: Herokai
|
||||||
subject: May our paths cross again
|
subject: May our paths cross again
|
||||||
|
tags:
|
||||||
|
- personal
|
||||||
|
- heroku
|
||||||
---
|
---
|
||||||
|
|
||||||
# Farewell Email - Heroku
|
# Farewell Email - Heroku
|
||||||
|
|
|
@ -3,6 +3,7 @@ title: Fear
|
||||||
date: 2018-07-24
|
date: 2018-07-24
|
||||||
thanks: CelestialBoon, no really this guy is amazing and doesn't get enough credit, I'm so grateful for him.
|
thanks: CelestialBoon, no really this guy is amazing and doesn't get enough credit, I'm so grateful for him.
|
||||||
for: Twilight Sparkle
|
for: Twilight Sparkle
|
||||||
|
series: stories
|
||||||
---
|
---
|
||||||
|
|
||||||
# Fear
|
# Fear
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: FFI-ing Go from Nim for Fun and Profit
|
title: FFI-ing Go from Nim for Fun and Profit
|
||||||
date: 2015-12-20
|
date: 2015-12-20
|
||||||
|
series: howto
|
||||||
|
tags:
|
||||||
|
- go
|
||||||
|
- nim
|
||||||
---
|
---
|
||||||
|
|
||||||
FFI-ing Golang from Nim for Fun and Profit
|
FFI-ing Golang from Nim for Fun and Profit
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: A Formal Grammar of h
|
title: A Formal Grammar of h
|
||||||
date: 2019-05-19
|
date: 2019-05-19
|
||||||
|
series: conlangs
|
||||||
---
|
---
|
||||||
|
|
||||||
# A Formal Grammar of `h`
|
# A Formal Grammar of `h`
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Getting Started with Go
|
title: Getting Started with Go
|
||||||
date: 2015-01-28
|
date: 2015-01-28
|
||||||
|
series: howto
|
||||||
---
|
---
|
||||||
|
|
||||||
Getting Started with Go
|
Getting Started with Go
|
||||||
|
|
|
@ -3,6 +3,7 @@ title: Gratitude
|
||||||
date: 2018-07-20
|
date: 2018-07-20
|
||||||
thanks: CelestialBoon
|
thanks: CelestialBoon
|
||||||
for: Mother Aya
|
for: Mother Aya
|
||||||
|
series: magick
|
||||||
---
|
---
|
||||||
|
|
||||||
# Gratitude
|
# Gratitude
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: The h Programming Language
|
title: The h Programming Language
|
||||||
date: 2019-06-30
|
date: 2019-06-30
|
||||||
|
tags:
|
||||||
|
- wasm
|
||||||
|
- release
|
||||||
---
|
---
|
||||||
|
|
||||||
# The h Programming Language
|
# The h Programming Language
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: How does into Meditation
|
title: How does into Meditation
|
||||||
date: 2017-12-10
|
date: 2017-12-10
|
||||||
|
series: when-then-zen
|
||||||
---
|
---
|
||||||
|
|
||||||
# How does into Meditation
|
# How does into Meditation
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: How to Send Email with Nim
|
title: How to Send Email with Nim
|
||||||
date: 2019-08-28
|
date: 2019-08-28
|
||||||
|
series: howto
|
||||||
|
tags:
|
||||||
|
- nim
|
||||||
|
- email
|
||||||
---
|
---
|
||||||
|
|
||||||
# How to Send Email with Nim
|
# How to Send Email with Nim
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: How to Automate Discord Message Posting With Webhooks and Cron
|
title: How to Automate Discord Message Posting With Webhooks and Cron
|
||||||
date: 2018-03-29
|
date: 2018-03-29
|
||||||
|
series: howto
|
||||||
---
|
---
|
||||||
|
|
||||||
# How to Automate Discord Message Posting With Webhooks and Cron
|
# How to Automate Discord Message Posting With Webhooks and Cron
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: How to Use User Mode Linux
|
title: How to Use User Mode Linux
|
||||||
date: 2019-07-07
|
date: 2019-07-07
|
||||||
|
series: howto
|
||||||
---
|
---
|
||||||
|
|
||||||
# How to Use User Mode Linux
|
# How to Use User Mode Linux
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "iPad Smart Keyboard: French Accents/Ligatures"
|
title: "iPad Smart Keyboard: French Accents/Ligatures"
|
||||||
date: 2019-05-10
|
date: 2019-05-10
|
||||||
|
series: howto
|
||||||
---
|
---
|
||||||
|
|
||||||
# iPad Smart Keyboard: French Accents/Ligatures
|
# iPad Smart Keyboard: French Accents/Ligatures
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: "Land 1: Syscalls & File I/O"
|
title: "Land 1: Syscalls & File I/O"
|
||||||
date: 2018-06-18
|
date: 2018-06-18
|
||||||
|
series: olin
|
||||||
|
tags:
|
||||||
|
- wasm
|
||||||
---
|
---
|
||||||
|
|
||||||
# Land 1: Syscalls & File I/O
|
# Land 1: Syscalls & File I/O
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
title: Let it Snow
|
title: Let it Snow
|
||||||
date: 2018-12-17
|
date: 2018-12-17
|
||||||
for: the lols
|
for: the lols
|
||||||
|
tags:
|
||||||
|
- fluff
|
||||||
---
|
---
|
||||||
|
|
||||||
# Let it Snow
|
# Let it Snow
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
title: "Life Update - Montréal"
|
title: "Life Update - Montréal"
|
||||||
date: "2019-05-16"
|
date: "2019-05-16"
|
||||||
for: "Vic"
|
for: "Vic"
|
||||||
|
tags:
|
||||||
|
- personal
|
||||||
---
|
---
|
||||||
|
|
||||||
# Life Update - Montréal
|
# Life Update - Montréal
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
title: Introducing Lokahi
|
title: Introducing Lokahi
|
||||||
date: 2018-02-08
|
date: 2018-02-08
|
||||||
github_issue: https://github.com/Xe/lokahi/issues/15
|
github_issue: https://github.com/Xe/lokahi/issues/15
|
||||||
|
tags:
|
||||||
|
- hackweek
|
||||||
|
- release
|
||||||
|
- go
|
||||||
|
- monitoring
|
||||||
---
|
---
|
||||||
|
|
||||||
# Introducing Lokahi
|
# Introducing Lokahi
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: MrBeast is Postmodern Gold
|
title: MrBeast is Postmodern Gold
|
||||||
date: 2019-06-05
|
date: 2019-06-05
|
||||||
|
tags:
|
||||||
|
- mrbeast
|
||||||
|
- postmodern
|
||||||
|
- youtube
|
||||||
---
|
---
|
||||||
|
|
||||||
Author's note: I've been going through a lot lately. This Monday I was in the emergency room after having a panic attack. I have a folder of writing in my notes that I use to help work off steam. I don't know why, but writing this article really helped me feel better. I can only hope it helps make your day feel better too.
|
Author's note: I've been going through a lot lately. This Monday I was in the emergency room after having a panic attack. I have a folder of writing in my notes that I use to help work off steam. I don't know why, but writing this article really helped me feel better. I can only hope it helps make your day feel better too.
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
title: Narrative of Sickness
|
title: Narrative of Sickness
|
||||||
date: 2018-08-13
|
date: 2018-08-13
|
||||||
for: awakening
|
for: awakening
|
||||||
|
series: magick
|
||||||
---
|
---
|
||||||
|
|
||||||
# Narrative of Sickness
|
# Narrative of Sickness
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Olin: 1: Why"
|
title: "Olin: 1: Why"
|
||||||
date: 2018-09-01
|
date: 2018-09-01
|
||||||
|
series: olin
|
||||||
---
|
---
|
||||||
|
|
||||||
# [Olin][olin]: 1: Why
|
# [Olin][olin]: 1: Why
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Olin: 2: The Future"
|
title: "Olin: 2: The Future"
|
||||||
date: 2018-09-05
|
date: 2018-09-05
|
||||||
|
series: olin
|
||||||
---
|
---
|
||||||
|
|
||||||
# [Olin](https://github.com/Xe/olin): 2: The Future
|
# [Olin](https://github.com/Xe/olin): 2: The Future
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
title: "One Day"
|
title: "One Day"
|
||||||
date: 2018-11-01
|
date: 2018-11-01
|
||||||
for: "Nicole"
|
for: "Nicole"
|
||||||
|
series: stories
|
||||||
---
|
---
|
||||||
|
|
||||||
# One Day
|
# One Day
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: The Saga of plt, Part 1
|
title: The Saga of plt, Part 1
|
||||||
date: 2015-02-14
|
date: 2015-02-14
|
||||||
|
series: plt
|
||||||
---
|
---
|
||||||
|
|
||||||
The Saga of plt, Part 1
|
The Saga of plt, Part 1
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: The Saga of plt, Part 2
|
title: The Saga of plt, Part 2
|
||||||
date: 2015-02-14
|
date: 2015-02-14
|
||||||
|
series: plt
|
||||||
---
|
---
|
||||||
|
|
||||||
The Saga of plt, Part 2
|
The Saga of plt, Part 2
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Instant Pot Quinoa Taco Bowls"
|
title: "Instant Pot Quinoa Taco Bowls"
|
||||||
date: 2019-08-16
|
date: 2019-08-16
|
||||||
|
series: recipes
|
||||||
---
|
---
|
||||||
|
|
||||||
# Instant Pot Quinoa Taco Bowls
|
# Instant Pot Quinoa Taco Bowls
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: "RSS Feed Generation"
|
title: "RSS Feed Generation"
|
||||||
date: "2017-03-29"
|
date: "2017-03-29"
|
||||||
|
tags:
|
||||||
|
- rss
|
||||||
|
- atom
|
||||||
---
|
---
|
||||||
|
|
||||||
RSS Feed Generation
|
RSS Feed Generation
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Site to Site WireGuard: Part 1 - Names and Numbers"
|
title: "Site to Site WireGuard: Part 1 - Names and Numbers"
|
||||||
date: "2019-04-02"
|
date: "2019-04-02"
|
||||||
|
series: site-to-site-wireguard
|
||||||
---
|
---
|
||||||
|
|
||||||
# Site to Site WireGuard: Part 1 - Names and Numbers
|
# Site to Site WireGuard: Part 1 - Names and Numbers
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Site to Site WireGuard: Part 2 - DNS"
|
title: "Site to Site WireGuard: Part 2 - DNS"
|
||||||
date: 2019-04-07
|
date: 2019-04-07
|
||||||
|
series: site-to-site-wireguard
|
||||||
---
|
---
|
||||||
|
|
||||||
# Site to Site WireGuard: Part 2 - DNS
|
# Site to Site WireGuard: Part 2 - DNS
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Site to Site WireGuard: Part 3 - Custom TLS Certificate Authority"
|
title: "Site to Site WireGuard: Part 3 - Custom TLS Certificate Authority"
|
||||||
date: 2019-04-11
|
date: 2019-04-11
|
||||||
|
series: site-to-site-wireguard
|
||||||
---
|
---
|
||||||
|
|
||||||
# Site to Site WireGuard: Part 3 - Custom TLS Certificate Authority
|
# Site to Site WireGuard: Part 3 - Custom TLS Certificate Authority
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
---
|
---
|
||||||
title: Sorting Time
|
title: Sorting Time
|
||||||
date: 2018-08-26
|
date: 2018-08-26
|
||||||
|
tags:
|
||||||
|
- time
|
||||||
|
- javascript
|
||||||
|
- tale-of-woe
|
||||||
---
|
---
|
||||||
|
|
||||||
# Sorting Time
|
# Sorting Time
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Tarot for Hackers
|
title: Tarot for Hackers
|
||||||
date: 2019-07-24
|
date: 2019-07-24
|
||||||
|
series: magick
|
||||||
---
|
---
|
||||||
|
|
||||||
# Tarot for Hackers
|
# Tarot for Hackers
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "TempleOS: 1 - Installation"
|
title: "TempleOS: 1 - Installation"
|
||||||
date: 2019-05-20
|
date: 2019-05-20
|
||||||
|
series: templeos
|
||||||
---
|
---
|
||||||
|
|
||||||
# TempleOS: 1 - Installation
|
# TempleOS: 1 - Installation
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Ten Thousand Laughs"
|
title: "Ten Thousand Laughs"
|
||||||
date: "2018-12-01"
|
date: "2018-12-01"
|
||||||
|
series: conlangs
|
||||||
---
|
---
|
||||||
|
|
||||||
# Ten Thousand Laughs
|
# Ten Thousand Laughs
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
---
|
---
|
||||||
title: The Cult of Kubernetes
|
title: The Cult of Kubernetes
|
||||||
date: 2019-09-07
|
date: 2019-09-07
|
||||||
|
series: howto
|
||||||
|
tags:
|
||||||
|
- kubernetes
|
||||||
|
- digitalocean
|
||||||
|
- githubactions
|
||||||
---
|
---
|
||||||
|
|
||||||
# The Cult of Kubernetes
|
# The Cult of Kubernetes
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: The Service is Already Down
|
title: The Service is Already Down
|
||||||
date: 2018-10-13
|
date: 2018-10-13
|
||||||
|
series: stories
|
||||||
---
|
---
|
||||||
|
|
||||||
# The Service is Already Down
|
# The Service is Already Down
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
---
|
---
|
||||||
title: V is for Vaporware
|
title: V is for Vaporware
|
||||||
date: 2019-06-23
|
date: 2019-06-23
|
||||||
|
tags:
|
||||||
|
- v
|
||||||
|
- rant
|
||||||
---
|
---
|
||||||
|
|
||||||
# V is for Vaporware
|
# V is for Vaporware
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
---
|
---
|
||||||
title: WebAssembly Talk Video Posted
|
title: WebAssembly Talk Video Posted
|
||||||
date: 2019-08-15
|
date: 2019-08-15
|
||||||
|
tags:
|
||||||
|
- wasm
|
||||||
---
|
---
|
||||||
|
|
||||||
# WebAssembly Talk Video Posted
|
# WebAssembly Talk Video Posted
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"christine.website/internal"
|
"christine.website/internal"
|
||||||
|
@ -69,6 +70,34 @@ var postView = promauto.NewCounterVec(prometheus.CounterOpts{
|
||||||
Help: "The number of views per post or talk",
|
Help: "The number of views per post or talk",
|
||||||
}, []string{"base"})
|
}, []string{"base"})
|
||||||
|
|
||||||
|
func (s *Site) listSeries(w http.ResponseWriter, r *http.Request) {
|
||||||
|
s.renderTemplatePage("series.html", s.Series).ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Site) showSeries(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.RequestURI == "/blog/series/" {
|
||||||
|
http.Redirect(w, r, "/blog/series", http.StatusSeeOther)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
series := filepath.Base(r.URL.Path)
|
||||||
|
var posts []blog.Post
|
||||||
|
|
||||||
|
for _, p := range s.Posts {
|
||||||
|
if p.Series == series {
|
||||||
|
posts = append(posts, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.renderTemplatePage("serieslist.html", struct {
|
||||||
|
Name string
|
||||||
|
Posts []blog.Post
|
||||||
|
}{
|
||||||
|
Name: series,
|
||||||
|
Posts: posts,
|
||||||
|
}).ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Site) showTalk(w http.ResponseWriter, r *http.Request) {
|
func (s *Site) showTalk(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.RequestURI == "/talks/" {
|
if r.RequestURI == "/talks/" {
|
||||||
http.Redirect(w, r, "/talks", http.StatusSeeOther)
|
http.Redirect(w, r, "/talks", http.StatusSeeOther)
|
||||||
|
@ -136,17 +165,29 @@ func (s *Site) showPost(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var tags string
|
||||||
|
|
||||||
|
if len(p.Tags) != 0 {
|
||||||
|
for _, t := range p.Tags {
|
||||||
|
tags = tags + " #" + strings.ReplaceAll(t, "-", "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const dateFormat = `2006-01-02`
|
const dateFormat = `2006-01-02`
|
||||||
s.renderTemplatePage("blogpost.html", struct {
|
s.renderTemplatePage("blogpost.html", struct {
|
||||||
Title string
|
Title string
|
||||||
Link string
|
Link string
|
||||||
BodyHTML template.HTML
|
BodyHTML template.HTML
|
||||||
Date string
|
Date string
|
||||||
|
Series string
|
||||||
|
Tags string
|
||||||
}{
|
}{
|
||||||
Title: p.Title,
|
Title: p.Title,
|
||||||
Link: p.Link,
|
Link: p.Link,
|
||||||
BodyHTML: p.BodyHTML,
|
BodyHTML: p.BodyHTML,
|
||||||
Date: p.Date.Format(dateFormat),
|
Date: p.Date.Format(dateFormat),
|
||||||
|
Series: strings.ReplaceAll(p.Series, "-", ""),
|
||||||
|
Tags: tags,
|
||||||
}).ServeHTTP(w, r)
|
}).ServeHTTP(w, r)
|
||||||
postView.With(prometheus.Labels{"base": filepath.Base(p.Link)}).Inc()
|
postView.With(prometheus.Labels{"base": filepath.Base(p.Link)}).Inc()
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@ type Site struct {
|
||||||
Posts blog.Posts
|
Posts blog.Posts
|
||||||
Talks blog.Posts
|
Talks blog.Posts
|
||||||
Resume template.HTML
|
Resume template.HTML
|
||||||
|
Series []string
|
||||||
|
|
||||||
rssFeed *feeds.Feed
|
rssFeed *feeds.Feed
|
||||||
jsonFeed *jsonfeed.Feed
|
jsonFeed *jsonfeed.Feed
|
||||||
|
@ -81,7 +82,7 @@ func (s *Site) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
middleware.RequestID(s.xffmw.Handler(ex.HTTPLog(s.mux))).ServeHTTP(w, r)
|
middleware.RequestID(s.xffmw.Handler(ex.HTTPLog(s.mux))).ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
var arbDate = time.Date(2019, time.May, 20, 18, 0, 0, 0, time.UTC)
|
var arbDate = time.Date(2019, time.September, 12, 0, 0, 0, 0, time.UTC)
|
||||||
|
|
||||||
// Build creates a new Site instance or fails.
|
// Build creates a new Site instance or fails.
|
||||||
func Build() (*Site, error) {
|
func Build() (*Site, error) {
|
||||||
|
@ -147,6 +148,8 @@ func Build() (*Site, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
s.Posts = posts
|
s.Posts = posts
|
||||||
|
s.Series = posts.Series()
|
||||||
|
sort.Strings(s.Series)
|
||||||
|
|
||||||
talks, err := blog.LoadPosts("./talks", "talks")
|
talks, err := blog.LoadPosts("./talks", "talks")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -210,6 +213,8 @@ func Build() (*Site, error) {
|
||||||
s.mux.Handle("/blog.atom", middleware.Metrics("blog.atom", http.HandlerFunc(s.createAtom)))
|
s.mux.Handle("/blog.atom", middleware.Metrics("blog.atom", http.HandlerFunc(s.createAtom)))
|
||||||
s.mux.Handle("/blog.json", middleware.Metrics("blog.json", http.HandlerFunc(s.createJSONFeed)))
|
s.mux.Handle("/blog.json", middleware.Metrics("blog.json", http.HandlerFunc(s.createJSONFeed)))
|
||||||
s.mux.Handle("/blog/", middleware.Metrics("blogpost", http.HandlerFunc(s.showPost)))
|
s.mux.Handle("/blog/", middleware.Metrics("blogpost", http.HandlerFunc(s.showPost)))
|
||||||
|
s.mux.Handle("/blog/series", http.HandlerFunc(s.listSeries))
|
||||||
|
s.mux.Handle("/blog/series/", http.HandlerFunc(s.showSeries))
|
||||||
s.mux.Handle("/talks/", middleware.Metrics("talks", http.HandlerFunc(s.showTalk)))
|
s.mux.Handle("/talks/", middleware.Metrics("talks", http.HandlerFunc(s.showTalk)))
|
||||||
s.mux.Handle("/css/", http.FileServer(http.Dir(".")))
|
s.mux.Handle("/css/", http.FileServer(http.Dir(".")))
|
||||||
s.mux.Handle("/static/", http.FileServer(http.Dir(".")))
|
s.mux.Handle("/static/", http.FileServer(http.Dir(".")))
|
||||||
|
|
|
@ -20,6 +20,8 @@ type Post struct {
|
||||||
Summary string `json:"summary,omitifempty"`
|
Summary string `json:"summary,omitifempty"`
|
||||||
Body string `json:"-"`
|
Body string `json:"-"`
|
||||||
BodyHTML template.HTML `json:"body"`
|
BodyHTML template.HTML `json:"body"`
|
||||||
|
Series string `json:"series"`
|
||||||
|
Tags []string `json:"tags"`
|
||||||
SlidesLink string `json:"slides_link"`
|
SlidesLink string `json:"slides_link"`
|
||||||
Date time.Time
|
Date time.Time
|
||||||
DateString string `json:"date"`
|
DateString string `json:"date"`
|
||||||
|
@ -28,6 +30,24 @@ type Post struct {
|
||||||
// Posts implements sort.Interface for a slice of Post objects.
|
// Posts implements sort.Interface for a slice of Post objects.
|
||||||
type Posts []Post
|
type Posts []Post
|
||||||
|
|
||||||
|
func (p Posts) Series() []string {
|
||||||
|
names := map[string]struct{}{}
|
||||||
|
|
||||||
|
for _, ps := range p {
|
||||||
|
if ps.Series != "" {
|
||||||
|
names[ps.Series] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var result []string
|
||||||
|
|
||||||
|
for name := range names {
|
||||||
|
result = append(result, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
func (p Posts) Len() int { return len(p) }
|
func (p Posts) Len() int { return len(p) }
|
||||||
func (p Posts) Less(i, j int) bool {
|
func (p Posts) Less(i, j int) bool {
|
||||||
iDate := p[i].Date
|
iDate := p[i].Date
|
||||||
|
@ -42,6 +62,8 @@ func LoadPosts(path string, prepend string) (Posts, error) {
|
||||||
type postFM struct {
|
type postFM struct {
|
||||||
Title string
|
Title string
|
||||||
Date string
|
Date string
|
||||||
|
Series string
|
||||||
|
Tags []string
|
||||||
SlidesLink string `yaml:"slides_link"`
|
SlidesLink string `yaml:"slides_link"`
|
||||||
}
|
}
|
||||||
var result Posts
|
var result Posts
|
||||||
|
@ -91,6 +113,8 @@ func LoadPosts(path string, prepend string) (Posts, error) {
|
||||||
Body: string(remaining),
|
Body: string(remaining),
|
||||||
BodyHTML: template.HTML(output),
|
BodyHTML: template.HTML(output),
|
||||||
SlidesLink: fm.SlidesLink,
|
SlidesLink: fm.SlidesLink,
|
||||||
|
Series: fm.Series,
|
||||||
|
Tags: fm.Tags,
|
||||||
}
|
}
|
||||||
result = append(result, p)
|
result = append(result, p)
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
<p>If you have a compatible reader, be sure to check out my <a href="/blog.rss">RSS Feed</a> for automatic updates. Also check out the <a href="/blog.json">JSONFeed</a>.</p>
|
<p>If you have a compatible reader, be sure to check out my <a href="/blog.rss">RSS Feed</a> for automatic updates. Also check out the <a href="/blog.json">JSONFeed</a>.</p>
|
||||||
|
|
||||||
|
<p>For a breakdown by post series, see <a href="/blog/series">here</a>.</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<ul>
|
<ul>
|
||||||
{{ range . }}
|
{{ range . }}
|
||||||
|
|
|
@ -55,6 +55,14 @@
|
||||||
|
|
||||||
<p>This article was posted on {{ .Date }}. Facts and circumstances may have changed since publication. Please <a href="/contact">contact me</a> before jumping to conclusions if something seems wrong or unclear.</p>
|
<p>This article was posted on {{ .Date }}. Facts and circumstances may have changed since publication. Please <a href="/contact">contact me</a> before jumping to conclusions if something seems wrong or unclear.</p>
|
||||||
|
|
||||||
|
{{ if ne .Series "" }}
|
||||||
|
<p>Series: <a href="/blog/series/{{ .Series }}">{{ .Series }}</a></p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if ne .Tags "" }}
|
||||||
|
<p>Tags:{{.Tags}}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
// The actual function. Set this as an onclick function for your "Share on Mastodon" button
|
// The actual function. Set this as an onclick function for your "Share on Mastodon" button
|
||||||
|
@ -91,6 +99,9 @@ function share_on_mastodon() {
|
||||||
// Hashtags
|
// Hashtags
|
||||||
var hashtags = "#blogpost";
|
var hashtags = "#blogpost";
|
||||||
|
|
||||||
|
{{ if ne .Series "" }}hashtags += " #{{ .Series }}";{{ end }}
|
||||||
|
{{ if ne .Tags "" }}hashtags += "{{ .Tags }}";{{ end }}
|
||||||
|
|
||||||
// Tagging users, such as offical accounts or the author of the post
|
// Tagging users, such as offical accounts or the author of the post
|
||||||
var author = "@cadey@mst3k.interlinked.me";
|
var author = "@cadey@mst3k.interlinked.me";
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
{{ define "title" }}
|
||||||
|
<title>Blog Series - Christine Dodrill</title>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ define "content" }}
|
||||||
|
<h1>Series</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<ul>
|
||||||
|
{{ range . }}
|
||||||
|
<li><a href="/blog/series/{{ . }}">{{ . }}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{ end }}
|
|
@ -0,0 +1,16 @@
|
||||||
|
{{ define "title" }}
|
||||||
|
<title>Blog {{.Name}} - Christine Dodrill</title>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ define "content" }}
|
||||||
|
<h1>Series: {{ .Name }}</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<ul>
|
||||||
|
{{ range .Posts }}
|
||||||
|
<li>{{ .DateString }} - <a href="/{{ .Link }}">{{ .Title }}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{ end }}
|
Loading…
Reference in New Issue