From ac2914e923a6061033d4cddf1bf9d6a8acaadaca Mon Sep 17 00:00:00 2001
From: Michael Clemens
Date: Wed, 14 Jul 2021 01:53:07 +0200
Subject: [PATCH] initial commit
---
.gitignore | 1 +
.gitmodules | 12 +
README.md | 4 +
archetypes/.gitkeep | 0
archetypes/default.md | 6 +
config.toml | 47 ++
content/.gitkeep | 0
content/_index.md | 0
content/about.md | 25 ++
content/impressum.md | 41 ++
...-05-the-arduino-enabled-washing-machine.md | 61 +++
...2-10-30-the-one-button-audiobook-player.md | 130 ++++++
content/post/2013-01-29-adressenmeister.md | 25 ++
content/post/2013-03-23-little-helper.md | 25 ++
...n-audiobook-player-features-in-new-book.md | 21 +
...05-05-nse-script-sqlite-output-for-nmap.md | 22 +
...patch-for-the-cli-password-manager-pass.md | 14 +
...documentation-generator-for-mcafee-siem.md | 20 +
.../post/2018-05-03-dynamic-dns-for-nsd.md | 103 +++++
content/post/30m-shortened-dipole.md | 52 +++
content/post/cif.md | 22 +
content/post/g90-mods.md | 60 +++
content/post/heated_trackball.md | 46 ++
content/post/mikrotik-auto-backup.md | 77 ++++
content/post/mikrotik-capsman-setup.md | 97 +++++
.../post/mikrotik-execute-scripts-via-sms.md | 61 +++
content/post/qrz-sh.md | 42 ++
content/post/the-antennapi.md | 58 +++
content/privacy.md | 99 +++++
content/projects.md | 49 +++
data/.gitkeep | 0
layouts/.gitkeep | 0
layouts/partials/footer.html | 7 +
layouts/partials/header.html | 20 +
resources/.gitkeep | 0
...s_1fcd9040f1144c65015c77e7b93bc5ac.content | 1 +
...scss_1fcd9040f1144c65015c77e7b93bc5ac.json | 1 +
...s_5e1eb8e37c42cdfb6215b61e44dcfa5f.content | 1 +
...scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.json | 1 +
...s_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.content | 403 ++++++++++++++++++
...scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.json | 1 +
...s_17a317b87063135b4df76ed814d78726.content | 3 +
...scss_17a317b87063135b4df76ed814d78726.json | 1 +
static/.gitkeep | 0
static/.htaccess | 1 +
static/_headers | 5 +
static/css/style.css | 15 +
static/favicon.ico | Bin 0 -> 549 bytes
static/img/30m_dipole.jpg | Bin 0 -> 150489 bytes
static/img/30m_dipole_coil.jpg | Bin 0 -> 187655 bytes
static/img/30m_dipole_nanovna.jpg | Bin 0 -> 90527 bytes
static/img/30m_dipole_schematics.jpg | Bin 0 -> 47180 bytes
static/img/antennapi01.jpg | Bin 0 -> 106984 bytes
static/img/antennapi02.jpg | Bin 0 -> 77764 bytes
static/img/antennapi03.jpg | Bin 0 -> 138166 bytes
static/img/antennapi04.jpg | Bin 0 -> 143549 bytes
static/img/antennapi05.jpg | Bin 0 -> 152562 bytes
static/img/antennapi06.jpg | Bin 0 -> 162708 bytes
static/img/diskette.jpg | Bin 0 -> 28251 bytes
static/img/esm2markdown.png | Bin 0 -> 83680 bytes
static/img/g90_mic_mod.jpg | Bin 0 -> 186912 bytes
static/img/g90_power_cable.jpg | Bin 0 -> 216249 bytes
static/img/g90_vfo_knob.jpg | Bin 0 -> 85160 bytes
static/img/helferlein_final_small.jpg | Bin 0 -> 35520 bytes
static/img/laundruino1_panel_small.jpg | Bin 0 -> 55419 bytes
.../img/laundruino2_cuircuit_board_small.jpg | Bin 0 -> 55332 bytes
static/img/laundruino3_washer_small.jpg | Bin 0 -> 50772 bytes
static/img/laundruino4_schematics_small.jpg | Bin 0 -> 16068 bytes
static/img/laundruino5_shield_small.jpg | Bin 0 -> 91365 bytes
static/img/laundruino6_shield_small.jpg | Bin 0 -> 75452 bytes
static/img/laundruino7_debug_small.jpg | Bin 0 -> 65685 bytes
static/img/laundruino8_screen1.jpg | Bin 0 -> 13668 bytes
static/img/laundruino9_screen2.jpg | Bin 0 -> 13182 bytes
static/img/mc_moshed.jpg | Bin 0 -> 12834 bytes
static/img/micha_moshed.jpg | Bin 0 -> 8576 bytes
static/img/obabp_1.jpg | Bin 0 -> 20358 bytes
static/img/obabp_2.jpg | Bin 0 -> 33019 bytes
static/img/obabp_schematics.jpg | Bin 0 -> 34989 bytes
static/img/qrz-sh.jpg | Bin 0 -> 44856 bytes
static/img/rapidcover250.jpg | Bin 0 -> 44927 bytes
static/img/resistance.png | Bin 0 -> 1163 bytes
static/img/trackball1.jpg | Bin 0 -> 66859 bytes
static/img/trackball2.jpg | Bin 0 -> 57829 bytes
static/img/trackball3.jpg | Bin 0 -> 69213 bytes
static/img/trackball4.jpg | Bin 0 -> 32087 bytes
themes/smol/LICENSE.md | 22 +
themes/smol/README.md | 92 ++++
themes/smol/archetypes/default.md | 4 +
themes/smol/images/screenshot.png | Bin 0 -> 74704 bytes
themes/smol/images/tn.png | Bin 0 -> 81359 bytes
.../_default/_markup/render-image.html | 11 +
themes/smol/layouts/_default/baseof.html | 24 ++
themes/smol/layouts/_default/list.html | 26 ++
themes/smol/layouts/_default/single.html | 16 +
themes/smol/layouts/_default/summary.html | 13 +
themes/smol/layouts/index.html | 9 +
themes/smol/layouts/partials/footer.html | 7 +
themes/smol/layouts/partials/header.html | 16 +
themes/smol/layouts/partials/pagination.html | 9 +
themes/smol/layouts/partials/sidebar.html | 14 +
themes/smol/static/css/style.css | 11 +
themes/smol/theme.toml | 17 +
102 files changed, 1971 insertions(+)
create mode 100644 .gitignore
create mode 100644 .gitmodules
create mode 100644 README.md
create mode 100644 archetypes/.gitkeep
create mode 100644 archetypes/default.md
create mode 100644 config.toml
create mode 100644 content/.gitkeep
create mode 100644 content/_index.md
create mode 100644 content/about.md
create mode 100644 content/impressum.md
create mode 100644 content/post/2011-08-05-the-arduino-enabled-washing-machine.md
create mode 100644 content/post/2012-10-30-the-one-button-audiobook-player.md
create mode 100644 content/post/2013-01-29-adressenmeister.md
create mode 100644 content/post/2013-03-23-little-helper.md
create mode 100644 content/post/2013-05-03-one-button-audiobook-player-features-in-new-book.md
create mode 100644 content/post/2014-05-05-nse-script-sqlite-output-for-nmap.md
create mode 100644 content/post/2016-05-25-patch-for-the-cli-password-manager-pass.md
create mode 100644 content/post/2018-04-29-correlation-rule-documentation-generator-for-mcafee-siem.md
create mode 100644 content/post/2018-05-03-dynamic-dns-for-nsd.md
create mode 100644 content/post/30m-shortened-dipole.md
create mode 100644 content/post/cif.md
create mode 100644 content/post/g90-mods.md
create mode 100644 content/post/heated_trackball.md
create mode 100644 content/post/mikrotik-auto-backup.md
create mode 100644 content/post/mikrotik-capsman-setup.md
create mode 100644 content/post/mikrotik-execute-scripts-via-sms.md
create mode 100644 content/post/qrz-sh.md
create mode 100644 content/post/the-antennapi.md
create mode 100644 content/privacy.md
create mode 100644 content/projects.md
create mode 100644 data/.gitkeep
create mode 100644 layouts/.gitkeep
create mode 100644 layouts/partials/footer.html
create mode 100644 layouts/partials/header.html
create mode 100644 resources/.gitkeep
create mode 100644 resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.content
create mode 100644 resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.json
create mode 100644 resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.content
create mode 100644 resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.json
create mode 100644 resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.content
create mode 100644 resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.json
create mode 100644 resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.content
create mode 100644 resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.json
create mode 100644 static/.gitkeep
create mode 100644 static/.htaccess
create mode 100644 static/_headers
create mode 100644 static/css/style.css
create mode 100644 static/favicon.ico
create mode 100644 static/img/30m_dipole.jpg
create mode 100644 static/img/30m_dipole_coil.jpg
create mode 100644 static/img/30m_dipole_nanovna.jpg
create mode 100644 static/img/30m_dipole_schematics.jpg
create mode 100644 static/img/antennapi01.jpg
create mode 100644 static/img/antennapi02.jpg
create mode 100644 static/img/antennapi03.jpg
create mode 100644 static/img/antennapi04.jpg
create mode 100644 static/img/antennapi05.jpg
create mode 100644 static/img/antennapi06.jpg
create mode 100644 static/img/diskette.jpg
create mode 100644 static/img/esm2markdown.png
create mode 100644 static/img/g90_mic_mod.jpg
create mode 100644 static/img/g90_power_cable.jpg
create mode 100644 static/img/g90_vfo_knob.jpg
create mode 100644 static/img/helferlein_final_small.jpg
create mode 100644 static/img/laundruino1_panel_small.jpg
create mode 100644 static/img/laundruino2_cuircuit_board_small.jpg
create mode 100644 static/img/laundruino3_washer_small.jpg
create mode 100644 static/img/laundruino4_schematics_small.jpg
create mode 100644 static/img/laundruino5_shield_small.jpg
create mode 100644 static/img/laundruino6_shield_small.jpg
create mode 100644 static/img/laundruino7_debug_small.jpg
create mode 100644 static/img/laundruino8_screen1.jpg
create mode 100644 static/img/laundruino9_screen2.jpg
create mode 100644 static/img/mc_moshed.jpg
create mode 100644 static/img/micha_moshed.jpg
create mode 100644 static/img/obabp_1.jpg
create mode 100644 static/img/obabp_2.jpg
create mode 100644 static/img/obabp_schematics.jpg
create mode 100644 static/img/qrz-sh.jpg
create mode 100644 static/img/rapidcover250.jpg
create mode 100755 static/img/resistance.png
create mode 100644 static/img/trackball1.jpg
create mode 100644 static/img/trackball2.jpg
create mode 100644 static/img/trackball3.jpg
create mode 100644 static/img/trackball4.jpg
create mode 100644 themes/smol/LICENSE.md
create mode 100644 themes/smol/README.md
create mode 100644 themes/smol/archetypes/default.md
create mode 100644 themes/smol/images/screenshot.png
create mode 100644 themes/smol/images/tn.png
create mode 100644 themes/smol/layouts/_default/_markup/render-image.html
create mode 100644 themes/smol/layouts/_default/baseof.html
create mode 100644 themes/smol/layouts/_default/list.html
create mode 100644 themes/smol/layouts/_default/single.html
create mode 100644 themes/smol/layouts/_default/summary.html
create mode 100644 themes/smol/layouts/index.html
create mode 100644 themes/smol/layouts/partials/footer.html
create mode 100644 themes/smol/layouts/partials/header.html
create mode 100644 themes/smol/layouts/partials/pagination.html
create mode 100644 themes/smol/layouts/partials/sidebar.html
create mode 100644 themes/smol/static/css/style.css
create mode 100644 themes/smol/theme.toml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..46f5006
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+public/*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..9cc6700
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "themes/hugo-coder"]
+ path = themes/hugo-coder
+ url = https://github.com/luizdepra/hugo-coder.git
+[submodule "themes/hugo-theme-cactus"]
+ path = themes/hugo-theme-cactus
+ url = https://github.com/monkeyWzr/hugo-theme-cactus.git
+[submodule "themes/cactus"]
+ path = themes/cactus
+ url = https://github.com/monkeyWzr/hugo-theme-cactus.git
+[submodule "themes/smol"]
+ path = themes/smol
+ url = https://github.com/colorchestra/smol
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..af68971
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+Source of my personal website: https://clemens.name
+
+ * Static site generator: Hugo (https://gohugo.io/)
+ * Theme: hugo-coder (https://github.com/luizdepra/hugo-coder/)
diff --git a/archetypes/.gitkeep b/archetypes/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644
index 0000000..00e77bd
--- /dev/null
+++ b/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
+
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..b811ebd
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,47 @@
+baseURL = "https://qrz.is/"
+languageCode = "en-us"
+title = "Michael Clemens"
+theme = "smol"
+
+publishDir = "/var/www/qrz.is"
+
+
+
+# Menu links
+[menu]
+[[menu.main]]
+ name = "Posts"
+ weight = 1
+ url = "/post/"
+[[menu.main]]
+ name = "Projects"
+ weight = 3
+ url = "/projects/"
+[[menu.main]]
+ name = "About"
+ weight = 4
+ url = "/about/"
+[[menu.footer]]
+ name = "Github"
+ weight = 5
+ url = "https://github.com/exitnode/"
+[[menu.footer]]
+ name = "Mastodon"
+ weight = 6
+ url = "https://mastodon.radio/@DL6MHC"
+[[menu.footer]]
+ name = "QRZ"
+ weight = 7
+ url = "https://qrz.com/DB/DL6MHC"
+[[menu.footer]]
+ name = "Datenschutz"
+ weight = 8
+ url = "/privacy/"
+[[menu.footer]]
+ name = "Impressum"
+ weight = 9
+ url = "/impressum/"
+
+
+dateFormat = "2006-01-02" # default
+copyright = "Michael Clemens"
diff --git a/content/.gitkeep b/content/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..e69de29
diff --git a/content/about.md b/content/about.md
new file mode 100644
index 0000000..97ebc04
--- /dev/null
+++ b/content/about.md
@@ -0,0 +1,25 @@
+---
+title: "About"
+slug: "about"
+date: 2018-05-03T16:42:59+02:00
+draft: false
+---
+
+Hi, I'm Michael Clemens. I'm an information security engineer with many years of experience in information technology. My first computer was a Commodore C64 (1989), followed by an Amiga (1992) and finally, in 1995, I got my first PC. In 1998 I installed my first Linux distribution (S.u.S.E. Linux 5.3), moved to Debian in 2002, tried a lot of BSDs and Linux distributions but always came back to Debian.
+
+I support the [Free Software Foundation Europe (fsfe.org)][1]. Everything I code in my freetime is therefore published as open source software. If you are interested, you can have a look at my projects [here][2]. I also try to document interesting stuff on my [blog][4].
+
+Besides that, I enjoy gaming on everything 8-bit (C64, Atari 2600, NES etc.) or fantasy consoles (PICO-8, TIC-80).
+
+Apart from computer related hobbies, I love analog photography, bicycles, reading and many more.
+
+I am a licensed ham radio operator and member of the [DARC][3]. My callsign is DL6MHC. You can find some information about my station on my [QRZ.com page][6].
+
+If you'd like to contact me, please send me a mail to mail@_domainofthiswebsite_ or send me a toot on [Mastodon][5].
+
+ [1]: https://wiki.fsfe.org/Fellows/clemens
+ [2]: /projects/
+ [3]: https://www.darc.de
+ [4]: /blog/
+ [5]: https://mastodon.radio/@DL6MHC
+ [6]: https://qrz.com/DB/DL6MHC
diff --git a/content/impressum.md b/content/impressum.md
new file mode 100644
index 0000000..12d4bff
--- /dev/null
+++ b/content/impressum.md
@@ -0,0 +1,41 @@
+---
+title: "Impressum"
+slug: "impressum"
+date: 2018-05-03T16:42:59+02:00
+draft: false
+---
+
+Michael Clemens
+c/o Block Services
+Stuttgarter Str. 106
+70736 Fellbach
+
+Telefon: 0162/3522778
+E-Mail: [impressum_0x7E5@qrz.is](mailto:impressum_0x7E5@qrz.is)
+
+**Verantwortlich für den Inhalt** (gem. § 55 Abs. 2 RStV):
+Michael Clemens
+c/o Block Services
+Stuttgarter Str. 106
+70736 Fellbach
+
+
+
+
+## Disclaimer – rechtliche Hinweise
+
+### § 1 Warnhinweis zu Inhalten
+Die kostenlosen und frei zugänglichen Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Der Anbieter dieser Webseite übernimmt jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten kostenlosen und frei zugänglichen journalistischen Ratgeber und Nachrichten. Namentlich gekennzeichnete Beiträge geben die Meinung des jeweiligen Autors und nicht immer die Meinung des Anbieters wieder. Allein durch den Aufruf der kostenlosen und frei zugänglichen Inhalte kommt keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande, insoweit fehlt es am Rechtsbindungswillen des Anbieters.
+
+### § 2 Externe Links
+Diese Website enthält Verknüpfungen zu Websites Dritter ("externe Links"). Diese Websites unterliegen der Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.
+
+### § 3 Urheber- und Leistungsschutzrechte
+Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt insbesondere für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen elektronischen Medien und Systemen. Inhalte und Rechte Dritter sind dabei als solche gekennzeichnet. Die unerlaubte Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.
+
+Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher Erlaubnis zulässig.
+
+### § 4 Besondere Nutzungsbedingungen
+Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den vorgenannten Paragraphen abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen.
+
+Quelle: [Hier aufrufen](https://www.juraforum.de)
diff --git a/content/post/2011-08-05-the-arduino-enabled-washing-machine.md b/content/post/2011-08-05-the-arduino-enabled-washing-machine.md
new file mode 100644
index 0000000..a43091d
--- /dev/null
+++ b/content/post/2011-08-05-the-arduino-enabled-washing-machine.md
@@ -0,0 +1,61 @@
+---
+title: The Laundruino
+date: 2011-08-05T09:58:52+00:00
+url: /the-arduino-enabled-washing-machine/
+categories:
+ - arduino
+tags:
+ - arduino
+
+---
+My washing machine is located in the basement. Unfortunately, the time data displayed on the front panel is always inaccurate. So instead of constantly running down the stairs and checking if the laundry is done, I decided to connect the washing machine to my LAN and extend it’s features by a simple http server. This is what I needed for it:
+
+ * 1 [arduino uno][1]
+ * 1 [ethernet shield][2]
+ * 1 opto-coupler (CNY17)
+ * 1 perfboard
+ * 1 resistor (150 Ohm)
+
+In my case, getting the right signal from the washing machine was simple: It has a „Finished“ LED on the front panel, so all I needed to do, was to solder it out and replace it with a two-core wire.
+
+
+![image][3]
+
+![image][4]
+
+![image][5]
+
+To connect my washing machine with the arduino, I built a minimal shield with a prefboard and a CNY17. Here’s how everything is put together:
+
+![image][6]
+
+![image][7]
+
+![image][8]
+
+Now I have a LOW signal on pin A2 (digital mode) when the laundry is done and a HIGH signal if the machine is running or turned off. In my case, a loop of 100ms duration is needed every time to watch the signal because I don’t get a steady voltage here (I guess the front panel LEDs might be multiplexed). If the signal becomes LOW once in this time window, the washing machine has finished and the LED would have turned on.
+
+![image][9]
+
+Screenshots:
+
+![image][10]
+
+![image][11]
+
+You can download the code on github: [https://github.com/exitnode/laundruino ][12]
+
+
+
+ [1]: http://arduino.cc/en/Main/ArduinoBoardUno
+ [2]: http://arduino.cc/en/Main/ArduinoBoardEthernet
+ [3]: /img/laundruino1_panel_small.jpg
+ [4]: /img/laundruino2_cuircuit_board_small.jpg
+ [5]: /img/laundruino3_washer_small.jpg
+ [6]: /img/laundruino4_schematics_small.jpg
+ [7]: /img/laundruino5_shield_small.jpg
+ [8]: /img/laundruino6_shield_small.jpg
+ [9]: /img/laundruino7_debug_small.jpg
+ [10]: /img/laundruino8_screen1.jpg
+ [11]: /img/laundruino9_screen2.jpg
+ [12]: https://github.com/exitnode/laundruino
diff --git a/content/post/2012-10-30-the-one-button-audiobook-player.md b/content/post/2012-10-30-the-one-button-audiobook-player.md
new file mode 100644
index 0000000..5bf1d1f
--- /dev/null
+++ b/content/post/2012-10-30-the-one-button-audiobook-player.md
@@ -0,0 +1,130 @@
+---
+title: The One Button Audiobook Player
+author: micha
+date: 2012-10-29T23:20:05+00:00
+url: /the-one-button-audiobook-player/
+categories:
+ - Uncategorized
+tags:
+ - raspberry audiobook
+
+---
+This little Raspberry Pi based project is a gift for my wife’s grandmother for her 90th birthday. Being visually impaired, she is hard to entertain but loves to listen to audiobooks. The problem is, that she isn’t able to handle a ghetto blaster or MP3 player.
+
+The solution to this problem was – tadaaaah – a one button audiobook player 🙂
+
+It basically consists of:
+
+ * 1 Raspberry Pi
+ * 1 [ModMyPi enclosure][1]
+ * 1 button
+ * 2 resistors (330 Ohm, 10 Kilo-Ohm)
+ * 1 blue LED
+ * 1 (slow) 8GB SD-Card
+ * some wire
+ * a pair of speakers
+
+The following software has been used:
+
+ * Raspbian minimal image ([http://www.linuxsystems.it/2012/06/raspbian-wheezy-armhf-raspberry-pi-minimal-image][2])
+ * mpd (music player daemon)
+ * mpc
+ * mpd-python
+ * pyudev (for USB access)
+ * a self-written python script
+
+The features are the following:
+
+ * **always on:** When you power on the raspberry, it will boot up and start the python script with the audio book in pause
+ * **one button usage:** The button pauses and unpauses the audio book or goes back one track when you press the button longer than 4 seconds
+ * **remembers position:** It will always remember the last played position
+ * **only one audiobook:** There will always be only one audio book on the Raspberry
+ * **easy audio book deployment:** When you plug in a USB thumb drive with a special name/label, the Raspberry will stop playing, mount the thumb drive, deletes the old audio book, copies the new one, rebuilds the playlist and – after unplugging the thumb drive – starts the new audiobook in pause mode
+ * **multi format:** Since it uses mpd, the player supports Ogg Vorbis, FLAC, OggFLAC, MP2, MP3, MP4/AAC, MOD, Musepack and wave
+
+Some pics and a video:
+
+![image][3]
+
+![image][4]
+
+
+
+(The audiobook used in this video is a free version of Cory Doctorows „Little Brother“ from Fabian Neidhardt)
+
+If you like to build your own one button audio book player, here are the super simple schematics:
+
+![image][5]
+
+And last but not least – the python script. The code might be crappy, please comment if you have improvements (especially regarding loadMusic). You can find it on github:
+
+
+
+**Update (2013-11-26)**
+
+Here’s what Russel wrote in a comment to this post:
+
+ I just completed building this and have some addendum notes adding more details:
+ Install the following packages:
+ sudo apt-get install mpd
+ sudo apt-get install mpc
+ sudo apt-get install python-mpd
+ sudo apt-get install python-pyudev
+
+ (below assumes using defaults for /etc/mpd.conf)
+ sudo mkdir -p /music/usb
+ sudo ln -s /var/lib/mpd /music/mpd
+ sudo ln -s /var/lib/mpd/music /music/mp3
+
+ Copy the tobabp.py script to /home/pi
+ nano /home/pi/tobabp.py
+
+ Change these in the script or flip the connections in wiring diagram.
+ BUTTON = 17
+ LED = 24
+
+ Testing
+
+ Rename a USB stick to “1GB”
+ Copy 1 MP3 onto the stick
+
+ Insert the stick into pi
+ sudo mount /dev/sda1 /music/usb
+ sudo /etc/init.d/mpd stop
+ sudo rm /music/mp3/*
+ sudo cp /music/usb/* /music/mp3/
+ sudo umount /music/usb
+
+ Remove the USB stick
+ sudo rm /music/mpd/tag_cache
+ sudo /etc/init.d/mpd start
+ mpc clear
+ mpc ls
+ mpc ls | mpc add
+ sudo /etc/init.d/mpd restart
+ mpc play
+
+ Plug in earphones
+ You should hear audio
+
+ Next try the python script:
+ sudo python /home/pi/tobabp.py
+
+ Insert USB stick
+ the LED should flash and the USB file copy to /music/mp3/
+ the LED should flash again. Remove the Stick and LED flashes again.
+ Press button to start playing
+ Press button again to stop
+ Press & hold button to rewind to beginning.
+ sudo crontab -e
+ Add following line run at startup
+ @reboot python /home/pi/tobabp.py &
+ sudo reboot
+
+ Then retest again to be sure all is well.
+
+ [1]: https://www.modmypi.com/
+ [2]: http://www.linuxsystems.it/2012/06/raspbian-wheezy-armhf-raspberry-pi-minimal-image/
+ [3]: /img/obabp_1.jpg
+ [4]: /img/obabp_2.jpg
+ [5]: /img/obabp_schematics.jpg
diff --git a/content/post/2013-01-29-adressenmeister.md b/content/post/2013-01-29-adressenmeister.md
new file mode 100644
index 0000000..76a7ca6
--- /dev/null
+++ b/content/post/2013-01-29-adressenmeister.md
@@ -0,0 +1,25 @@
+---
+title: Adressenmeister
+author: micha
+date: 2013-01-29T12:39:02+00:00
+url: /adressenmeister/
+categories:
+ - Uncategorized
+
+---
+I’d like to share my very first software project from 1992 with you which was written in BASIC 2.0 on my C64. It has never really been finished but had a nice intro screen with moving sprites and was able to print labels on a wire printer 🙂
+
+In order to archive it for myself, I’ve set up a github repository where the source code is available: [https://github.com/exitnode/adressenmeister][1]
+
+Here’s a little screen-cap of it:
+
+
+
+Update:
+
+Here’s a pic of the floppy disk:
+
+![image][2]
+
+ [1]: https://github.com/exitnode/adressenmeister "https://github.com/exitnode/adressenmeister"
+ [2]: /img/diskette.jpg
diff --git a/content/post/2013-03-23-little-helper.md b/content/post/2013-03-23-little-helper.md
new file mode 100644
index 0000000..16398c9
--- /dev/null
+++ b/content/post/2013-03-23-little-helper.md
@@ -0,0 +1,25 @@
+---
+title: Little Helper
+author: micha
+date: 2013-03-23T11:49:38+00:00
+url: /little-helper/
+categories:
+ - Uncategorized
+
+---
+Here’s the result of my attempt to recreate [Gyro Gearloose’s Little Helper (in German: Daniel Düsentrieb’s Helferlein)][1]:
+
+![image][2]
+
+It’s built out of:
+
+ * aluminium tubes
+ * brass sticks
+ * wooden shoes and gloves
+ * lots of two-component adhesive
+ * a 12V 40W bulb with E27 thread
+ * some wire
+ * a AC/DC converter 12V 3A
+
+ [1]: https://www.duckipedia.de/Helferlein
+ [2]: /img/helferlein_final_small.jpg
diff --git a/content/post/2013-05-03-one-button-audiobook-player-features-in-new-book.md b/content/post/2013-05-03-one-button-audiobook-player-features-in-new-book.md
new file mode 100644
index 0000000..a11921f
--- /dev/null
+++ b/content/post/2013-05-03-one-button-audiobook-player-features-in-new-book.md
@@ -0,0 +1,21 @@
+---
+title: One-button audiobook player features in new book
+author: micha
+date: 2013-05-03T13:16:03+00:00
+url: /one-button-audiobook-player-features-in-new-book/
+categories:
+ - Uncategorized
+
+---
+The One-button audiobook player has been included in the new book Raspberry Pi For Dummies by Sean McManus and Mike Cook. The book covers setting up the Raspberry Pi, using Linux on it, using the Pi for work and play, programming the Raspberry Pi in Scratch and Python, and creating electronics projects.
+
+![image][1]
+
+Co-author Sean McManus told me: “We wanted to finish the book by highlighting some inspiring projects that would give people an idea of what they could do by taking their new programming and electronics skills further. The one-button audiobook player is a nice example of an electronics project, but I particularly like the way it’s really improving someone’s quality of life, by making it possible for your wife’s grandmother to listen to audiobooks. I get a lot of enjoyment from audiobooks myself, so I can imagine how much it means to her to be able to listen to them, especially given her visual impairment.”
+
+Other inspiring Raspberry Pi projects mentioned in the book include a synthesiser, a bird feeder webcam, a weather station and a jukebox.
+
+You can [find out more about Raspberry Pi For Dummies at Sean’s website][2].
+
+ [1]: /img/rapidcover250.jpg
+ [2]: http://www.sean.co.uk/books/raspberry-pi-for-dummies/index.shtm
diff --git a/content/post/2014-05-05-nse-script-sqlite-output-for-nmap.md b/content/post/2014-05-05-nse-script-sqlite-output-for-nmap.md
new file mode 100644
index 0000000..2825d25
--- /dev/null
+++ b/content/post/2014-05-05-nse-script-sqlite-output-for-nmap.md
@@ -0,0 +1,22 @@
+---
+title: 'NSE-Script: SQLite output for Nmap'
+author: micha
+date: 2014-05-05T13:36:29+00:00
+url: /nse-script-sqlite-output-for-nmap/
+categories:
+ - Uncategorized
+
+---
+I wrote this little NSE script that allows you to store the output of Nmap into a SQLite database: https://github.com/exitnode/nmap-sqlite-output
+
+This might come in handy when performing large inventory scans. The SQLite database can be queried and sorted easily or exported as a CSV file. This way you can, for example, easily generate tables for your assessment report.
+
+**Example:**
+
+`$ nmap -sS -A -F --script sqlite-output scanme.nmap.org
+[...]
+$ sqlite3 scan.sqlite
+[...]
+sqlite> select * from scandata;
+scanme.nmap.org|74.207.244.221|22|tcp|ssh|open|OpenSSH5.3p1 Debian 3ubuntu7.1
+scanme.nmap.org|74.207.244.221|80|tcp|http|open|Apache httpd2.2.14`
diff --git a/content/post/2016-05-25-patch-for-the-cli-password-manager-pass.md b/content/post/2016-05-25-patch-for-the-cli-password-manager-pass.md
new file mode 100644
index 0000000..62af443
--- /dev/null
+++ b/content/post/2016-05-25-patch-for-the-cli-password-manager-pass.md
@@ -0,0 +1,14 @@
+---
+title: Patch for the CLI password manager „pass“
+author: micha
+date: 2016-05-25T21:47:20+00:00
+url: /patch-for-the-cli-password-manager-pass/
+categories:
+ - Uncategorized
+
+---
+I use Pass (https://www.passwordstore.org/) to store and synchronize all my passwords.
+
+When I use Pass via SSH on a remote system in order to retrieve a password, I cannot make use of it’s clipboard feature. In order to output the password without actually displaying it, I wrote the following patch which prints the password in red on a red background while still being able to be manually copied to the clipboard:
+
+
diff --git a/content/post/2018-04-29-correlation-rule-documentation-generator-for-mcafee-siem.md b/content/post/2018-04-29-correlation-rule-documentation-generator-for-mcafee-siem.md
new file mode 100644
index 0000000..32e27e1
--- /dev/null
+++ b/content/post/2018-04-29-correlation-rule-documentation-generator-for-mcafee-siem.md
@@ -0,0 +1,20 @@
+---
+title: Correlation Rule Documentation Generator for McAfee SIEM
+author: micha
+date: 2018-04-29T13:09:57+00:00
+url: /correlation-rule-documentation-generator-for-mcafee-siem/
+categories:
+ - Uncategorized
+
+---
+Since we are required to document all custom correlation rules inside our SIEM (McAfee Enterprise Security Manager) for our customers, I wrote a Python script that converts XML rule exports to Markdown. Afterwards its easy to convert teh resulting file e.g. to PDF, DOCX, HTML or even variuous wiki-formats with e.g. Pandoc. This way it’s possible to generate a PDF documentation of all rules with just a few clicks/commands.
+
+![image][1]
+
+On the long shot that this is useful for you, you can find the script on [Github][2].
+
+Please comment on this on the [McAfee Support Community][3] or on [Github][2].
+
+ [1]: /img/esm2markdown.png
+ [2]: https://github.com/exitnode/esm2markdown "Github"
+ [3]: https://community.mcafee.com/t5/Security-Information-and-Event/Script-Automatic-Correlation-Rule-Documentation-Generator/m-p/590048
diff --git a/content/post/2018-05-03-dynamic-dns-for-nsd.md b/content/post/2018-05-03-dynamic-dns-for-nsd.md
new file mode 100644
index 0000000..7869eee
--- /dev/null
+++ b/content/post/2018-05-03-dynamic-dns-for-nsd.md
@@ -0,0 +1,103 @@
+---
+title: Dynamic DNS for NSD
+author: micha
+date: 2018-05-03T02:26:11+00:00
+url: /dynamic-dns-for-nsd/
+categories:
+ - Uncategorized
+
+---
+# Introduction
+
+nsd-dyndns is a simple script that adds dynamic DNS dunctionality to NSD (authoritative DNS name server).
+
+# Requirements
+
+The following is required or suggested:
+
+ * OpenBSD (or another BSD or some Linux distro) with HTTPD and NSD installed (pkg_add nsd), configured and running
+ * (sub-)domain for your webserver. Needed for updating the NS record of your actual DynDNS domain.
+ * In this example: _update.example.com_
+ * (sub-)domain that is updated dynamically.
+ * In this example: _dyn.example.com_
+ * A router capable of sending custom GET-requests to your DynDNS server.
+ * In this example: A FritzBox
+
+# Installation
+
+## Configure your HTTPD
+
+Add the following new virtual host to your _/etc/httpd.conf_:
+
+ server "update.example.com" {
+ listen on $ext_addr port 80
+ root "/htdocs/dyndns"
+ log access dyndns.log
+ }
+
+Create an empty _update.html_:
+
+ # mkdir /var/www/htdocs/dyndns/
+ # touch /var/www/htdocs/dyndns/update.html
+
+After reloading HTTPD, try to access http://update.example.com/update.html The request should show up in _/var/www/logs/dyndns.log_
+
+## **Create a zone file for dyn.example.com**
+
+Create a new zone file (e.g. at _/var/nsd/zones/dyn.example.com.zone_) with the following content
+
+ $ORIGIN example.com.
+ $TTL 300
+ @ IN SOA ns1.example.com. admin.example.com. (
+ 1524952218
+ 300 ; refresh
+ 900 ; retry
+ 1209600 ; expire
+ 1800 ; ttl
+ )
+
+ ; Name servers
+ IN NS ns1.example.com.
+ IN NS ns1.example.com.
+
+ ; A records
+ @ IN A 123.123.123.123
+ update IN A 123.123.123.123
+ dyn IN A 123.123.123.123
+
+Don’t forget to set your own domain names, name servers and ip addresses Furthermore, add this zone file to your _/var/nsd/etc/nsd.conf_
+
+## Configure and Install nsd-dyndns
+
+ * Download the scripts from here: https://github.com/exitnode/nsd-dyndns
+ * Copy _dyndns.conf-dist_ to _/etc/dyndns.conf_
+ * _\# cp dyndns.conf-dist /etc/dyndns.conf_
+ * Edit _/etc/dyndns.conf_ to your needs
+ * Copy _dyndns.sh_ to _/usr/local/bin/dyndns.sh_
+ * _\# cp dyndns.sh /usr/local/bin/dyndns.sh_
+ * Make the script executable:
+ * _\# chmod u+x /usr/local/bin/dyndns.sh_
+ * Add _/usr/local/bin/dyndns.sh_ to your crontab
+
+## Configure your router
+
+Configure your router to query the following URL:
+
+ http://update.example.com/update.html?qwertzuiop1234567890
+
+Don’t forgert to set your own domain name and to replace the string after „?“ with the password you configured in the config file.
+
+# What it does
+
+When your router gets a new IP and therefore sends an HTTP request to your server, a similar entry should appear in your _/var/www/logs/dyndns.log_:
+
+ update.example.com 123.123.123.123 - - [29/Apr/2018:20:48:19 +0200] "GET /update.html?qwertzuiop1234567890 HTTP/1.1" 200 6
+
+When the script is executed e.g. via cron, the following happens:
+
+ * It greps the last line of _/var/www/logs/dyndns.log_ where the correct password was found and extracts the requesting IP address
+ * It checks if this IP is the same than the last time
+ * If it’s a new IP, then it replaces the forth line in your zone file – the line with the version number – with a new version (current unix time stamp)
+ * As a second step, it updates the A record of you DynDNS domain (dyn.example.com in our example)
+ * It then stores the new IP in the file _/tmp/last\_dyndns\_ip.txt_
+ * Finally it reloads NSD
diff --git a/content/post/30m-shortened-dipole.md b/content/post/30m-shortened-dipole.md
new file mode 100644
index 0000000..e0d6a19
--- /dev/null
+++ b/content/post/30m-shortened-dipole.md
@@ -0,0 +1,52 @@
+---
+title: "Shortened 30m Dipole"
+date: 2020-02-02T15:00:00+02:00
+url: /30m-dipole/
+---
+
+# Why and what
+
+This aricle describes the construction of a 9,50 m long dipole for the 30 m band (10.1 MHz to 10.15 MHz). It was designed to be mounted ca. 6m above ground inside an attic. The calculations were performed by OE1MEW with the help of [this antenna calculator](http://66pacific.com). To reduce the length of the ~15 m long dipole, a coil will be integrated into each side of the dipole.
+
+The following diagram shows the dipole in theory:
+
+![image][1]
+
+# Bill of materials
+
+ * 1 feed point connector with PL socket or a 1:1 balun
+ * 2 isolators
+ * 2x 1 m antenna wire
+ * 2x ca. 4 m antenna wire
+ * 2 short pieces of 16 mm installation tubes
+ * several meters of 1.5 mm2 copper wire (e.g. out of NYM-J 3 x 1,5 cable)
+
+# Construction
+
+## Coils
+
+Drill a hole into the 16 mm installation tube and stick a few centimeters of the 1.5 mm2 wire through it. Afterwards tightly wind the wire around it 37 times. After the 37th turn, drill a hole closely to the wire into the tube and stick the wire through it. It now should look like this:
+
+![image][2]
+
+Repeat this step to build a second coil.
+
+## Assembly
+
+Connect 1 m antenna wire to each side of the feed point connector (or the 1:1 balun). Now solder the ends of the antenna wires to one side of each coil. Use shrink tubing to make it water resistant. Solder the 4 m pieces of antenna wire to the other side of the coils. Both ends should then be terminated with isolatiors. A good start for tuning is a wire length of about 3,60 m between coil and isolator. Wrap around the remaining 40 cm for the tuning procedure.
+
+The result should look like this:
+
+![image][3]
+
+# Result
+
+The antenna ended up being 9,30 m long (including feed point, excluding isolators). The following photos show how nicely this antenna can be tuned:
+
+![image][4]
+
+
+ [1]: /img/30m_dipole_schematics.jpg
+ [2]: /img/30m_dipole_coil.jpg
+ [3]: /img/30m_dipole.jpg
+ [4]: /img/30m_dipole_nanovna.jpg
diff --git a/content/post/cif.md b/content/post/cif.md
new file mode 100644
index 0000000..d2ac8bd
--- /dev/null
+++ b/content/post/cif.md
@@ -0,0 +1,22 @@
+---
+title: "Cif / Bearded Avenger"
+date: 2018-10-28T20:09:18+01:00
+draft: true
+---
+
+# Introduction
+
+ cif@cif:~$ cif --itype fqdn --tags malware --limit 1 --fields tlp,indicator,count,tags,description,confidence,rdata,provider
+ +-------+----------------+-------+---------+----------------+------------+-------+--------------+
+ | tlp | indicator | count | tags | description | confidence | rdata | provider |
+ +-------+----------------+-------+---------+----------------+------------+-------+--------------+
+ | white | erxxxxxxzq.com | 2 | malware | malware domain | 9.0 | None | spamhaus.org |
+ +-------+----------------+-------+---------+----------------+------------+-------+--------------+
+ cif@cif:~$ cif --indicator 2xx.xx.xx.xx7 --format table --fields tlp,indicator,count,tags,description,confidence,rdata,provider --limit 3
+ +-------+---------------+-------+--------------------+------------------+------------+-------+---------------------+
+ | tlp | indicator | count | tags | description | confidence | rdata | provider |
+ +-------+---------------+-------+--------------------+------------------+------------+-------+---------------------+
+ | green | 2xx.xx.xx.xx7 | 1 | malware | compromised host | 8.0 | None | emergingthreats.net |
+ | green | 2xx.xx.xx.xx7 | 6 | bruteforce,scanner | None | 9.0 | None | dataplane.org |
+ | amber | 2xx.xx.xx.xx7 | 7 | search | None | 10.0 | None | admin |
+ +-------+---------------+-------+--------------------+------------------+------------+-------+---------------------+
diff --git a/content/post/g90-mods.md b/content/post/g90-mods.md
new file mode 100644
index 0000000..7a16ae8
--- /dev/null
+++ b/content/post/g90-mods.md
@@ -0,0 +1,60 @@
+---
+title: "Xiegu G90 Mods"
+author: micha
+date: 2020-01-17T15:00:00+02:00
+url: /g90-mods/
+---
+
+# Mods
+
+The following is a compilation of some recommended mods for the Xiegu G90. None of these mods are my idea, I learned about them from the Xiegu G90 group.io group (see below).
+
+## Power Cable
+
+The original power cable is too thin and should be replaced with silicone 14AWG cables plus some ferrite beads. Don't forget to integrate a 5Ah fuse into the cable.
+
+Mine looks like this now:
+
+![image][1]
+
+## Microphone Mod
+
+When using the original G90 microphone, your voice might be too bassy. To solve this problem, open the mic and replace the cpacitor C15 with a 10 nanofarad SMD capacitor and C14 with 2,2 nanofarad (both size 0603). [source](https://xiegug90.groups.io/g/main/profile/@YO2AA)
+
+The following image shows both capacitors (taken from https://xiegug90.groups.io/g/main/message/1219):
+
+![image][2]
+
+## Ferrite Beads
+
+In order to prevent radio-frequency interference, all cables should be fitted with ferrite beads:
+
+ * Microphone cable
+ * Power cord
+ * CAT cable
+ * Head unit connection cable
+
+## VFO Knob
+
+Not essential but nice: A larger VFO knob. I bought a black aluminium potentiometer knob for 6mm axis with a size of 32x13mm.
+
+The G90 with a larger VFO knob:
+
+![image][3]
+
+## Head Unit Stand
+
+I like [this 3D printable design over at thingiverse.com](https://www.thingiverse.com/thing:3741359) for placing the head unit on the table in an ergonomic way.
+
+# Useful other Information
+
+ * Very active and helpful community: [XieguG90](https://xiegug90.groups.io/g/main)
+ * [G90 Update Instructions](https://xiegug90.groups.io/g/main/files/G90%20Firmware%20Update%20Instructions/G90%20Firmware%20Update%20Instructions.pdf)
+ * [CI-V Reference](https://xiegug90.groups.io/g/main/files/G90%20CI-V%20REFERENCE.pdf)
+ * [Cheat Sheet](https://xiegug90.groups.io/g/main/files/XIEGU%20G90%20CHEAT%20SHEET%20v1.73%2012-15-2019.pdf)
+ * [ini file for OnmiRig](https://xiegug90.groups.io/g/main/files/XieguG90.ini)
+
+
+ [1]: /img/g90_power_cable.jpg
+ [2]: /img/g90_mic_mod.jpg
+ [3]: /img/g90_vfo_knob.jpg
diff --git a/content/post/heated_trackball.md b/content/post/heated_trackball.md
new file mode 100644
index 0000000..49ea940
--- /dev/null
+++ b/content/post/heated_trackball.md
@@ -0,0 +1,46 @@
+---
+title: "Heated Trackball"
+date: 2014-12-22T14:34:34+02:00
+draft: false
+---
+
+## Parts needed
+
+ * Heating wire (0,2mm 43,95 Ohm/m Kanthal D)
+ * some regular wire
+ * glue
+ * soldering equipment
+
+Since the USB port should ghive us 500mAh and the trackball shouldn't
+consume more than 150mAh, the wire might consume 350mAh. Knowing the
+voltage of 5V and the desired power consumption, it is easy to
+calculate the needed resistor:
+
+![image][1]
+
+The heating wire has a resistance of 43,95 Ohm per meter, the wire
+needs to be 33cm long in order to consume 350mAh:
+Icalculation of the wire length /pics/length.png
+
+## Assembly
+
+Glueing the wire to the inner side of the housing:
+
+![image][2]
+
+After reassembling the mouse buttons:
+
+![image][3]
+
+The finished trackball:
+
+![image][4]
+
+![image][5]
+
+
+ [1]: /img/resistance.png
+ [2]: /img/trackball1.jpg
+ [3]: /img/trackball3.jpg
+ [4]: /img/trackball2.jpg
+ [5]: /img/trackball4.jpg
diff --git a/content/post/mikrotik-auto-backup.md b/content/post/mikrotik-auto-backup.md
new file mode 100644
index 0000000..42f358f
--- /dev/null
+++ b/content/post/mikrotik-auto-backup.md
@@ -0,0 +1,77 @@
+---
+title: "MikroTik: Auto-Backup der Routerkonfiguration via FTP"
+author: micha
+date: 2019-01-04T22:00:11+02:00
+url: /blog/mikrotik-auto-backup/
+draft: false
+categories:
+ - MikroTik
+
+---
+# Einführung
+
+Folgend wird beschrieben, wie man seinen MikroTik Router automatisch sichert und das Backup auf einen FTP-Server überträgt. Zielsetzung ist die folgende:
+
+ * Erstellung eines Exports und eines Backups
+ * Speicherung des letzten Backups/Exports auf dem Router selbst
+ * Übertragung der Dateien auf einen FTP-Server
+
+# Vorbedingungen
+
+ * MikroTik RouterBoard, z.B. ein MikroTik hEX
+ * FTP-Server im LAN
+
+# Quellen
+
+ * [Mikrotik Forum Post von rextended](https://forum.mikrotik.com/viewtopic.php?t=87749#p440665)
+ * [https://github.com/massimo-filippi/mikrotik/blob/master/backup-config.rsc](https://github.com/massimo-filippi/mikrotik/blob/master/backup-config.rsc)
+
+# Los geht's
+
+## Skript
+
+ ## environment specific configuration
+ :local ftpServer "1.2.3.4"
+ :local ftpUser "user"
+ :local ftpPassword "pass"
+ :local ftpPath "/"
+
+ :local dstFile "backup"
+ :local srcFile $dstFile
+ :local myVer value=[/system package update get installed-version];
+ :local id value=[/system identity get value-name=name];
+ :local date value=[/system clock get date];
+
+ ## replace "/" with "-" in date
+ :local newdate value="";
+ :if ([:find $date "/" -1] > 0) do={
+ :for i from=0 to=([:len $date] -1) step=1 do={
+ :local actualchar value=[:pick $date $i];
+ :if ($actualchar = "/") do={ :set actualchar value="-" };
+ :set newdate value=($newdate.$actualchar);
+ }
+ };
+
+ ## construct destination file name
+ :set dstFile ($dstFile . "-" . $id . "-" . $myVer . "-" . $newdate);
+
+ ## perform the actual backup / export
+ /system backup save name="$srcFile"
+ /export file="$srcFile"
+
+ ## upload both files via FTP
+ :foreach i in=(".backup", ".rsc") do={
+ /tool fetch address=$ftpServer src-path=($srcFile . $i) user=$ftpUser mode=ftp password=$ftpPassword dst-path=($ftpPath . $dstFile . $i) upload=yes port=21
+ }
+
+ ## Log
+ :log info ("Configuration backup created on router $[/system identity get name].")
+
+
+## Scheduler
+
+Nachdem das Skript unter dem Namen "backup-config" angelegt wurde, kann man es mit folgendem Befehl täglich um 3:00 Uhr ausführen lassen:
+
+ /system scheduler
+ add interval=1d name=backup-config on-event=backup-config start-date=jan/05/2019 start-time=03:00:00
+
diff --git a/content/post/mikrotik-capsman-setup.md b/content/post/mikrotik-capsman-setup.md
new file mode 100644
index 0000000..49d3c61
--- /dev/null
+++ b/content/post/mikrotik-capsman-setup.md
@@ -0,0 +1,97 @@
+---
+title: "MikroTik: Zentrales WiFi-Management mit CAPsMAN"
+author: micha
+date: 2018-12-31T16:00:11+02:00
+url: /blog/mikrotik-capsman-setup/
+draft: false
+categories:
+ - MikroTik
+
+---
+# Einführung
+
+Folgend wird beschrieben, wie man mit CAPsMAN beliebig viele Wireless Access Points verwaltet und dynamisch provisioniert. Zielsetzung ist die folgende:
+
+ * Zentrale Verwaltung aller APs im Haus (zunächst 3 APs, weitere sollen jederzeit ohne Aufwand hinzugefügt werden können)
+ * 2 SSIDs, je eine SSID für 2,4 GHz und eine für 5 GHz
+ * Jeder AP soll die gleiche Konfiguration erhalten
+ * Umgebung soll beliebig erweiterbar sein, z.B. weitere SSID mit eigenem VLAN
+
+# Vorbedingungen
+
+ * MikroTik RouterBoard mit installiertem "wireless" Package, z.B. ein MikroTik hEX
+ * 1-n MikroTik Wireless Access Points, z.B. wAP AC
+
+# CAPsMAN konfigurieren
+
+## Channels
+
+Zu Beginn definieren wir zwei Channels:
+
+ /caps-man channel
+ add band=2ghz-g/n control-channel-width=20mhz extension-channel=disabled frequency=2437 name="2.4 GHz"
+ add band=5ghz-n/ac name="5 GHz"
+
+Hierbei ist folgendes zu beachten:
+
+ * 2.4 GHz WLANs sollten idealerweise die Kanäle 1, 6 oder 11 nutzen. CAPsMAN verlangt die Angabe der jeweiligen Trägerfrequenz, diese kann [hier](https://www.elektronik-kompendium.de/sites/net/1712061.htm) nachgeschaut werden (hier 2437 MHz = Kanal 6).
+ * Bei einem Frequenzbereich von 2.4 GHz ist eine Kanalbreite von 20 MHz ideal
+ * Auf 802.11g sollte man unbedingt verzichten, da dies die Gesamtgeschwindigkeit reduziert und sowieso keine g-Clients zu erwarten sein sollten.
+
+## Security Configurations
+
+In meiner Umgebung verwende ich das gleiche Passwort für beide SSIDs:
+
+ /caps-man security
+ add authentication-types=wpa2-psk disable-pmkid=yes encryption=aes-ccm group-encryption=aes-ccm group-key-update=1h name="Wifi Security Settings" passphrase=GeheimesPasswort
+
+Hierbei ist folgendes zu beachten:
+
+ * Auf WPA kann man in den meisten fällen verzichten, WPA2 ist immer zu bevorzugen
+ * Mit "disable-pmkid=yes" mitigiert man die Schwachstelle CVE-2018-3580
+
+## Datapaths
+
+Hier gibt es kaum etwas zu beachten, gegebenenfalls muss anstelle von "bridge1" der Name der Bridge angegeben werden, die auf dem Router definiert wurde:
+
+ /caps-man datapath
+ add bridge=bridge1 client-to-client-forwarding=yes local-forwarding=yes name=BridgeDP
+
+## Configurations
+
+Die bisher definierten Einstellungen werden nun in zwei übergeordneten Konfigurationen eingesetzt. Diese Konfigurationen werden in einem späteren Schritt verwendet, um die APs zu provisionieren:
+
+ /caps-man configuration
+ add channel="2.4 GHz" country=germany datapath=BridgeDP installation=indoor name="2.4 GHz" security="Wifi Security Settings" ssid="Mein WLAN (2.4 GHz)"
+ add channel="5 GHz" country=germany datapath=BridgeDP name="5 GHz" security="Wifi Security Settings" ssid="Mein WLAN (5 Ghz)"
+
+## Provisioning
+
+Folgende Einstellungen sorgen dafür, dass jeder AP vollständig dynamisch provisioniert wird:
+
+ /caps-man provisioning
+ add action=create-enabled hw-supported-modes=g master-configuration="2.4 GHz" name-format=prefix-identity name-prefix=2.4GHz
+ add action=create-enabled hw-supported-modes=ac master-configuration="5 GHz" name-format=prefix-identity name-prefix=5GHz
+
+Über den Parameter "hw-supported-modes" wird gesteuert, dass Interfaces, die "g" unterstützen (und es sich somit um 2.4 GHz Interfaces handelt), die Konfiguration "2.4 GHz" erhalten. 5 GHz Interfaces, welche "ac" unterstützen, erhalten wiederum die Konfiguration mit dem Namen "5 GHz".
+
+## Manager
+
+Schlussendlich aktivieren wir den Manager mit
+
+ /caps-man manager
+ set enabled=yes
+
+# Inbetriebnahme
+
+Zu beachten ist, dass man keine CAP Interfaces anlegen muss - dies geschieht vollautomatisch. Jetzt können die neuen APs hinzugefügt werden:
+
+ * Während des Einschaltens 10 Sekunden lang Reset gedrückt halten bis die "AP/CAP"-LED anfängt zu blinken (von Modell abhängig)
+ * Nach einer Weile erscheinen dann pro AP zwei CAP Interfaces mit dem Namensmuster "2.4GHz-MikroTik-1" bzw. "5GHz-MikroTik-1"
+ * Fertig!
+
+Sinnvolle ToDos:
+
+ * Alle APs aktualiseren (Packages + Firmware)
+ * Jedem AP ein Passwort vergeben
+ * Jedem AP eine Identity geben, z.B. "AP EG", "AP OG" und "AP Büro" statt "MikroTik"
diff --git a/content/post/mikrotik-execute-scripts-via-sms.md b/content/post/mikrotik-execute-scripts-via-sms.md
new file mode 100644
index 0000000..6075aa9
--- /dev/null
+++ b/content/post/mikrotik-execute-scripts-via-sms.md
@@ -0,0 +1,61 @@
+---
+title: "MikroTik: Ausführen von Skripten per SMS"
+author: micha
+date: 2018-12-30T13:00:11+02:00
+url: /blog/mikrotik-exec-scripts-via-sms/
+draft: false
+categories:
+ - MikroTik
+
+---
+# Einführung
+
+Dieser Blogeintrag beschäftigt sich mit dem Ausführen von Skripten per SMS-Kommandos. In diesem Beispiel soll als Aktion eine SMS zurückgesendet werden, welche die aktuelle öffentliche IP-Adresse enthält.
+
+# Vorbedingungen
+
+ * MikroTik RouterBoard mit USB-Port, z.B. ein MikroTik hEX
+ * USB UMTS-Stick, z.B. ein Standard Huawei Stick aus verschiedenen Prepaid-Angeboten
+
+# Los geht's
+
+Zuerst schauen wir nach, ob der Router den USB-Stick erkannt hat:
+
+ [admin@hEX] /system resource usb> print
+ # DEVICE VENDOR NAME SPEED
+ 0 1-0 Linux 3.3.5 xhci-hcd xHCI Host Controller 480
+ 1 2-0 Linux 3.3.5 xhci-hcd xHCI Host Controller 5000
+ 2 1-1 HUAWEI Technology HUAWEI Mobile 480
+
+
+Anschließend versenden wir eine Test-SMS:
+
+ /tool sms send usb1 "+4915212345678" message="Test"
+
+Nach dem erfolgreichen Test kann das benötigte Skript wie folgt erstellt werden:
+
+ /system script
+ add dont-require-permissions=yes name=extip owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\
+ "/tool fetch url=\"https://icanhazip.com/\" mode=http dst-path=mypublicip.txt\r\
+ \n:local currentIP [/file get mypublicip.txt contents]\r\
+ \n:put \$currentIP\r\
+ \n/tool sms send usb1 \"+4915212345678\" message=\"\$currentIP\";"
+
+Zur Ermittlung der öffentlichen IP wird absichtlich nicht das WAN-Interface abgefragt, sondern ein externer Dienst, da mein Router nicht direkt mit dem Internet verbunden ist. Die Antwort des versendeten GET-Requests wird in der Datei mypublicip.txt zwischengespeichert und direkt darauf per SMS an die im Skript hinterlegte Nummer gesendet.
+
+Zuletzt muss noch der Empfang von SMS aktiviert werden:
+
+ /tool sms
+ set allowed-number=+4915212345678 port=usb1 receive-enabled=yes secret=GeheimesPasswort
+
+Wenn alles geklappt hat, muss man folgenden Text (ohne Anführungszeichen) and die Nummer des UMTS-Sticks senden:
+
+ ":cmd GeheimesPasswort extip"
+
+Als Antwort sollte anschließend die öffentliche IP-Adresse des Routers kommen.
+
+Weitere Informationen sind dem MikroTik Wiki entnehmbar:
+
+ * [Manual:Tools/SMS](https://wiki.mikrotik.com/wiki/Manual:Tools/Sms)
+ * [Manual:Tools/Fetch](https://wiki.mikrotik.com/wiki/Manual:Tools/Fetch)
+ * [Manual:Scripting](https://wiki.mikrotik.com/wiki/Manual:Scripting)
diff --git a/content/post/qrz-sh.md b/content/post/qrz-sh.md
new file mode 100644
index 0000000..e2abc02
--- /dev/null
+++ b/content/post/qrz-sh.md
@@ -0,0 +1,42 @@
+---
+title: "qrz.sh - a CLI QRZ.com query tool"
+author: micha
+date: 2020-11-09T17:00:00+02:00
+url: /qrz-sh/
+---
+
+# About
+
+This script queries the QRZ.com callsign database and returns
+the result to the command line. A XML subscription plan with
+QRZ.com is required for full functionality.
+
+You can download the script here: [https://github.com/exitnode/qrz.sh](https://github.com/exitnode/qrz.sh)
+
+
+
+# Installation
+
+* Copy the file _.qrz.conf_ into your home directory
+* Copy the file _qrz.sh_ into a directory that is in you PATH variable
+* Set the correct file permissions: _chmod u+x qrz.sh_
+
+# Dependencies
+
+* curl
+
+# Configuration
+
+Edit the file _~/.qrz.conf_ like this:
+
+```
+user=
+password=
+```
+
+# Usage
+
+```
+# qrz.sh
+```
+
diff --git a/content/post/the-antennapi.md b/content/post/the-antennapi.md
new file mode 100644
index 0000000..54fd98b
--- /dev/null
+++ b/content/post/the-antennapi.md
@@ -0,0 +1,58 @@
+---
+title: "The AntennaPi"
+author: micha
+date: 2019-07-05T13:29:09+02:00
+url: /the-antennapi/
+---
+
+## Parts needed
+
+ * Aluminium case
+ * Raspberry Pi 1 or newer
+ * relay module
+ * PL sockets
+ * screws, cables, etc.
+ * soldering equipment, drill, etc.
+
+This is a remote antenna switch I use in my attic to connect transceivers
+in the basement to multiple antennas in the attic. There is only one antenna
+cable going up to the attic which is why an antenna switch is needed.
+
+The goal of this project is to be able to remotely connect one of the
+antennas in the attic to the only antenna cable available.
+
+Since I only have two antennas in place at the moment, I only installed
+two relays and only wired up two PL sockets. In the future I'll be able
+to upgrade easily by adding a second module.
+
+## Hardware
+
+Drill the holes for the PL sockets:
+
+![image][1]
+
+Install the sockets:
+
+![image][2]
+
+Mount the relay module and use some antenna wire to connect the sockets with the relay module like this:
+
+![image][3]
+
+In the end it looks like this:
+
+![image][4]
+
+![image][5]
+
+![image][6]
+
+## Software
+
+
+ [1]: /img/antennapi01.jpg
+ [2]: /img/antennapi02.jpg
+ [3]: /img/antennapi03.jpg
+ [4]: /img/antennapi04.jpg
+ [5]: /img/antennapi05.jpg
+ [6]: /img/antennapi06.jpg
diff --git a/content/privacy.md b/content/privacy.md
new file mode 100644
index 0000000..34d409b
--- /dev/null
+++ b/content/privacy.md
@@ -0,0 +1,99 @@
+---
+title: "Datenschutzerklärung"
+slug: "privacy"
+date: 2018-05-03T16:42:59+02:00
+draft: false
+---
+
+Verantwortlicher im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:
+
+Michael Clemens
+c/o Block Services
+Stuttgarter Str. 106
+70736 Fellbach
+Deutschland
+E-Mail-Adresse: datenschutz_0x7E5@qrz.is
+
+Ihre Betroffenenrechte
+----------------------
+
+Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:
+
+* Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung (Art. 15 DSGVO),
+* Berichtigung unrichtiger personenbezogener Daten (Art. 16 DSGVO),
+* Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO),
+* Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen dürfen (Art. 18 DSGVO),
+* Widerspruch gegen die Verarbeitung Ihrer Daten bei uns (Art. 21 DSGVO) und
+* Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns abgeschlossen haben (Art. 20 DSGVO).
+
+Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen.
+
+Sie können sich jederzeit mit einer Beschwerde an eine Aufsichtsbehörde wenden, z. B. an die zuständige Aufsichtsbehörde des Bundeslands Ihres Wohnsitzes oder an die für uns als verantwortliche Stelle zuständige Behörde.
+
+Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter: [https://www.bfdi.bund.de/DE/Service/Anschriften/Laender/Laender-node.html](https://www.bfdi.bund.de/DE/Service/Anschriften/Laender/Laender-node.html).
+
+Erfassung allgemeiner Informationen beim Besuch unserer Website
+---------------------------------------------------------------
+
+### Art und Zweck der Verarbeitung:
+
+Wenn Sie auf unsere Website zugreifen, d.h., wenn Sie sich nicht registrieren oder anderweitig Informationen übermitteln, werden automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Internet-Service-Providers, Ihre IP-Adresse und ähnliches.
+
+Sie werden insbesondere zu folgenden Zwecken verarbeitet:
+
+* Sicherstellung eines problemlosen Verbindungsaufbaus der Website,
+* Sicherstellung einer reibungslosen Nutzung unserer Website,
+* Auswertung der Systemsicherheit und -stabilität sowie
+* zur Optimierung unserer Website.
+
+Wir verwenden Ihre Daten nicht, um Rückschlüsse auf Ihre Person zu ziehen. Informationen dieser Art werden von uns ggfs. anonymisiert statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu optimieren.
+
+### Rechtsgrundlage und berechtigtes Interesse:
+
+Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an der Verbesserung der Stabilität und Funktionalität unserer Website.
+
+### Empfänger:
+
+Empfänger der Daten sind ggf. technische Dienstleister, die für den Betrieb und die Wartung unserer Webseite als Auftragsverarbeiter tätig werden.
+
+### Speicherdauer:
+
+Die Daten werden gelöscht, sobald diese für den Zweck der Erhebung nicht mehr erforderlich sind. Dies ist für die Daten, die der Bereitstellung der Website dienen, grundsätzlich der Fall, wenn die jeweilige Sitzung beendet ist.
+
+### Bereitstellung vorgeschrieben oder erforderlich:
+
+Die Bereitstellung der vorgenannten personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. Ohne die IP-Adresse ist jedoch der Dienst und die Funktionsfähigkeit unserer Website nicht gewährleistet. Zudem können einzelne Dienste und Services nicht verfügbar oder eingeschränkt sein. Aus diesem Grund ist ein Widerspruch ausgeschlossen.
+
+SSL-Verschlüsselung
+-------------------
+
+Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.
+
+* * *
+
+Information über Ihr Widerspruchsrecht nach Art. 21 DSGVO
+---------------------------------------------------------
+
+### Einzelfallbezogenes Widerspruchsrecht
+
+Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung Sie betreffender personenbezogener Daten, die aufgrund Art. 6 Abs. 1 lit. f DSGVO (Datenverarbeitung auf der Grundlage einer Interessenabwägung) erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmung gestütztes Profiling im Sinne von Art. 4 Nr. 4 DSGVO.
+
+Legen Sie Widerspruch ein, werden wir Ihre personenbezogenen Daten nicht mehr verarbeiten, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
+
+### Empfänger eines Widerspruchs
+
+Michael Clemens
+c/o Block Services
+Stuttgarter Str. 106
+70736 Fellbach
+Deutschland
+E-Mail-Adresse: datenschutz_0x7E5@qrz.is
+
+* * *
+
+Änderung unserer Datenschutzbestimmungen
+----------------------------------------
+
+Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.
+
+_Die Datenschutzerklärung wurde mithilfe der activeMind AG erstellt, den Experten für [externe Datenschutzbeauftragte](https://www.activemind.de/datenschutz/datenschutzbeauftragter/) (Version #2020-09-30)._
diff --git a/content/projects.md b/content/projects.md
new file mode 100644
index 0000000..3c87f4a
--- /dev/null
+++ b/content/projects.md
@@ -0,0 +1,49 @@
+---
+title: "Projects"
+date: 2018-05-03T15:42:59+02:00
+draft: false
+---
+
+#### Software Projects
+ * [TSM Monitor][1] - A PHP application for monitoring IBM's Tivoli Storage Manager
+ * [TSM Monitor 2][2] - An enhanced PHP application for monitoring IBM's Tivoli Storage Manager
+ * [MSTerminology][3] - Translates strings used in all kind of Microsoft products
+ * [Nmap-sqlite-output][4] - Nmap NSE script for writing the scan output into a sqlite3 database
+ * [Adressenmeister][5] - Adressenmeister - my very first "software project" (C64 BASIC)
+ * [Shellfolio][6] - A command line cryptocurrency portfolio manager and price tracker
+ * [esm2markdown][7] - A converter for McAfee SIEM rule export files to Markdown documents
+ * [nsd-dyndns][8] - Dynamic DNS for NSD
+
+#### Hardware Projects
+ * [The Laundruino][9] - Washing machine monitoring with an Arduino
+ * [The One Button Audio Book Player][10] - The one button audiobook player
+ * [Little Helper][11] - Daniel Duesentrieb's Little Helper
+ * [Heated Trackball][14] - Heating mod for Logitech trackballs
+
+#### Amateur Radio
+ * [The AntennaPi][17] - Raspberry Pi based remote antenna switch
+ * [Shortened 30m Dipole][18] - Dipole for the 30m band, designed for a 10m long attic
+
+#### Organizations / Projects I like and support
+
+ * [Free Software Foundation Europe][15] - a charity that empowers users to control technology.
+ * [Super Dimension Fortress][16] - SDF Public Access UNIX System .. Est. 1987
+
+ [1]: https://github.com/exitnode/tsmmonitor
+ [2]: https://github.com/exitnode/tsmmonitor2
+ [3]: https://github.com/exitnode/MSTerminology
+ [4]: https://github.com/exitnode/nmap-sqlite-output
+ [5]: https://github.com/exitnode/adressenmeister
+ [6]: https://github.com/exitnode/shellfolio
+ [7]: https://github.com/exitnode/esm2markdown
+ [8]: https://github.com/exitnode/nsd-dyndns
+ [9]: /the-arduino-enabled-washing-machine/
+ [10]: /the-one-button-audiobook-player/
+ [11]: /little-helper/
+ [12]: https://clemens.name/curses/index.html
+ [13]: gopher://gopher.bildschirmtext.com
+ [14]: /blog/heated_trackball/
+ [15]: http://fsfe.org
+ [16]: http://sdf.org
+ [17]: /the-antennapi/
+ [18]: /30m-dipole/
diff --git a/data/.gitkeep b/data/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/layouts/.gitkeep b/layouts/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html
new file mode 100644
index 0000000..9e68ca5
--- /dev/null
+++ b/layouts/partials/footer.html
@@ -0,0 +1,7 @@
+
diff --git a/layouts/partials/header.html b/layouts/partials/header.html
new file mode 100644
index 0000000..c2e1937
--- /dev/null
+++ b/layouts/partials/header.html
@@ -0,0 +1,20 @@
+
+ {{ end }}
+
diff --git a/resources/.gitkeep b/resources/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.content b/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.content
new file mode 100644
index 0000000..9072ad1
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.content
@@ -0,0 +1 @@
+body.colorscheme-dark{color:#dadada;background-color:#212121}body.colorscheme-dark a{color:#36679f}body.colorscheme-dark h1,body.colorscheme-dark h2,body.colorscheme-dark h3,body.colorscheme-dark h4,body.colorscheme-dark h5,body.colorscheme-dark h6{color:#dadada}body.colorscheme-dark code{background-color:#424242;color:#dadada}body.colorscheme-dark pre code{background-color:inherit;color:inherit}body.colorscheme-dark blockquote{border-left:2px solid #424242}body.colorscheme-dark table td,body.colorscheme-dark table th{border:2px solid #dadada}@media(prefers-color-scheme:dark){body.colorscheme-auto{color:#dadada;background-color:#212121}body.colorscheme-auto a{color:#36679f}body.colorscheme-auto h1,body.colorscheme-auto h2,body.colorscheme-auto h3,body.colorscheme-auto h4,body.colorscheme-auto h5,body.colorscheme-auto h6{color:#dadada}body.colorscheme-auto code{background-color:#424242;color:#dadada}body.colorscheme-auto pre code{background-color:inherit;color:inherit}body.colorscheme-auto blockquote{border-left:2px solid #424242}body.colorscheme-auto table td,body.colorscheme-auto table th{border:2px solid #dadada}}body.colorscheme-dark .content .list ul li .title{color:#dadada}body.colorscheme-dark .content .list ul li .title:hover,body.colorscheme-dark .content .list ul li .title:focus{color:#36679f}body.colorscheme-dark .content .centered .about ul li a{color:#dadada}body.colorscheme-dark .content .centered .about ul li a:hover,body.colorscheme-dark .content .centered .about ul li a:focus{color:#36679f}@media(prefers-color-scheme:dark){body.colorscheme-auto .content .list ul li .title{color:#dadada}body.colorscheme-auto .content .list ul li .title:hover,body.colorscheme-auto .content .list ul li .title:focus{color:#36679f}body.colorscheme-auto .content .centered .about ul li a{color:#dadada}body.colorscheme-auto .content .centered .about ul li a:hover,body.colorscheme-auto .content .centered .about ul li a:focus{color:#36679f}}body.colorscheme-dark .navigation a,body.colorscheme-dark .navigation span{color:#dadada}body.colorscheme-dark .navigation a:hover,body.colorscheme-dark .navigation a:focus{color:#36679f}@media only screen and (max-width:768px){body.colorscheme-dark .navigation .navigation-list{background-color:#212121;border-top:solid 2px #424242;border-bottom:solid 2px #424242}}@media only screen and (max-width:768px){body.colorscheme-dark .navigation .navigation-list .menu-separator{border-top:2px solid #dadada}}@media only screen and (max-width:768px){body.colorscheme-dark .navigation #menu-toggle:checked+label{color:#424242}}@media only screen and (max-width:768px){body.colorscheme-dark .navigation .menu-button{color:#dadada}body.colorscheme-dark .navigation .menu-button:hover,body.colorscheme-dark .navigation .menu-button:focus{color:#36679f}}@media(prefers-color-scheme:dark){body.colorscheme-auto .navigation a,body.colorscheme-auto .navigation span{color:#dadada}body.colorscheme-auto .navigation a:hover,body.colorscheme-auto .navigation a:focus{color:#36679f}}@media only screen and (prefers-color-scheme:dark) and (max-width:768px){body.colorscheme-auto .navigation .navigation-list{background-color:#212121;border-top:solid 2px #424242;border-bottom:solid 2px #424242}}@media only screen and (prefers-color-scheme:dark) and (max-width:768px){body.colorscheme-auto .navigation .navigation-list .menu-separator{border-top:2px solid #dadada}}@media only screen and (prefers-color-scheme:dark) and (max-width:768px){body.colorscheme-auto .navigation #menu-toggle:checked+label{color:#424242}}@media only screen and (prefers-color-scheme:dark) and (max-width:768px){body.colorscheme-auto .navigation .menu-button{color:#dadada}body.colorscheme-auto .navigation .menu-button:hover,body.colorscheme-auto .navigation .menu-button:focus{color:#36679f}}body.colorscheme-dark .footer a{color:#36679f}@media(prefers-color-scheme:dark){body.colorscheme-auto .footer a{color:#36679f}}
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.json b/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.json
new file mode 100644
index 0000000..8e29f6d
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder-dark.scss_1fcd9040f1144c65015c77e7b93bc5ac.json
@@ -0,0 +1 @@
+{"Target":"css/coder-dark.min.83a2010dac9f59f943b3004cd6c4f230507ad036da635d3621401d42ec4e2835.css","MediaType":"text/css","Data":{"Integrity":"sha256-g6IBDayfWflDswBM1sTyMFB60DbaY102IUAdQuxOKDU="}}
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.content b/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.content
new file mode 100644
index 0000000..d02df73
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.content
@@ -0,0 +1 @@
+*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000;background-color:#fff;font-family:monospace,courier new,Courier;font-size:1.6em;font-weight:300;line-height:1.2em}@media only screen and (max-width:768px){body{font-size:1.6em;line-height:1.6em}}a{font-weight:300;color:#f44336;text-decoration:none}a:focus,a:hover{text-decoration:underline}p{margin:2rem 0}h1,h2,h3,h4,h5,h6{font-family:monospace,courier new,Courier;font-weight:700;color:#222;margin:4.8rem 0 2.6rem}h1{font-size:2.8rem;line-height:2.6rem}@media only screen and (max-width:768px){h1{font-size:2.6rem;line-height:2.4rem}}h2{font-size:2.4rem;line-height:2.2rem}@media only screen and (max-width:768px){h2{font-size:2.2rem;line-height:2rem}}h3{font-size:2.2rem;line-height:1.8rem}@media only screen and (max-width:768px){h3{font-size:2rem;line-height:1.6rem}}h4{font-size:2rem;line-height:1.6rem}@media only screen and (max-width:768px){h4{font-size:1.8rem;line-height:1.4rem}}h5{font-size:2.8rem;line-height:1.4rem}@media only screen and (max-width:768px){h5{font-size:1.6rem;line-height:1.2rem}}h6{font-size:1.6rem;line-height:1.2rem}@media only screen and (max-width:768px){h6{font-size:1.4rem;line-height:1rem}}b,strong{font-weight:700}pre{display:block;font-family:source code pro,lucida console,monospace;font-size:1.6rem;font-weight:400;line-height:2.6rem;margin:2rem 0;padding:2rem;overflow-x:auto}pre code{display:inline-block;background-color:inherit;color:inherit}code{font-family:source code pro,lucida console,monospace;font-size:1.6rem;font-weight:400;background-color:#424242;color:#000;padding:.2rem .4rem}blockquote{border-left:2px solid #424242;padding-left:2rem;line-height:2.2rem;font-weight:400;font-style:italic}th,td{padding:1.6rem}table{border-collapse:collapse}table td,table th{border:2px solid #222}table tr:first-child th{border-top:0}table tr:last-child td{border-bottom:0}table tr td:first-child,table tr th:first-child{border-left:0}table tr td:last-child,table tr th:last-child{border-right:0}img{max-width:100%}.wrapper{display:flex;flex-direction:column;min-height:100vh;width:100%}.container{margin:0 auto;max-width:90rem;width:100%;padding-left:2rem;padding-right:2rem}.fab{font-weight:400}.fas{font-weight:700}.float-right{float:right}.float-left{float:left}.fab{font-weight:400}.fas{font-weight:900}.content{flex:1;display:flex;margin-top:1.6rem;margin-bottom:3.2rem}.content article header{margin-top:6.4rem;margin-bottom:3.2rem}.content article header h1{font-size:4.2rem;line-height:3rem;margin:0}@media only screen and (max-width:768px){.content article header h1{font-size:4rem;line-height:4.4rem}}.content article footer{margin-top:4rem}.content article footer .see-also{margin:3.2rem 0}.content article footer .see-also h3{margin:3.2rem 0}.content .post .post-title{margin-bottom:.75em}.content .post .post-meta i{text-align:center;width:1.6rem;margin-left:0;margin-right:.5rem}.content .post .post-meta .date .posted-on{margin-left:0;margin-right:1.5rem}.content figure{margin:0;padding:0}.content figcaption p{text-align:center;font-style:italic;font-size:1.6rem;margin:0}.avatar img{width:20rem;height:auto;border-radius:50%}@media only screen and (max-width:768px){.avatar img{width:10rem}}.list ul{margin:3.2rem 0;list-style:none;padding:0}.list ul li{font-size:1.8rem}@media only screen and (max-width:768px){.list ul li{margin:1.6rem 0}}.list ul li .date{display:inline-block;width:20rem;text-align:right;margin-right:3rem}@media only screen and (max-width:768px){.list ul li .date{display:block;text-align:left}}.list ul li .title{font-size:1.8rem;color:#000;font-family:monospace,courier new,Courier;font-weight:700}.list ul li .title:hover,.list ul li .title:focus{color:#f44336}.centered{display:flex;align-items:center;justify-content:center}.centered .about{text-align:center}.centered .about h1{margin-top:2rem;margin-bottom:.5rem}.centered .about h2{margin-top:1rem;margin-bottom:.5rem;font-size:2.4rem}@media only screen and (max-width:768px){.centered .about h2{font-size:2rem}}.centered .about ul{list-style:none;margin:3rem 0 1rem;padding:0}.centered .about ul li{display:inline-block;position:relative}.centered .about ul li a{color:#000;text-transform:uppercase;margin-left:1rem;margin-right:1rem;font-size:1.6rem}.centered .about ul li a:hover,.centered .about ul li a:focus{color:#f44336}@media only screen and (max-width:768px){.centered .about ul li a{font-size:1.4rem}}.centered .about ul li a i{font-size:3.2rem}.centered .error{text-align:center}.centered .error h1{margin-top:2rem;margin-bottom:.5rem;font-size:4.6rem}@media only screen and (max-width:768px){.centered .error h1{font-size:3.2rem}}.centered .error h2{margin-top:2rem;margin-bottom:3.2rem;font-size:3.2rem}@media only screen and (max-width:768px){.centered .error h2{font-size:2.8rem}}.navigation{height:6rem;width:100%}.navigation a,.navigation span{display:inline;font-size:1.6rem;font-family:monospace,courier new,Courier;font-weight:700;line-height:6rem;color:#000}.navigation a:hover,.navigation a:focus{color:#f44336}.navigation .navigation-title{letter-spacing:.1rem;text-transform:uppercase}.navigation .navigation-list{float:right;list-style:none;margin-bottom:0;margin-top:0}@media only screen and (max-width:768px){.navigation .navigation-list{position:absolute;top:6rem;right:0;z-index:5;visibility:hidden;opacity:0;padding:0;max-height:0;width:100%;background-color:#fff;border-top:solid 2px #424242;border-bottom:solid 2px #424242;transition:opacity .25s,max-height .15s linear}}.navigation .navigation-list .navigation-item{float:left;margin:0;position:relative}@media only screen and (max-width:768px){.navigation .navigation-list .navigation-item{float:none!important;text-align:center}.navigation .navigation-list .navigation-item a,.navigation .navigation-list .navigation-item span{line-height:5rem}}.navigation .navigation-list .navigation-item a,.navigation .navigation-list .navigation-item span{margin-left:1rem;margin-right:1rem}@media only screen and (max-width:768px){.navigation .navigation-list .separator{display:none}}@media only screen and (max-width:768px){.navigation .navigation-list .menu-separator{border-top:2px solid #000;margin:0 8rem}.navigation .navigation-list .menu-separator span{display:none}}.navigation #dark-mode-toggle{margin:1.7rem 0;font-size:2.4rem;line-height:inherit;bottom:2rem;left:2rem;z-index:100;position:fixed}.navigation #menu-toggle{display:none}@media only screen and (max-width:768px){.navigation #menu-toggle:checked+label>i{color:#424242}.navigation #menu-toggle:checked+label+ul{visibility:visible;opacity:1;max-height:100rem}}.navigation .menu-button{display:none}@media only screen and (max-width:768px){.navigation .menu-button{display:block;margin:1.8rem 0;font-size:2.4rem;font-weight:400}}.navigation .menu-button i:hover,.navigation .menu-button i:focus{color:#222}.navigation i{color:#000;cursor:pointer}.navigation i:hover,.navigation i:focus{color:#f44336}.pagination{margin-top:6rem;text-align:center;font-family:monospace,courier new,Courier}.pagination li{display:inline;text-align:center;font-weight:700}.pagination li span{margin:0;text-align:center;width:3.2rem}.pagination li a{font-weight:300}.pagination li a span{margin:0;text-align:center;width:3.2rem}.footer{width:100%;text-align:center;line-height:2rem;margin-bottom:1rem}.footer a{color:#f44336}.float-container{bottom:2rem;right:2rem;z-index:100;position:fixed;font-size:1.6em}.float-container a{display:block;text-align:center;width:3rem;height:3rem;color:#222;background-color:#424242;font-size:2rem;border-radius:.5rem;opacity:50%;transition:all .25s ease-in}.float-container a:hover,.float-container a:focus{color:#f44336;opacity:100%}@media only screen and (max-width:768px){.float-container a:hover,.float-container a:focus{color:#222;opacity:50%}}
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.json b/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.json
new file mode 100644
index 0000000..2dedf6a
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder.scss_5e1eb8e37c42cdfb6215b61e44dcfa5f.json
@@ -0,0 +1 @@
+{"Target":"css/coder.min.40d8e1c52a909f26a3afa74a018f27732272cd6f868dafd9cca806423a7eee2f.css","MediaType":"text/css","Data":{"Integrity":"sha256-QNjhxSqQnyajr6dKAY8ncyJyzW+Gja/ZzKgGQjp+7i8="}}
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.content b/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.content
new file mode 100644
index 0000000..f8d8d2f
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.content
@@ -0,0 +1,403 @@
+*,
+*:after,
+*:before {
+ box-sizing: inherit; }
+
+html {
+ box-sizing: border-box;
+ font-size: 62.5%; }
+
+body {
+ color: #212121;
+ background-color: #FAFAFA;
+ font-family: Merriweather, Georgia, serif;
+ font-size: 1.6em;
+ font-weight: 300;
+ line-height: 1.8em; }
+ @media only screen and (max-width: 768px) {
+ body {
+ font-size: 1.6em;
+ line-height: 1.6em; } }
+
+a {
+ font-weight: 300;
+ color: #1565c0;
+ text-decoration: none; }
+ a:focus, a:hover {
+ text-decoration: underline; }
+
+p {
+ margin: 2.0rem 0 2.0rem 0; }
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: Lato, Helvetica, sans-serif;
+ font-weight: 700;
+ color: #000;
+ margin: 6.4rem 0 3.2rem 0; }
+
+h1 {
+ font-size: 3.2rem;
+ line-height: 3.6rem; }
+ @media only screen and (max-width: 768px) {
+ h1 {
+ font-size: 3.0rem;
+ line-height: 3.4rem; } }
+
+h2 {
+ font-size: 2.8rem;
+ line-height: 3.2rem; }
+ @media only screen and (max-width: 768px) {
+ h2 {
+ font-size: 2.6rem;
+ line-height: 3.0rem; } }
+
+h3 {
+ font-size: 2.4rem;
+ line-height: 2.8rem; }
+ @media only screen and (max-width: 768px) {
+ h3 {
+ font-size: 2.2rem;
+ line-height: 2.6rem; } }
+
+h4 {
+ font-size: 2.2rem;
+ line-height: 2.6rem; }
+ @media only screen and (max-width: 768px) {
+ h4 {
+ font-size: 2.0rem;
+ line-height: 2.4rem; } }
+
+h5 {
+ font-size: 2.0rem;
+ line-height: 2.4rem; }
+ @media only screen and (max-width: 768px) {
+ h5 {
+ font-size: 1.8rem;
+ line-height: 2.2rem; } }
+
+h6 {
+ font-size: 1.8rem;
+ line-height: 2.2rem; }
+ @media only screen and (max-width: 768px) {
+ h6 {
+ font-size: 1.6rem;
+ line-height: 2.0rem; } }
+
+b, strong {
+ font-weight: 700; }
+
+pre {
+ display: block;
+ font-family: "Source Code Pro", "Lucida Console", monospace;
+ font-size: 1.6rem;
+ font-weight: 400;
+ line-height: 2.6rem;
+ margin: 2.0rem 0 2.0rem 0;
+ padding: 2.0rem;
+ overflow-x: auto; }
+ pre code {
+ display: inline-block;
+ background-color: inherit;
+ color: inherit; }
+
+code {
+ font-family: "Source Code Pro", "Lucida Console", monospace;
+ font-size: 1.6rem;
+ font-weight: 400;
+ background-color: #E0E0E0;
+ color: #212121;
+ padding: 0.2rem 0.4rem 0.2rem 0.4rem; }
+
+blockquote {
+ border-left: 2px solid #E0E0E0;
+ padding-left: 2.0rem;
+ line-height: 2.2rem;
+ font-weight: 400;
+ font-style: italic; }
+
+th, td {
+ padding: 1.6rem; }
+
+table {
+ border-collapse: collapse; }
+
+table td, table th {
+ border: 2px solid #000; }
+
+table tr:first-child th {
+ border-top: 0; }
+
+table tr:last-child td {
+ border-bottom: 0; }
+
+table tr td:first-child,
+table tr th:first-child {
+ border-left: 0; }
+
+table tr td:last-child,
+table tr th:last-child {
+ border-right: 0; }
+
+img {
+ max-width: 100%; }
+
+.wrapper {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ width: 100%; }
+
+.container {
+ margin: 0 auto;
+ max-width: 90.0rem;
+ width: 100%;
+ padding-left: 2.0rem;
+ padding-right: 2.0rem; }
+
+.fab {
+ font-weight: 400; }
+
+.fas {
+ font-weight: 700; }
+
+.float-right {
+ float: right; }
+
+.float-left {
+ float: left; }
+
+.fab {
+ font-weight: 400; }
+
+.fas {
+ font-weight: 900; }
+
+.content {
+ flex: 1;
+ display: flex;
+ margin-top: 1.6rem;
+ margin-bottom: 3.2rem; }
+ .content article header {
+ margin-top: 6.4rem;
+ margin-bottom: 3.2rem; }
+ .content article header h1 {
+ font-size: 4.2rem;
+ line-height: 4.6rem;
+ margin: 0; }
+ @media only screen and (max-width: 768px) {
+ .content article header h1 {
+ font-size: 4.0rem;
+ line-height: 4.4rem; } }
+ .content article footer {
+ margin-top: 4.0rem; }
+ .content .post .post-title {
+ margin-bottom: .75em; }
+ .content .post .post-meta i {
+ text-align: center;
+ width: 1.6rem;
+ margin-left: 0;
+ margin-right: 0.5rem; }
+ .content .post .post-meta .date .posted-on {
+ margin-left: 0;
+ margin-right: 1.5rem; }
+ .content figure {
+ margin: 0;
+ padding: 0; }
+ .content figcaption p {
+ text-align: center;
+ font-style: italic;
+ font-size: 1.6rem;
+ margin: 0; }
+
+.avatar img {
+ width: 20rem;
+ height: auto;
+ border-radius: 50%; }
+ @media only screen and (max-width: 768px) {
+ .avatar img {
+ width: 10rem; } }
+
+.list ul {
+ margin: 3.2rem 0 3.2rem 0;
+ list-style: none;
+ padding: 0; }
+ .list ul li {
+ font-size: 1.8rem; }
+ @media only screen and (max-width: 768px) {
+ .list ul li {
+ margin: 1.6rem 0 1.6rem 0; } }
+ .list ul li span {
+ display: inline-block;
+ width: 20.0rem;
+ text-align: right;
+ margin-right: 3.0rem; }
+ @media only screen and (max-width: 768px) {
+ .list ul li span {
+ display: block;
+ text-align: left; } }
+ .list ul li a {
+ font-size: 1.8rem;
+ color: #212121;
+ font-family: Lato, Helvetica, sans-serif;
+ font-weight: 700; }
+ .list ul li a:hover, .list ul li a:focus {
+ color: #1565c0; }
+
+.centered {
+ display: flex;
+ align-items: center;
+ justify-content: center; }
+ .centered .about {
+ text-align: center; }
+ .centered .about h1 {
+ margin-top: 2.0rem;
+ margin-bottom: 0.5rem; }
+ .centered .about h2 {
+ margin-top: 1.0rem;
+ margin-bottom: 0.5rem;
+ font-size: 2.4rem; }
+ @media only screen and (max-width: 768px) {
+ .centered .about h2 {
+ font-size: 2.0rem; } }
+ .centered .about ul {
+ list-style: none;
+ margin: 3.0rem 0 1.0rem 0;
+ padding: 0; }
+ .centered .about ul li {
+ display: inline-block;
+ position: relative; }
+ .centered .about ul li a {
+ color: #212121;
+ text-transform: uppercase;
+ margin-left: 1.0rem;
+ margin-right: 1.0rem;
+ font-size: 1.6rem; }
+ .centered .about ul li a:hover, .centered .about ul li a:focus {
+ color: #1565c0; }
+ @media only screen and (max-width: 768px) {
+ .centered .about ul li a {
+ font-size: 1.4rem; } }
+ .centered .about ul li a i {
+ font-size: 3.2rem; }
+ .centered .error {
+ text-align: center; }
+ .centered .error h1 {
+ margin-top: 2.0rem;
+ margin-bottom: 0.5rem;
+ font-size: 4.6rem; }
+ @media only screen and (max-width: 768px) {
+ .centered .error h1 {
+ font-size: 3.2rem; } }
+ .centered .error h2 {
+ margin-top: 2.0rem;
+ margin-bottom: 3.2rem;
+ font-size: 3.2rem; }
+ @media only screen and (max-width: 768px) {
+ .centered .error h2 {
+ font-size: 2.8rem; } }
+
+.navigation {
+ height: 6.0rem;
+ width: 100%; }
+ .navigation a, .navigation span {
+ display: inline;
+ font-size: 1.6rem;
+ font-family: Lato, Helvetica, sans-serif;
+ font-weight: 700;
+ line-height: 6.0rem;
+ color: #212121; }
+ .navigation a:hover, .navigation a:focus {
+ color: #1565c0; }
+ .navigation .navigation-title {
+ letter-spacing: 0.1rem;
+ text-transform: uppercase; }
+ .navigation .navigation-list {
+ float: right;
+ list-style: none;
+ margin-bottom: 0;
+ margin-top: 0; }
+ @media only screen and (max-width: 768px) {
+ .navigation .navigation-list {
+ position: absolute;
+ top: 6.0rem;
+ right: 0;
+ z-index: 5;
+ visibility: hidden;
+ opacity: 0;
+ padding: 0;
+ max-height: 0;
+ width: 100%;
+ background-color: #FAFAFA;
+ border-top: solid 2px #E0E0E0;
+ border-bottom: solid 2px #E0E0E0;
+ transition: opacity 0.25s, max-height 0.15s linear; } }
+ .navigation .navigation-list .navigation-item {
+ float: left;
+ margin: 0;
+ position: relative; }
+ @media only screen and (max-width: 768px) {
+ .navigation .navigation-list .navigation-item {
+ float: none !important;
+ text-align: center; }
+ .navigation .navigation-list .navigation-item a, .navigation .navigation-list .navigation-item span {
+ line-height: 5.0rem; } }
+ .navigation .navigation-list .navigation-item a, .navigation .navigation-list .navigation-item span {
+ margin-left: 1.0rem;
+ margin-right: 1.0rem; }
+ @media only screen and (max-width: 768px) {
+ .navigation .navigation-list .menu-separator {
+ border-top: 2px solid #212121;
+ margin: 0 8.0rem; }
+ .navigation .navigation-list .menu-separator span {
+ display: none; } }
+ .navigation #menu-toggle {
+ display: none; }
+ @media only screen and (max-width: 768px) {
+ .navigation #menu-toggle:checked + label {
+ color: #E0E0E0; }
+ .navigation #menu-toggle:checked + label + ul {
+ visibility: visible;
+ opacity: 1;
+ max-height: 100rem; } }
+ .navigation .menu-button {
+ display: none; }
+ @media only screen and (max-width: 768px) {
+ .navigation .menu-button {
+ display: block;
+ font-size: 2.4rem;
+ font-weight: 400;
+ line-height: 6.0rem;
+ color: #212121;
+ cursor: pointer; }
+ .navigation .menu-button:hover, .navigation .menu-button:focus {
+ color: #1565c0; } }
+
+.pagination {
+ margin-top: 6.0rem;
+ text-align: center; }
+ .pagination li {
+ display: inline;
+ text-align: center; }
+ .pagination li span {
+ margin: 0;
+ text-align: center;
+ width: 3.2rem; }
+ .pagination li a span {
+ margin: 0;
+ text-align: center;
+ width: 3.2rem; }
+
+.footer {
+ width: 100%;
+ text-align: center;
+ line-height: 2.0rem;
+ margin-bottom: 1.0rem; }
+ .footer a {
+ color: #1565c0; }
+
+/*# sourceMappingURL=coder.css.map */
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.json b/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.json
new file mode 100644
index 0000000..cfa430e
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/coder.scss_fd4b5b3f9a48bc0c7f005d2f7a4cc30f.json
@@ -0,0 +1 @@
+{"Target":"css/coder.css","MediaType":"text/css","Data":{}}
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.content b/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.content
new file mode 100644
index 0000000..0663b16
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.content
@@ -0,0 +1,3 @@
+.inline{display:inline}.block{display:block}.inline-block{display:inline-block}.table{display:table}.table-cell{display:table-cell}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-auto{overflow:auto}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.left{float:left}.right{float:right}.fit{max-width:100%}.truncate{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.max-width-1{max-width:24rem}.max-width-2{max-width:32rem}.max-width-3{max-width:48rem}.max-width-4{max-width:64rem}.border-box{box-sizing:border-box}.m0{margin:0}.mt0{margin-top:0}.mr0{margin-right:0}.mb0{margin-bottom:0}.ml0{margin-left:0}.mx0{margin-right:0;margin-left:0}.my0{margin-top:0;margin-bottom:0}.m1{margin:.5rem}.mt1{margin-top:.5rem}.mr1{margin-right:.5rem}.mb1{margin-bottom:.5rem}.ml1{margin-left:.5rem}.mx1{margin-right:.5rem;margin-left:.5rem}.my1{margin-top:.5rem;margin-bottom:.5rem}.m2{margin:1rem}.mt2{margin-top:1rem}.mr2{margin-right:1rem}.mb2{margin-bottom:1rem}.ml2{margin-left:1rem}.mx2{margin-right:1rem;margin-left:1rem}.my2{margin-top:1rem;margin-bottom:1rem}.m3{margin:2rem}.mt3{margin-top:2rem}.mr3{margin-right:2rem}.mb3{margin-bottom:2rem}.ml3{margin-left:2rem}.mx3{margin-right:2rem;margin-left:2rem}.my3{margin-top:2rem;margin-bottom:2rem}.m4{margin:4rem}.mt4{margin-top:4rem}.mr4{margin-right:4rem}.mb4{margin-bottom:4rem}.ml4{margin-left:4rem}.mx4{margin-right:4rem;margin-left:4rem}.my4{margin-top:4rem;margin-bottom:4rem}.mxn1{margin-right:-.5rem;margin-left:-.5rem}.mxn2{margin-right:-1rem;margin-left:-1rem}.mxn3{margin-right:-2rem;margin-left:-2rem}.mxn4{margin-right:-4rem;margin-left:-4rem}.ml-auto{margin-left:auto}.mr-auto{margin-right:auto}.mx-auto{margin-right:auto;margin-left:auto}.p0{padding:0}.pt0{padding-top:0}.pr0{padding-right:0}.pb0{padding-bottom:0}.pl0{padding-left:0}.px0{padding-right:0;padding-left:0}.py0{padding-top:0;padding-bottom:0}.p1{padding:.5rem}.pt1{padding-top:.5rem}.pr1{padding-right:.5rem}.pb1{padding-bottom:.5rem}.pl1{padding-left:.5rem}.py1{padding-top:.5rem;padding-bottom:.5rem}.px1{padding-right:.5rem;padding-left:.5rem}.p2{padding:1rem}.pt2{padding-top:1rem}.pr2{padding-right:1rem}.pb2{padding-bottom:1rem}.pl2{padding-left:1rem}.py2{padding-top:1rem;padding-bottom:1rem}.px2{padding-right:1rem;padding-left:1rem}.p3{padding:2rem}.pt3{padding-top:2rem}.pr3{padding-right:2rem}.pb3{padding-bottom:2rem}.pl3{padding-left:2rem}.py3{padding-top:2rem;padding-bottom:2rem}.px3{padding-right:2rem;padding-left:2rem}.p4{padding:4rem}.pt4{padding-top:4rem}.pr4{padding-right:4rem}.pb4{padding-bottom:4rem}.pl4{padding-left:4rem}.py4{padding-top:4rem;padding-bottom:4rem}.px4{padding-right:4rem;padding-left:4rem}h1,.h1{display:block;margin-top:3rem;margin-bottom:1rem;color:#2bbc8a;letter-spacing:.01em;font-weight:700;font-style:normal;font-size:1.5em;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}h2,.h2{position:relative;display:block;margin-top:2rem;margin-bottom:.5rem;color:#383838;text-transform:none;letter-spacing:normal;font-weight:bold;font-size:1rem}h3{color:#383838;text-decoration:underline;font-weight:bold;font-size:.9rem}h4 h5 h6{display:inline;text-decoration:none;color:#8c8c8c;font-weight:bold;font-size:.9rem}h3 h4 h5 h6{margin-top:.9rem;margin-bottom:.5rem}hr{border:0.5px dashed #8c8c8c;opacity:.5;margin:0;margin-top:20px;margin-bottom:20px}strong{font-weight:bold}em cite{font-style:italic}sup sub{position:relative;vertical-align:baseline;font-size:.75em;line-height:0}sup{top:-.5em}sub{bottom:-.2em}small{font-size:.85em}acronym abbr{border-bottom:1px dotted}ul ol dl{line-height:1.725}ul ul,ol ul,ul ol,ol ol{margin-top:0;margin-bottom:0}ol{list-style:decimal}dt{font-weight:bold}table{width:100%;border-collapse:collapse;text-align:left;font-size:12px;overflow:auto;display:block}th{padding:8px;border-bottom:1px dashed #666;color:#383838;font-weight:bold;font-size:13px}td{padding:0 8px;border-bottom:none}@font-face{font-style:normal;font-family:"JetBrains Mono";font-display:swap;src:local("JetBrains Mono"),local("JetBrains-Mono"),url("../lib/JetBrainsMono/web/woff2/JetBrainsMono-Regular.woff2") format("woff2"),url("../lib/JetBrainsMono/web/woff/JetBrainsMono-Regular.woff") format("woff"),url("../lib/JetBrainsMono/web/eot/JetBrainsMono-Regular.eot") format("embedded-opentype"),url("../lib/JetBrainsMono/ttf/JetBrainsMono-Regular.ttf") format("truetype")}*,*:before,*:after{box-sizing:border-box}html{margin:0;padding:0;height:100%;border-top:2px solid #383838;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0;height:100%;background-color:#fff;color:#383838;font-display:swap;font-weight:400;font-size:14px;font-family:"JetBrains Mono",monospace;line-height:1.725;text-rendering:geometricPrecision;flex:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.content{position:relative;display:flex;flex-direction:column;min-height:100%;overflow-wrap:break-word}.content p{hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;-webkit-hyphens:auto}.content code{hyphens:manual;-moz-hyphens:manual;-ms-hyphens:manual;-webkit-hyphens:manual}.content a{color:#383838;text-decoration:none;background-image:linear-gradient(transparent, transparent 5px, #383838 5px, #383838);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.content a:hover{background-image:linear-gradient(transparent, transparent 4px, #d480aa 4px, #d480aa)}.content a.icon{background:none}.content a.icon:hover{color:#d480aa}.content h1 a,.content .h1 a,.content h2 a,.content h3 a,.content h4 a,.content h5 a,.content h6 a{background:none;color:inherit;text-decoration:none}.content h1 a:hover,.content .h1 a:hover,.content h2 a:hover,.content h3 a:hover,.content h4 a:hover,.content h5 a:hover,.content h6 a:hover{background-image:linear-gradient(transparent, transparent 6px, #d480aa 6px, #d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.content h6 a{background:none;color:inherit;text-decoration:none}.content h6 a:hover{background-image:linear-gradient(transparent, transparent 6px, #d480aa 6px, #d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}@media (min-width: 540px){.image-wrap{flex-direction:row;margin-bottom:2rem}.image-wrap .image-block{flex:1 0 35%;margin-right:2rem}.image-wrap p{flex:1 0 65%}}.max-width{max-width:48rem}@media (max-width: 480px){.px3{padding-right:1rem;padding-left:1rem}.my4{margin-top:2rem;margin-bottom:2rem}}@media (min-width: 480px){p{text-align:justify}}#header{margin:0 auto 2rem;width:100%}#header h1,#header .h1{margin-top:0;margin-bottom:0;color:#383838;letter-spacing:.01em;font-weight:700;font-style:normal;font-size:1.5rem;line-height:2rem;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}#header a{background:none;color:inherit;text-decoration:none}#header #logo{display:inline-block;float:left;margin-right:20px;width:50px;height:50px;border-radius:5px;background-size:50px 50px;background-repeat:no-repeat;filter:grayscale(100%);-webkit-filter:grayscale(100%)}#header #nav{color:#2bbc8a;letter-spacing:.01em;font-weight:200;font-style:normal;font-size:.8rem}#header #nav ul{margin:0;padding:0;list-style-type:none;line-height:15px}#header #nav ul a{margin-right:15px;color:#2bbc8a}#header #nav ul a:hover{background-image:linear-gradient(transparent, transparent 5px, #2bbc8a 5px, #2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}#header #nav ul li{display:inline-block;margin-right:15px;border-right:1px dotted;border-color:#2bbc8a;vertical-align:middle}#header #nav ul .icon{display:none}#header #nav ul li:last-child{margin-right:0;border-right:0}#header #nav ul li:last-child a{margin-right:0}#header:hover #logo{filter:none;-webkit-filter:none}@media screen and (max-width: 480px){#header #title{display:table;margin-right:5rem;min-height:50px}#header #title h1{display:table-cell;vertical-align:middle}#header #nav ul a:hover{background:none}#header #nav ul li{display:none;border-right:0}#header #nav ul li.icon{position:absolute;top:77px;right:1rem;display:inline-block}#header #nav ul.responsive li{display:block}#header #nav li:not(:first-child){padding-top:1rem;padding-left:70px;font-size:1rem}}#header-post{position:fixed;top:2rem;right:0;display:inline-block;float:right;z-index:100}#header-post a{background:none;color:inherit;text-decoration:none}#header-post a.icon{background:none}#header-post a.icon:hover{color:#d480aa}#header-post nav ul{display:block;list-style-image:none;list-style-position:outside;list-style-type:none;padding-inline-start:40px}#header-post nav ul li{display:list-item;margin-right:0px}#header-post nav>ul{margin-block-end:1em;margin-block-start:1em}#header-post ul{display:inline-block;margin:0;padding:0;list-style-type:none}#header-post ul li{display:inline-block;margin-right:15px;vertical-align:middle}#header-post ul li:last-child{margin-right:0}#header-post #menu-icon{float:right;margin-right:2rem;margin-left:15px}#header-post #menu-icon:hover{color:#2bbc8a}#header-post #menu-icon-tablet{float:right;margin-right:2rem;margin-left:15px}#header-post #menu-icon-tablet:hover{color:#2bbc8a}#header-post #top-icon-tablet{position:fixed;right:2rem;bottom:2rem;margin-right:2rem;margin-left:15px}#header-post #top-icon-tablet:hover{color:#2bbc8a}#header-post .active{color:#2bbc8a}#header-post #menu{visibility:hidden;margin-right:2rem}#header-post #nav{color:#2bbc8a;letter-spacing:.01em;font-weight:200;font-style:normal;font-size:.8rem}#header-post #nav ul{line-height:15px}#header-post #nav ul a{margin-right:15px;color:#2bbc8a}#header-post #nav ul a:hover{background-image:linear-gradient(transparent, transparent 5px, #2bbc8a 5px, #2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}#header-post #nav ul li{border-right:1px dotted #2bbc8a}#header-post #nav ul li:last-child{margin-right:0;border-right:0}#header-post #nav ul li:last-child a{margin-right:0}#header-post #actions{float:right;margin-top:2rem;margin-right:2rem;width:100%;text-align:right}#header-post #actions ul{display:block}#header-post #actions .info{display:block;font-style:italic}#header-post #share{clear:both;padding-top:1rem;padding-right:2rem;text-align:right}#header-post #share li{display:block;margin:0}#header-post #toc{float:right;clear:both;overflow:auto;margin-top:1rem;padding-right:2rem;max-width:20em;max-height:calc(95vh - 7rem);text-align:right}#header-post #toc a:hover{color:#d480aa}#header-post #toc nav>ul>li{color:#383838;font-size:.8rem}#header-post #toc nav>ul>li:before{color:#2bbc8a;content:"#";margin-right:8px}#header-post #toc nav>ul>li>ul>li{color:#666;font-size:.7rem}#header-post #toc nav>ul>li>ul>li:before{color:#2bbc8a;content:"·";font-weight:bold;margin-right:3px}#header-post #toc nav>ul>li>ul>li>ul>li{color:#333;font-size:.4rem}#header-post #toc .toc-level-5{display:none}#header-post #toc .toc-level-6{display:none}#header-post #toc .toc-number{display:none}@media screen and (max-width: 500px){#header-post{display:none}}@media screen and (max-width: 900px){#header-post #menu-icon{display:none}#header-post #actions{display:none}}@media screen and (max-width: 1199px){#header-post #toc{display:none}}@media screen and (min-width: 900px){#header-post #menu-icon-tablet{display:none !important}#header-post #top-icon-tablet{display:none !important}}@media screen and (min-width: 1199px){#header-post #actions{width:auto}#header-post #actions ul{display:inline-block;float:right}#header-post #actions .info{display:inline;float:left;margin-right:2rem;font-style:italic}}#footer-post{position:fixed;right:0;bottom:0;left:0;z-index:5000000;width:100%;border-top:1px solid #666;background:#fafafa;transition:opacity .2s}#footer-post a{background:none;color:inherit;text-decoration:none}#footer-post a.icon{background:none}#footer-post a.icon:hover{color:#d480aa}#footer-post #nav-footer{padding-right:1rem;padding-left:1rem;background:#e6e5e5;text-align:center}#footer-post #nav-footer a{color:#2bbc8a;font-size:1em}#footer-post #nav-footer a:hover{background-image:linear-gradient(transparent, transparent 5px, #2bbc8a 5px, #2bbc8a);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}#footer-post #nav-footer ul{display:table;margin:0;padding:0;width:100%;list-style-type:none}#footer-post #nav-footer ul li{display:inline-table;padding:10px;width:20%;vertical-align:middle}#footer-post #actions-footer{overflow:auto;margin-top:1rem;margin-bottom:1rem;padding-right:1rem;padding-left:1rem;width:100%;text-align:center;white-space:nowrap}#footer-post #actions-footer a{display:inline-block;padding-left:1rem;color:#2bbc8a}#footer-post #share-footer{padding-right:1rem;padding-left:1rem;background:#e6e5e5;text-align:center}#footer-post #share-footer ul{display:table;margin:0;padding:0;width:100%;list-style-type:none}#footer-post #share-footer ul li{display:inline-table;padding:10px;width:20%;vertical-align:middle}#footer-post #toc-footer{clear:both;padding-top:1rem;padding-bottom:1rem;background:#e6e5e5;text-align:left}#footer-post #toc-footer #TableOfContents ul{margin:0;padding-left:20px;list-style-type:none}#footer-post #toc-footer #TableOfContents ul li{line-height:30px}#footer-post #toc-footer a:hover{color:#d480aa}#footer-post #toc-footer #TableOfContents>ul>li{color:#383838;font-size:.8rem}#footer-post #toc-footer #TableOfContents>ul>li:before{color:#2bbc8a;content:"#";margin-right:8px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li{color:#666;font-size:.7rem;line-height:15px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li:before{color:#2bbc8a;content:"·";font-weight:bold;margin-right:3px}#footer-post #toc-footer #TableOfContents>ul>li>ul>li>ul>li{display:none}@media screen and (min-width: 500px){#footer-post-container{display:none}}.post-list{padding:0}.post-list .post-item{margin-bottom:1rem;margin-left:0;list-style-type:none}.post-list .post-item .meta{display:block;margin-right:16px;min-width:100px;color:#666;font-size:14px}@media (min-width: 480px){.post-list .post-item{display:flex;margin-bottom:5px}.post-list .post-item .meta{text-align:left}}.project-list{padding:0;list-style:none}.project-list .project-item{margin-bottom:5px}.project-list .project-item p{display:inline}article header .posttitle{margin-top:0;margin-bottom:0;text-transform:none;font-size:1.5em;line-height:1.25}article header .meta{margin-top:0;margin-bottom:1rem}article header .meta *{color:#8c8c8c;font-size:.85rem}article header .author{text-transform:uppercase;letter-spacing:.01em;font-weight:700}article header .postdate{display:inline}article .content h2:before{position:absolute;top:-4px;left:-1rem;color:#2bbc8a;content:"#";font-weight:bold;font-size:1.2rem}article .content img,article .content video{display:block;margin:auto;max-width:100%;height:auto}article .content img .video-container,article .content video .video-container{position:relative;overflow:hidden;padding-top:56.25% e;height:0}article .content img .video-container iframe,article .content img .video-container object,article .content img .video-container embed,article .content video .video-container iframe,article .content video .video-container object,article .content video .video-container embed{position:absolute;top:0;left:0;margin-top:0;width:100%;height:100%}article .content img blockquote,article .content video blockquote{margin:1rem 10px;padding:.5em 10px;background:inherit;color:#2bbc8a;quotes:"\201C" "\201D" "\2018" "\2019";font-weight:bold}article .content img blockquote p,article .content video blockquote p{margin:0}article .content img blockquote:before,article .content video blockquote:before{margin-right:.25em;color:#2bbc8a;content:"\201C";vertical-align:-.4em;font-size:2em;line-height:.1em}article .content img blockquote footer,article .content video blockquote footer{margin:line-height 0;color:#666;font-size:11px}article .content img blockquote footer a,article .content video blockquote footer a{background-image:linear-gradient(transparent, transparent 5px, #666 5px, #666);color:#666}article .content img blockquote footer a:hover,article .content video blockquote footer a:hover{background-image:linear-gradient(transparent, transparent 4px, #999 4px, #999);color:#999}article .content img blockquote footer cite:before,article .content video blockquote footer cite:before{padding:0 .5em;content:"—"}article .content img .pullquote,article .content video .pullquote{margin:0;width:45%;text-align:left}article .content img .pullquote.left,article .content video .pullquote.left{margin-right:1em;margin-left:.5em}article .content img .pullquote.right,article .content video .pullquote.right{margin-right:.5em;margin-left:1em}article .content img .caption,article .content video .caption{position:relative;display:block;margin-top:.5em;color:#666;text-align:center;font-size:.9em}.posttitle{text-transform:none;font-size:1.5em;line-height:1.25}.article-tag .tag-link:before{content:"#";background-image:linear-gradient(transparent, transparent 10px, #d480aa 10px, #d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}.article-category .category-link{background-image:linear-gradient(transparent, transparent 10px, #d480aa 10px, #d480aa);background-position:bottom;background-size:100% 6px;background-repeat:repeat-x}@media (min-width: 480px){.article-read-time,.article-tag,.article-category{display:inline}.article-read-time:before,.article-tag:before,.article-category:before{content:"|"}}#archive .post-list{padding:0}#archive .post-list .post-item{margin-bottom:1rem;margin-left:0;list-style-type:none}#archive .post-list .post-item .meta{display:block;margin-right:16px;min-width:100px;color:#666;font-size:14px}@media (min-width: 480px){#archive .post-list .post-item{display:flex;margin-bottom:5px;margin-left:1rem}#archive .post-list .post-item .meta{text-align:left}}.blog-post-comments{margin-top:4rem}#footer{position:absolute;bottom:0;margin-bottom:10px;width:100%;color:#666;vertical-align:top;text-align:center;font-size:11px}#footer ul{margin:0;padding:0;list-style:none}#footer li{display:inline-block;margin-right:15px;border-right:1px solid;border-color:#666;vertical-align:middle}#footer li a{margin-right:15px}#footer li:last-child{margin-right:0;border-right:0}#footer li:last-child a{margin-right:0}#footer a{color:#666;text-decoration:underline;background-image:none}#footer a:hover{color:#999}#footer .footer-left{height:20px;vertical-align:middle;line-height:20px}@media (min-width: 39rem){#footer{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:center;align-content:center;margin-bottom:20px}#footer .footer-left{align-self:flex-start;margin-right:20px}#footer .footer-right{align-self:flex-end}}.pagination{display:inline-block;margin-top:2rem;width:100%;text-align:center}.pagination .page-number{color:#383838;font-size:.8rem}.pagination a{padding:4px 6px;border-radius:5px;background-image:none;color:#383838;text-decoration:none}.pagination a:hover{background-image:none}.pagination a:hover:not(.active){color:#383838}.search-input{padding:4px 7px;width:100%;outline:none;border:solid 1px #8c8c8c;border-radius:5px;background-color:#fff;color:#383838;font-size:1.2rem;-webkit-border-radius:5px;-moz-border-radius:5px}.search-input:focus{border:solid 1px #2bbc8a}#search-result ul.search-result-list{padding:0;list-style-type:none}#search-result li{margin:2em auto}#search-result a.search-result-title{background-image:none;color:#383838;text-transform:capitalize;font-weight:bold;line-height:1.2}#search-result p.search-result{overflow:hidden;margin:.4em auto;max-height:13em;text-align:justify;font-size:.8em}#search-result em.search-keyword{border-bottom:1px dashed #d480aa;color:#d480aa;font-weight:bold}.search-no-result{display:none;padding-bottom:.5em;color:#383838}#tag-cloud .tag-cloud-title{color:#666}#tag-cloud .tag-cloud-tags{clear:both;text-align:center}#tag-cloud .tag-cloud-tags a{display:inline-block;margin:10px}.tooltipped{position:relative}.tooltipped::after{position:absolute;z-index:1000000;display:none;padding:.2em .5em;-webkit-font-smoothing:subpixel-antialiased;color:#fff;font-display:swap;font-weight:400;font-size:11.2px;font-family:"JetBrains Mono",monospace;line-height:1.725;text-rendering:geometricPrecision;text-align:center;word-wrap:break-word;white-space:pre;content:attr(aria-label);background:#383838;border-radius:3px;opacity:0}.tooltipped::before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:#383838;pointer-events:none;content:'';border:6px solid transparent;opacity:0}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}.tooltipped:hover::before,.tooltipped:hover::after,.tooltipped:active::before,.tooltipped:active::after,.tooltipped:focus::before,.tooltipped:focus::after{display:inline-block;text-decoration:none;animation-name:tooltip-appear;animation-duration:0.1s;animation-fill-mode:forwards;animation-timing-function:ease-in}.tooltipped-s::after,.tooltipped-sw::after{top:100%;right:50%;margin-top:6px}.tooltipped-s::before,.tooltipped-sw::before{top:auto;right:50%;bottom:-7px;margin-right:-6px;border-bottom-color:#383838}.tooltipped-sw::after{margin-right:-16px}.tooltipped-s::after{transform:translateX(50%)}#categories .category-list-title{color:#666}#categories .category-list .category-list-item .category-list-count{color:#666}#categories .category-list .category-list-item .category-list-count:before{content:" ("}#categories .category-list .category-list-item .category-list-count:after{content:")"}pre{overflow-x:auto;padding:15px 15px 10px 15px;border:1px dotted #666;border-radius:2px;-webkit-border-radius:2px;font-size:13px;font-family:"JetBrains Mono",monospace;line-height:22px;position:relative}pre .code-copy-btn{position:absolute;top:0;right:0;border:0;border-radius:0 2px;padding:0;font-family:"JetBrains Mono", monospace;font-weight:800;font-size:0.9em;line-height:1.7;color:#fff;background-color:#8c8c8c;min-width:60px;text-align:center;cursor:pointer;letter-spacing:0em}pre .code-copy-btn:hover{background-color:#666;color:#2bbc8a}pre code{display:block;padding:0;border:none}code{font-family:"JetBrains Mono",monospace;padding:0 5px;border:1px dotted #666;border-radius:2px;-webkit-border-radius:2px}.highlight>div{border-radius:2px;-webkit-border-radius:2px}.highlight pre{border:none;background:none}.highlight table pre{margin-top:0}.highlight table td:first-child pre{padding-right:0}.highlight table td:last-child pre{padding-left:0}
+
+/*# sourceMappingURL=styles.css.map */
\ No newline at end of file
diff --git a/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.json b/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.json
new file mode 100644
index 0000000..e9f8b82
--- /dev/null
+++ b/resources/_gen/assets/scss/scss/style.scss_17a317b87063135b4df76ed814d78726.json
@@ -0,0 +1 @@
+{"Target":"css/styles.3fe40362df50d49db5018ca03fa5231ecd0fb34469614033aae05e1bf138441ff02925c097d2dc7c53e5792268d26daf9bc0477fcd58c396295764ec6769982c.css","MediaType":"text/css","Data":{"Integrity":"sha512-P+QDYt9Q1J21AYygP6UjHs0Ps0RpYUAzquBeG/E4RB/wKSXAl9LcfFPleSJo0m2vm8BHf81Yw5YpV2TsZ2mYLA=="}}
\ No newline at end of file
diff --git a/static/.gitkeep b/static/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/static/.htaccess b/static/.htaccess
new file mode 100644
index 0000000..de377bf
--- /dev/null
+++ b/static/.htaccess
@@ -0,0 +1 @@
+ErrorDocument 404 /404.html
diff --git a/static/_headers b/static/_headers
new file mode 100644
index 0000000..91ad64d
--- /dev/null
+++ b/static/_headers
@@ -0,0 +1,5 @@
+/*
+ X-Frame-Options: DENY
+ X-XSS-Protection: 1; mode=block
+ Referrer-Policy: no-referrer
+ X-Content-Type-Options: nosniff
diff --git a/static/css/style.css b/static/css/style.css
new file mode 100644
index 0000000..f65946e
--- /dev/null
+++ b/static/css/style.css
@@ -0,0 +1,15 @@
+html {overflow-y: scroll}
+:root { --bgcolor: black; --fontcolor: orange; --linkcolor: orange; --visitedcolor: orange; --precolor: #fff; --prebgcolor: #222;}
+body{max-width:800px;margin:40px auto;padding:0 10px;font:14px/1.5 monospace;color:var(--fontcolor); background: var(--bgcolor)}a:link{color: var(--linkcolor)}a:visited{color: var(--visitedcolor)}a:active{color: var(--visitedcolor)}h1,h2,h3{line-height:1.2}
+p > code{color: var(--precolor); background: var(--prebgcolor); padding:2px}
+pre{color: var(--precolor); background: var(--prebgcolor); padding:24px; overflow-x: auto}
+.ascii-art {
+ font-family: monospace;
+ white-space: pre;
+ line-height: 1;
+}
+article{padding:24px 0}
+.center {display: block;margin-left: auto;margin-right: auto;width: 100%;}
+img {display: block; max-width: 100%; height: auto;}
+figcaption {color: #888; font: 12px/1.5 monospace; text-align: center;}
+figure {margin: auto}
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..94929fb2304ca744d49b014404bdbbc1f3a9d143
GIT binary patch
literal 549
zcmZ?wbhEHb6krfw_{hW%7!v;f|9=KBQ2fclX~e+9p!lEL&ow02*)hP?NY8+o5h$qx
zQUKDz!1SC2tQeJW0Ls9Cg8;G$0S;sy0|yHeOdW`3VFH;B2TYA{CWs**fMhIrT%ZvU
iL!d^%`6w1)a<~{6V8JnD{SNmPYB0iuaWQ~?w*~-&C>5>%
literal 0
HcmV?d00001
diff --git a/static/img/30m_dipole.jpg b/static/img/30m_dipole.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9a276d3f3f9c8d3e0fd6637d1cc987bd23261faf
GIT binary patch
literal 150489
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 GNO^%kb#k
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 |