commit b909b7cc0e7f9f6aa559b40b20ee7eb10fc371e0 Author: Nils Schulte Date: Tue Oct 29 06:06:23 2019 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..364fdec --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..fdb7586 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +source code for my personal blog + + +## Licence +The content of this blog is licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/legalcode) and the Rest under the [MIT license](http://opensource.org/licenses/mit-license.php). \ No newline at end of file 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..a257697 --- /dev/null +++ b/config.toml @@ -0,0 +1,7 @@ +baseURL = "https://nilsschulte.de/" +languageCode = "en-us" +title = "nilsschulte.de" + + +pygmentsCodeFences = true +pygmentsCodeFencesGuessSyntax = true \ No newline at end of file diff --git a/content/posts/desk-automation.md b/content/posts/desk-automation.md new file mode 100644 index 0000000..f6bb690 --- /dev/null +++ b/content/posts/desk-automation.md @@ -0,0 +1,73 @@ +--- +title: "Automating my desk lamp" +date: 2019-10-28T21:11:15+02:00 +draft: false +summary: Let the computer turn on the lamp... +images: [/static/img/lamp-relay-esp.png] +--- +Automation makes the life easier. At least thats what it should do... +In my case im not sure it actually did simplify my life as a few years later i own way more stuff and tools to build said automation than my small dorm room can handle. + +Most of the stuff i build is now living on my desk. Among other things that includes my "smart" desk lamp[^1], which is just a normal IKEA lamp[^2] with the power cord cut, a 2-Channel relay from ebay and an ESP32 (which is a microcontroler with WIFI). Thous things in combination allow me to turn the lamp on when its getting dark and off when i'm finally lying in bed, which would normally be way out of reach of the light switch. + +{{< figure src="/img/lamp-relay-esp.png" title="Relay wiring">}} + +When you read instructions how to do this most of them say to just cut one mains wire. The circuit will work but as the EU-Plug is reversible that could mean only the neutral wire gets disconnected (depending on the orientation). Normally that doesn't matter as you can't touch it, but for example when you change the light bulb (and the lamp is off) there still could be live voltage in the lamp. + +This was my first time messing with mains wiring and i had a ton of respect. I 3D-printed a nice case for the relay and the wiring so that even if i wanted to i couldn't touch the wiring. And cause im paranoid i put that in another electrical case just for good measure. + + +For the software i used [ESPHome](https://esphome.io/) which is a nice open source firmware for the ESP32 (and ESP8266). You define a YAML file with all the functionality you want to have and have esphome generate all the actual c++ code (and flash it also). My config for the lamp looks like this: +```yaml +esphome: + name: schreibtisch + platform: ESP32 + board: nodemcu-32s + +wifi: + ssid: " " + password: " " + use_address: "192.168.222.20" + + ap: + ssid: "Schreibtisch Fallback Hotspot" + password: " " + +ota: + safe_mode: True + password: " " + + +switch: + - platform: gpio + pin: + number: 33 + inverted: True + name: "Schreibtischlampe" + id: relay1 + +web_server: + port: 80 + auth: + username: "" + password: "" + +logger: +``` +After the first flashing of the ESP you can update the firmware over the air which is quite nice. +As you can see i defined a webserver which enables a REST-Api on the device. +To turn on the lamp on/off i can just type call a easy script which uses curl to make the request: +```bash +#/bin/sh! +curl -u : -X POST http://192.168.222.20/switch/schreibtischlampe/toggle +``` + +This setup already works but its actually not that good to only be able to control the lamp via a network connection. If thats down i can't turn on the light to fix[^3] the network connection which is bad cause then i cant turn on the light... + +To escape that vicious circle of darkness i plan to add some nice tactile arcade buttons to my desk. Stay tuned for that! + +[^1]: It can't play chess or drive a car but at least it connects to a router ;) +[^2]: A black [FORSÅ](https://www.ikea.com/de/de/p/forsa-arbeitsleuchte-schwarz-00146776/) to be exact +[^3]: And by that i mean restart the router under my desk + + diff --git a/content/posts/hello-world.md b/content/posts/hello-world.md new file mode 100644 index 0000000..ee7e643 --- /dev/null +++ b/content/posts/hello-world.md @@ -0,0 +1,18 @@ +--- +title: "Hello, World!" +date: 2019-10-26T21:11:15+02:00 +draft: false +summary: Does the world need another blog ? Yes!... +images: +--- + +**Documentation is the most boring part of any project. However that doesn't mean its not important...** + +Everything requieres mantainance and so there will come the day when you have to open up the project[^1] again and fix or repair something. For me this is always exiting since most of the time i have completely forgotten most of what i have done to do the repair. Having to sit down and getting into the mindset of my past self by just looking at the internals of the project takes way more time then if i just had written a few words about the thing in the first place. + +That is where this blog comes into play. I want to have a fun way of just writing some quick words about a project while working on it. That way i can freshen up my memories when i need to know the details again. And there is a side benefit to that... +**YOU** get to read about it, too! + +Let's see how that pans out or if im just going to stop after the first view posts ;) + +[^1]: be it software or hardware \ No newline at end of file diff --git a/layouts/_default/list.atom.xml b/layouts/_default/list.atom.xml new file mode 100644 index 0000000..418646b --- /dev/null +++ b/layouts/_default/list.atom.xml @@ -0,0 +1,31 @@ +{{ printf "" | safeHTML }} + + {{ .Site.Title }} + + {{ with .OutputFormats.Get "Atom" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{ end }} + {{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }} + + {{ with $.Site.Author.name }}{{ . }}{{ end }} + {{ with $.Site.Author.email }}{{ . }}{{ end }} + + Hugo + {{ .Permalink }} + {{ range first 15 .Pages }} + + {{ .Title }} + + {{ .Permalink }} + {{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }} + {{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" | safeHTML }} + {{ .Summary | html }} + {{ range .Params.tags }} + + {{ end }} + {{ range .Params.categories }} + + {{ end }} + + {{ end }} + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 0000000..b5f9a94 --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1,26 @@ +{{ partial "header.html" . }} + + +
+ {{ range .Paginator.Pages }} +
+
+ +

