All the code
11
.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
site/photos/*.html
|
||||||
|
site/photos/*/*.html
|
||||||
|
site/photos/*/mid
|
||||||
|
site/photos/*/thm
|
||||||
|
photos/*.html
|
||||||
|
photos/*/*.html
|
||||||
|
photos/*/mid
|
||||||
|
photos/*/thm
|
||||||
|
www/*
|
||||||
|
code/*
|
||||||
|
site/uugcal/*
|
120
Makefile
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
WWW = ${PWD}/www
|
||||||
|
SITE = ${PWD}/site
|
||||||
|
SCRIPTS = ${PWD}/scripts
|
||||||
|
LOCAL = /var/www/htdocs
|
||||||
|
REMOTE = sdk@codevoid.de:/home/www/htdocs/shagen
|
||||||
|
|
||||||
|
# do everything by default
|
||||||
|
all: build-and-upload-all
|
||||||
|
@echo "done."
|
||||||
|
|
||||||
|
# Create the photo galleries and create the index and preview html
|
||||||
|
# pages in site/, so they get parsed in the compile step
|
||||||
|
PHOTODIRS != find photos/* -maxdepth 0 -mindepth 0 -type d
|
||||||
|
photos: ${PHOTODIRS}
|
||||||
|
mkdir -p ${SITE}/photos
|
||||||
|
cd photos && sh ${SCRIPTS}/mkphotoindex.sh > index.html
|
||||||
|
find photos -type f -not -name "*.html" -exec install -D {} www/{} \;
|
||||||
|
find photos -type f -name "*.html" -exec install -D {} site/{} \;
|
||||||
|
|
||||||
|
optimize:
|
||||||
|
find photos -name "*.jpg" -type f -exec jpegoptim -w 12 --all-progressive --strip-all "{}" +
|
||||||
|
|
||||||
|
calendar:
|
||||||
|
mkdir -p ${SITE}/uugcal
|
||||||
|
cd ${SITE}/uugcal && sh ${SCRIPTS}/mkuugcalendar.sh > index.html
|
||||||
|
|
||||||
|
${PHOTODIRS}:
|
||||||
|
cd "$@" && sh ${SCRIPTS}/mkphotos.sh > index.html
|
||||||
|
|
||||||
|
# invoke zod and compile the website into the www/ dir
|
||||||
|
compile:
|
||||||
|
mkdir -p ${WWW}
|
||||||
|
zod ${SITE} ${WWW}
|
||||||
|
|
||||||
|
# after mixing different generators in the compile step, let's tidy and
|
||||||
|
# indent the output properly (XXX is there a tool that does _only_
|
||||||
|
# indent?)
|
||||||
|
tidy:
|
||||||
|
find ${WWW} -type f -name "*.html" \
|
||||||
|
-exec tidy -q -i -m -c -w 120 -f /dev/null {} \;
|
||||||
|
find ${WWW} -type f -name "*.html" \
|
||||||
|
-exec sed -i '/.*meta name="generator".*/d' {} \;
|
||||||
|
|
||||||
|
# create gzip variants of text files, so they can be served by httpds
|
||||||
|
# gzip-static extension
|
||||||
|
gzip:
|
||||||
|
find ${WWW} -type f \
|
||||||
|
\( -name "*.html" -o -name "*.css" \) \
|
||||||
|
-exec gzip -kf9 {} \;
|
||||||
|
|
||||||
|
# set permissions so the web server can read the file
|
||||||
|
fixperms:
|
||||||
|
doas chown -R sdk:www ${WWW}
|
||||||
|
doas chmod -R ugo+wrX,go-w ${WWW}
|
||||||
|
|
||||||
|
# we can upload to the local and the remote webserver at the same time
|
||||||
|
upload-local: stagit
|
||||||
|
doas rsync -a --delete ${WWW}/ ${LOCAL}/
|
||||||
|
upload-remote: stagit
|
||||||
|
doas rsync -a --delete -e ssh ${WWW}/ ${REMOTE}/
|
||||||
|
upload-all: upload-local upload-remote
|
||||||
|
|
||||||
|
build:
|
||||||
|
make clean; \
|
||||||
|
make photos; \
|
||||||
|
make stagit; \
|
||||||
|
make calendar; \
|
||||||
|
make compile; \
|
||||||
|
make tidy; \
|
||||||
|
make fixperms;
|
||||||
|
|
||||||
|
build-and-upload-all:
|
||||||
|
make build; \
|
||||||
|
make upload-all;
|
||||||
|
|
||||||
|
# deploy to the local webserver for preview
|
||||||
|
local:
|
||||||
|
make build; \
|
||||||
|
make upload-local;
|
||||||
|
remote:
|
||||||
|
make build; \
|
||||||
|
make upload-remote
|
||||||
|
|
||||||
|
# clean up temporary files and everything that can be regenerated very fast
|
||||||
|
clean:
|
||||||
|
rm -rf ${WWW}/photos
|
||||||
|
rm -rf ${SITE}/photos
|
||||||
|
rm -f photos/index.html
|
||||||
|
rm -f photos/*/*.html
|
||||||
|
rm -rf ${SITE}/uugcal
|
||||||
|
rm -rf ${WWW}
|
||||||
|
|
||||||
|
# clean and also delete all generated images
|
||||||
|
realclean: clean
|
||||||
|
rm -rf photos/*/{thm,mid}
|
||||||
|
|
||||||
|
|
||||||
|
### TARGETS BELOW ARE ONLY FOR CONVENIENCE
|
||||||
|
|
||||||
|
stagit:
|
||||||
|
scripts/reposync.sh
|
||||||
|
|
||||||
|
git-add:
|
||||||
|
find site/photos -type f \
|
||||||
|
-not -name "*.html" \
|
||||||
|
-not -path "*/thm/*" \
|
||||||
|
-not -path "*/mid/*" \
|
||||||
|
-exec git add "{}" +
|
||||||
|
|
||||||
|
# watch files and rebuild automatically
|
||||||
|
notify:
|
||||||
|
ulimit -n 1024; \
|
||||||
|
find ${SITE} ${SCRIPTS} -not -path "*/photos/*" -type f \
|
||||||
|
| inotifywait -m -e modify --fromfile - \
|
||||||
|
| while read line; \
|
||||||
|
do \
|
||||||
|
make; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.PHONY: ${PHOTODIRS} ${REPOS}
|
11
config
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[core]
|
||||||
|
repositoryformatversion = 0
|
||||||
|
filemode = true
|
||||||
|
bare = false
|
||||||
|
logallrefupdates = true
|
||||||
|
[remote "origin"]
|
||||||
|
url = git@github.com:c0dev0id/website.git
|
||||||
|
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||||
|
[branch "main"]
|
||||||
|
remote = origin
|
||||||
|
merge = refs/heads/main
|
36
scripts/mkphotoindex.sh
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
echo "<h1>My Photos</h1>"
|
||||||
|
[ -f index.txt ] && cat index.txt
|
||||||
|
|
||||||
|
|
||||||
|
makelink() {
|
||||||
|
_text="$(echo "$1" | sed 's/-/ /g;s/_/ - /g;s/\(....\) \(..\) \(..\)/\1-\2-\3/')"
|
||||||
|
echo "<li><a href=\"${_dir}\">${_text}</a></li>"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "<h3>Events:</h3>"
|
||||||
|
|
||||||
|
echo "<ul>"
|
||||||
|
find * -maxdepth 0 -mindepth 0 -type d \
|
||||||
|
| grep "^20" \
|
||||||
|
| grep -v "unlisted" \
|
||||||
|
| sort -r \
|
||||||
|
| while read _dir
|
||||||
|
do
|
||||||
|
makelink "$_dir"
|
||||||
|
done
|
||||||
|
echo "</ul>"
|
||||||
|
|
||||||
|
echo "<h3>Collections:</h3>"
|
||||||
|
|
||||||
|
echo "<ul>"
|
||||||
|
find * -maxdepth 0 -mindepth 0 -type d \
|
||||||
|
| grep -v "^20" \
|
||||||
|
| grep -v "unlisted" \
|
||||||
|
| sort -r \
|
||||||
|
| while read _dir
|
||||||
|
do
|
||||||
|
makelink "$_dir"
|
||||||
|
done
|
||||||
|
echo "</ul>"
|
90
scripts/mkphotos.sh
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
## settings
|
||||||
|
|
||||||
|
DIR="$(basename "$PWD")"
|
||||||
|
TITLE="$(basename "$PWD" |sed 's/unlisted-//g' | cut -d"_" -f2- | tr '-' ' ')"
|
||||||
|
|
||||||
|
mkdir -p thm mid
|
||||||
|
|
||||||
|
echo "<h1>$TITLE</h1>"
|
||||||
|
[ -f index.txt ] && cat index.txt
|
||||||
|
|
||||||
|
echo "<p>"
|
||||||
|
echo "<table class=\"photo-table\">"
|
||||||
|
echo "<tr>"
|
||||||
|
|
||||||
|
_count=0
|
||||||
|
find * -maxdepth 0 -mindepth 0 -type f \( -iname "*.jpg" \
|
||||||
|
-o -iname "*.jpeg" \
|
||||||
|
-o -iname "*.png" \
|
||||||
|
-o -iname "*.gif" \
|
||||||
|
\) \
|
||||||
|
| sort -r | while read _file
|
||||||
|
do
|
||||||
|
_file_thm="thm/${_file%%.*}.jpg"
|
||||||
|
_file_mid="mid/${_file%%.*}.jpg"
|
||||||
|
_file_html="${_file%%.*}.html"
|
||||||
|
_file_descr="${_file%%.*}.txt"
|
||||||
|
|
||||||
|
# increase file counter
|
||||||
|
_count=$(( _count + 1))
|
||||||
|
|
||||||
|
if [ ! -f "${_file_thm}" ]
|
||||||
|
then
|
||||||
|
convert -quality 73 \
|
||||||
|
-sharpen 2x2 \
|
||||||
|
-auto-orient \
|
||||||
|
-define jpeg:size=440x440 \
|
||||||
|
"$_file" \
|
||||||
|
-thumbnail 220x220^ \
|
||||||
|
-gravity center \
|
||||||
|
-extent 220x220 \
|
||||||
|
"${_file_thm}" \
|
||||||
|
>/dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "${_file_mid}" ]
|
||||||
|
then
|
||||||
|
convert -quality 83 \
|
||||||
|
-sharpen 2x2 \
|
||||||
|
-auto-orient \
|
||||||
|
-define jpeg:size=1440x2400 \
|
||||||
|
"$_file" \
|
||||||
|
-thumbnail 720x1600 \
|
||||||
|
"${_file_mid}" \
|
||||||
|
>/dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
if [ ! -f "${_file_html}" ]
|
||||||
|
then
|
||||||
|
echo "<h1>$TITLE</h1>" > "${_file_html}"
|
||||||
|
echo "<p>File: ${_file} (<a href=\"/photos/$DIR/${_file}\" target=_blank>Open Original</a>)</p>" >> "${_file_html}"
|
||||||
|
echo "<p><img class=\"photo-mid\" src=\"/photos/$DIR/${_file_mid}\"></p>" >> "${_file_html}"
|
||||||
|
[ -f "${_file_descr}" ] && cat "${_file_descr}" >> "${_file_html}"
|
||||||
|
echo "<p><a href=index.html>Back to Index</a></p>" >> "${_file_html}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "<td class=\"photo-td\" ><a href=\"/photos/$DIR/${_file_html}\"><img class=\"photo-img\" src=\"${_file_thm}\"></a></td>"
|
||||||
|
if [ $(( _count % 3 )) -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "</tr><tr>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while [ $(pgrep convert | wc -l) -ge 15 ]
|
||||||
|
do sleep 0.3; done
|
||||||
|
|
||||||
|
done
|
||||||
|
echo "</tr>"
|
||||||
|
echo "</table>"
|
||||||
|
echo "</p>"
|
||||||
|
|
||||||
|
echo "<p><a href=../index.html>Back to the gallery index</a></p>"
|
||||||
|
echo "section: photos" > dir.meta
|
||||||
|
|
||||||
|
wait
|
||||||
|
|
||||||
|
# it looks like wait doesn't catch processes spawned
|
||||||
|
# in a subshell. So we check explicitely for running
|
||||||
|
# convert processes. XXX
|
||||||
|
while [ $(pgrep convert | wc -l) -ge 1 ]
|
||||||
|
do sleep 1; done
|
16
scripts/mkuugcalendar.sh
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
REM=$(curl -s "https://raw.githubusercontent.com/c0dev0id/dotfiles/main/.reminders/uugrn.rem")
|
||||||
|
rm -f uugrn-calendar.*
|
||||||
|
|
||||||
|
echo "$REM" | remind -b1 -p24 - 2>/dev/null | rem2pdf > uugrn-calendar.pdf
|
||||||
|
echo "$REM" | remind -b1 -p24 - 2>/dev/null | rem2html --nostyle --tableonly > uugrn-calendar.html
|
||||||
|
echo "$REM" | remind -b1 -p24 - 2>/dev/null | rem2ics > uugrn-calendar.ics
|
||||||
|
|
||||||
|
echo "<h1>UUGRN Calendar</h1>"
|
||||||
|
echo "<ul>"
|
||||||
|
echo "<li><a href=uugrn-calendar.html>HTML Format</a></li>"
|
||||||
|
echo "<li><a href=uugrn-calendar.pdf>PDF Format</a></li>"
|
||||||
|
echo "<li><a href=uugrn-calendar.ics>iCAL Format</a></li>"
|
||||||
|
echo "</ul>"
|
||||||
|
|
30
scripts/reposync.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
add_repo() {(
|
||||||
|
_dir="$(basename "$1")"
|
||||||
|
if [ -d "code/${_dir}" ]
|
||||||
|
then
|
||||||
|
( cd code/${_dir} && git pull )
|
||||||
|
else
|
||||||
|
( cd code && git clone "https://$1" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
_fulldir=$(readlink -f "code/${_dir}")
|
||||||
|
mkdir -p www/code/${_dir}
|
||||||
|
cp site/code/*.{css,png} www/code/${_dir}/
|
||||||
|
cd www/code/${_dir}
|
||||||
|
stagit -u https://stefanhagen.de/code ${_fulldir}
|
||||||
|
)}
|
||||||
|
|
||||||
|
mkdir -p code
|
||||||
|
add_repo "github.com/c0dev0id/dotfiles"
|
||||||
|
add_repo "github.com/c0dev0id/mkpicindex"
|
||||||
|
add_repo "github.com/c0dev0id/mystuff"
|
||||||
|
add_repo "github.com/c0dev0id/website"
|
||||||
|
add_repo "github.com/c0dev0id/xpick"
|
||||||
|
add_repo "github.com/luakit/luakit"
|
||||||
|
|
||||||
|
|
||||||
|
_repos="$(find code/* -mindepth 0 -maxdepth 0 -type d)"
|
||||||
|
|
||||||
|
stagit-index ${_repos} > www/code/index.html
|
65
scripts/tikz.lua
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
local system = require 'pandoc.system'
|
||||||
|
|
||||||
|
local tikz_doc_template = [[
|
||||||
|
\documentclass{standalone}
|
||||||
|
\usepackage[pdftex]{graphics}
|
||||||
|
\usepackage[pdftex]{graphicx}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
\usepackage{tikz}
|
||||||
|
\begin{document}
|
||||||
|
\nopagecolor
|
||||||
|
%s
|
||||||
|
\end{document}
|
||||||
|
]]
|
||||||
|
|
||||||
|
local function tikz2image(src, filetype, outfile)
|
||||||
|
system.with_temporary_directory('tikz2image', function (tmpdir)
|
||||||
|
system.with_working_directory(tmpdir, function()
|
||||||
|
local f = io.open('tikz.tex', 'w')
|
||||||
|
f:write(tikz_doc_template:format(src))
|
||||||
|
f:close()
|
||||||
|
os.execute('pdflatex tikz.tex >/dev/null 2>&1')
|
||||||
|
if filetype == 'pdf' then
|
||||||
|
os.rename('tikz.pdf', outfile)
|
||||||
|
else
|
||||||
|
os.execute('pdf2svg tikz.pdf ' .. outfile .. '>/dev/null 2>&1')
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
extension_for = {
|
||||||
|
html = 'svg',
|
||||||
|
html4 = 'svg',
|
||||||
|
html5 = 'svg',
|
||||||
|
latex = 'pdf',
|
||||||
|
beamer = 'pdf' }
|
||||||
|
|
||||||
|
local function file_exists(name)
|
||||||
|
local f = io.open(name, 'r')
|
||||||
|
if f ~= nil then
|
||||||
|
io.close(f)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function starts_with(start, str)
|
||||||
|
return str:sub(1, #start) == start
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function RawBlock(el)
|
||||||
|
if starts_with('\\begin{tikzpicture}', el.text) then
|
||||||
|
local filetype = extension_for[FORMAT] or 'svg'
|
||||||
|
local fbasename = pandoc.sha1(el.text) .. '.' .. filetype
|
||||||
|
local fname = system.get_working_directory() .. '/' .. fbasename
|
||||||
|
if not file_exists(fname) then
|
||||||
|
tikz2image(el.text, filetype, fname)
|
||||||
|
end
|
||||||
|
return pandoc.Para({pandoc.Image({}, fbasename)})
|
||||||
|
else
|
||||||
|
return el
|
||||||
|
end
|
||||||
|
end
|
47
site/.zod/config
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
; This is an example zodiac configuration file
|
||||||
|
; A line starting with a `;` is a comment and is ignored.
|
||||||
|
|
||||||
|
; The `parse` section is for page templates that will not be converted to
|
||||||
|
; HTML via an external utility.
|
||||||
|
;
|
||||||
|
; [parse]
|
||||||
|
; extension,extension
|
||||||
|
; extension
|
||||||
|
; ...
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
; [parse]
|
||||||
|
; htm
|
||||||
|
; html
|
||||||
|
|
||||||
|
|
||||||
|
; The `parse_convert` section is for page templates that will be converted
|
||||||
|
; to HTML via an external utility.
|
||||||
|
;
|
||||||
|
; By default, page templates with the `md` extension are piped through the
|
||||||
|
; built-in awk implementation of Markdown.
|
||||||
|
;
|
||||||
|
; [parse_convert]
|
||||||
|
; extension,extension command
|
||||||
|
; extension command
|
||||||
|
; ...
|
||||||
|
|
||||||
|
|
||||||
|
[parse_convert]
|
||||||
|
sh sh
|
||||||
|
md discount
|
||||||
|
adoc asciidoctor -r asciidoctor-diagram -a data-uri -a allow-uri-read -a svg-embed -a diagram-svg-type=inline -a showtitle -a icons=image -a icontype=svg -a iconsdir=site/images/icons -s -
|
||||||
|
tex pandoc --embed-resources --lua-filter scripts/tikz.lua
|
||||||
|
; md,markdown discount
|
||||||
|
; txt asciidoc -s -
|
||||||
|
|
||||||
|
|
||||||
|
; The `ignore` section is for patterns that zodiac will ignore when
|
||||||
|
; searching the project directory. Ignored files will not be parsed or
|
||||||
|
; copied to the target directory.
|
||||||
|
;
|
||||||
|
; [ignore]
|
||||||
|
; pattern
|
||||||
|
; pattern
|
||||||
|
; ...
|
2068
site/asciidoctor.css
Normal file
17
site/blog.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Blog
|
||||||
|
|
||||||
|
These are my blog posts
|
||||||
|
|
||||||
|
* 2021-09-26 [Memory management, virtual and residential memory](/blog/2021-09-26-memory-management.html)
|
||||||
|
* 2021-01-09 [Mutt inline patch handling](/blog/2021-01-09-mutt-inline-patch-macro.html)
|
||||||
|
* 2020-11-14 [OpenBSD Full Disk Encryption (FDE) Setup](/blog/2020-11-14-openbsd-fde.html)
|
||||||
|
* 2020-05-17 [Dark-Mode in Browsers](/blog/2020-05-17-browser-dark-mode.html)
|
||||||
|
* 2019-10-24 [Building an OpenBSD Kernel](/blog/2019-10-24-building-an-openbsd-kernel.html)
|
||||||
|
* 2019-10-17 [LineageOS on the Motorola Z2 Force](/blog/2019-10-17-LineageOS-on-Motorola-Z2-Force.html)
|
||||||
|
* 2019-04-27 [Manage dotfiles with git](/blog/2019-04-27-manage-dotfiles-with-git.html)
|
||||||
|
|
||||||
|
*Note that the $ and # in my blog posts have meaning.*
|
||||||
|
<pre>
|
||||||
|
$ run this command as user
|
||||||
|
# run this command as root (or prepend doas/sudo)
|
||||||
|
</pre>
|
2
site/blog.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
title: Blog
|
||||||
|
section: blog
|
58
site/blog/2019-04-27-manage-dotfiles-with-git.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Manage dotfiles with git
|
||||||
|
|
||||||
|
I'm managing my dotfiles with git. My method serves me well for a few
|
||||||
|
years already and so I think it's time to write it down.
|
||||||
|
|
||||||
|
If you think git, you might think of a dotfile repository and dozens of
|
||||||
|
symlinks into the home directory. This is precisely what kept me from
|
||||||
|
using git until I discovered bare repositories.
|
||||||
|
|
||||||
|
Create your dotfile repository with the `--bare` parameter
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
git init --bare ${HOME}/.cfg
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
This creates only a folder for git control files, which normally reside
|
||||||
|
inside the `.git` folder within the repository.
|
||||||
|
|
||||||
|
You can now tell git to use `${HOME}` as your work-tree directory. This
|
||||||
|
makes git handle your home directory like all the files would be within
|
||||||
|
the git repository. Now you can:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} add .vimrc
|
||||||
|
git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} commit -m "my .vimrc"
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
If course it is silly to type out such a long command every time you
|
||||||
|
want to interract with your dotfiles. So why not create an alias?
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
alias config='git --git-dir=${HOME}/.cfg/ --work-tree=${HOME}'
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Put this in your `~/.bashrc` or `~/.kshrc` and you can now use the command
|
||||||
|
`config` in the same way you usually use git.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
config add .vimrc
|
||||||
|
config commit -m "my vimrc"
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Maybe you have been brave and typed `config status` already. This will
|
||||||
|
list the content of your whole home directory as "untracked files". This
|
||||||
|
is not what we want. We can run `git config` and tell it to stop doing
|
||||||
|
this. But of course we must run our git, which is called `config`.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
config config --local status.showUntrackedFiles no
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Now git status will only check what's being tracked. So if you add
|
||||||
|
your vimrc file and later change it, `config status` will show it,
|
||||||
|
`config diff` will diff it...
|
||||||
|
|
||||||
|
You can now use the power of git with your new `config` command.
|
||||||
|
|
||||||
|
The solution is not perfect, but it comes pretty close...
|
42
site/blog/2019-10-17-LineageOS-on-Motorola-Z2-Force.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# LineageOS on Motorola Z2 Force
|
||||||
|
|
||||||
|
Whenever there is a major LineageOS Update, chances are that I forgot
|
||||||
|
the flashing process. So here are the notes.
|
||||||
|
|
||||||
|
Disclaimer: Due to the missing tools to flash from OpenBSD, I use my
|
||||||
|
work computer, which runs windows.
|
||||||
|
|
||||||
|
*Required Downloads:*
|
||||||
|
|
||||||
|
* [Android Platform Tools](https://dl.google.com/android/repository/platform-tools-latest-windows.zip)
|
||||||
|
(contains adb and fastboot)
|
||||||
|
* [Motorola Smart Assistant](https://support.lenovo.com/us/en/downloads/ds101291) (contains USB drivers for fastboot)
|
||||||
|
|
||||||
|
*Prepare:*
|
||||||
|
|
||||||
|
- Install motorola smart assistant
|
||||||
|
- Extract platform-tools make sure you're in the platform tools
|
||||||
|
directory or that they are in your $PATH.
|
||||||
|
|
||||||
|
*Update steps:*
|
||||||
|
|
||||||
|
- > Boot into bootloader (power+down)
|
||||||
|
- $ fastboot flash boot_a <lineageos_recovery>.img
|
||||||
|
- $ fastboot flash boot_b <lineageos_recovery>.img
|
||||||
|
- > Boot into bootloader (power+down) -> Boot Recovery
|
||||||
|
- > Factory Reset -> Wipe data / factory reset + Wipe System
|
||||||
|
- > Apply update -> adb sideload
|
||||||
|
- $ adb sideload <lineageos>.zip
|
||||||
|
- $ adb sideload <addons>.zip
|
||||||
|
- > Reboot
|
||||||
|
|
||||||
|
$ == commandline activity<br>
|
||||||
|
> == phone activity
|
||||||
|
|
||||||
|
*Notes:*
|
||||||
|
|
||||||
|
* "adb devices" works without USB drivers
|
||||||
|
* "fastboot devices" shows nothing if USB drivers are not installed
|
||||||
|
* This phone has two boot areas and therefore "fastboot flash boot" will
|
||||||
|
fail. The areas "boot_a" and "boot_b" must be used instead. If "boot_a"
|
||||||
|
and "boot_b" are flashed differently, booting will fail.
|
47
site/blog/2019-10-24-building-an-openbsd-kernel.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Building an OpenBSD Kernel
|
||||||
|
|
||||||
|
I'm running OpenBSD-current for a while in order to support my port.
|
||||||
|
It's only one port at the moment, but that's a start, right?
|
||||||
|
|
||||||
|
Anyway... every once in a while I stumble over a patch on the OpenBSD
|
||||||
|
mailing list I want to try and this requires me to apply the patch and
|
||||||
|
build the Kernel with it. But how?
|
||||||
|
|
||||||
|
Well, the documentation is where
|
||||||
|
[where you would expect it](https://www.openbsd.org/faq/faq5.html#Custom).
|
||||||
|
|
||||||
|
*Download the kernel source*
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /usr
|
||||||
|
# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs checkout -P src
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
*Update the kernel source (if you downloaded it a while ago)*
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /usr/src
|
||||||
|
# cvs -q up -Pd
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
*Configure Kernel*
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /usr/src/sys/arch/amd64/conf
|
||||||
|
# cp GENERIC.MP MYKERNEL
|
||||||
|
# config MYKERNEL
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
*Build and install kernel (amd64)*
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /sys/arch/amd64/compile/MYKERNEL
|
||||||
|
# make clean
|
||||||
|
# make
|
||||||
|
# make install # the old kernel is /obsd now
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
That's it. Reboot.
|
||||||
|
|
||||||
|
This is ONLY the Kernel. If you need to build the whole system, please
|
||||||
|
consult the OpenBSD documentation. The manpage release(8) is a good start.
|
55
site/blog/2020-05-17-browser-dark-mode.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Browser Dark Mode
|
||||||
|
|
||||||
|
Dark Mode luckily has become a thing also in the non-unix world. Finally
|
||||||
|
browsers can be used with dark interfaces and websites can have
|
||||||
|
alternative color schemes.
|
||||||
|
|
||||||
|
However, in other operating systems, there is a global toggle for dark
|
||||||
|
mode, which also switches the browser into it. This is not the case on
|
||||||
|
linux and unix systems.
|
||||||
|
|
||||||
|
## Chrome / Chromium / Iridium
|
||||||
|
|
||||||
|
Chrome and Chromium starting with version 73 can be tought to start in
|
||||||
|
dark mode:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ chrome --enable-features=WebUIDarkMode --force-dark-mode
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Then go to chrome://settings/?search=themes and switch the theme to
|
||||||
|
"Classic".
|
||||||
|
|
||||||
|
## Firefox
|
||||||
|
|
||||||
|
Firefox learned the dark mode in release 70.
|
||||||
|
|
||||||
|
0. Go to "about:config"
|
||||||
|
1. Enter "ui.systemUsesDarkTheme" into the search bar
|
||||||
|
2. Click "Number" and then "+"
|
||||||
|
3. Enter "1" and click the check mark
|
||||||
|
|
||||||
|
Right click on a free spot in the icon bar and select "customize". At
|
||||||
|
the bottom left of the screen, you can switch to a dark theme.
|
||||||
|
|
||||||
|
Note: If you've set privacy.resistFingerprinting to "true" the CSS dark
|
||||||
|
mode switching won't work. Kudus to
|
||||||
|
[@andinus@tilde.zone](https://tilde.zone/@andinus) for figuring this out.
|
||||||
|
|
||||||
|
There you go, both browsers are in dark mode now. The UI should be dark
|
||||||
|
and also websites that support the `@media (prefers-color-scheme: dark)`
|
||||||
|
directive should make use of it.
|
||||||
|
|
||||||
|
You can test it on my webpage ([https://codevoid.de](https://codevoid.de)). The
|
||||||
|
light version has a light gray background and a blue font. The dark version has
|
||||||
|
a dark gray background and an orange font.
|
||||||
|
|
||||||
|
## vim-browser (vimb)
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ echo "set dark-mode=true" >> ${HOME}/.config/vimb/config
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## luakit
|
||||||
|
|
||||||
|
Open `:settings` and check `application.prefer_dark_mode`
|
32
site/blog/2020-11-14-openbsd-fde.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# OpenBSD FDE Setup
|
||||||
|
|
||||||
|
This is a condensed version of [OpenBSD FDE
|
||||||
|
FAQ](https://www.openbsd.org/faq/faq14.html#softraid).
|
||||||
|
|
||||||
|
Boot installer, drop to shell with "s"
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /dev && sh MAKEDEV sd0
|
||||||
|
# dd if=/dev/urandom of=/dev/rsd0c bs=1m
|
||||||
|
# fdisk -iy -g -b 960 sd0 # GPT / without -g and -b for MBR
|
||||||
|
# disklabel -E sd0
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Note, switch to kbd en before setting the password as this is
|
||||||
|
what you have on the boot prompt.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# bioctl -c C -l sd0a softraid0
|
||||||
|
# dd if=/dev/zero of=/dev/rsd1c bs=1m count=1
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Ctrl+D to restart the installer. Choose sd1 as install target.
|
||||||
|
|
||||||
|
If sd1 is not present:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# cd /dev && sh MAKEDEV sd1
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
When the installer later asks about installing with MBR or GPT layout,
|
||||||
|
choose MBR. Even if you boot via UEFI/GPT.
|
74
site/blog/2021-01-09-mutt-inline-patch-macro.md
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Mutt inline patch handling
|
||||||
|
|
||||||
|
Developers like to send diffs inline in emails. They do this, because it's fast
|
||||||
|
and easy to read through them, comment on them and also to apply them. Some
|
||||||
|
version control systems also take over the email text into the patch description
|
||||||
|
as well.
|
||||||
|
|
||||||
|
Up to now, my workflow was manual. I had to save the email somewhere, then open
|
||||||
|
a terminal, cd to the direcory the patch shall be applied in and call the patch
|
||||||
|
utility with the path to the saved email as argument.
|
||||||
|
|
||||||
|
No more.
|
||||||
|
|
||||||
|
This mutt macro takes the current visible email and copies it to a temporary
|
||||||
|
file (/tmp/mutt-patch.diff). Then it executes the portpatch.sh shell script. All
|
||||||
|
with one push on ctrl+s while looking at the email.
|
||||||
|
|
||||||
|
The macro must be written in one line and ^S can be entered with the keyboard
|
||||||
|
sequence ctrl+v ctrl+s:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
macro pager ^S "<shell-escape>rm -f /tmp/mutt-patch.diff<enter><copy-message>/tmp/mutt-patch.diff<enter><enter-command>echo 'Saved as /tmp/mutt-patch.diff'<enter><shell-escape> ~/.mutt/scripts/portpatch.sh /tmp/mutt-patch.diff<enter>"
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The portpatch.sh script:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#!/bin/sh
|
||||||
|
# needs converters/qprint
|
||||||
|
clear
|
||||||
|
|
||||||
|
echo '---------------------------------------------------------------------'
|
||||||
|
grep -E 'Subject: |^Index|^RCS|^diff --git|^file +|^[-+]{3} ' "${1}"
|
||||||
|
echo '---------------------------------------------------------------------'
|
||||||
|
|
||||||
|
printf "Apply patch on path [defaults to /usr/ports]? "
|
||||||
|
read -r _path
|
||||||
|
|
||||||
|
printf "Fix quoted-printable mangeled patch? [y/N]: "
|
||||||
|
read -r _qprint
|
||||||
|
|
||||||
|
case ${_qprint} in
|
||||||
|
[y|Y]) _catcmd="qprint -d"; ;;
|
||||||
|
*) _catcmd="cat"; ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf "Strip? [0]: "
|
||||||
|
read -r _strip
|
||||||
|
|
||||||
|
${_catcmd} "${1}" | doas patch -Ep${_strip:=0} -d ${_path:=/usr/ports}
|
||||||
|
cd ${_path} && ksh
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The script shows some relvant bits from the email patch that are handy
|
||||||
|
to determine on which path the patch shall be applied.
|
||||||
|
|
||||||
|
Next it allows the user to enter a different path. I mostly use /usr/ports, so
|
||||||
|
this is the default. Then the patch is applied and a ksh shell is opened for
|
||||||
|
further work.
|
||||||
|
|
||||||
|
Quitting the shell brings me back to mutt to work on the next email.
|
||||||
|
|
||||||
|
Sometimes someone sends a mangled patch encoded in quoted-printable. My script
|
||||||
|
allows to fix this with qprint.
|
||||||
|
|
||||||
|
Git diffs mostly need strip 1 to cut off the a/ b/ in front of the file path, so
|
||||||
|
the script is asking for that too. For most patches on ports@, the defaults are
|
||||||
|
fine and hitting enter 2 times works as intended.
|
||||||
|
|
||||||
|
*...and if everyone would generate patches from the /usr/ports root, it wouldn't
|
||||||
|
even be necessary to enter the path.*
|
||||||
|
|
||||||
|
This is quite friggin handy.
|
||||||
|
|
213
site/blog/2021-05-19-gnupg-quickstart.md
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
# GnuPG Quickstart
|
||||||
|
|
||||||
|
I love GPG and the way it works. I know there are many that complain
|
||||||
|
about it because it has flaws. My stance on this is that I prefer
|
||||||
|
battle-tested software with known flaws to something with unknown flaws.
|
||||||
|
|
||||||
|
Anyway, this should get you started with GnuPG
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Install gpg and pinentry.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# pkg_add gnupg pinentry
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## You need a Key
|
||||||
|
|
||||||
|
If you want to lock and unlock stuff, you need a key. This is how you
|
||||||
|
get to one:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --generate-key
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Hop through the wizard until you see these lines:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
pub rsa3072 2021-05-19 [SC] [expires: 2023-05-19]
|
||||||
|
BA696588D9A04AD9F70DA33EC54733F6DBECC2C1
|
||||||
|
uid John Doe <j.doe@example.com>
|
||||||
|
sub rsa3072 2021-05-19 [E] [expires: 2023-05-19]
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
If you see an error like:
|
||||||
|
gpg: agent_genkey failed: Permission denied
|
||||||
|
|
||||||
|
Add the following entry and try again.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Congratulations, you got yourself a GPG Key. This long gibberish is your
|
||||||
|
full GPG Key ID. Most of the time, you can simply use the last 8
|
||||||
|
characters. So the short version of this GPG Key is DBECC2C1.
|
||||||
|
|
||||||
|
You can set it as default key, so it's used to encrypt stuff when no
|
||||||
|
explicit key is given.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ echo "default-key DBECC2C1" >> ~/.gnupg/gpg.conf
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## Share the key with your people
|
||||||
|
|
||||||
|
If you want someone to be able to encrypt something for you, send him or
|
||||||
|
her the output of:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --export -a DBECC2C1
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
You can also use your email address instead of the Key ID, if you have
|
||||||
|
only one key with it. This key is public. So put it on some webspace and
|
||||||
|
add a link to your email header or signature.
|
||||||
|
|
||||||
|
## Upload the key so people can find it (optional)
|
||||||
|
|
||||||
|
You can also upload your key to a key server. For this, configure a
|
||||||
|
keyserver:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ echo "keyserver hkps://keys.openpgp.org" >> ~/.gnupg/gpg.conf
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Then send your key to it:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --send-keys DBECC2C1
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## You got a key from someone
|
||||||
|
|
||||||
|
Add a key from someone else to gnupg, so you can use it to encrypt data
|
||||||
|
for this person. If the key is on your harddrive, use:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --import <pubkeyfile.asc>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The file ending here is kind of undefined. Some call it .asc, .gpg, .pub
|
||||||
|
or .key. If the key is on a key server, you can import it like so:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --recv-key 52BE43BA
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
This would import my key. You can look at it now with:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --list-keys 52BE43BA
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## Encrypt a file
|
||||||
|
|
||||||
|
This encrypts the file plain.txt with the public key DBECC2C1.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --encrypt -r DBECC2C1 file.txt
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Now you have file.txt.gpg, which is the encrypted version
|
||||||
|
|
||||||
|
## Decrypt a file
|
||||||
|
|
||||||
|
GnuPG automaticall figures out what key it can use to decrypt a file. So
|
||||||
|
this will output the content of file.txt on the terminal. If you want
|
||||||
|
to save the output in a file, add -o file.txt.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg -d file.txt.gpg
|
||||||
|
$ gpg -d file.txt.gpg -o file.txt
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## Choose a better password prompt (optional)
|
||||||
|
|
||||||
|
You can change the way gpg asks for the password:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ cat ~/.gnupg/gpg-agent.conf
|
||||||
|
[...]
|
||||||
|
pinentry-program /usr/local/bin/pinentry-curses
|
||||||
|
[...]
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Options are:
|
||||||
|
|
||||||
|
- pinentry (sometimes also called pinentry-tty)
|
||||||
|
- pinentry-curses
|
||||||
|
- pinentry-gtk2: pkg_add pinentry-gtk2
|
||||||
|
- pinentry-gnome3: pkg_add pinentry-gnome3
|
||||||
|
- pinentry-dmenu: https://github.com/ritze/pinentry-dmenu
|
||||||
|
|
||||||
|
*Note: If you use a console pinentry program and want to use gpg with a
|
||||||
|
GUI tool (like thunderbird), the password prompt will be invisible and
|
||||||
|
gpg/thunderbird will freeze.*
|
||||||
|
|
||||||
|
Makes sense, doesn't it?
|
||||||
|
|
||||||
|
## Start GPG Agent for password caching (optional)
|
||||||
|
|
||||||
|
Put this in your .kshrc or .bashrc:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
export GPG_TTY=$(tty)
|
||||||
|
gpg-connect-agent /bye
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## Make a Backup (not so optional)
|
||||||
|
|
||||||
|
There is no handholding cloud or support team you can call when you
|
||||||
|
messed up or deleted your key. So back it up safely.
|
||||||
|
|
||||||
|
Either you backup your ~/.gnugp directory, or you export the secret
|
||||||
|
keys and backup them safely.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ gpg --export-secret-keys -a DBECC2C1 > gpg_key_backup.sec
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Seriously, don't skip this step.
|
||||||
|
|
||||||
|
## Configure Mutt (optional)
|
||||||
|
|
||||||
|
Install mutt with the gpgme flavor. Gpgme is the "new way" of handling
|
||||||
|
gpg in mutt.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
# pkg_add mutt--gpgme
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
If you're not on OpenBSD, check with `mutt -v` if it was compiled with
|
||||||
|
the `--enable-gpgme` option. Then enable it in mutt.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ cat ~/.muttrc
|
||||||
|
[...]
|
||||||
|
crypt_use_gpgme = yes
|
||||||
|
[...]
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
In the mutt compose view, you can now select Security Options.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
From: c0dev0id <c0@example.com>
|
||||||
|
To: j.doe@example.com
|
||||||
|
Cc:
|
||||||
|
Bcc:
|
||||||
|
Subject: Hello my friend
|
||||||
|
Reply-To:
|
||||||
|
Fcc: =Sent
|
||||||
|
Security: Sign, Encrypt (PGP/MIME)
|
||||||
|
Sign as: <default>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
You can change the setting with the key "p", which should bring up a
|
||||||
|
selection menu.
|
||||||
|
|
||||||
|
PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, s/(m)ime or (c)lear?
|
||||||
|
|
||||||
|
*That's it! GPG is not difficult. You need to know a few bits, but these are not
|
||||||
|
more difficult than many other things we do on a daily basis.*
|
69
site/blog/2021-09-26-memory-management.md
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<i>Disclaimer: I'm trying to learn this stuff. Now a year later, I think
|
||||||
|
I got some terminology wrong. The process address space is not one, but
|
||||||
|
many pages. How many depends on the page size.</i>
|
||||||
|
|
||||||
|
# Memory management, virtual and residential memory
|
||||||
|
|
||||||
|
Memory management is a complex topic and most can be left for the kernel
|
||||||
|
to handle. But having a fundamental idea about where memory is
|
||||||
|
allocated greatly helps in understanding top(1) and the memory footprint
|
||||||
|
of applications.
|
||||||
|
|
||||||
|
## Process memory address space (page)
|
||||||
|
|
||||||
|
When a process starts up, the kernel assigns it a so called memory page.
|
||||||
|
The page size depends on the architecture. On amd64 it's 2^64 - 1 bytes.
|
||||||
|
|
||||||
|
Every memory allocation this process performs, returns a pointer to some
|
||||||
|
place within this page. Forcing a pointer outside this page, will cause
|
||||||
|
a SEGFAULT.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
char *w = 1; // segfault
|
||||||
|
char *w = malloc(12); // returns pointer within page
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
# Memory allocation (virtual memory)
|
||||||
|
|
||||||
|
Let's say we allocatate 2G of memory:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
char *m = malloc(2*1073741824); // 2*1G in bytes
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
This will grab 2G of consecutive address space within the process memory.
|
||||||
|
At this point, the memory is likely available but not guaranteed. The
|
||||||
|
allocation shows up in top(1) as "SIZE" or on linux as "VIRT"ual memory.
|
||||||
|
This memory is not actually used. So nothing has been written to the
|
||||||
|
physical RAM chip in your computer.
|
||||||
|
|
||||||
|
# Using memory (residential memory)
|
||||||
|
|
||||||
|
Once memory gets used, it will actually use up space on your RAM chip.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
memset(m, 'u', 1073741824);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Now we've written the character "u" to the first 1G of our allocated
|
||||||
|
memory. If we look at top(), we'll see something like this:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
PID TID PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND
|
||||||
|
96621 569318 3 0 2048M 1027M sleep/12 ttyin 0:01 1.66% ./a.out
|
||||||
|
^ ^
|
||||||
|
allocated memory -' `- used (written) memory
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Note 1: When memory is swapped to disk, it leaves the residential bucket and
|
||||||
|
can be seen as swap->used.
|
||||||
|
|
||||||
|
Note 2: Stack memory will also show up as residential when used. Unused stack
|
||||||
|
memory will *not* show up as virtual memory.
|
||||||
|
|
||||||
|
Note 3: Residential memory includes shared memory as well. If you see 10
|
||||||
|
chrome processes which are consuming 300MB of residential memory each, this
|
||||||
|
does *not* mean that chrome as a whole is using 3000MB.
|
||||||
|
|
||||||
|
TODO: Find out how the shared memory part of RES can be seen on OpenBSD.
|
||||||
|
(Linux has SHR in top)
|
2
site/code.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
title: Code
|
||||||
|
section: code
|
37
site/code.sh
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
_distpath="$PWD/www/distfiles"
|
||||||
|
mkdir -p "$_distpath"
|
||||||
|
|
||||||
|
_repopath="/home/sdk/www/repo"
|
||||||
|
|
||||||
|
out() { printf ' %s%s\n' "$1"; }
|
||||||
|
|
||||||
|
out "<h1>Source Code Repositories</h1>"
|
||||||
|
out " <p>Stuff I wrote or regularly contribute to</p>"
|
||||||
|
|
||||||
|
repo() {
|
||||||
|
NAME="$1"
|
||||||
|
LINK="$2"
|
||||||
|
DESC="$3"
|
||||||
|
out " <tr>"
|
||||||
|
out " <td><a href=\"$LINK\">$NAME</a></td>"
|
||||||
|
out " <td>$DESC</td>"
|
||||||
|
out " </tr>"
|
||||||
|
}
|
||||||
|
|
||||||
|
out "<table class=\"repotable\">"
|
||||||
|
out " <tr>"
|
||||||
|
out " <th>Repository</th>"
|
||||||
|
out " <th>Description</th>"
|
||||||
|
out " </tr>"
|
||||||
|
|
||||||
|
|
||||||
|
repo "xpick" "https://github.com/c0dev0id/xpick" "Command line color picker with hex, xterm and rgb support"
|
||||||
|
repo "mkpicindex" "https://github.com/c0dev0id/mkpicindex" "Image gallery generator with shell tools (static + js version)"
|
||||||
|
repo "luakit" "https://github.com/luakit/luakit" "Fast, small, webkit based browser framework extensible by Lua"
|
||||||
|
repo "mystuff" "https://github.com/c0dev0id/mystuff" "My OpenBSD ports"
|
||||||
|
repo "dotfiles" "https://github.com/c0dev0id/dotfiles" "My Dotfiles"
|
||||||
|
|
||||||
|
|
||||||
|
out "</table>"
|
BIN
site/code/favicon.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
site/code/logo.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
153
site/code/style.css
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
:root {
|
||||||
|
--width : 36;
|
||||||
|
--rounding : 8px;
|
||||||
|
--accent : #1d3456;
|
||||||
|
--dark-grey : #ddd;
|
||||||
|
--grey : #eee;
|
||||||
|
--light-grey : #f8f8f8;
|
||||||
|
--code : #bdd5f6;
|
||||||
|
--content : min(calc(1rem * var(--width) - 2rem),calc(100vw - 2rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 400;
|
||||||
|
src : url('/proza-r.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 300;
|
||||||
|
src : url('/proza-l.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 300;
|
||||||
|
font-style : italic;
|
||||||
|
src : url('/proza-li.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
height : 100%;
|
||||||
|
font-family : Proza,sans-serif;
|
||||||
|
font-weight : 300;
|
||||||
|
font-size : clamp(16px, 100vw / var(--width), 20px);
|
||||||
|
font-feature-settings : 'onum','pnum';
|
||||||
|
line-height : 1.5;
|
||||||
|
-webkit-text-size-adjust : none;
|
||||||
|
text-size-adjust : none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
height : 100%;
|
||||||
|
background : var(--accent);
|
||||||
|
color : #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
header,
|
||||||
|
footer {
|
||||||
|
font-weight : 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-size: 1em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
img, h1, h2 {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:target {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.d,
|
||||||
|
a.h,
|
||||||
|
a.i,
|
||||||
|
a.line {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#blob a {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
#blob a:hover {
|
||||||
|
color: blue;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table thead td {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td {
|
||||||
|
padding: 0 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content table td {
|
||||||
|
vertical-align: top;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#branches tr:hover td,
|
||||||
|
#tags tr:hover td,
|
||||||
|
#index tr:hover td,
|
||||||
|
#log tr:hover td,
|
||||||
|
#files tr:hover td {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
#index tr td:nth-child(2),
|
||||||
|
#tags tr td:nth-child(3),
|
||||||
|
#branches tr td:nth-child(3),
|
||||||
|
#log tr td:nth-child(2) {
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.desc {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: 0;
|
||||||
|
border-top: 1px solid #555;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
font: 0.8rem 'Consolas',Menlo,monospace
|
||||||
|
}
|
||||||
|
|
||||||
|
pre a.h {
|
||||||
|
color: #00a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.A,
|
||||||
|
span.i,
|
||||||
|
pre a.i {
|
||||||
|
color: #070;
|
||||||
|
}
|
||||||
|
|
||||||
|
.D,
|
||||||
|
span.d,
|
||||||
|
pre a.d {
|
||||||
|
color: #e00;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre a.h:hover,
|
||||||
|
pre a.i:hover,
|
||||||
|
pre a.d:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
BIN
site/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
site/favicon.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
1
site/global.meta
Normal file
@ -0,0 +1 @@
|
|||||||
|
site_title: Stefan Hagen
|
122
site/gpg.txt
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
=ZR0P
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
38
site/helpers.awk
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{ helpers = "yes" }
|
||||||
|
|
||||||
|
function load_helpers() {
|
||||||
|
data["page_title"] = page_title()
|
||||||
|
data["section_blog"] = section_blog()
|
||||||
|
data["section_code"] = section_code()
|
||||||
|
data["section_photos"] = section_photos()
|
||||||
|
data["page_css"] = page_css()
|
||||||
|
}
|
||||||
|
|
||||||
|
function page_title( title) {
|
||||||
|
if (data["title"]) {
|
||||||
|
title = data["title"] " - " data["site_title"]
|
||||||
|
} else {
|
||||||
|
title = data["site_title"]
|
||||||
|
}
|
||||||
|
return title
|
||||||
|
}
|
||||||
|
function section_blog(section) {
|
||||||
|
if (data["section"] == "blog") {
|
||||||
|
return " class=\"section\""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function section_code(section) {
|
||||||
|
if (data["section"] == "code") {
|
||||||
|
return " class=\"section\""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function section_photos(section) {
|
||||||
|
if (data["section"] == "photos") {
|
||||||
|
return " class=\"section\""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function page_css(css) {
|
||||||
|
if (data["page_css"]) {
|
||||||
|
return "<link rel=\"stylesheet\" href=\"" data["page_css"] "\" type=\"text/css\">\n "
|
||||||
|
}
|
||||||
|
}
|
BIN
site/images/404.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
site/images/bun.jpg
Normal file
After Width: | Height: | Size: 23 KiB |
3
site/images/icons/arrow-right.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 14.7929C12 15.4596 12.5404 16 13.2071 16C13.5273 16 13.8343 15.8728 14.0607 15.6464L19.48 10.2271C19.813 9.89415 20 9.44259 20 8.97176C20 8.54798 19.8484 8.13818 19.5726 7.81642L14.0847 1.4138C13.8595 1.15116 13.5309 1 13.185 1C12.5305 1 12 1.53053 12 2.18496V5.01434C9.66201 5.06374 7.90557 4.8176 6.28027 4.13698C4.53922 3.40788 2.90304 2.16138 0.850537 0.143456C0.70688 0.0022192 0.492492 -0.0390072 0.306698 0.0388775C0.120904 0.116762 0 0.298542 0 0.5C0 7.15985 5.96289 11.7483 12 11.99V14.7929ZM13.2071 15C13.0927 15 13 14.9073 13 14.7929V11.5C13 11.2239 12.7761 11 12.5 11C7.10216 11 1.7852 7.23342 1.07916 1.74406C2.77038 3.3059 4.27094 4.37968 5.894 5.05936C7.81401 5.8634 9.85983 6.09714 12.5183 5.99966C12.7872 5.98981 13 5.76901 13 5.5V2.18496C13 2.08281 13.0828 2 13.185 2C13.239 2 13.2903 2.02359 13.3254 2.06459L18.8134 8.46721C18.9338 8.60772 19 8.78669 19 8.97176C19 9.17738 18.9183 9.37458 18.7729 9.51997L13.3536 14.9393C13.3147 14.9782 13.262 15 13.2071 15Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
3
site/images/icons/attachment.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="19" height="20" viewBox="0 0 19 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.7581 1.62676C15.513 0.693165 13.7528 0.806267 12.6435 1.89114L2.44525 10.8715C0.546832 12.7282 0.542258 15.7358 2.43502 17.5979C4.33701 19.4691 7.43251 19.4741 9.34079 17.609L17.7422 10.393C17.9411 10.1986 18.2635 10.1986 18.4623 10.393C18.6612 10.5874 18.6612 10.9025 18.4623 11.0968L10.0609 18.3129C7.75401 20.5676 4.01184 20.5616 1.71251 18.2994C-0.575654 16.0483 -0.570125 12.4124 1.72488 10.1679L11.9232 1.1875C13.3938 -0.250761 15.7274 -0.400704 17.378 0.837005C19.3649 2.32684 19.5566 5.18521 17.7859 6.91589L7.92572 15.5573C7.02391 16.4387 5.56126 16.4369 4.66167 15.5534C3.7652 14.6729 3.76699 13.2493 4.66567 12.3709L12.65 5.56256C12.8489 5.36819 13.1713 5.36819 13.3702 5.56256C13.569 5.75692 13.569 6.07205 13.3702 6.26641L5.38581 13.0748C4.88416 13.5651 4.88317 14.3597 5.38358 14.8512C5.88573 15.3444 6.70219 15.3454 7.20559 14.8534L17.0657 6.21202C18.4014 4.90658 18.2567 2.75053 16.7581 1.62676Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
98
site/images/icons/cc0.svg
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="88px" height="31px" viewBox="-0.5 -0.101 88 31" enable-background="new -0.5 -0.101 88 31" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M1.803,0.482L84.93,0.631c1.161,0,2.198-0.173,2.198,2.333L87.025,30.52h-87.32V2.862
|
||||||
|
C-0.295,1.626-0.177,0.482,1.803,0.482z"/>
|
||||||
|
<g>
|
||||||
|
<ellipse fill="#FFFFFF" cx="13.887" cy="15.502" rx="11.101" ry="11.174"/>
|
||||||
|
</g>
|
||||||
|
<path d="M23.271,4.061c3.484,2.592,5.754,6.744,5.755,11.44c-0.001,4.272-1.88,8.095-4.842,10.705h62.853V4.061H23.271z"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M35.739,7.559c0.392,0,0.728,0.059,1.002,0.173c0.276,0.116,0.5,0.268,0.674,0.456
|
||||||
|
c0.173,0.189,0.299,0.405,0.379,0.647c0.079,0.242,0.118,0.494,0.118,0.753c0,0.253-0.039,0.503-0.118,0.749
|
||||||
|
c-0.08,0.244-0.206,0.462-0.379,0.65c-0.174,0.189-0.397,0.341-0.674,0.456c-0.274,0.114-0.61,0.173-1.002,0.173h-1.452v2.267
|
||||||
|
h-1.382V7.559H35.739z M35.36,10.535c0.158,0,0.312-0.012,0.457-0.035c0.147-0.023,0.276-0.069,0.388-0.137
|
||||||
|
c0.112-0.068,0.201-0.164,0.269-0.288s0.101-0.287,0.101-0.487c0-0.2-0.033-0.362-0.101-0.487
|
||||||
|
c-0.067-0.124-0.157-0.221-0.269-0.287c-0.111-0.068-0.24-0.114-0.388-0.138C35.671,8.652,35.518,8.64,35.36,8.64h-1.073v1.896
|
||||||
|
L35.36,10.535L35.36,10.535z"/>
|
||||||
|
<path fill="#FFFFFF" d="M43.751,13.4c-0.476,0.417-1.133,0.625-1.972,0.625c-0.851,0-1.509-0.207-1.976-0.62
|
||||||
|
c-0.466-0.412-0.699-1.052-0.699-1.913V7.559h1.381v3.934c0,0.171,0.016,0.338,0.045,0.505c0.029,0.165,0.091,0.311,0.185,0.439
|
||||||
|
c0.094,0.126,0.225,0.229,0.392,0.309c0.167,0.081,0.392,0.12,0.673,0.12c0.493,0,0.833-0.11,1.021-0.332
|
||||||
|
c0.188-0.222,0.282-0.568,0.282-1.04V7.559h1.382v3.934C44.464,12.348,44.227,12.983,43.751,13.4z"/>
|
||||||
|
<path fill="#FFFFFF" d="M49.07,7.559c0.3,0,0.572,0.027,0.818,0.081c0.244,0.054,0.457,0.14,0.633,0.261
|
||||||
|
c0.177,0.121,0.312,0.282,0.41,0.482c0.096,0.201,0.146,0.45,0.146,0.745c0,0.318-0.072,0.584-0.216,0.796
|
||||||
|
c-0.146,0.212-0.357,0.388-0.639,0.523c0.387,0.112,0.676,0.31,0.865,0.589c0.189,0.281,0.286,0.62,0.286,1.015
|
||||||
|
c0,0.319-0.062,0.595-0.187,0.828c-0.123,0.232-0.289,0.423-0.496,0.571c-0.209,0.148-0.445,0.257-0.713,0.327
|
||||||
|
c-0.269,0.07-0.541,0.105-0.822,0.105h-3.047V7.559H49.07z M48.895,10.119c0.246,0,0.448-0.059,0.607-0.178
|
||||||
|
c0.158-0.118,0.236-0.309,0.236-0.576c0-0.147-0.025-0.269-0.078-0.363c-0.053-0.093-0.123-0.168-0.211-0.221
|
||||||
|
c-0.09-0.053-0.189-0.091-0.305-0.109C49.029,8.65,48.912,8.64,48.789,8.64h-1.294v1.48L48.895,10.119L48.895,10.119
|
||||||
|
L48.895,10.119z M48.975,12.804c0.135,0,0.264-0.014,0.387-0.04c0.123-0.026,0.23-0.072,0.326-0.133
|
||||||
|
c0.092-0.062,0.168-0.147,0.226-0.254c0.056-0.104,0.083-0.241,0.083-0.406c0-0.324-0.092-0.557-0.271-0.695
|
||||||
|
c-0.182-0.138-0.424-0.208-0.723-0.208h-1.505v1.738h1.479v-0.002H48.975z"/>
|
||||||
|
<path fill="#FFFFFF" d="M54.143,7.559v5.156h3.062v1.168H52.76V7.559H54.143z"/>
|
||||||
|
<path fill="#FFFFFF" d="M59.748,7.559v6.324h-1.382V7.559H59.748z"/>
|
||||||
|
<path fill="#FFFFFF" d="M65.451,9.247c-0.082-0.132-0.186-0.249-0.309-0.349c-0.123-0.102-0.263-0.18-0.418-0.236
|
||||||
|
c-0.156-0.057-0.316-0.084-0.488-0.084c-0.312,0-0.574,0.062-0.793,0.183c-0.217,0.12-0.394,0.283-0.525,0.486
|
||||||
|
c-0.136,0.204-0.232,0.436-0.296,0.695c-0.062,0.259-0.093,0.528-0.093,0.806c0,0.267,0.031,0.524,0.093,0.776
|
||||||
|
c0.062,0.251,0.16,0.477,0.296,0.678c0.134,0.201,0.312,0.361,0.525,0.483c0.219,0.12,0.481,0.181,0.793,0.181
|
||||||
|
c0.424,0,0.752-0.13,0.99-0.389c0.236-0.26,0.383-0.602,0.437-1.028H67c-0.034,0.396-0.126,0.753-0.271,1.072
|
||||||
|
c-0.146,0.318-0.342,0.591-0.582,0.815c-0.238,0.225-0.521,0.396-0.845,0.513c-0.323,0.119-0.678,0.178-1.065,0.178
|
||||||
|
c-0.479,0-0.914-0.084-1.297-0.252c-0.385-0.169-0.709-0.398-0.973-0.695c-0.265-0.295-0.468-0.642-0.607-1.04
|
||||||
|
c-0.142-0.399-0.211-0.829-0.211-1.289c0-0.473,0.069-0.911,0.211-1.316c0.141-0.404,0.344-0.758,0.607-1.059
|
||||||
|
c0.264-0.302,0.588-0.536,0.973-0.708c0.384-0.172,0.815-0.258,1.297-0.258c0.348,0,0.676,0.051,0.981,0.15
|
||||||
|
c0.308,0.102,0.583,0.248,0.827,0.44c0.243,0.191,0.443,0.43,0.604,0.712c0.158,0.283,0.259,0.608,0.301,0.975h-1.34
|
||||||
|
C65.586,9.524,65.533,9.377,65.451,9.247z"/>
|
||||||
|
<path fill="#FFFFFF" d="M35.615,16.418c0.405,0,0.782,0.062,1.131,0.192c0.35,0.13,0.651,0.324,0.906,0.585
|
||||||
|
c0.255,0.26,0.455,0.586,0.599,0.975c0.144,0.391,0.216,0.849,0.216,1.371c0,0.463-0.059,0.888-0.176,1.277
|
||||||
|
c-0.118,0.391-0.295,0.727-0.532,1.012c-0.238,0.281-0.534,0.504-0.89,0.668c-0.354,0.16-0.772,0.242-1.254,0.242h-2.71v-6.322
|
||||||
|
H35.615z M35.519,21.572c0.199,0,0.393-0.031,0.581-0.098c0.188-0.062,0.354-0.173,0.502-0.323
|
||||||
|
c0.146-0.151,0.264-0.347,0.352-0.59c0.088-0.241,0.132-0.536,0.132-0.886c0-0.317-0.031-0.606-0.093-0.863
|
||||||
|
c-0.062-0.256-0.162-0.479-0.304-0.659c-0.141-0.183-0.326-0.323-0.559-0.421c-0.231-0.098-0.517-0.146-0.858-0.146h-0.984v3.986
|
||||||
|
H35.519z"/>
|
||||||
|
<path fill="#FFFFFF" d="M39.8,18.289c0.141-0.403,0.344-0.756,0.606-1.059c0.265-0.303,0.589-0.538,0.973-0.709
|
||||||
|
c0.385-0.171,0.816-0.257,1.298-0.257c0.487,0,0.921,0.086,1.303,0.257c0.381,0.171,0.704,0.406,0.969,0.709
|
||||||
|
c0.264,0.303,0.466,0.652,0.605,1.059c0.143,0.404,0.213,0.845,0.213,1.316c0,0.46-0.07,0.891-0.213,1.288
|
||||||
|
c-0.142,0.397-0.344,0.744-0.605,1.04c-0.266,0.295-0.588,0.525-0.969,0.695c-0.382,0.166-0.815,0.252-1.303,0.252
|
||||||
|
c-0.481,0-0.913-0.086-1.298-0.252c-0.384-0.17-0.708-0.4-0.973-0.695c-0.263-0.296-0.466-0.645-0.606-1.04
|
||||||
|
c-0.14-0.397-0.211-0.828-0.211-1.288C39.589,19.134,39.659,18.694,39.8,18.289z M41.062,20.379
|
||||||
|
c0.062,0.252,0.16,0.479,0.295,0.68c0.135,0.2,0.312,0.359,0.527,0.482c0.218,0.121,0.481,0.183,0.792,0.183
|
||||||
|
c0.312,0,0.576-0.062,0.792-0.183c0.218-0.121,0.394-0.281,0.529-0.482c0.134-0.2,0.231-0.428,0.295-0.68
|
||||||
|
c0.062-0.25,0.092-0.508,0.092-0.774c0-0.276-0.03-0.547-0.092-0.806c-0.062-0.262-0.161-0.492-0.295-0.696
|
||||||
|
c-0.136-0.201-0.312-0.365-0.529-0.485c-0.216-0.121-0.48-0.184-0.792-0.184c-0.311,0-0.574,0.062-0.792,0.184
|
||||||
|
c-0.216,0.12-0.393,0.284-0.527,0.485c-0.135,0.204-0.233,0.437-0.295,0.696c-0.062,0.259-0.093,0.527-0.093,0.806
|
||||||
|
C40.97,19.871,41.001,20.129,41.062,20.379z"/>
|
||||||
|
<path fill="#FFFFFF" d="M49.092,16.418l1.471,4.348h0.02l1.393-4.348h1.942v6.322h-1.294v-4.48h-0.02l-1.539,4.48H50l-1.54-4.437
|
||||||
|
h-0.019v4.437h-1.293v-6.322H49.092z"/>
|
||||||
|
<path fill="#FFFFFF" d="M58.764,16.418l2.35,6.322H59.68l-0.476-1.408h-2.351l-0.492,1.408h-1.391l2.377-6.322H58.764z
|
||||||
|
M58.844,20.297l-0.793-2.322h-0.018l-0.817,2.322H58.844z"/>
|
||||||
|
<path fill="#FFFFFF" d="M63.547,16.418v6.322h-1.382v-6.322H63.547z"/>
|
||||||
|
<path fill="#FFFFFF" d="M66.604,16.418l2.623,4.242h0.018v-4.242h1.294v6.322h-1.384l-2.611-4.234h-0.02v4.234H65.23v-6.322
|
||||||
|
H66.604z"/>
|
||||||
|
</g>
|
||||||
|
<path d="M85.852,0H1.147C0.239,0-0.5,0.744-0.5,1.658v28.969C-0.5,30.834-0.333,31-0.128,31h87.256
|
||||||
|
c0.205,0,0.372-0.166,0.372-0.373V1.658C87.5,0.744,86.762,0,85.852,0z M1.147,0.75h84.705c0.498,0,0.902,0.406,0.902,0.908
|
||||||
|
c0,0,0,20.121,0,28.557H0.245v-8.426c0-8.435,0-20.131,0-20.131C0.245,1.157,0.65,0.75,1.147,0.75z"/>
|
||||||
|
<g>
|
||||||
|
<ellipse fill="#FFFFFF" cx="14.156" cy="15.661" rx="11.004" ry="11.076"/>
|
||||||
|
<path id="text2809_4_" d="M14.22,8.746c-3.862,0-4.834,3.669-4.834,6.779c0,3.111,0.971,6.779,4.834,6.779
|
||||||
|
c3.863,0,4.834-3.67,4.834-6.779C19.054,12.414,18.083,8.746,14.22,8.746z M14.22,11.301c0.157,0,0.3,0.024,0.435,0.06
|
||||||
|
c0.278,0.24,0.414,0.573,0.147,1.038l-2.572,4.76c-0.079-0.603-0.091-1.195-0.091-1.634C12.139,14.155,12.233,11.301,14.22,11.301
|
||||||
|
z M16.146,13.494c0.137,0.731,0.155,1.493,0.155,2.03c0,1.37-0.094,4.223-2.08,4.223c-0.156,0-0.301-0.017-0.435-0.049
|
||||||
|
c-0.025-0.01-0.049-0.019-0.074-0.025c-0.04-0.012-0.084-0.024-0.122-0.041c-0.442-0.188-0.721-0.531-0.319-1.139L16.146,13.494z"
|
||||||
|
/>
|
||||||
|
<path id="path2815_4_" d="M14.195,3.748c-3.245,0-5.98,1.137-8.21,3.422c-1.128,1.135-1.99,2.431-2.589,3.876
|
||||||
|
c-0.585,1.43-0.876,2.921-0.876,4.478c0,1.57,0.291,3.062,0.876,4.479s1.434,2.69,2.548,3.826
|
||||||
|
c1.128,1.121,2.395,1.985,3.802,2.588c1.421,0.59,2.903,0.884,4.449,0.884c1.547,0,3.05-0.304,4.499-0.907
|
||||||
|
c1.448-0.604,2.74-1.471,3.883-2.605c1.101-1.078,1.934-2.317,2.49-3.719c0.571-1.415,0.853-2.932,0.853-4.544
|
||||||
|
c0-1.598-0.281-3.112-0.852-4.528c-0.571-1.429-1.407-2.693-2.507-3.801C20.263,4.895,17.469,3.748,14.195,3.748z M14.244,5.867
|
||||||
|
c2.646,0,4.904,0.944,6.784,2.836c0.906,0.912,1.6,1.954,2.073,3.119c0.473,1.164,0.713,2.398,0.713,3.703
|
||||||
|
c0,2.707-0.92,4.952-2.744,6.746c-0.948,0.927-2.012,1.638-3.196,2.128c-1.17,0.489-2.375,0.732-3.63,0.732
|
||||||
|
c-1.268,0-2.481-0.239-3.638-0.717c-1.156-0.489-2.193-1.191-3.113-2.104c-0.92-0.925-1.629-1.97-2.13-3.135
|
||||||
|
c-0.487-1.178-0.738-2.391-0.738-3.653c0-1.276,0.251-2.497,0.738-3.662c0.501-1.178,1.211-2.235,2.13-3.175
|
||||||
|
C9.317,6.809,11.57,5.867,14.244,5.867z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
3
site/images/icons/github-square.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20 10C20 15.5228 15.5228 20 10 20C4.47715 20 0 15.5228 0 10C0 4.47715 4.47715 0 10 0C15.5228 0 20 4.47715 20 10ZM11.4232 18.8881C10.9596 18.9618 10.4843 19 10 19C9.51576 19 9.04045 18.9618 8.57692 18.8881V14.1818C8.57692 13.8064 8.63397 13.5516 8.72183 13.3649C8.80718 13.1836 8.93666 13.0343 9.13629 12.8921C9.53269 12.6096 9.33288 11.9848 8.84615 11.9848C7.56957 11.9848 6.73952 11.6882 6.23588 11.2633C5.74434 10.8486 5.5 10.258 5.5 9.51515C5.5 8.90631 5.55001 8.45658 5.65769 8.05142C5.76523 7.6468 5.93638 7.26353 6.20399 6.7924L6.30116 6.62133L6.2557 6.42991C6.14611 5.96848 6.09434 5.63144 6.09272 5.29751C6.09176 5.1003 6.10826 4.89584 6.14593 4.65961C6.68747 4.86613 7.13188 5.11583 7.74963 5.65072L8.03006 5.89353L8.34375 5.69557C8.80856 5.40226 9.25103 5.34848 10 5.34848C10.749 5.34848 11.1915 5.40226 11.6563 5.69557L11.97 5.89353L12.2505 5.65072C12.8682 5.11583 13.3126 4.86613 13.8542 4.65961C13.8918 4.89584 13.9083 5.1003 13.9074 5.29751C13.9057 5.63144 13.854 5.96848 13.7444 6.42991L13.6989 6.62133L13.7961 6.7924C14.0637 7.26353 14.2349 7.6468 14.3424 8.05142C14.4501 8.45658 14.5001 8.90631 14.5001 9.51515C14.5001 10.258 14.2557 10.8486 13.7642 11.2633C13.2606 11.6882 12.4305 11.9848 11.1539 11.9848C10.6672 11.9848 10.4674 12.6096 10.8638 12.8921C11.0634 13.0343 11.1929 13.1836 11.2782 13.3649C11.3661 13.5516 11.4232 13.8064 11.4232 14.1818V18.8881ZM12.4232 18.67V14.1818C12.4232 13.7087 12.3517 13.2975 12.1831 12.9391L12.1745 12.9212C13.1051 12.7979 13.8532 12.4965 14.409 12.0276C15.1675 11.3877 15.5001 10.4934 15.5001 9.51515C15.5001 8.85126 15.4457 8.30943 15.3088 7.79457C15.1872 7.33692 15.0053 6.91884 14.761 6.47002C14.8526 6.05342 14.9055 5.68594 14.9074 5.30238C14.9095 4.86122 14.844 4.42268 14.7175 3.88542L14.5932 3.35712L14.0768 3.52431C13.2635 3.78768 12.6615 4.03091 11.8647 4.67028C11.2634 4.38435 10.6692 4.34848 10 4.34848C9.33076 4.34848 8.73664 4.38435 8.13538 4.67028C7.33861 4.03091 6.7366 3.78768 5.92326 3.52431L5.40691 3.35712L5.28254 3.88542C5.15605 4.42268 5.09058 4.86122 5.09273 5.30238C5.0946 5.68594 5.14753 6.05342 5.23903 6.47002C4.99481 6.91884 4.81287 7.33692 4.69124 7.79457C4.5544 8.30943 4.5 8.85126 4.5 9.51515C4.5 10.4934 4.83259 11.3877 5.59105 12.0276C6.1469 12.4965 6.89503 12.7979 7.82554 12.9212L7.81703 12.9391C7.66108 13.2705 7.58826 13.6469 7.57816 14.0757C7.56215 14.0851 7.54495 14.095 7.52663 14.1054C7.39921 14.1774 7.22298 14.2678 7.02469 14.3442C6.59417 14.5102 6.2076 14.5539 5.95585 14.4245C5.59107 14.237 5.4297 14.0102 5.21335 13.7062C5.14481 13.6099 5.07075 13.5058 4.98295 13.3928C4.80852 13.1682 4.58577 12.9317 4.25025 12.7592C4.03299 12.6475 3.78576 12.5714 3.49863 12.5319C3.22507 12.4943 3 12.7239 3 13C3 13.2761 3.22713 13.4877 3.49701 13.5462C3.62086 13.573 3.71655 13.6092 3.79309 13.6486C3.9488 13.7286 4.06555 13.8418 4.1932 14.0062C4.23707 14.0627 4.28389 14.1296 4.33565 14.2037C4.56621 14.5334 4.89493 15.0035 5.49869 15.3139C6.15603 15.6517 6.90583 15.4618 7.3844 15.2773C7.45111 15.2516 7.51546 15.2248 7.57692 15.1977V18.6701C3.78328 17.6121 1 14.1311 1 10C1 5.02944 5.02944 1 10 1C14.9706 1 19 5.02944 19 10C19 14.131 16.2168 17.612 12.4232 18.67Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
3
site/images/icons/github.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.72917 4.19154C0.579167 5.529 0 7.17895 0 8.92473C0 10.2539 0.233333 11.6747 0.841667 12.8829C1.64686 14.4667 3.16373 15.2466 4.8731 15.6302C6.22644 15.9339 7.70046 15.9892 9.0375 15.9983C9.34417 16.0004 9.64363 16.0001 9.93277 15.9998C10.0371 15.9996 10.1401 15.9995 10.2417 15.9995C10.3109 15.9995 10.3807 15.9996 10.451 15.9996C10.6453 15.9997 10.8439 15.9998 11.0458 15.9991C12.3164 15.9949 13.7213 15.9602 15.0297 15.7017C16.8226 15.3476 18.4343 14.5736 19.2708 12.8829C19.8667 11.6622 20 10.2539 20 8.92473C20 7.17895 19.5208 5.5165 18.375 4.16654C18.5875 3.52073 18.6958 2.84158 18.6958 2.15827C18.6958 1.26246 18.4958 0.812476 18.0875 0C16.2208 0 15.0125 0.354156 13.5958 1.46662C12.5042 1.20413 11.3708 1.0833 10.2458 1.0833C9 1.0833 7.75833 1.21246 6.55 1.49996C5.1125 0.374989 3.90417 0 2.01667 0C1.6125 0.812476 1.40833 1.26246 1.40833 2.15827C1.40833 2.84158 1.5125 3.53323 1.72917 4.19154ZM2.64003 1.01684C2.4679 1.41456 2.40833 1.69111 2.40833 2.15827C2.40833 2.7412 2.49735 3.32687 2.67904 3.87891L2.85559 4.41532L2.48741 4.84351C1.50081 5.99093 1 7.40657 1 8.92473C1 10.15 1.21698 11.4037 1.73397 12.4315C1.84605 12.6517 1.97696 12.8538 2.12561 13.0394C1.89106 12.4468 1.77083 11.7762 1.77083 11.0288C1.77083 9.92071 2.10693 8.82409 2.79987 7.98526C3.50873 7.12715 4.5554 6.58727 5.83333 6.58727C6.55057 6.58727 7.25942 6.69269 7.88568 6.78583C8.02993 6.80728 8.1698 6.82808 8.30438 6.84679L8.31824 6.84872C8.88325 6.93535 9.45221 6.9706 10.0458 6.9706C10.644 6.9706 11.2125 6.9354 11.7725 6.84897L11.7809 6.84766L11.7894 6.8465C11.9334 6.8268 12.0828 6.80473 12.2367 6.782C12.8593 6.69002 13.5548 6.58727 14.2583 6.58727C15.5363 6.58727 16.5829 7.12715 17.2918 7.98526C17.9847 8.82409 18.3208 9.92071 18.3208 11.0288C18.3208 11.8136 18.1887 12.5138 17.9309 13.1279C18.1005 12.9217 18.2485 12.6937 18.3734 12.4418C18.8669 11.4291 19 10.2069 19 8.92473C19 7.36361 18.5742 5.9466 17.6126 4.81366L17.2499 4.38636L17.4251 3.85399C17.6042 3.30978 17.6958 2.73619 17.6958 2.15827C17.6958 1.68972 17.6375 1.41213 17.4657 1.01622C16.8886 1.04851 16.4116 1.12996 15.9772 1.26872C15.4017 1.45254 14.8497 1.75348 14.2134 2.25311L13.8327 2.55208L13.362 2.43891C12.3546 2.19667 11.3004 2.0833 10.2458 2.0833C9.06871 2.0833 7.90547 2.20537 6.78146 2.4728L6.31296 2.58427L5.9337 2.28747C5.28281 1.77809 4.72318 1.46861 4.14166 1.27872C3.70324 1.13555 3.22243 1.05054 2.64003 1.01684ZM6.75608 12.0329C6.91621 11.7325 7 11.3243 7 11.0288C7 10.7333 6.91621 10.3252 6.75608 10.0248C6.5994 9.73086 6.49103 9.73273 6.47221 9.73306C6.47168 9.73307 6.47122 9.73307 6.47083 9.73307C6.47045 9.73307 6.46999 9.73307 6.46945 9.73306C6.45063 9.73273 6.34226 9.73086 6.18558 10.0248C6.02546 10.3252 5.94167 10.7333 5.94167 11.0288C5.94167 11.3243 6.02546 11.7325 6.18558 12.0329C6.34226 12.3268 6.45063 12.3249 6.46945 12.3246C6.46999 12.3246 6.47045 12.3246 6.47083 12.3246C6.47122 12.3246 6.47168 12.3246 6.47221 12.3246C6.49103 12.3249 6.5994 12.3268 6.75608 12.0329ZM11.925 7.83727C12.0909 7.81457 12.2551 7.79041 12.4183 7.76639C13.0342 7.67579 13.6358 7.58727 14.2583 7.58727C16.2083 7.58727 17.3208 9.19973 17.3208 11.0288C17.3208 13.113 16.2374 14.1919 14.7637 14.7348C13.6478 15.1459 12.3081 15.2495 11.0458 15.2495H9.0375C7.71915 15.2495 6.31228 15.1346 5.16625 14.6708C3.77684 14.1086 2.77083 13.0335 2.77083 11.0288C2.77083 9.19973 3.88333 7.58727 5.83333 7.58727C6.46909 7.58727 7.08604 7.67863 7.70791 7.77072C7.86042 7.7933 8.01322 7.81593 8.16667 7.83727C8.79167 7.9331 9.4125 7.9706 10.0458 7.9706C10.6833 7.9706 11.3042 7.9331 11.925 7.83727ZM13.2439 10.0248C13.0838 10.3252 13 10.7333 13 11.0288C13 11.3243 13.0838 11.7325 13.2439 12.0329C13.4006 12.3268 13.509 12.3249 13.5278 12.3246C13.5283 12.3246 13.5288 12.3246 13.5292 12.3246C13.5296 12.3246 13.53 12.3246 13.5305 12.3246C13.5494 12.3249 13.6577 12.3268 13.8144 12.0329C13.9745 11.7325 14.0583 11.3243 14.0583 11.0288C14.0583 10.7333 13.9745 10.3252 13.8144 10.0248C13.6577 9.73086 13.5494 9.73273 13.5305 9.73306C13.53 9.73307 13.5296 9.73307 13.5292 9.73307C13.5288 9.73307 13.5283 9.73307 13.5278 9.73306C13.509 9.73273 13.4006 9.73086 13.2439 10.0248ZM6.47083 13.3246C7.54583 13.3246 8 11.8996 8 11.0288C8 10.158 7.54583 8.73307 6.47083 8.73307C5.39583 8.73307 4.94167 10.158 4.94167 11.0288C4.94167 11.8996 5.39583 13.3246 6.47083 13.3246ZM12 11.0288C12 10.158 12.4542 8.73307 13.5292 8.73307C14.6042 8.73307 15.0583 10.158 15.0583 11.0288C15.0583 11.8996 14.6042 13.3246 13.5292 13.3246C12.4542 13.3246 12 11.8996 12 11.0288Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.6 KiB |
BIN
site/images/irc.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
site/images/me.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
20
site/index.adoc
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
== Welcome,
|
||||||
|
|
||||||
|
++++
|
||||||
|
<img style="margin-top: 1em; margin: 1em; border-radius: 25%; width: 140px; height: 140px; "align="right" float="left" src="images/me.jpg"/>
|
||||||
|
++++
|
||||||
|
As you may have guessed from the URL, my name is Stefan Hagen. I'm a software developer based in south-west Germany. I'm living in a small town called https://en.wikipedia.org/wiki/Hockenheim[Hockenheim,role=external,window=_blank] together with my wife Jessica and two cats named http://stefanhagen.de/photos/Chloe-%26-June/[Chloe and June].
|
||||||
|
|
||||||
|
I'm the head of the https://www.uugrn.org[Unix User Group Rhein-Neckar,role=external,window=_blank] and you can meet me at our local events https://fixme.uugrn.org[FIXME,role=external,window=_blank] and https://stammtisch.uugrn.org[Stammtisch,role=external,window=_blank] (regular table).
|
||||||
|
|
||||||
|
I'm also developing for my favorite https://www.openbsd.org[Operating System,role=external,window=_blank] by https://en.wikipedia.org/wiki/Porting[porting software,role=external,window=_blank] and occationally http://www.oxide.org/cvs/sdk.html[fixing a bug,role=external,window=_blank].
|
||||||
|
|
||||||
|
For compatibility reasons, this website is available via http://stefanhagen.de[plaintext (http)] and https://stefanhagen.de[encrypted (https)]. Set your bookmark accordingly.
|
||||||
|
|
||||||
|
=== You can find me here:
|
||||||
|
[%hardbreaks]
|
||||||
|
icon:arrow-right[fw] on https://irc.uugrn.org[irc.uugrn.org,role=external,window=_blank] ( #uugrn, sdk )
|
||||||
|
icon:arrow-right[fw] on https://github.com/c0dev0id[github.com/c0dev0id,role=external,window=_blank]
|
||||||
|
icon:arrow-right[fw] on https://bsd.network/@sh[bsd.network,role=external,window=_blank] (Mastodon)
|
||||||
|
|
||||||
|
You can optain my email addresses from link:/gpg.txt[my gpg key] or by using the https://linux.die.net/man/1/finger[finger(1)] command on `finger@codevoid.de` <- this is _not_ an email address.
|
38
site/main.layout
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>{{page_title}}</title>
|
||||||
|
<meta name="description" content="my website">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<link href="/proza-r.woff2" as="font" type="font/woff2">
|
||||||
|
<link href="/proza-i.woff2" as="font" type="font/woff2">
|
||||||
|
<link href="/proza-li.woff2" as="font" type="font/woff2">
|
||||||
|
{{page_css}}<link rel="stylesheet" href="/site.css" type="text/css">
|
||||||
|
<link rel="icon" href="/favicon.png" type="image/png">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<a href="/"><svg viewbox="0 0 30 30"><title>{{site_title}}</title><path d="m13,3 13,13h-4v11h-6v-9h-6v9h-6v-11h-4"/></svg></a>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/blog.html"{{section_blog}}>Blog</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/code.html"{{section_code}}>Code</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/photos"{{section_photos}}>Photos</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<a href="https://bsd.network/@sh" target=_blank><svg viewBox="0 0 740 790"><title>Stefan Hagen on Mastodon</title><path d="M737 174C726 91 652 24 564 12C549 10 494 2 364 2H363C233 2 205 10 191 12C106 24 28 83 9 168C0 210-1 256 1 299C3 360 4 420 9 481C13 521 20 561 29 601C47 673 120 734 191 759C267 784 349 789 427 771C436 769 444 767 453 764C472 758 494 751 511 740C511 740 511 739 511 739C511 739 511 738 511 738V679C511 679 511 679 511 679C511 678 511 678 511 678C510 678 510 678 510 678C51 678 509 678 509 678C459 690 407 696 356 695C267 695 243 654 236 636C231 621 227 606 226 590C226 589 226 589 226 589C226 589 226 589 226 588C227 588 227 588 227 588C227 588 228 588 228 588C277 600 328 606 379 606C391 606 403 606 415 605C467 604 520 601 571 592C572 591 573 591 574 591C654 576 729 529 737 409C737 404 738 359 738 355C738 338 743 237 737 174ZM615 473H532V271C532 229 513 207 477 207C437 207 417 232 417 283V394H334V283C334 232 314 207 274 207C238 207 220 229 220 271V473H136V265C136 222 147 189 169 164C192 139 221 126 258 126C301 126 333 142 355 174L376 209L396 174C418 142 450 126 493 126C520 126 559 139 582 164C604 189 615 222 615 265L615 473Z"/></svg></a>
|
||||||
|
</header>
|
||||||
|
<main>{{{yield}}}
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<a href="/netcitizen">Net Citizen</a> from Stefan Hagen
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
94
site/netcitizen/index.adoc
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
= Net Citizen
|
||||||
|
|
||||||
|
The web was still young when I first went online in 1996. It felt like a
|
||||||
|
utopian dream of free culture and free knowledge. Anyone could contribute and
|
||||||
|
communicate. I spent countless hours on IRC, learnt html, php and mysql and
|
||||||
|
created my first site on a shared shell server with some webspace.
|
||||||
|
|
||||||
|
I’ve watched as the dream has become a nightmare of
|
||||||
|
https://en.wikipedia.org/wiki/Online_advertising#Privacy_concerns[surveillance]
|
||||||
|
and monetisation
|
||||||
|
(https://en.wikipedia.org/wiki/Website_monetization[1],
|
||||||
|
https://en.wikipedia.org/wiki/Data_monetization[2],
|
||||||
|
https://en.wikipedia.org/wiki/Software_monetization[3]). Companies such as
|
||||||
|
https://en.wikipedia.org/wiki/Google#Racially-targeted_surveillance[Google]
|
||||||
|
and https://en.wikipedia.org/wiki/Privacy_concerns_with_Facebook[Facebook]
|
||||||
|
offer their
|
||||||
|
https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services[services]
|
||||||
|
for free to the public because their real products are their advertising
|
||||||
|
networks powered by the personal data of their visitors.
|
||||||
|
|
||||||
|
I've watched hundreds of carefully handcrafted, personal websites become slow
|
||||||
|
and boring wordpress, medium and bootstrap blogs that all look the same. Many
|
||||||
|
of them just disappeared and people moved to big social media plattforms.
|
||||||
|
|
||||||
|
I've watched networks becoming regulated, favoring services for money and
|
||||||
|
slowing down or blocking services that were not liked by the network provider,
|
||||||
|
endagering https://en.wikipedia.org/wiki/Net_neutrality[Net neutrality].
|
||||||
|
|
||||||
|
I watched a network that was made for everyone become a marketing instrument
|
||||||
|
to influence politics and make everyone pay with their personal data. Mostly
|
||||||
|
involuntarily and by offering a useful service people want. This service is
|
||||||
|
mostly not the business the company is in, but rather a side product needed
|
||||||
|
so people join in.
|
||||||
|
|
||||||
|
The same scheme can be seen in games, which use psychological techniques to get
|
||||||
|
people addicted, so they buy in app goods, which have absolutely zero value in
|
||||||
|
real life.
|
||||||
|
|
||||||
|
And here I am, ranting about the past like one of the old people.
|
||||||
|
|
||||||
|
I have little influence over the wider web, but I can control my small part of
|
||||||
|
it, and hold it to the ideal I learned to love. This page is simple, doesn't use
|
||||||
|
javascript, tracking or cookies. It's just there, like a good old homepage.
|
||||||
|
|
||||||
|
== Copyright
|
||||||
|
|
||||||
|
Copyright limits creativity and holds back progress by restricting our rights to
|
||||||
|
build upon the works of others. Therefore I'm releasing this website, it's code
|
||||||
|
and content under the terms of the Creative Commons CC0 1.0 Universal Legal Code.
|
||||||
|
You can use and adapt it without attribution.
|
||||||
|
|
||||||
|
Exempt from this release are all pictures that show people or are in the Photos
|
||||||
|
section of this website.
|
||||||
|
|
||||||
|
== Privacy
|
||||||
|
|
||||||
|
My site is hosted on a server provided by Hetzner Online GmbH in Germany. I'm
|
||||||
|
operating the server myself and Hetzner only provides the hardware and remote
|
||||||
|
access to it. There is no content delivery network involved when accessing this
|
||||||
|
site. This means it might be slow in far away regions, but it also means that no
|
||||||
|
data is shared with a CDN provider. The server is fully encrypted and webserver
|
||||||
|
logs are deleted after two weeks.
|
||||||
|
|
||||||
|
Almost every site today includes code that tracks visitors for statistical and
|
||||||
|
advertising purposes. Often the site owner includes code with the deliberate aim
|
||||||
|
of tracking their visitors, but sometimes they just want to include a feature
|
||||||
|
provided by a third party, and that provider includes their own tracking code.
|
||||||
|
|
||||||
|
My site doesn’t include any tracking code, and doesn’t load any code from third
|
||||||
|
parties. It doesn’t have a cookie banner because it doesn’t use cookies.
|
||||||
|
|
||||||
|
== Transparency
|
||||||
|
|
||||||
|
You probably don’t know me, and shouldn’t have to trust me. Instead, you should
|
||||||
|
be able to check security and privacy claims for yourself. Unfortunately most
|
||||||
|
sites today use a process called code minification, which makes them faster but
|
||||||
|
also makes it harder for other people to understand their code.
|
||||||
|
|
||||||
|
My site doesn’t need to use code minification in order to load quickly due to
|
||||||
|
its simple design, efficient implementation, and absence of resources loaded
|
||||||
|
from third parties. As a result, other software developers can easily understand
|
||||||
|
how the layout, styling, and interactive features are created.
|
||||||
|
|
||||||
|
== Attribution
|
||||||
|
|
||||||
|
I'm not every good with design and therefore many design related elements
|
||||||
|
of this page are taken from https://iamkate.com[Kate Rose Morley] who thankfully
|
||||||
|
released her work under a permissive license.
|
||||||
|
However, the way how the page and content is generated is different and
|
||||||
|
based on a modified version of https://github.com/nuex/zodiac[zodiac],
|
||||||
|
which is a static website generator written in the programming language
|
||||||
|
https://en.wikipedia.org/wiki/AWK[AWK]. Some content pages are generated by
|
||||||
|
https://asciidoctor.org[asciidoctor] and others by shell scripts or a
|
||||||
|
markdown parser. Here is the https://github.com/c0dev0id/website[Source Code].
|
1
site/netcitizen/index.meta
Normal file
@ -0,0 +1 @@
|
|||||||
|
title: Net Citizen
|
BIN
site/proza-l.woff2
Normal file
BIN
site/proza-li.woff2
Normal file
BIN
site/proza-r.woff2
Normal file
481
site/site.css
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
:root {
|
||||||
|
--width : 36;
|
||||||
|
--rounding : 8px;
|
||||||
|
--accent : #1d3456;
|
||||||
|
--dark-grey : #ddd;
|
||||||
|
--grey : #eee;
|
||||||
|
--light-grey : #f8f8f8;
|
||||||
|
--code : #bdd5f6;
|
||||||
|
--content : min(calc(1rem * var(--width) - 2rem),calc(100vw - 2rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 400;
|
||||||
|
src : url('/proza-r.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 300;
|
||||||
|
src : url('/proza-l.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family : 'Proza';
|
||||||
|
font-weight : 300;
|
||||||
|
font-style : italic;
|
||||||
|
src : url('/proza-li.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
::before,
|
||||||
|
::after {
|
||||||
|
box-sizing : border-box;
|
||||||
|
margin : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
height : 100%;
|
||||||
|
font-family : Proza,sans-serif;
|
||||||
|
font-weight : 300;
|
||||||
|
font-size : clamp(16px, 100vw / var(--width), 20px);
|
||||||
|
font-feature-settings : 'onum','pnum';
|
||||||
|
line-height : 1.5;
|
||||||
|
-webkit-text-size-adjust : none;
|
||||||
|
text-size-adjust : none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
display : grid;
|
||||||
|
grid-template-rows : max-content 1fr max-content;
|
||||||
|
height : 100%;
|
||||||
|
background : var(--accent);
|
||||||
|
color : #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
header,
|
||||||
|
footer {
|
||||||
|
font-weight : 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display : grid;
|
||||||
|
grid-template-columns : 30px calc(min(100vw, 1rem * var(--width)) - 60px - 2rem) 30px;
|
||||||
|
justify-content : center;
|
||||||
|
align-items : center;
|
||||||
|
padding : 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header svg {
|
||||||
|
fill : #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav ul {
|
||||||
|
display : grid;
|
||||||
|
grid-auto-flow : column;
|
||||||
|
grid-auto-columns : min-content;
|
||||||
|
justify-content : center;
|
||||||
|
padding : 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav li {
|
||||||
|
display : block;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a {
|
||||||
|
display : block;
|
||||||
|
padding : 0 0.5rem;
|
||||||
|
border-radius : 0.75rem;
|
||||||
|
color : inherit;
|
||||||
|
text-decoration : none;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a.section {
|
||||||
|
background : #fff;
|
||||||
|
color : var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
padding-bottom : 1rem;
|
||||||
|
background : #fff;
|
||||||
|
color : #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding : 1rem;
|
||||||
|
text-align : center;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer > a{
|
||||||
|
color : #fff;
|
||||||
|
text-decoration-color : #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
p,
|
||||||
|
dl,
|
||||||
|
ol,
|
||||||
|
ul,
|
||||||
|
pre,
|
||||||
|
code,
|
||||||
|
table,
|
||||||
|
figure,
|
||||||
|
form,
|
||||||
|
main > div {
|
||||||
|
max-width : calc(1rem * var(--width));
|
||||||
|
margin : 0 auto;
|
||||||
|
padding : 1rem 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3 {
|
||||||
|
font-weight : 400;
|
||||||
|
line-height : 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size : 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding-top : 2rem;
|
||||||
|
font-size : 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
padding-top : 2rem;
|
||||||
|
font-size : 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl {
|
||||||
|
padding : 0 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
padding-top : 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
padding-left : 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol,
|
||||||
|
ul {
|
||||||
|
padding : 1rem 2rem 0 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul ul {
|
||||||
|
padding : 0 0 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
margin-top : 1rem;
|
||||||
|
border-collapse : collapse;
|
||||||
|
font-feature-settings : 'lnum','tnum';
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
position : sticky;
|
||||||
|
top : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
padding : 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background : var(--accent);
|
||||||
|
color : #fff;
|
||||||
|
font-weight : 400;
|
||||||
|
text-align : left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repotable tr:nth-child(even) td {
|
||||||
|
background : var(--grey);
|
||||||
|
}
|
||||||
|
|
||||||
|
.numeric {
|
||||||
|
text-align : right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.negative {
|
||||||
|
color : #f00;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure,
|
||||||
|
form {
|
||||||
|
width : max-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure > img,
|
||||||
|
figure > svg {
|
||||||
|
max-width : calc(100vw - 2rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
form > div {
|
||||||
|
padding : 1rem;
|
||||||
|
border-radius : var(--rounding);
|
||||||
|
background : var(--grey);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre,
|
||||||
|
code {
|
||||||
|
font : 0.7rem/1.1rem 'Consolas',Menlo,monospace;
|
||||||
|
font-feature-settings : 'lnum','tnum';
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin-top : 1em;
|
||||||
|
border-left : 4px solid var(--accent);
|
||||||
|
border-radius : var(--rounding);
|
||||||
|
padding : 4px 4px 4px 8px;
|
||||||
|
background : var(--code);
|
||||||
|
overflow-x : auto;
|
||||||
|
width : min(calc(1rem * var(--width) - 2rem),calc(100vw - 2rem))
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
padding : 2px 6px 2px;
|
||||||
|
border-radius : var(--rounding);
|
||||||
|
background : var(--code);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color : var(--accent);
|
||||||
|
text-decoration-color : var(--accent);
|
||||||
|
text-decoration-thickness : 1px;
|
||||||
|
text-underline-offset : 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited {
|
||||||
|
color : inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr {
|
||||||
|
font-variant : small-caps;
|
||||||
|
text-transform : lowercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
img,
|
||||||
|
svg {
|
||||||
|
vertical-align : bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
border : 2px solid var(--dark-grey);
|
||||||
|
border-radius : var(--rounding);
|
||||||
|
background : #fff no-repeat center center;
|
||||||
|
color : #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
:is(input, textarea, select):where(:active:not(:disabled), :focus) {
|
||||||
|
border-color : var(--accent);
|
||||||
|
outline : none;
|
||||||
|
}
|
||||||
|
|
||||||
|
:is(input, textarea, select):disabled {
|
||||||
|
background : var(--grey);
|
||||||
|
color : #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:where([type="password"], [type="text"]),
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
padding : calc(0.25rem - 2px) calc(0.5rem - 2px);
|
||||||
|
font-family : Proza,sans-serif;
|
||||||
|
font-weight : 300;
|
||||||
|
font-size : 1rem;
|
||||||
|
font-feature-settings : 'lnum','tnum';
|
||||||
|
line-height : 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:where([inputmode="numeric"], [inputmode="decimal"]) {
|
||||||
|
text-align : right;
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
-webkit-appearance : none;
|
||||||
|
appearance : none;
|
||||||
|
height : 2rem;
|
||||||
|
padding-right : 30px;
|
||||||
|
background-image : url('/select.svg');
|
||||||
|
background-position : right;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:where([type="checkbox"], [type="radio"]) {
|
||||||
|
-webkit-appearance : none;
|
||||||
|
appearance : none;
|
||||||
|
width : 22px;
|
||||||
|
height : 22px;
|
||||||
|
margin : calc(0.75rem - 11px) 0.25rem 0 0;
|
||||||
|
vertical-align : top;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"]:checked {
|
||||||
|
background-image : url('/checkbox.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"] {
|
||||||
|
border-radius : 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"]:checked {
|
||||||
|
background-image : url('/radio.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="file"] {
|
||||||
|
position : absolute;
|
||||||
|
left : -100vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
button{
|
||||||
|
margin : 0;
|
||||||
|
padding : 0;
|
||||||
|
border : 0;
|
||||||
|
background : transparent;
|
||||||
|
font-family : inherit;
|
||||||
|
font-size : inherit;
|
||||||
|
line-height : inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:-moz-focus-inner {
|
||||||
|
padding : 0;
|
||||||
|
border : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:where(:active, :focus) {
|
||||||
|
outline : none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button > span,
|
||||||
|
.button {
|
||||||
|
display : inline-block;
|
||||||
|
padding : 0 0.5rem;
|
||||||
|
border : 2px solid var(--accent);
|
||||||
|
border-radius : calc(0.75rem + 2px);
|
||||||
|
background : var(--accent);
|
||||||
|
color : #fff;
|
||||||
|
font-weight : 400;
|
||||||
|
-webkit-user-select : none;
|
||||||
|
user-select : none;
|
||||||
|
cursor : pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:where(:active, :focus) > span,
|
||||||
|
.button:where(:active, :focus),
|
||||||
|
input[type="file"]:where(:active, :focus) + .button {
|
||||||
|
background : #fff;
|
||||||
|
color : var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.repotable {
|
||||||
|
width : 100%;
|
||||||
|
border-radius: calc(0.75rem + 2px);
|
||||||
|
overflow : hidden;
|
||||||
|
text-align : left;
|
||||||
|
vertical-align: top;
|
||||||
|
width : min(calc(1rem * var(--width) - 2rem),calc(100vw - 2rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight > div {
|
||||||
|
background : var(--light-grey);
|
||||||
|
overflow : hidden;
|
||||||
|
padding-right : 0.8rem;
|
||||||
|
border-radius : var(--rounding * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight table {
|
||||||
|
--horizontal : 0.8rem;
|
||||||
|
--vertical : 0.6rem;
|
||||||
|
width : 100%;
|
||||||
|
margin : 0;
|
||||||
|
padding : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight tr {
|
||||||
|
display : grid;
|
||||||
|
grid-template-columns : max-content 1fr;
|
||||||
|
gap : var(--horizontal);
|
||||||
|
background : green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight td:first-child {
|
||||||
|
padding : var(--vertical) var(--horizontal);
|
||||||
|
background : var(--grey);
|
||||||
|
color : #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight td:last-child {
|
||||||
|
overflow : auto;
|
||||||
|
padding : var(--vertical) 0;
|
||||||
|
background : transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight code {
|
||||||
|
display : block;
|
||||||
|
padding : 0;
|
||||||
|
background : transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.c, .c1, .cm){
|
||||||
|
color : #aaa;
|
||||||
|
font-style : italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.o, .p){
|
||||||
|
color : #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.fm, .k, .kc, .kd, .nt),
|
||||||
|
.highlight .language-css :where(.nc, .nd, .nn, .s2){
|
||||||
|
color : #c66;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.na, .nb, .nf, .nv),
|
||||||
|
.highlight .language-css :where(.k, .kc, .kp, .kt),
|
||||||
|
.highlight .language-javascript .nx{
|
||||||
|
color : #5b5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.cp, .nc, .ni, .nx),
|
||||||
|
.highlight .language-css :where(.n, .nv){
|
||||||
|
color : #e94;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight :where(.m, .mf, .mh, .mi, .s, .s1, .s2, .sr){
|
||||||
|
color : #36b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.photo-img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.photo-mid {
|
||||||
|
width: var(--content);
|
||||||
|
}
|
||||||
|
.photo-td {
|
||||||
|
width: calc((var(--content) / 3) - (4 * 4px));
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
.photo-table {
|
||||||
|
width: var(--content);
|
||||||
|
margin: auto;
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ASCIIDOCTOR FIXES */
|
||||||
|
|
||||||
|
.sect1, .sect0 {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#preamble {
|
||||||
|
padding: 0;
|
||||||
|
}
|