+ {{- .Title -}} + {{ if and .Params.lang (ne .Site.Language.Lang .Params.lang) }} + [{{ .Params.lang }}] + {{ end }} +

+
+

+ {{.Summary}} +

+
+ {{ end }} + +
+ + + +{{ partial "footer.html" . }} diff --git a/layouts/_default/list.rss.xml b/layouts/_default/list.rss.xml new file mode 100644 index 0000000..aa96b21 --- /dev/null +++ b/layouts/_default/list.rss.xml @@ -0,0 +1,33 @@ +{{ printf "" | safeHTML }} + + + {{ .Site.Title }} + {{ .Permalink }} + Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} + Hugo{{ with .Site.LanguageCode }} + {{.}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} + {{.}}{{end}}{{ if not .Date.IsZero }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{ with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{ end }} + {{ range first 15 .Pages }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} + {{ .Permalink }} + {{ .Summary | html }} + {{ range .Params.tags }} + {{ . }} + {{ end }} + {{ range .Params.categories }} + {{ . }} + {{ end }} + + {{ end }} + + diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..1b1ca6f --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,18 @@ +{{ partial "header.html" . }} + +
+
+

{{ .Title }}

+ +
+ + {{ .Content }} + + {{ if eq .Params.lang "en" }} +
+ {{ partial "article-footer.html" . }} +
+ {{ end }} +
+ +{{ partial "footer.html" . }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..8d5f49f --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,28 @@ +{{ partial "head.html" . }} +
+
+
+
+
+ Triangles +
+
+ Triangles +
+ +{{ partial "nav.html" . }} +{{ partial "footer.html" . }} \ No newline at end of file diff --git a/layouts/partials/article-footer.html b/layouts/partials/article-footer.html new file mode 100644 index 0000000..e69de29 diff --git a/layouts/partials/foot.html b/layouts/partials/foot.html new file mode 100644 index 0000000..7fb2bd6 --- /dev/null +++ b/layouts/partials/foot.html @@ -0,0 +1,2 @@ + + diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 0000000..26f8620 --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,9 @@ +
+ +
+ © {{ now.Format "2006" }} Nils Schulte + Creative Commons License +
+
+ +{{ partial "foot.html" . }} diff --git a/layouts/partials/head.html b/layouts/partials/head.html new file mode 100644 index 0000000..d93b381 --- /dev/null +++ b/layouts/partials/head.html @@ -0,0 +1,17 @@ + + + + + {{ partial "title.txt" . }} + + + + {{ range .AlternativeOutputFormats -}} + + {{ end -}} + + + + + + diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 0000000..3508fd2 --- /dev/null +++ b/layouts/partials/header.html @@ -0,0 +1,12 @@ +{{ partial "head.html" . }} + +
+
+ + +
+ + +
+ +{{ partial "nav.html" . }} \ No newline at end of file diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html new file mode 100644 index 0000000..6d9f0a1 --- /dev/null +++ b/layouts/partials/nav.html @@ -0,0 +1,5 @@ + diff --git a/layouts/partials/title.txt b/layouts/partials/title.txt new file mode 100644 index 0000000..c1a3c91 --- /dev/null +++ b/layouts/partials/title.txt @@ -0,0 +1,15 @@ +{{- $title := .Title -}} +{{- $siteTitle := .Site.Title -}} +{{- if .IsHome -}} + {{ $siteTitle }} +{{- else if eq .Kind "taxonomy" -}} + {{ title .Data.Singular }}: {{ $title }} · {{ $siteTitle }} +{{- else if eq .Kind "section" -}} + {{ $title }} · {{ $siteTitle }} +{{- else if .IsPage -}} + {{ $title }} · {{ $siteTitle }} +{{- else if not (eq .Title "") -}} + {{ $title }} · {{ $siteTitle }} +{{- else -}} + {{ $siteTitle }} +{{- end -}} diff --git a/static/css/normalize.css b/static/css/normalize.css new file mode 100644 index 0000000..8c331ec --- /dev/null +++ b/static/css/normalize.css @@ -0,0 +1,350 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } + \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..5bdb0b8 --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,410 @@ + + html { + background-color: black; + color: #dfdfdf; + } + +/* raleway-300 - latin */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 300; + src: local('Raleway Light'), local('Raleway-Light'), + url('../fonts/raleway-v14-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('../fonts/raleway-v14-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } + + /* raleway-700 - latin */ + @font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 700; + src: local('Raleway Bold'), local('Raleway-Bold'), + url('../fonts/raleway-v14-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('../fonts/raleway-v14-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } + + + + +#background { + position: fixed; + z-index: -1; + background-color: rgb(63, 18, 18);/*rgb(153, 34, 13);*/ + width: 100%; + height: 100%; +} + +@keyframes backgroundFallin { + 00% {height: 0%;} + 10% {height: 0%;} + 50% {height: 100%;} + 65% {height: 80%;} + 80% {height: 100%;} + 90% {height: 90%;} + 100% {height: 100%;} +} + +@keyframes headspin { + 0% {transform: rotate(-760deg) scale(0,0);} + 100% {transform: rotate(0deg) scale(1,1);} +} + +@keyframes dealfall { + 0% {transform: translateY(-2000%) } + 1% {transform: translateY(-200%) } + 100% {transform: translateY(0%) } +} + +body { + font-family: 'Raleway'; + display: flex; + flex-flow: row; + text-align: center; + + font-size: 20px; +} + +body > header { + width: 100%; + position: absolute; + text-align: center; + align-content: center; + display: flex; + flex-flow: row; +} + +body > header h1 { + display: flex; + flex-flow: row; + margin: 0; +} + + +#main { + flex: auto; + min-height: 100vh; + overflow: hidden; + + display: flex; + flex-flow: column; + + align-items: center; +} + +#main > nav, #main > main, #main > footer { + padding: 15px; +} + + +#main > main { + flex: 1; + margin-right: 25px; +} + +#main > footer { + padding-top: 50px; +} + +@media (prefers-color-scheme: dark) { + html { + background-color: black; + color: #dfdfdf; + } + + article img:not([src$=".jpg"]):not([src$=".jpeg"]) { + /* prevent transparent images from showing the black background */ + background-color: white; + border: 5px solid white; + box-sizing: border-box; + } +} + + +/* Article list */ +.article-list { + max-width: 45em; + width: 90vw; +} + +.article-list article{ + margin: 1.2em 0 0 0; +} + +.article-list article > header { + display: flex; + flex-flow: row; + align-items: center; + margin-bottom: 0; +} + +.article-list article time { + color:grey; +} + +.article-list article h3 { + display: inline-block; + margin: 0.5em; +} + +.article-list .summary { + text-align: justify; + margin: 0 1em; +} + +.article-list article small { + font-weight: normal; + color: gray; +} + +a, a:visited { + color: inherit; +} + +article > header { + text-align: center; + margin-bottom: 2em; +} + +article > header time { + color: gray; +} + +article { + max-width: 45em; + width: 90vw; + text-align: justify; +} + + +article img, article video { + max-width: 100%; +} + +article .footnotes { + font-size: 0.75em; +} + +pre { + background-color: #272822; + color: #f8f8f2; + padding: 15px; + overflow: auto; + + tab-size: 2; + -moz-tab-size: 2; +} + +p code, li code { + color: #930d72; +} + +.centerdiv { + margin: 0; + position: absolute; + display: flex; + width: 100%; + height: 90%; + z-index: -1; +} + +.logo_anim { + margin:auto; + max-height: 60%; + max-width: 60%; +} + +/* Layout * + +body { + font-family: 'Fira Code', 'Nanum Gothic Coding', monospace; + display: flex; + flex-flow: row; +} + +body > header { + text-align: center; +} + +body > header h1 { + width: 1.5em; + font-size: 10em; + margin: 0 auto; +} + +body > header p { + color: gray; +} + +#main { + flex: auto; + min-height: 100vh; + max-width: 820px; + overflow: hidden; + + display: flex; + flex-flow: column; +} + +#main > nav, #main > main, #main > footer { + padding: 15px; +} + +#main > nav { + text-align: center; +} + +#main > main { + flex: 1; + margin-right: 25px; +} + +#main > footer { + padding-top: 50px; +} + +@media (max-width: 640px) { + body { + flex-direction: column; + } + + body > header h1 { + width: auto; + font-size: 7em; + } + + #main { + display: block; + min-height: 0; + } + + #main > main { + margin-right: 0; + } +} + +hr { + border: none; + border-top: 1px solid gray; + max-width: 25px; + margin: 35px auto; +} + +.muted { + color: gray; +} + +@media (prefers-color-scheme: dark) { + html { + background-color: black; + color: #dfdfdf; + } + + article img:not([src$=".jpg"]):not([src$=".jpeg"]) { + /* prevent transparent images from showing the black background + background-color: white; + border: 5px solid white; + box-sizing: border-box; + } +} + +/* Homepage + +#intro { + width: 100%; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; +} + +#intro h1 { + font-size: 10em; + margin: 0; +} + +#intro p { + color: gray; + margin-bottom: 5em; +} + +@media (max-width: 640px) { + #intro h1 { + font-size: 7em; + } +} + +/* Typography + +article > header { + margin-bottom: 2em; +} + +article > header time { + color: gray; + white-space: nowrap; +} + +article p, article li { + text-align: justify; +} + +article img, article video { + max-width: 100%; +} + +article .footnotes { + font-size: 0.75em; +} + +pre { + font-family: 'Fira Code', 'Nanum Gothic Coding', monospace; + background-color: #272822; + color: #f8f8f2; + padding: 15px; + overflow: auto; + + tab-size: 2; + -moz-tab-size: 2; +} + +p code, li code { + color: #930d72; +} + +a, a:visited { + color: inherit; +} + +iframe[src*="youtube-nocookie.com"] { + border: none; + width: 100%; + height: 460px; +} + +@media (max-width: 640px) { + iframe[src*="youtube-nocookie.com"] { + height: 260px; + } +} + +/* Article list + +.article-list article > header { + display: flex; + flex-flow: row; + align-items: center; + margin-bottom: 0; +} + +.article-list article h3 { + display: inline-block; + margin: 0.5em; +} + +.article-list article small { + font-weight: normal; + color: gray; +} diff --git a/static/img/deal.svg b/static/img/deal.svg new file mode 100644 index 0000000..b726325 --- /dev/null +++ b/static/img/deal.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000..343002d Binary files /dev/null and b/static/img/favicon.ico differ diff --git a/static/img/lamp-relay-esp.png b/static/img/lamp-relay-esp.png new file mode 100644 index 0000000..995adae Binary files /dev/null and b/static/img/lamp-relay-esp.png differ diff --git a/static/img/tri.svg b/static/img/tri.svg new file mode 100644 index 0000000..eafcf82 --- /dev/null +++ b/static/img/tri.svg @@ -0,0 +1,1400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +