commit: 144fdd050f6f5612a9ccbc48a7303c0a9797626a
parent:
author: Chris Noxz <chris@noxz.tech>
date: Thu, 19 Sep 2019 13:51:16 +0200
Initial commit for public release
noxz.tech/about/questions-&-answers/index.md | 19 +
A | noxz.tech/about/tools/index.md | 101 | +++++ |
A | noxz.tech/articles.nobuild/.buildignore | 0 | |
A | noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore | 0 | |
A | noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate | 1 | + |
A | noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md | 21 | + |
A | noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png | Bin | 0 |
A | noxz.tech/dictionary/index.md | 96 | +++++ |
A | noxz.tech/dotfiles/index.md | 71 | ++++ |
A | noxz.tech/index.md | 62 | +++ |
A | noxz.tech/music/.buildignore | 0 | |
A | noxz.tech/pub/.buildignore | 0 | |
A | noxz.tech/pub/chrisnoxz.pub | 1 | + |
A | noxz.tech/pub/gpg-public-key.asc | 30 | ++ |
A | noxz.tech/pub/logo.black.svg | 110 | +++++ |
A | noxz.tech/pub/logo.svg | 110 | +++++ |
A | noxz.tech/pub/rss.svg | 34 | ++ |
A | noxz.tech/pub/style.css | 223 | ++++++++++ |
A | noxz.tech/pub/twtxt.svg | 27 | ++ |
A | noxz.tech/software/cidr2ip/.buildignore | 0 | |
A | noxz.tech/software/cidr2ip/index.md | 24 | ++ |
A | noxz.tech/software/endrilo/.buildignore | 0 | |
A | noxz.tech/software/index.md | 44 | ++ |
A | noxz.tech/software/ip2cidr/.buildignore | 0 | |
A | noxz.tech/software/ip2cidr/index.md | 22 | + |
A | noxz.tech/software/mpvd/index.md | 56 | +++ |
A | noxz.tech/software/ncscpl/.buildignore | 0 | |
A | noxz.tech/software/rspan/index.md | 27 | ++ |
A | noxz.tech/software/satan-gh60/index.md | 38 | ++ |
A | noxz.tech/software/satan-gh60/keyboard.png | Bin | 0 |
A | noxz.tech/software/swps/index.md | 23 | ++ |
A | noxz.tech/software/wikid/.buildignore | 0 | |
A | noxz.tech/software/wikid/index.md | 30 | ++ |
A | noxz.tech/software/ztatus/index.md | 38 | ++ |
A | noxz.tech/twtxt.txt | 24 | ++ |
A | twtxt | 11 | + |
53 files changed, 2484 insertions(+)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,12 @@
+*.html
+!/*.html
+builder
+config.h
+web.tar
+articles.ref
+quark.map
+repo-graph
+noxz.tech/blog
+noxz.tech/pub/feed.rss
+git.noxz.tech/*
+!git.noxz.tech/pub
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+© 2018-2019 Chris Noxz <chris@noxz.tech>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Makefile b/Makefile
@@ -0,0 +1,49 @@
+include config.mk
+
+all: clean builder
+ @echo building blog structure
+ @./build-blog.sh
+ @
+ @echo rendering html files
+ @find * -type d -exec sh -ec '[ ! -f "$$0/.buildignore" ] && ./builder "$$0" >$$0/index.html 2>/dev/null' {} \;
+ @
+ @echo applying extensions
+ @./apply-extensions.sh
+ @
+ @echo creating git site
+ @./build-git.sh
+ @
+ @echo creating icons
+ @convert -density 1200 -resize 256x256 ./noxz.tech/pub/logo.black.svg ./noxz.tech/pub/logo.png
+ @convert -density 1200 -resize 256x256 ./git.noxz.tech/pub/logo.svg ./git.noxz.tech/pub/logo.png
+ @
+ @echo creating tar archive 'web.tar'
+ @find ./ -type f -regex \
+ ".*\.\(jpg\|png\|svg\|html\|css\|asc\|pub\|rss\|xml\|swps\|txt\)" \
+ -exec tar -rf web.tar {} \;
+
+builder: config.h builder.c
+ @echo CC -o $@
+ @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ builder.c
+
+publish: all
+ @echo publishing to web server...
+ @scp ./web.tar anthra.system.local:/usr/local/share/noxz.tech/web.tar
+
+config.h:
+ @echo creating $@ from config.def.h
+ @cp config.def.h $@
+
+clean:
+ @echo cleaning
+ @find ./git.noxz.tech/* -type d -prune ! -name "pub" -exec sh -ec 'rm -r "$$0"' {} \;
+ @find -name '*.html' -type f -exec sh -ec 'rm "$$0"' {} \;
+ @rm -rf noxz.tech/blog
+ @rm -f noxz.tech/pub/feed.rss
+ @rm -f noxz.tech/pub/logo.png
+ @rm -f git.noxz.tech/pub/logo.png
+ @rm -f articles.ref
+ @rm -f quark.map
+ @rm -f web.tar
+ @rm -f builder
+ @rm -f repo-graph
diff --git a/README.md b/README.md
@@ -0,0 +1,14 @@
+noxz-sites
+==========
+`noxz-sites` is a collection of a builder and various scripts creating the
+noxz.tech sites:
+
++ noxz.tech
++ git.noxz.tech
++ irc.noxz.tech
+
+License
+-------
+The code for creating this site is licensed under the `MIT License`, see
+LICENSE. Usage of the content however is regulated by the copying policy for
+the sites: https://noxz.tech/about/copying-policy/.
diff --git a/apply-extensions.sh b/apply-extensions.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+if [ -f ./articles.ref ]; then
+ # replace references based on [[display_text|article_name]]
+ while read a b; do
+ find ./noxz.tech/ -name "*.html" -type f -print0 | \
+ xargs -0 sed -i -e "s,\[\[\([^|]*\)|$a\]\],<a href="$b">\1</a>,g"
+ done < ./articles.ref
+
+ # replace missing references with display text only
+ find ./noxz.tech/ -name "*.html" -type f -print0 | \
+ xargs -0 sed -i -e 's,\[\[\([^|]*\)|\([^]]*\)\]\],\1,g'
+fi
+
+# 1. inject div blocks {:: ...}, {::}
+# 2. inject block parameters {: ...}
+# 3. remove comments
+find ./noxz.tech/ -name "*.html" -type f -print0 | \
+ xargs -0 sed -i \
+ -e 's,^\(<[^>]*>\){::\( .*\)}$,<div\2>\1,g' \
+ -e 's,^{::},</div>,g' \
+ -e 's,^<\([^>]*\)>{:\( .*\)}$,<\1\2>,g' \
+ -e '/{% comment %}/,/{% endcomment %}/d'
diff --git a/build-blog.sh b/build-blog.sh
@@ -0,0 +1,143 @@
+#!/bin/sh
+
+base="noxz.tech/blog"
+rss="noxz.tech/pub/feed.rss"
+
+rss_head="\
+<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
+<rss version=\"2.0\"
+ xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"
+ xmlns:dc=\"http://purl.org/dc/elements/1.1/\"
+ >
+<channel>
+ <title>Chris Noxz Blog</title>
+ <description>Chris Noxz Blog</description>
+ <link>http://noxz.tech/blog/</link>
+ <lastBuildDate>%s</lastBuildDate>
+ <pubDate>%s</pubDate>
+ <ttl>1800</ttl>
+"
+rss_item="
+ <item>
+ <title>%s</title>
+ <link>%s</link>
+ <pubDate>%s</pubDate>
+ <dc:creator>Chris Noxz</dc:creator>
+ <description>%s</description>
+ <content:encoded><![CDATA[%s]]></content:encoded>
+ <guid isPermaLink=\"false\">%s</guid>
+ </item>
+"
+rss_end="
+</channel>
+</rss>"
+
+article_head="\
+# %s
+<span class=\"%s\">posted on <strong>%s</strong> by <strong>%s</strong></span>
+
+"
+
+get_month() {
+ case "$((${1}))" in
+ 1) printf "january" ;;
+ 2) printf "february" ;;
+ 3) printf "march" ;;
+ 4) printf "april" ;;
+ 5) printf "may" ;;
+ 6) printf "june" ;;
+ 7) printf "july" ;;
+ 8) printf "august" ;;
+ 9) printf "september" ;;
+ 10) printf "october" ;;
+ 11) printf "november" ;;
+ 12) printf "december" ;;
+ esac
+}
+
+for dir in noxz.tech/articles.nobuild/*; do
+ if [ -f "$dir/.createdate" ] && [ -f "$dir/index.md" ]; then
+ # variables
+ article_name="${dir##*/}"
+ create_date="$(cat "$dir/.createdate")"
+ year="${create_date%%-*}"
+ month="${create_date%-*}"
+ month="${month##*-}"
+ month_str="$(get_month "$(echo $month | sed 's/^0*//')")"
+ article_dir="$base/$year/$month_str/$article_name"
+ article_sort="-$(date -d "$create_date" +"%s")"
+ year_sort="-$(date -d "$year-01-01 00:00" +"%s")"
+ month_sort="-$(date -d "$year-$month-01 00:00" +"%s")"
+ content="$(cat "$dir/index.md")"
+
+ # create article markdowns with head
+ mkdir -p "$article_dir"
+ printf "$article_head" \
+ "$(echo "$article_name" | tr "[A-Z]" "[a-z]" | sed -e 's/_/ /g' -e 's/\( \|^\)\(.\)/\1\u\2/g')" \
+ "article-date" \
+ "${create_date%% *}" \
+ "Chris Noxz" \
+ >> "$article_dir/index.md"
+ cp "$article_dir/index.md" "$article_dir/preview.md"
+
+ # article reference file
+ printf "%s\t%s\t%s\t%s\n" \
+ "$(date -d "$create_date" +"%s")" \
+ "$dir/index.md" \
+ "$article_name" \
+ "//$article_dir/" \
+ >> "./articles.ref"
+
+ # quark mapping file
+ printf "? /articles/%s/ /blog/%s/\n" \
+ "$article_name" \
+ "$year/$month_str/$article_name" \
+ >> "./quark.map"
+
+ # append to index and preview
+ printf "%s" "$content" | \
+ tee -a "$article_dir/index.md" | \
+ sed -e '/^$/,$d' >> "$article_dir/preview.md"
+
+ # create build indicators and sorting files
+ [ ! -f "$base/.buildarticles" ] \
+ && touch "$base/.buildarticles"
+ [ ! -f "$base/$year/.buildarticles" ] \
+ && touch "$base/$year/.buildarticles" \
+ && echo "$year_sort" > "$base/$year/.sort"
+ [ ! -f "$base/$year/$month_str/.buildarticles" ] \
+ && touch "$base/$year/$month_str/.buildarticles" \
+ && echo "$month_sort" > "$base/$year/$month_str/.sort"
+ [ ! -f "$article_dir/.buildarticles" ] \
+ && touch "$article_dir/.buildarticles" \
+ && echo "$article_sort" > "$article_dir/.sort"
+
+ # copy any existing attachments
+ find "$dir" -type f ! -regex ".*\.\(md\|buildignore\|createdate\)" \
+ -exec cp '{}' "$article_dir/" \;
+
+ printf "[\033[1;32m+\033[m] article created: %s\n" "$article_dir"
+ fi
+done
+
+# sort references by date (first column)
+sort -r -k 1,1 -o "./articles.ref" "./articles.ref"
+
+# render rss file
+if [ ! -f "$rss" ]; then
+ printf "$rss_head" "$(date -R)" "$(date -R)" >> "$rss"
+ while read _date _path _title _url; do
+ printf "$rss_item" \
+ "$(echo $_title | sed 's/_/ /g')" \
+ "https:$_url" \
+ "$(date -R -d "@$_date")" \
+ "$(cat $_path | sed -e '/^$/,$d')" \
+ "$(smu -b "https:$_url" $_path | sed -e 's/{: .*}//g')" \
+ "$(echo $_url | md5sum | cut -d ' ' -f 1 | sed -e 's,^\(.\{8\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)\(.\{12\}\)$,\1-\2-\3-\4-\5,g')" \
+ >> "$rss"
+ done < "./articles.ref"
+ printf "$rss_end" >> "$rss"
+fi
+
+# remove the 2 first columns as they are not needed anymore
+sed -i 's/^\([^\t][^\t]*\t\)\{2\}//g' "./articles.ref"
diff --git a/build-git.sh b/build-git.sh
@@ -0,0 +1,104 @@
+#!/bin/sh
+
+[ ! -d "$(realpath ~/mnt/src/z0noxz)" ] && exit 1;
+
+reposdir="$(realpath ~/mnt/src/z0noxz)"
+basedir="$(realpath ./)"
+basedir_git="$(realpath ./git.noxz.tech)"
+basedir_root="$(realpath ./noxz.tech)"
+
+REPOS=$(for d in "${reposdir}/"*/; do [ ! -f $d/fork ] && [ ! -f $d/disc ] && echo $d; done)
+FORKS=$(for d in "${reposdir}/"*/; do [ -f $d/fork ] && echo $d; done)
+#DISCO=$(for d in "${reposdir}/"*/; do [ -f $d/disc ] && echo $d; done)
+
+REPOS=$(stagit-index $REPOS)
+REPOS=$(echo "$REPOS" | sed -e 's/<tr><td><b>/<tr class="nohi"><td><b>/')
+HEADR=$(echo "$REPOS" | grep -o '^.*</thead><tbody>' | sed -e 's|</thead.*$||')
+#DISCO=$(stagit-index $DISCO)
+
+if [ "$FORKS" != "" ]
+then
+ FORKS=$(stagit-index $FORKS)
+ FORKS=$(echo "$FORKS" | sed -n '/<table id="index">/,$p' | sed 1,2d)
+ REPOS=$(echo "$REPOS" | awk -vN=2 '1;/<\/table>/&&--N<=0{exit}' | sed '$ d')
+ REPOS="$REPOS<tr class=\"nohi\"><td colspan=\"4\"> </td></tr>$HEADR$FORKS"
+fi
+
+echo "$REPOS" > "${basedir_git}/index.html"
+#stagit-index $REPOS > "${basedir_git}/index.html"
+
+for dir in "${reposdir}/"*/; do
+ r=$(basename "${dir}")
+ d=$(basename "${dir}" ".git")
+
+ mkdir -p "${basedir_git}/${d}"
+ cd "${basedir_git}/${d}"
+ stagit -c ".cache" "${reposdir}/${r}"
+
+ # rename hidden (dotfiles) so they can be accessed using quark
+ for dotfile in $(grep -o 'href="file/[^"]*.html"' files.html \
+ | grep '/\.' | sed -e 's|^href="||' -e 's|"$||')
+ do
+ new_name="$(echo $dotfile | sed -e 's|/\.|/_.|g')"
+ new_dir="$(dirname $new_name)"
+ [ ! -d "$new_dir" ] && mkdir -p "$new_dir"
+ mv "$dotfile" "$new_name"
+ sed -i -e "s|href=\"$dotfile\"|href=\"$new_name\"|g" files.html
+ done
+
+ # remove empty directories after rename
+ find ./file -type d -empty -delete
+
+ cp log.html index.html
+
+ printf "[\033[1;32m+\033[m] git repo created: %s\n" "${d}"
+done
+
+find "${basedir_git}/." -name "*.html" -type f -print0 | \
+ xargs -0 sed -i \
+ -e 's,="[^a-zA-Z0-9]*style.css",="/pub/style.css",g' \
+ -e 's,="[^a-zA-Z0-9]*logo.png",="/pub/logo.svg",g' \
+ -e 's,="[^a-zA-Z0-9]*favicon.png",="/pub/logo.png",g'
+
+> $basedir/repo-graph
+printf '<h2>Commits in the last year</h2>\n' > $basedir/repo-graph
+repo-graph -s $reposdir/* >> $basedir/repo-graph
+
+log=""
+for x in $reposdir/*
+do
+ x="$(realpath $x)"
+ a="${x##*/}"
+ a="${a%%.*}"
+ a="<a href=\"https://noxz.tech/git/$a/log.html\">$a</a>"
+ cmd=$(printf 'cd "%s" && git log %s %s %s %s' \
+ "$x" \
+ '--no-merges' \
+ '--date="format:%Y-%m-%d %H:%M:%S"' \
+ "--pretty=\"format:%at:%ad [$a] %s"\" \
+ '--since="13 months"' \
+ )
+ log=$(printf '%s\n%s' "$log" "$(eval "$cmd")")
+done
+
+echo "$log" \
+| sort -r \
+| sed 10q \
+| sed -e 's/^[^:]*://g' \
+| awk '
+ BEGIN {
+ print "<ul class=\"repo-log\">";
+ } {
+ printf "<li><span class=\"log-date\">%s %s</span>",$1,$2;
+ $1=$2="";
+ $0=$0;
+ } NF=NF {
+ printf "%s</li>\n",$0
+ } END {
+ print "<li>[<a href=\"https://noxz.tech/git/\">...</a>]</li></ul>"
+ }
+' >> $basedir/repo-graph
+
+sed -i $basedir_root/index.html \
+ -e "/^.*!!placeholder:repo-graph!!.*$/r $basedir/repo-graph" \
+ -e "/^.*!!placeholder:repo-graph!!.*$/d"
diff --git a/builder.c b/builder.c
@@ -0,0 +1,429 @@
+/* builder.c
+ * Based on ideas from the suckless.org site builder
+ */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <dirent.h>
+#include <linux/limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "config.h"
+
+#define LEN(x) (sizeof(x) / sizeof *(x))
+#define CONVERTER "smu"
+#define TITLE_MAX 1024
+#define TITLE_DEF "noxz.tech"
+#define DIR_MAX 1024
+#define URL_MAX 2048
+
+enum file_type {
+ F_DIR,
+ F_REG
+};
+
+typedef struct {
+ char *path;
+ int sort;
+} Article;
+
+static char basedir[PATH_MAX];
+static Article **articles = NULL;
+static int article_count = 0;
+
+void die(char *msg, ...)
+{
+ va_list a;
+
+ va_start(a, msg);
+ vfprintf(stderr, msg, a);
+ va_end(a);
+ fputc('\n', stderr);
+ exit(1);
+}
+
+int get_sort(int *sort, char const *path)
+{
+ FILE *fp = NULL;
+ int r = 0;
+
+ if (!(fp = fopen(path, "r")))
+ return -1;
+
+ r = fscanf(fp, "%d", sort);
+ fclose(fp);
+
+ return r;
+}
+
+int oneline(char *value, size_t len, char const *path)
+{
+ char *r = 0;
+ FILE *fp = NULL;
+
+ if (!(fp = fopen(path, "r")))
+ return perror(path), -1;
+
+ r = fgets(value, len, fp);
+ *(value + strlen(value) - 1) = '\0';
+ fclose(fp);
+
+ return !!r;
+}
+
+int spawn_wait(char **argv)
+{
+ int status;
+ switch (fork()) {
+ case 0:
+ execvp(argv[0], argv);
+ exit(126);
+ case -1:
+ return -1;
+ }
+ if (wait(&status) == -1)
+ return -1;
+ return WIFEXITED(status) ? 0 : -1;
+}
+
+void print_head(char *domain, char *page)
+{
+ char title[TITLE_MAX];
+ (void)domain;
+ (void)page;
+
+ if (oneline(title, sizeof title, ".title") <= 0)
+ printf(html_head, TITLE_DEF, MAIN_TITLE, SUB_TITLE);
+ else
+ printf(html_head, title, MAIN_TITLE, SUB_TITLE);
+}
+
+void print_header(char *domain, char *page)
+{
+ (void)domain;
+ (void)page;
+
+ printf(html_header, MAIN_TITLE, SUB_TITLE);
+}
+
+void print_name(char *name)
+{
+ char *from = "_-",
+ *to = " ",
+ *s;
+
+ for (;*name; ++name) {
+ if ((s = strchr(from, *name)) != NULL)
+ putchar(to[s - from]);
+ else
+ putchar(*name);
+ }
+}
+
+int check_stat(char *f, int type)
+{
+ struct stat s;
+ if (stat(f, &s) == -1) {
+ return 0;
+ }
+ switch (type) {
+ case F_DIR:
+ return S_ISDIR(s.st_mode);
+ case F_REG:
+ return S_ISREG(s.st_mode);
+ default:
+ return 0;
+ }
+}
+
+int qsort_articles(const void *a, const void *b)
+{
+ return ((*(Article **)a)->sort - (*(Article **)b)->sort);
+}
+
+int qsort_strcmp(const void *a, const void *b)
+{
+ char a_sort_path[PATH_MAX],
+ b_sort_path[PATH_MAX];
+ int a_sort,
+ b_sort;
+
+ snprintf(a_sort_path, PATH_MAX + 8, "%s/%s/.sort", basedir, *(char **)a);
+ snprintf(b_sort_path, PATH_MAX + 8, "%s/%s/.sort", basedir, *(char **)b);
+
+ if (get_sort(&a_sort, a_sort_path) == 1 && get_sort(&b_sort, b_sort_path) == 1) {
+ return (a_sort - b_sort);
+ }
+
+ return strcmp(*(char **)a, *(char **)b);
+}
+
+void subdir(char *newdir, size_t len, char *base, char *add)
+{
+ *newdir = '\0';
+ if (base) {
+ strncat(newdir, base, len - 1); newdir[len - 1] = '\0';
+ strncat(newdir, "/", len - 1); newdir[len - 1] = '\0';
+ }
+ strncat(newdir, add, len - 1); newdir[len - 1] = '\0';
+}
+
+int build_ignore(char *domain, char *page)
+{
+ char ignore[PATH_MAX];
+ (void)domain;
+
+ snprintf(ignore, PATH_MAX, "%s/.buildignore", page);
+
+ if (access(ignore, F_OK) != -1)
+ return 0;
+ return 1;
+}
+
+void nav(char *domain, char *page, char *this)
+{
+ DIR *dp;
+ struct dirent *ent;
+ char *d_list[DIR_MAX];
+ char **d;
+ size_t d_len = 0;
+ char newdir[PATH_MAX];
+
+ if ((dp = opendir(this ? this : ".")) == NULL)
+ die("opendir %s", this ? this : ".");
+
+ while (d_len < LEN(d_list) && (ent = readdir(dp)))
+ d_list[d_len++] = ent->d_name;
+ d_list[d_len] = NULL;
+
+ snprintf(basedir, PATH_MAX, "%s", this ? this : "");
+ qsort(d_list, d_len, sizeof *d_list, &qsort_strcmp);
+
+ for (d = d_list; *d != NULL; ++d) {
+ if (**d == '.')
+ continue;
+ subdir(newdir, sizeof newdir, this, *d);
+ if (!check_stat(newdir, F_DIR))
+ continue;
+ if (build_ignore(domain, newdir) == 0)
+ continue;
+
+ fputs("\t<li><a", stdout);
+ if (page && !strncmp(newdir, page, strlen(newdir)))
+ fputs(" class=\"active\"", stdout);
+ printf(" href=\"//%s/%s/\">", domain, newdir);
+ if (page && !strncmp(newdir, page, strlen(newdir)))
+ fputs("» ", stdout);
+ else
+ fputs("› ", stdout);
+ print_name(*d);
+ fputs("</a>", stdout);
+
+ if (page && !strncmp(newdir, page, strlen(newdir))) {
+ puts("\t<ul>");
+ nav(domain, page, newdir);
+ puts("\t</ul>");
+ }
+ puts("</li>");
+ }
+ closedir(dp);
+}
+
+void print_nav(char *domain, char *page)
+{
+ (void)domain;
+ (void)page;
+
+ fputs("<div id=\"nav\">\n\t<ul>\n\t<li><a", stdout);
+ if (!page)
+ fputs(" class=\"active\"", stdout);
+ fputs(" href=\"/\">home</a></li>", stdout);
+ nav(domain, page, NULL);
+ fputs("\t</ul>", stdout);
+ fputs("\t<a class=\"rss\" href=\"/pub/feed.rss\" target=\"_blank\">"
+ "subscribe</a>", stdout);
+ fputs("\t<a class=\"twtxt\" href=\"/twtxt.txt\" target=\"_blank\">"
+ "twtxt</a>", stdout);
+ fputs("</div>", stdout);
+}
+
+void append_article(char *path)
+{
+ Article *a;
+ char sort_path[PATH_MAX];
+ int sort;
+
+ if (articles == NULL)
+ articles = (Article **)malloc(0);
+
+ snprintf(sort_path, PATH_MAX + 8, "%s/.sort", path);
+ get_sort(&sort, sort_path);
+
+ a = (Article *)malloc(sizeof(Article));
+ a->path = (char *)malloc(strlen(path) + 1);
+ a->sort = sort;
+ strcpy(a->path, path);
+
+ articles = (Article **)realloc(articles, (article_count + 1) * sizeof(Article *));
+ articles[article_count++] = a;
+}
+
+void free_articles(void)
+{
+ int i;
+
+ for (i = 0; i < article_count; i++) {
+ free(articles[i]->path);
+ free(articles[i]);
+ }
+ free(articles);
+}
+
+void load_articles(char *this)
+{
+ DIR *dp;
+ struct dirent *ent;
+ char *d_list[DIR_MAX];
+ char **d;
+ size_t d_len = 0;
+ char newdir[PATH_MAX];
+ char index[PATH_MAX];
+
+ subdir(index, sizeof index, this, "index.md");
+ if (check_stat(index, F_REG)) {
+ append_article(this);
+ return;
+ }
+
+ if ((dp = opendir(this ? this : ".")) == NULL)
+ die("opendir %s", this ? this : ".");
+
+ while (d_len < LEN(d_list) && (ent = readdir(dp)))
+ d_list[d_len++] = ent->d_name;
+ d_list[d_len] = NULL;
+
+ for (d = d_list; *d != NULL; ++d) {
+ if (**d == '.')
+ continue;
+ subdir(newdir, sizeof newdir, this, *d);
+ if (!check_stat(newdir, F_DIR))
+ continue;
+ load_articles(newdir);
+ }
+ closedir(dp);
+}
+
+void generate_index(char *domain, char *page, char *index, char *base_url)
+{
+ char *argv[5] = { NULL };
+ int i = 0;
+
+ argv[i++] = CONVERTER;
+ if (base_url != NULL) {
+ argv[i++] = "-b";
+ argv[i++] = base_url;
+ }
+ argv[i++] = index;
+
+ fflush(stdout);
+
+ if (base_url != NULL && spawn_wait(argv) == -1)
+ die("failed: %s -b %s %s/%s/%s", CONVERTER, base_url, domain, page, index);
+ else if (base_url == NULL && spawn_wait(argv) == -1)
+ die("failed: %s %s/%s/%s", CONVERTER, domain, page, index);
+}
+
+void print_content(char *domain, char *page)
+{
+ char buildarticles[PATH_MAX];
+ char index[PATH_MAX];
+ char base_url[URL_MAX];
+ int is_base = strcmp(page ? page : "", "blog") == 0;
+ int is_page = -1;
+ int i, l;
+
+ subdir(index, sizeof index, page, "index.md");
+ subdir(buildarticles, sizeof buildarticles, page, ".buildarticles");
+ fputs("<div id=\"main\">\n", stdout);
+
+ if (check_stat(buildarticles, F_REG)) {
+ load_articles(page);
+ qsort(articles, article_count, sizeof *articles, &qsort_articles);
+ l = 20;
+ for (i = 0; i < article_count; i++) {
+
+ /* limit number or articles being printed */
+ if (i == l)
+ continue;
+
+ is_page = strcmp(page, articles[i]->path) == 0;
+ snprintf(base_url, URL_MAX, "/%s/", articles[i]->path);
+
+ fputs("<div class=\"article\">\n", stdout);
+ if ((is_base || is_page) && i < 2)
+ subdir(index, sizeof index, articles[i]->path, "index.md");
+ else
+ subdir(index, sizeof index, articles[i]->path, "preview.md");
+
+ generate_index(domain, page, index, base_url);
+
+ if (!(is_base || is_page) || i >= 2)
+ fprintf(stdout, "\n<p><a href=\"%s\">continue reading...</a></p>\n", base_url);
+ fputs("</div>\n", stdout);
+ }
+
+ free_articles();
+ } else if (check_stat(index, F_REG)) {
+ generate_index(domain, page, index, NULL);
+ }
+ fputs("</div>\n", stdout);
+}
+
+void print_footer(char *domain, char *page)
+{
+ time_t timer;
+ struct tm* tm_info;
+ char year[5];
+
+ (void)domain;
+ (void)page;
+
+ time(&timer);
+ tm_info = localtime(&timer);
+ strftime(year, 5, "%Y", tm_info);
+ printf(html_footer, year);
+}
+
+int main(int argc, char *argv[])
+{
+ char *domain = NULL,
+ *page = NULL;
+
+ if (argc != 2)
+ die("usage: %s %s", argv[0], "directory");
+ if ((page = strchr(argv[1], '/')))
+ *page++ = '\0';
+ domain = argv[1];
+ if (chdir(domain) == -1)
+ return perror(domain), 1;
+
+ puts("<!doctype html>\n");
+ puts("<html>\n");
+ print_head(domain, page);
+ puts("<body>\n");
+ print_header(domain, page);
+ puts("<div id=\"content\">\n");
+ print_nav(domain, page);
+ print_content(domain, page);
+ puts("</div>\n");
+ print_footer(domain, page);
+ puts("</body>\n");
+ puts("</html>\n");
+}
diff --git a/config.def.h b/config.def.h
@@ -0,0 +1,32 @@
+#define MAIN_TITLE "noxz.tech"
+#define SUB_TITLE "Chris Noxz"
+
+char *html_head =
+ "<head>\n"
+ " <meta charset=\"utf-8\">\n"
+ " <meta name=\"author\" content=\"Chris Noxz\">\n"
+ " <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\"/>\n"
+ " <meta http-equiv=\"Pragma\" content=\"no-cache\"/>\n"
+ " <meta http-equiv=\"Expires\" content=\"0\"/>\n"
+ " <title>%s | %s %s</title>\n"
+ //" <link rel=\"icon\" type=\"image/svg+xml\" href=\"/pub/logo.svg\" />\n"
+ " <link rel=\"icon\" type=\"image/png\" href=\"/pub/logo.png\" />\n"
+ " <link rel=\"stylesheet\" type=\"text/css\" href=\"//noxz.tech/pub/style.css\">\n"
+ " <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Subscribe\" href=\"//noxz.tech/pub/feed.rss\">\n"
+ "</head>\n";
+
+char *html_header =
+ "<div id=\"header\">\n"
+ " <a id=\"header-logo\"href=\"//noxz.tech/\"><img src=\"//noxz.tech/pub/logo.svg\"/></a>\n"
+ " <a id=\"header-link\" href=\"//noxz.tech/\">%s</a>\n"
+ " <span id=\"header-subtitle\">%s</span>\n"
+ "</div>\n";
+
+char *html_footer =
+ "<div id=\"footer\">\n"
+ " <span class=\"right\">\n"
+ " © 2006-%s Chris Noxz"
+ " | <a href=\"//noxz.tech/about/copying-policy\">copying policy</a>\n"
+ " | <a href=\"//git.noxz.tech\">source</a>\n"
+ " </span>\n"
+ "</div>\n";
diff --git a/config.mk b/config.mk
@@ -0,0 +1,6 @@
+# paths
+REMOTE_PATH = anthra.system.local:/usr/local/share/noxz.tech/web.tar
+
+# flags
+CFLAGS = -Wall -Wextra -std=c99 -pedantic
+LDFLAGS = -static -s
diff --git a/git.noxz.tech/pub/logo.svg b/git.noxz.tech/pub/logo.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ viewBox="0 0 40 40"
+ version="1.1"
+ id="svg5995"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="logo.svg">
+ <defs
+ id="defs5989" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="169.22484"
+ inkscape:cy="86.16882"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5992">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-257)">
+ <g
+ id="g4971"
+ transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+ <g
+ id="g1447-3"
+ transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+ <path
+ id="path1435-6"
+ style="fill:none;stroke:#000000;stroke-width:0.1;stroke-opacity:1"
+ d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="rotate(-45)"
+ y="275.88495"
+ x="-79.740433"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-79.733536"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="295.18683"
+ x="-86.165421"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-92.597275"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="282.31039"
+ x="-99.041801"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2-7"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ </g>
+ </g>
+</svg>
diff --git a/git.noxz.tech/pub/style.css b/git.noxz.tech/pub/style.css
@@ -0,0 +1,112 @@
+body {
+ color: #000;
+ background-color: #fff;
+ font-family: monospace;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-size: 1em;
+ margin: 0;
+}
+
+img, h1, h2 {
+ vertical-align: middle;
+}
+
+img {
+ border: 0;
+}
+
+a.d,
+a.h,
+a.i,
+a.line {
+ text-decoration: none;
+}
+
+a.line {
+ padding-right: 5px;
+ border-right: 3px solid #eee;
+}
+
+#blob a {
+ color: #777;
+}
+
+#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;
+}
+
+thead tr:hover td,
+tr.nohi:hover td {
+ background-color: transparent !important;
+}
+
+#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;
+}
+
+td.num {
+ text-align: right;
+}
+
+.desc {
+ color: #777;
+}
+
+hr {
+ border: 0;
+ border-top: 1px solid #777;
+ height: 1px;
+}
+
+pre {
+ font-family: 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;
+}
diff --git a/irc.noxz.tech/.buildignore b/irc.noxz.tech/.buildignore
diff --git a/irc.noxz.tech/index.swps b/irc.noxz.tech/index.swps
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8"/>
+ <meta name="author" content="Chris Noxz"/>
+ <meta http-equiv="Cache-Control"
+ content="no-cache, no-store, must-revalidate"/>
+ <meta http-equiv="Pragma" content="no-cache"/>
+ <meta http-equiv="Expires" content="0"/>
+ <title>irc.noxz.tech | noxz.tech Chris Noxz</title>
+ <link rel="icon" type="image/png" href="//noxz.tech/pub/logo.png"/>
+ <style type="text/css">
+ body {
+ background-color : #666;
+ color : #222;
+ font-family : monospace, sans-serif;
+ padding : 0;
+ margin : 0;
+ }
+
+ h1 {
+ border-bottom : 1px solid #cacaca;
+ margin : 1em 1ex 1em 0;
+ padding : 0 0 0.75em 0;
+ font-size : 1.4em;
+ }
+
+ h2 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 1.3em;
+ }
+
+ h3 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 1.0em;
+ }
+
+ h4 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 0.9em;
+ }
+
+ a {
+ color : #005386;
+ text-decoration : none;
+ }
+
+ a:hover {
+ text-decoration : underline;
+ }
+
+ p, li {
+ color : #444;
+ line-height : 1.5em;
+ }
+
+ .paper {
+ background-color : #fff;
+ position : relative;
+ padding : 3em;
+ width : 50em;
+ margin : 6em auto;
+ }
+
+ .paper,
+ .paper::before,
+ .paper::after {
+ box-shadow : 2px 1px 1px rgba(0,0,0,0.15);
+ }
+
+ .paper::before,
+ .paper::after {
+ content : "";
+ position : absolute;
+ width : 100%;
+ height : 100%;
+ background-color : #eee;
+ }
+
+ .paper::before {
+ left : 7px;
+ top : 5px;
+ z-index : -1;
+ }
+
+ .paper::after {
+ left : 12px;
+ top : 10px;
+ z-index : -2;
+ }
+ </style>
+</head>
+<body>
+ <div class="paper">
+ <h1>irc.noxz.tech</h1>
+ <p>The IRC server allows for connection over tor, and all client
+ hostnames are cloaked for your privacy. Connections are also only
+ allowed using TLS/SSL on port 6697:
+ <a href="ircs://irc.noxz.tech:6697">ircs://irc.noxz.tech:6697</a><p>
+
+ <h2>About</h2>
+ <p>This server is mostly used for communication with me (Chris Noxz) or
+ for project specific communications. I've created this service mostly
+ for fun, and the fact that I couldn't find any reason not to. So feel
+ free to start using it, after reading the guidelines below.</p>
+ <h2>Server Guidelines</h2>
+ <p>Following are a couple of guidelines that should be easy to follow
+ </p>
+ <ul>
+ <li>No spamming</li>
+ <li>No nick faking/impersonation</li>
+ <li>No advertising</li>
+ <li>No exploit attempts, or other types of cracking</li>
+ <li>No illegal content, such as child pornography</li>
+ <li>Satirical content and jokes (even offensive) are of course allowed
+ </li>
+ </ul>
+ <p align="center"><br/>Happy hacking!<br/></p>
+ <pre align="center"><!--
+ --><br/> x <!--
+ --><br/> x <!--
+ --><br/> x x x </pre>
+ </div>
+</body>
+</html>
diff --git a/noxz.tech/.title b/noxz.tech/.title
@@ -0,0 +1 @@
+noxz.tech
diff --git a/noxz.tech/about/copying-policy/index.md b/noxz.tech/about/copying-policy/index.md
@@ -0,0 +1,19 @@
+# Copying policy
+This copying policy is only meant for content on this site, and this site only,
+and not for any external content or source code referenced from it. All source
+code carry their own licences for usage.
+
++ You may mirror and link to any portion of this site, at your wish.
++ You may *not* create or redistribute static copies, in any format, without my
+written consent. The only reason for this is that my thoughts and reasoning
+might change with time, and I don't want old, outdated, or tampered words of
+mine floating around. For various reasons people tend to quote or misquote
+others out of context, and it's in that case always better to reference the
+original source.
+
+## The logo, Game of Life Glider
+If you are familiar with the glider or the game of life, you recognize this
+symbol. I've created my own variant of it, with diamonds instead of dots. The
+glider is *not* copyrighted or trademarked, but it's only meant to be used by
+hackers, and people associating themselves with the hacker culture. You can
+read more about it [here](http://www.catb.org/hacker-emblem/).
diff --git a/noxz.tech/about/index.md b/noxz.tech/about/index.md
@@ -0,0 +1,41 @@
+About me
+========
+
+Political view?
+---------------
+I don't ideologically lean in any specific "direction". However, my views in
+general mainly correlate with liberalism and anarchism. Simply put, live and
+let live, don't assume authority over other people, and treat others as you
+would like to be treated yourself.
+
+Social media?
+-------------
+If you try to find me on so called "social media", you won't. It's nothing more
+than a collection of mega marketing platforms tricking people into giving up
+their time and privacy for marketing goals. Here is a [good
+read](https://www.nateliason.com/blog/delete-facebook) about the issue.
+
+Programming languages I currently use, or have used
+---------------------------------------------------
+To avoid creating a long list I will name the languages I feel worth naming,
+and leave out languages like *brainfuck*, markup languages and other
+non-programming languages. I've worked as a so called "development engineer",
+so I've come in contact with a lot of different languages during that time.
+
+**C**, the language of Unix, is the main language I use, which is by far my
+favorite. It's fast, precise and, given a good hacker, can look absolutely
+beautiful. C was one of the first languages I learned using.
+
+**Python** is another language I like to use, not for it's ^hyper optimized
+performance^, but for it's fast way of prototyping ideas. Python is almost
+never the language I use for a finished result.
+
+**JavaScript** is NOT a language I use, anymore. I used to use it quite a lot
+for a while, writing so called web applications. They often worked very well at
+first, but due to web applications nature they grew too much and too fast, and
+web browsers can never find any common way of implementing JavaScript.
+JavaScript is also a nightmare to debug due to its "forgiving nature" and
+willingness to ignore errors instead of failing hard when it should. JavaScript
+just accepts anything you throw at it, and not in a good way. Global variables
+makes your life a living hell, where you never know what will and have affected
+them. Avoid it!
@@ -0,0 +1,19 @@
+# Questions & answers
+
+{% comment %}
+## [[Building a keyboard|dummy\_article\_3]]
+Building a keyboard isn't all that difficult, and with online resources anyone
+can do it. Read about how I built mine.
+{% endcomment %}
+
+## libreboot, and blank background?
+I never found any writings about this topic online, even though the answer is
+quite straight forward. So yes, you can have a blank background, and remove the
+picture from the image file. The
+[documentation](https://libreboot.org/docs/grub/index.html#changing-the-background-image-in-grub)
+on libreboot.org only describes changing the current background, but it's both
+simple and possible to remove it completely.
+
+## [[What computer do I use?|the\_lenovo\_thinkpad\_t400]]
+I currently use a Lenovo Thinkpad T400, running libreboot instead of stock
+BIOS.
diff --git a/noxz.tech/about/tools/index.md b/noxz.tech/about/tools/index.md
@@ -0,0 +1,101 @@
+Programs and tools I use
+========================
+Following is a pseudo complete list of all programs and tools I use on a
+regular basis. The list is for anyone who is either curious or wanting to try
+any of the programs and tools I use. The list may change with time.
+
+Most tools I use are either [suckless](https://suckless.org), minimal or TUI
+based. I like using tools that use "vim like" keys and commands, and preferably
+are only key based.
+
+The list
+--------
+### Operating System
+I currently use [Void Linux](https://voidlinux.org) as my main operating
+system, due to it's simplicity and minimalistic nature. Another important
+reason is the rejection of SystemD(estroyer), with
+[runit](http://smarden.org/runit/) instead as both init and service manager.
+Void Linux isn't a fork from any other Linux distribution and is instead
+created from scratch together with its package manager
+[xbps](https://voidlinux.org/usage/xbps/).
+
+### Shell
+For an interactive shell I use [loksh](https://github.com/dimkr/loksh), a Linux
+port of OpenBSD's ksh (KornShell). For all non-interactive POSIX shell scripts
+I use [dash](https://git.kernel.org/pub/scm/utils/dash/dash.git/).
+
+### Display manager
+When my computers boot I have a simple login using agetty. After login I'm
+prompted with a modified version of [cdm](https://github.com/evertiro/cdm), the
+console display manager.
+
+### Window Manager
+When I'm in need of more than just a vterm I use
+[dwm](https://dwm.suckless.org), the dynamaic window manager, as my WM. Dwm is
+a so called tiling window manager, with the goal of using all available screen
+area for productivity. However it's not magic, the rest is of course up to you.
+
+Together with [dwm](https://dwm.suckless.org) I use
+[ztatus](//noxz.tech/software/ztatus) for notifications and status updates.
+
+### Terminal Emulator
+I use [st](https://st.suckless.org), the simple terminal, as my terminal
+emulator. It consists of around 3K LOC, supports 256 colors (and true colors),
+UTF-8, and more.
+
+### Fonts
+The fonts I mainly use are [hack](https://sourcefoundry.org/hack/) and
+[M+](http://mplus-fonts.osdn.jp/about-en.html)
+
+### Text editor and IDE
+My main text editor is [vim](https://www.vim.org/), with as few plugins as
+possible. The plugins I use I have written myself to be as minimal as possible.
+Together with [vim](https://www.vim.org/) I use
+[gdb](https://www.gnu.org/software/gdb/) for debugging and testing code.
+
+### File manager
+When default core programs aren't enough I use [vifm](https://vifm.info). Most
+of the time core programs are enough though.
+
+### Web browsers
+My web browsing tools are more diverse than other categories. For simple
+fetching I use either [wget](https://www.gnu.org/software/wget/) or
+[curl](https://curl.haxx.se/), but for more casual browsing I use either
+[w3m](http://w3m.sourceforge.net/), [surf](https://suckless.org/surf/) or
+[vimb](https://fanglingsu.github.io/vimb/) depending on the need for graphical
+rendering. However surf is the browser I use most times.
+
+### Communication
+For emailing I use [neomutt](https://neomutt.org/), together with
+[offlineimap](https://www.offlineimap.org/) and
+[msmtp](https://marlam.de/msmtp/). Another tool for communication is
+[irssi](https://irssi.org/) running on a remote raspberry pi.
+
+### Audio and video
+I use [mpv](https://mpv.io/images/mpv-screenshot-34cd36ae.jpg) together with
+[youtube-dl](https://youtube-dl.org/) for both viewing and listening on videos
+and music. For listening to tracks and mixes on SoundCloud I use ncscpl.
+
+### RSS and subscriptions
+I don't have any so called social media accounts, but I like watching videos on
+youtube for both education and pleasure. My solution and alternative to
+subscriptions through Google is using the RSS reader
+[newsboat](https://newsboat.org/) with RSS feeds from youtube channels.
+
+### Image and document rendering
+My image viewer is the versatile program
+[sxiv](https://github.com/muennich/sxiv), and for reading PDFs I use
+[zathura](https://pwmt.org/projects/zathura/).
+
+### Other programs worth mentioning
++ **[farbfeld](https://tools.suckless.org/farbfeld/)**: Lossless image format,
+ together with useful tools for converting to and from farbfeld (.ff). I store
+ many of my images in farbfeld, compressed with gzip (.ff.gz).
++ **[dmenu](https://tools.suckless.org/dmenu/)**: Super useful dynamic menu,
+ that I use for a lot of things.
++ **[imagemagick](https://www.imagemagick.org/)**: Image manipulator, that I
+ use for various image manipulation tasks.
++ **[tmux](https://github.com/tmux/tmux/wiki)**: Terminal multiplexer, that I
+ mainly use for persistent ssh sessions on remote machines.
++ **[swall](https://www.uninformativ.de/git/swall/file/README.html)**: A simple
+ Xrandr-aware program to set your wallpaper.
diff --git a/noxz.tech/articles.nobuild/.buildignore b/noxz.tech/articles.nobuild/.buildignore
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate
@@ -0,0 +1 @@
+2018-01-14 12:12:23
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md
@@ -0,0 +1,21 @@
+After being tired of being tied to my stationary workstation I finally got
+myself into buying a laptop. I didn't want a new fancy laptop I would have to
+replace in 2 years, due to it being filled with gunk, overheating or in
+general just fail. Modern laptops tend to be consumables. So, after some
+research I found that the Lenovo T400 should be stable, easy to fix, and also
+possible to libreboot (something that I've been interested in doing).
+
+I found a rather cheap one with some minor scratches on the top cover and a
+broken hard drive with a price of around $100. I replaced the keyboard, bought
+a new SSD, 8 GB of RAM, a new wireless NIC – and it was as good as new.
+After flashing the BIOS (which meant I had to disassemble everything to access
+the SPI pins) it gave me a cold boot time of about 10 seconds or less (I
+haven't timed it).
+
+This will be my main computer from now on, as it easily replaces my stationary
+workstation with a docking station I found at a flee market. I will probably
+buy another one just to be sure I have spare parts in case the motherboard
+breaks *fubar*.
+
+{: class="center"}
+![](t400.png)
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png
diff --git a/noxz.tech/dictionary/index.md b/noxz.tech/dictionary/index.md
@@ -0,0 +1,96 @@
+# Dictionary
+
+A collection of words and phrases, and their meaning when I used them. The
+purpose of this list is partly to minimize misunderstandings of me and partly
+to clarify misconceptions in general.
+
+{:: class="definition"}
+**brainfuck**:
+<a id="brainfuck"></a>
+A peculiar esoteric programming language consisting of only eight commands, in
+extreme minimalism. It's not sexual penetration of ones brain, although looking
+at the code might feel like it.
+{::}
+
+{:: class="definition"}
+**cracker**:
+<a id="cracker"></a>
+One who breaks security on a system. Coined ca. 1985 by hackers in defense
+against journalistic misuse of hacker (q.v., sense 8). While it is expected
+that any real hacker will have done some playful cracking and knows many of the
+basic techniques, anyone past larval stage is expected to have outgrown the
+desire to do so except for immediate, benign, practical reasons (for example,
+if it's necessary to get around some security in order to get some work done).
+
+Thus, there is far less overlap between hackerdom and crackerdom than the
+mundane reader misled by sensationalistic journalism might expect. Crackers
+tend to gather in small, tight-knit, very secretive groups that have little
+overlap with the huge, open poly-culture this lexicon describes; though
+crackers often like to describe themselves as hackers, most true hackers
+consider them a separate and lower form of life. See
+[jargon file](http://www.catb.org/jargon/html/C/cracker.html)
+{::}
+
+{:: class="definition"}
+**hacker**:
+<a id="hacker"></a>
+A person who enjoys exploring the details of programmable systems and how to
+stretch their capabilities, as opposed to most users, who prefer to learn only
+the minimum necessary. [RFC1392](https://www.rfc-editor.org/rfc/rfc1392.txt),
+the Internet Users' Glossary, usefully amplifies this as: A person who delights
+in having an intimate understanding of the internal workings of a system,
+computers and computer networks in particular. See
+[jargon file](http://www.catb.org/jargon/html/H/hacker.html)
+{::}
+
+{:: class="definition"}
+**hacker ethic**:
+<a id="hacker-ethic"></a>
+The hacker ethic is centered around passion, hard work, creativity and joy of
+creating software ([Himanen, 2001](#cite_himanen_2001)). Levy describes the
+following core principles to the hacker ethic:
++ Sharing — improvement of yours and others public creations.
++ Openness — all information should be free.
++ Decentralization — mistrust authority & promote decentralization. Hackers
+are encouraged to think critically and to challenge the status quo. Promoting
+decentralization dilutes the concentration of power and redistributes the power
+among the many.
++ Access to computers, and anything which might teach you something about the
+way the world works, should be unlimited and total. Always yield to the
+Hands-On Imperative!
++ World Improvement (foremost, upholding democracy and the fundamental laws we
+all live by, as a society)
++ Meritocracy — hackers should be judged by their hacking, not bogus criteria
+such as degrees, age, race, or position
++ You can create art and beauty on a computer.
++ Computers can change your life for the better.
+([Levy, 2010](#cite_levy_2010))
+
+The hacker ethic and its wider context can be associated with liberalism and
+anarchism.
+{::}
+
+{:: class="definition"}
+**meritocracy**:
+<a id="meritocracy"></a>
+*A system in which advancement is based on individual ability or achievement*.
+Inherent to the hacker ethic is a meritocratic system where superficiality is
+disregarded in esteem of skill, and "hackers should be judged by their hacking,
+not bogus criteria such as degrees, age, race, or position"
+([Levy, 2010](#cite_levy_2010)).
+
+In hacker ethic *meritocracy* is **not** meant as a form of social system in
+which power goes to those with superior intellects, or the belief that rulers
+should be chosen for their superior abilities and not because of their wealth
+or birth.
+{::}
+
+## References
+
+{: class="reference"}
+<a id="cite_himanen_2001"></a>Himanen, Pekka (2001). *The Hacker Ethic and the
+Spirit of the Information Age*. Floris Books. ISBN: 978-0-375-50566-9.
+
+{: class="reference"}
+<a id="cite_levy_2010"></a>Levy, Steven (2010). *Hackers – Heroes of the
+computer revolution*. O’Reilly Media. ISBN: 978-1-449-38839-3.
diff --git a/noxz.tech/dotfiles/index.md b/noxz.tech/dotfiles/index.md
@@ -0,0 +1,71 @@
+Dotfiles
+========
+I've written a little tool to manage my dotfiles, in a way that symlinks
+everything to where it should be. As I use patched versions of `st` and `dwm`
+some parts of my dotfiles doesn't make sense if you don't use my versions of
+`st` and `dwm`, but they are not prerequisites.
+
+Containers
+----------
+I store my dotfiles in containers for each category of dotfiles, and each
+container can be seen as their own representation of `$HOME`. There is for
+example one container called *vim* containing everything that has to do with
+vim and so on.
+
+Components
+----------
++ **link**: installer and uninstaller for the *dotfiles*.
++ **bin**: scripts and programs that will be included in `$PATH`.
++ **bin/.bin/alias**: scripts that will be sourced as functions instead of
+using aliases, as I find it simpler to maintain each 'alias' as it's own file.
++ **.exclude**: dotfiles that are global to the root and that won't get
+symlinked into `$HOME`.
++ **ksh**: KornShell is quite central to my dotfiles and contains functions
+that require *bin* and *bin/.bin/alias* to be installed. **.kshrc** is called
+when KornShell starts and then sources every *.sh* in **.kshrc.d**.
+
+### other containers
++ cdm
++ git
++ input
++ mbsync
++ mpv
++ msmtp
++ mutt
++ newsboat
++ ssh
++ surf
++ sxhkd
++ sxiv
++ themes
++ tmux
++ vifm
++ vim
++ vimb
++ x
+
+
+
+Prerequisites
+-------------
+I haven't actively integrated any dependency checks in any dotfile so if you
+use my dotfiles keep in mind that it might break stuff, and you might need to
+install extra software to make it work. If you find any such issues feel free
+to report them to me, and I might fix them.
+
+Oh, and I use ksh (loksh). That is kind of a prerequisite...
+
+Installation
+------------
+Installation is pretty simple. Just clone and install:
+
+ git clone git://git.noxz.tech/dotfiles
+ cd dotfiles
+ # optionally: mv dotfiles .dotfiles && cd .dotfiles
+ ./link install all
+
+Except for installing *all* you can tell `link` to install just the container
+for vim `./link install vim` and so on. To remove a container simply `./link
+remove vim`, or show status using `./link status vim`
+
+get source [here](//git.noxz.tech/dotfiles/).
diff --git a/noxz.tech/index.md b/noxz.tech/index.md
@@ -0,0 +1,62 @@
+Chris Noxz aka. z0noxz
+======================
+Welcome to my personal page, which have taken some years to create. Not due to
+its massive amount of content and extensive design, but rather a lack of
+priority. To keep my internet footprint low, you won't find any fancy
+JavaScript or flashy design here. Instead, you will only find readable content
+with a clean and simple design.
+
+!!placeholder:repo-graph!!
+
+About this site
+---------------
+This site is rendered from markdown to static HTML files, so there are no need
+for any preprocessors running on my servers, causing any delay for neither me
+nor you. If you want to use the content on this site please read this
+[copying policy](//noxz.tech/about/copying-policy/) first. This site should be
+readable in any web browser, and there are *no need* for any JavaScript engines
+or third party plugins. If you experience any problem viewing this site, it's
+probably due to your browser not being compliant with W3C standards, and you
+should switch it to another browser. If you find any legitimate errors in the
+content or how it is being rendered please let me know.
+
+If you feel triggered by any of my content please don't hesitate to direct your
+complaints to /dev/null. This should be a safe space for everyone :). On a more
+serious note, if you have any legitimate critique to my blog posts, send me an
+email and I might make a correction – if I deem it necessary. I currently don't
+have a feature for making comments on my posts, so this should work for now.
+
+About me
+--------
+I'm a [hacker](//noxz.tech/dictionary/#hacker), living in... Well, does it
+matter? If you want to get in touch with me I'm usually at some IRC or
+available through email at chris@noxz.tech. You can read all about my projects
+and [software](//noxz.tech/software/) I've both created and
+[use](//noxz.tech/about/tools/). Why not have a look at my
+[blog](//noxz.tech/blog/).
+
+All source code for software I've created should be available
+[here](//git.noxz.tech/). If you cannot find the source code, please let me
+know as it should be available.
+
+Encrypted messaging?
+--------------------
+You can get my [GPG public key](//noxz.tech/pub/gpg-public-key.asc), for
+sending me messages. Please use it, if you can, and if you have trouble using
+it have a look [here](http://codesorcery.net/old/mutt/mutt-gnupg-howto).
+
+Donate and support
+------------------
++ bitcoin: 17vMF3eP69KZ4utr1kYwJEj1GeWyjwWGCQ
++ litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
+
+Public keys
+-----------
++ [GPG public key](//noxz.tech/pub/gpg-public-key.asc)
++ [SSH public key](//noxz.tech/pub/chrisnoxz.pub)
+
+{: class="center"}
+Happy hacking!
+
+{: class="center"}
+![](/pub/logo.black.svg)
diff --git a/noxz.tech/music/.buildignore b/noxz.tech/music/.buildignore
diff --git a/noxz.tech/pub/.buildignore b/noxz.tech/pub/.buildignore
diff --git a/noxz.tech/pub/chrisnoxz.pub b/noxz.tech/pub/chrisnoxz.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5SKrqrHwNEhhGyXztYoOyANqbmuYEGdcybeccWiSyS/QDJ9T4KbtfCbHTY1z7zkycWSfFvH43ghwZ/8dr5fzCyqhiT02uvBptAZCVCD/dI9p+kOVITGkRDdU55Ve/plvJWsiJBwuzcYY3f6Vt1rk/pkX0ZJPmfC9UMJZen6bCUXgY4uAIaBqWuV1SWNhFaZFg9Fz+wWipYUhU083goJL4bJct+iu8SNwbfXlNgCvTz2XcQEDzqcYZRuY8o0K00Lsaj3BcqHJl5oFcKNUm0NIss5G7pcb7RhI7TE28k42Xiy5TsKU8d816h+umiyzo5jWm7e8A6SaLHKplqXkdkX90d4cvS0b3czCn7CE9FEChGCekttppjLGNfPiPBcqUzwhP/garEex5ZyUMp9/xu0iPELkD//giQyfAK+niKKOdmZ/68mVRnarOgn4PWeFLjqkJ0KERPjH9ZhI9sLm60FCJgMuzWoeaUm/UnUHlD7wyqtPc/FOoJgXPG5nSKRMB1M7BOtZ5aIpbZSJ1cfsBhliBcqBP/me7WGthbtywQpQ1LRuLHmi7upSBv8kw4jf+sTlOHuonG0mFjC/K3IQSwP85SEpBZuqWmvPEIYPwDERlZEmyOM9+iguTLtBpUgpfpJJDFaXdr5PwM/GIiJeG7sr0f5WcMpR9cgRtKyVZkHnWyQ== Chris Noxz
diff --git a/noxz.tech/pub/gpg-public-key.asc b/noxz.tech/pub/gpg-public-key.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFr1lvcBCADLqxHiXLEyIMb0/MC6UKzaVYW/6yGrypw+y9y+94r/2JiiAnEd
+XHnUlKxH+oM36390c2OtRrZJSpFSs0/VNnSSBIuIx+qcH8gVzR+OCOIUIPZV/awm
+WuS8s64MmytajNVCuHCC2l1OGIXb0mxSJ/dVjZMoi6vaBrktE5KvdGRnJ0wOX7uU
+pvXe5ML3BIgKOb8czV1KbJtjvpG1TKRJU9YdBJEDzl73La1MjPn5quSKcPxKwtyo
+eR7x5XDa72eMa6hILMM8jq9jD75ipmUKHznyyM4LnLzC60INl0gg+VecqCNv4W0l
+hUGEW5Lrklu03zS1JXQQWtrhrYvdKQxUzsrXABEBAAG0HENocmlzIE5veHogPGNo
+cmlzQG5veHoudGVjaD6JAVQEEwEIAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
+F4AWIQTDSGz6MISnhGjUJI65wwmLnanx/wUCXUQ2EAUJBhEGGQAKCRC5wwmLnanx
+/72tB/952xxOM3PhMiHke9PmICsJgFxcNdIihQAKll0ltoQZcmPAcai9uFwZdkWa
+brvOjppfYE3ATLZm+IqUS6VNg+syzU+TzodmoYQe0CZy0bvIjkX4pGvruPk7bWSn
+FkSEp5qBl1LkdY29Q4DZBa9vCW9nDDiObKasRS5SUjDXEi/zEmSZ4P7dgEIEEdsw
+5hbivOqsA7ZEbh+a93Riv8TUkv+Zl5m7KZ8MPpIN2avvAghpzbT/0sTwfmqPFfPG
+VzCBex/4tDpufUK/4tJRfehMJY2rSdlVTUEcY5HPnJQu3IRgtIBewyXzEAIPs1O8
+iZY09cRH7GXsMGjOAGeWvqgpF3pxuQENBFr1lvcBCAC3Chz82cghGNVmal8SgRvz
+Q4lrl5Ov0aBPFdMDhS6n/PDpyA5g7GFIVY6sRmxhxKt9QrrhpFhVRUduZBDQoHvz
+20BFw+hlprpgBenL5HxXOGTvzXngXMXg1xYX+ZpC16RchT4JkXUbCet2UjOwL6Q0
+au3D5vRSYvx9s3PobGf9TSXlsKzny9AwWEQ9xJj9TI0d9h4Xr06SxZ9cea+XMDhL
+YjsMNk0eYZYVIPmp4VPIBNmMyq5MZDIgzgYSD0E+IM6q8ivo6+vnmrqreR+PxqGP
+m+ilLfaUkUA7UJLXc4NSnvMYW1NYeHYyLTe/w+l2s+oyh6UZMfNxcbztS/Y/NOVr
+ABEBAAGJATwEGAEIACYCGwwWIQTDSGz6MISnhGjUJI65wwmLnanx/wUCXUQ2fgUJ
+BhEGhwAKCRC5wwmLnanx/1oVB/9L+TfB/zcljHLz+7pTgzhWAFNvwPWmvpnvjDFy
+aZIAgPseTJpuRrWjCeoINTTAB6soNsTrNpay7PWz9ARZWn4UFYVYfmDQqkNjeB4h
+GAty0fHulju4EiVfvzsyPJ7F6PmvlgSkDS1/z+yC8hOst+Q/JfzF21xxTZ7PAG2+
+uDb7nFL2q1xq4XXpTrXKQlcETxDWICZIb4D0zkV36GDcDD9pgQztJVJNnoySctrf
+AtI78HdD2Jxqq6UpSmU5oVrOxJF51Ushl3QfwOTKtj/uSkPm36YEEF86IXGRmHhn
+IcoKoJFhyFA4iNgE4xexfPt18iXLzpOjEkMV9e11HxpX0Fuq
+=XtUw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/noxz.tech/pub/logo.black.svg b/noxz.tech/pub/logo.black.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32px"
+ height="32px"
+ viewBox="0 0 40 40"
+ version="1.1"
+ id="svg5995"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="logo.svg">
+ <defs
+ id="defs5989" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="169.22484"
+ inkscape:cy="86.16882"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5992">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-257)">
+ <g
+ id="g4971"
+ transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+ <g
+ id="g1447-3"
+ transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+ <path
+ id="path1435-6"
+ style="fill:none;stroke:#000000;stroke-width:0.1;stroke-opacity:1"
+ d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="rotate(-45)"
+ y="275.88495"
+ x="-79.740433"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-79.733536"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="295.18683"
+ x="-86.165421"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-92.597275"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="282.31039"
+ x="-99.041801"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2-7"
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ </g>
+ </g>
+</svg>
diff --git a/noxz.tech/pub/logo.svg b/noxz.tech/pub/logo.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="25px"
+ height="25px"
+ viewBox="0 0 40 40"
+ version="1.1"
+ id="svg5995"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="logo.svg">
+ <defs
+ id="defs5989" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="169.22484"
+ inkscape:cy="86.16882"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5992">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-257)">
+ <g
+ id="g4971"
+ transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+ <g
+ id="g1447-3"
+ transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+ <path
+ id="path1435-6"
+ style="fill:none;stroke:#ffffff;stroke-width:0.1;stroke-opacity:1"
+ d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="rotate(-45)"
+ y="275.88495"
+ x="-79.740433"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-79.733536"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="295.18683"
+ x="-86.165421"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="288.75497"
+ x="-92.597275"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ <rect
+ transform="rotate(-45)"
+ y="282.31039"
+ x="-99.041801"
+ height="5.1449485"
+ width="5.1449485"
+ id="rect4878-2-9-2-7"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+ </g>
+ </g>
+</svg>
diff --git a/noxz.tech/pub/rss.svg b/noxz.tech/pub/rss.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" ?>
+<svg
+ height="12px"
+ width="12px"
+ id="Layer_1"
+ style="enable-background:new 0 0 12 12;"
+ version="1.1"
+ viewBox="0 0 512 512"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs id="defs19"/>
+ <g id="g3021"/>
+ <g id="Layer_1_1_"/>
+ <g id="Layer_1_1_-7" transform="translate(-819.672,-61.929991)"/>
+ <g id="g2989">
+ <rect
+ height="512"
+ id="rect2989"
+ rx="70"
+ ry="70"
+ style="fill:#ea7819;fill-opacity:1;stroke:none"
+ transform="scale(-1,-1)"
+ width="512"
+ x="-512"
+ y="-512"/>
+ <path d="m 81.05643,267.04958 c 43.7041,0 84.78879,17.07214 115.66407,48.12395 30.93179,31.05179 47.96156,72.41184 47.96156,116.44072 h 67.34951 c 0,-127.8857 -103.61898,-231.92124 -230.97514,-231.92124 v 67.35657 z M 81.1624,147.65054 c 155.7603,0 282.48808,127.4197 282.48808,284.04844 H 431 C 431,237.92528 274.05354,80.30102 81.1624,80.30102 v 67.34952 z m 93.13421,236.99769 c 0,25.75647 -20.89183,46.6483 -46.6483,46.6483 C 101.89184,431.29653 81,410.41176 81,384.64823 c 0,-25.7706 20.88477,-46.64831 46.64124,-46.64831 25.75649,0 46.65537,20.87771 46.65537,46.64831 z" id="path3844" style="fill:#ffffff"/>
+ </g>
+</svg>
diff --git a/noxz.tech/pub/style.css b/noxz.tech/pub/style.css
@@ -0,0 +1,223 @@
+body {
+ background-color: #eee;
+ color : #222;
+ font-family : monospace, sans-serif;
+ padding : 0;
+ margin : 0;
+}
+
+a {
+ color : #005386;
+ text-decoration : none;
+}
+
+a:hover {
+ text-decoration : underline;
+}
+
+#header {
+ clear : both;
+ color : #ffffff;
+ font-size : 1.35em;
+ border-bottom : solid 2px #526587;
+ background : #333a56;
+ height : 2.75em;
+ line-height : 2.75em;
+ padding : 0 1.35ex;
+}
+
+#header-logo img {
+ vertical-align : middle;
+ margin-right : 0.5em;
+}
+
+#header-subtitle {
+ color : #cacaca;
+ display : inline-block;
+ font-size : 0.75em;
+ font-style : italic;
+}
+
+#header-link,
+#header-link:hover,
+#header-logo:hover {
+ color : inherit;
+ background-color: inherit;
+ text-decoration : none;
+}
+
+h1 {
+ border-bottom : 1px solid #cacaca;
+ margin : 1em 1ex 1em 0;
+ padding : 0 0 0.75em 0;
+ font-size : 1.4em;
+}
+
+h2 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 1.3em;
+}
+
+h3 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 1.0em;
+}
+
+h4 {
+ margin : 1em 1ex 0.5ex 0;
+ font-size : 0.9em;
+}
+
+p, li {
+ color : #444;
+ line-height : 1.5em;
+}
+
+code {
+ font-family : monospace;
+ background-color: #efefef;
+ padding : 0 4px;
+}
+
+pre {
+ font-family : monospace;
+ background-color: #efefef;
+ padding : 10px;
+ overflow : auto;
+}
+
+pre code {
+ background-color: none;
+ padding : 0;
+}
+
+#content {
+ clear : both;
+ margin : 0;
+ padding : 0;
+ background-color: #ffffff;
+ overflow : hidden;
+}
+
+#nav {
+ background-color: #ffffff;
+ float : left;
+ margin : 0 1px 0 0;
+ padding : 1em 0;
+ border-right : 1px dotted #ccc;
+ width : 200px;
+}
+
+#nav ul {
+ margin : 0;
+ padding : 0;
+}
+
+#nav li {
+ list-style : none;
+ padding : 0;
+ margin : 0;
+}
+
+#nav li ul {
+ padding-left : 0.6em !important;
+}
+
+#nav li a {
+ display : block;
+ margin : 0;
+ padding : 0.8ex 2em 0.8ex 1em;
+}
+
+#nav li a:hover {
+ background-color: #eee;
+ text-decoration : none;
+}
+
+#nav li a.active {
+ color : #222;
+ font-weight : bold;
+}
+
+#main {
+ margin : 0 0 0 200px;
+ padding : 1.5em;
+ max-width : 50em;
+}
+
+#footer {
+ clear : both;
+ color : #666;
+ border-top : 1px solid #ccc;
+ font-size : 84%;
+ padding : 1em;
+ margin : 0 0 1.5em 0;
+}
+
+.left {
+ float : left;
+ margin : 0;
+ padding : 0;
+}
+
+.right {
+ float : right;
+ margin : 0;
+ padding : 0;
+}
+
+.definition {
+ padding-left : 2em;
+}
+
+.definition>p:first-child {
+ text-indent : -2em;
+}
+
+.reference {
+ padding-left : 2em;
+ text-indent : -2em;
+}
+
+.center {
+ text-align : center;
+}
+
+.article h1 {
+ margin-bottom : 0em;
+}
+
+.article .article-date {
+ font-size : 84%;
+}
+
+a.rss,a.twtxt {
+ display : block;
+ background : none no-repeat 0.9em center;
+ padding : 0.8ex 0 0.8ex 2.2em !important;
+ margin : 0;
+}
+
+a.rss {
+ background-image: url("/pub/rss.svg");
+}
+
+a.twtxt {
+ background-image: url("/pub/twtxt.svg");
+}
+
+ul.repo-log {
+ list-style-type : none;
+ margin : 0;
+ padding : 0;
+}
+
+ul.repo-log li {
+ font-family : monospace;
+ font-size : 84%;
+}
+
+ul.repo-log li .log-date {
+ font-weight : bold;
+ padding-right : 10px;
+}
diff --git a/noxz.tech/pub/twtxt.svg b/noxz.tech/pub/twtxt.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<svg
+ enable-background="new 0 0 30 30"
+ width="12"
+ height="12"
+ version="1.1"
+ viewBox="0 0 30 30"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+<g>
+<polyline
+ clip-rule="evenodd"
+ fill="#000000"
+ fill-rule="evenodd"
+ points="29.93,28.583 0,28.583 0,0 29.93,0 29.93,28.583"/>
+<polyline
+ fill="#ffffff"
+ points="4.562,7.106 25.189,7.106 25.189,10.053 4.562,10.053 4.562,7.106"/>
+<polyline
+ fill="#ffffff"
+ points="4.564,13 25.189,13 25.189,15.946 4.564,15.946 4.564,13"/>
+<polyline
+ fill="#ffffff"
+ points="4.564,18.893 16.349,18.893 16.349,21.84 4.564,21.84 4.564,18.893"/>
+</g>
+</svg>
diff --git a/noxz.tech/software/cidr2ip/.buildignore b/noxz.tech/software/cidr2ip/.buildignore
diff --git a/noxz.tech/software/cidr2ip/index.md b/noxz.tech/software/cidr2ip/index.md
@@ -0,0 +1,24 @@
+cidr2ip
+=======
+usage: **cidr2ip** <u>cidr</u>
+
+cidr2ip is a small and simple program for converting a CIDR into ip (mask).
+
+Installation
+------------
+Edit config.mk to match your local setup (cidr2ip is installed into the
+*/usr/local* namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Example usage of cidr2ip
+------------------------
+Print a complete CIDR to ip conversion table
+
+ for i in {1..32}; do
+ printf '\\%-5s' $i
+ cidr2ip $i
+ done
+
+get source [here](//git.noxz.tech/cidr2ip/).
diff --git a/noxz.tech/software/endrilo/.buildignore b/noxz.tech/software/endrilo/.buildignore
diff --git a/noxz.tech/software/index.md b/noxz.tech/software/index.md
@@ -0,0 +1,44 @@
+Software
+========
+Read about programs I've written below. All source code is available
+[here](//git.noxz.tech/), and also linked to from each software page
+respectively.
+
+{% comment %}
+### [cidr2ip](./cidr2ip/)
+``cidr2ip`` is a small and simple program for converting a CIDR into ip
+(mask).
+{% endcomment %}
+
+{% comment %}
+### [ip2cidr](./ip2cidr/)
+``ip2cidr`` is a small and simple program for converting an ip address (mask)
+into a CIDR, or returning an already valid CIDR if provided.
+{% endcomment %}
+
+### [rspan](./rspan/)
+``rspan`` executes a given command after a randomized time span.
+
+### [swps](./swps/)
+``swps``, Static Web Page Server, serves a given file on a specified port.
+
+{% comment %}
+### [wikid](./wikid/)
+``wikid`` is a quick and simple CLI-program for downloading and rendering
+wikipedia pages in your terminal.
+{% endcomment %}
+
+### [ztatus](./ztatus/)
+``ztatus`` creates a status bar for [dwm](https://dwm.suckless.org), and also
+acts as a simple notification daemon.
+
+Tools and scripts
+-----------------
+
+### [mpvd](./mpvd/)
+``mpvd`` is a simple script for daemonization of mpv togther with a controller,
+``mpvc``.
+
+### [satan-gh60](./satan-gh60/)
+A small tool for compiling and flashing my mechanical keyboard based on the
+Geekhack 60 board.
diff --git a/noxz.tech/software/ip2cidr/.buildignore b/noxz.tech/software/ip2cidr/.buildignore
diff --git a/noxz.tech/software/ip2cidr/index.md b/noxz.tech/software/ip2cidr/index.md
@@ -0,0 +1,22 @@
+ip2cidr
+=======
+usage: **ip2cidr** <u>ip</u>
+
+ip2cidr is a small and simple program for converting an ip address (mask)
+into a CIDR, or returning an already valid CIDR.
+
+Installation
+------------
+Edit config.mk to match your local setup (ip2cidr is installed into the
+*/usr/local* namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Example usage of ip2cidr
+------------------------
+Allow user to enter a subnet mask as either a CIDR or as an ip address:
+
+ read -p "enter subnet mask: " output; output=$(ip2cidr "$output")
+
+get source [here](//git.noxz.tech/ip2cidr/).
diff --git a/noxz.tech/software/mpvd/index.md b/noxz.tech/software/mpvd/index.md
@@ -0,0 +1,56 @@
+mpvd
+====
+usage: **mpvd**<br />
+or **mpvc** <u>action</u> [<u>arguments...</u>]
+
+mpvd is a simple script for daemonization of mpv togther with a controller,
+mpvc. It works by creating a fifo that mpv then uses for command input.
+
+Installation
+------------
+Edit config.mk to match your local setup (mpvd is installed into the /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
+
+ make install
+
+
+Example usage of mpvd
+---------------------
+Start the daemon
+
+ mpvd &
+
+Send commands
+
+ # append file to playlist
+ mpvc append mixtape.ogg
+
+ # load file to playlist (overwrites current playlist)
+ mpvc load better-mixtape.ogg
+
+ # goto next track
+ mpvc next
+
+ # goto previous track
+ mpvc prev
+
+ # seek 23 seconds backwards
+ mpvc seek -23
+
+ # toggle play/pause
+ mpvc toggle
+
+ # lower sound 10 units (or append an 'a' for lowering alsa sound 5%)
+ mpvc lower; mpvc alower
+
+ # raise sound 10 units (or append an 'a' for raising alsa sound 5%)
+ mpvc raise; mpvc araise
+
+ # toggle mute (or append an 'a' for toggeling alsa mute)
+ mpvc mute; mpvc amute
+
+ # set youtube-dl format
+ mpvc ytdl-format best
+
+get source [here](//git.noxz.tech/mpvd/).
diff --git a/noxz.tech/software/ncscpl/.buildignore b/noxz.tech/software/ncscpl/.buildignore
diff --git a/noxz.tech/software/rspan/index.md b/noxz.tech/software/rspan/index.md
@@ -0,0 +1,27 @@
+rspan
+=====
+usage: **rspan** <u>interval</u> <u>file</u> \[<u>arguments</u> <u>...</u>]
+
+rspan is a randomized time span creator, a program that upon execution creates
+a random timeout based on given interval. When the timeout ends, the given file
+will get executed with potentially given arguments.
+
+Installation
+------------
+Edit config.mk to match your local setup (rspan is installed into the
+*/usr/local* namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Example usage of rspan
+----------------------
+One common usage area of rspan is together with the crontab
+
+ # surprise Gorac some time in the morning
+ 30 6 * * * su -c 'rspan 120 surprise' gorac
+
+ # turn Steves lights off some time in the evening
+ 0 18 * * * su -c 'rspan 180 lights --off' steve
+
+get source [here](//git.noxz.tech/rspan/).
diff --git a/noxz.tech/software/satan-gh60/index.md b/noxz.tech/software/satan-gh60/index.md
@@ -0,0 +1,38 @@
+Satan GH60 (RevCHN)
+===================
+This tool is used for creating my configuration for a Satan GH60 RevCHN
+mechanical keyboard. There are three parts to this tool, the configuration
+(including keymap.c, config.h & rules.mk), the compilation and the flashing to
+the AVR microcontroller.
+
+My keyboard consists of a 4 layer configuration, the base layer, function layer
+with some XF86 keys, arrow keys layer and a pseudo mouse layer. See `keymap.c`
+for specifics.
+
+{: class="center"}
+![](keyboard.png)
+
+Prerequisites
+-------------
+Before being able to compile the source code the QMK firmware is needed, which
+can be cloned using `git clone https://github.com/qmk/qmk_firmware`. The
+`avr-gcc` compiler is also needed together with some other prerequisites (read
+more on [qmk.fm](https://qmk.fm)).
+
+Before being able to flash the microcontroller the TKG toolkit is needed and
+configured. Clone using `git clone https://github.com/kairyu/tkg-toolkit`. `cd`
+into tkg-toolkit and run `./setup.sh`. For a Satan GH60, you'll choose:
+
+ 2. GH60 RevCHN
+ Y (continue)
+ 1. Default
+ 1. atmel_dfu
+
+Installation
+------------
+When all is prepared the firmware with my config can be compiled and flashed
+using:
+
+ make flash
+
+get source [here](//git.noxz.tech/satan-gh60/).
diff --git a/noxz.tech/software/satan-gh60/keyboard.png b/noxz.tech/software/satan-gh60/keyboard.png
diff --git a/noxz.tech/software/swps/index.md b/noxz.tech/software/swps/index.md
@@ -0,0 +1,23 @@
+swps
+====
+usage: **swps** <u>port</u> <u>file</u> \[<u>-h</u>]
+
+The purpose of **swps** is to serve a single static <u>file</u> as a web
+server. Besides serving a file in the root, **swps** also handles 301, 403 and
+404.
+
+Installation
+------------
+Edit config.mk to match your local setup (swps is installed into the
+*/usr/local* namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Example usage of swps
+---------------------
+
+ # serve index.html on port 8080
+ swps 8080 index.html
+
+get source [here](//git.noxz.tech/swps/).
diff --git a/noxz.tech/software/wikid/.buildignore b/noxz.tech/software/wikid/.buildignore
diff --git a/noxz.tech/software/wikid/index.md b/noxz.tech/software/wikid/index.md
@@ -0,0 +1,30 @@
+wikid
+=====
+usage: **wikid** [<u>-hrt</u>] [<u>-l lang</u>] <u>term</u>
+
+wikid is a quick and simple CLI-program for downloading and rendering wikipedia
+pages in your terminal. And it's not **wikid** as in *wiki daemon*, but as in
+*wicked, Strikingly good, and effective*.
+
+Requirements
+------------
+wikid uses the **curl** library to download the wiki pages, and **ncurses** for
+retrieving the terminal width for line output.
+
+Installation
+------------
+Edit config.mk to match your local setup (wikid is installed into the
+/usr/local namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Example usage of wikid
+----------------------
+Read about wikipedia, using `less`
+
+ wikid wikipedia | less
+
+Read about wikipedia in german, using `less`
+
+ wikid -lde wikipedia | less
diff --git a/noxz.tech/software/ztatus/index.md b/noxz.tech/software/ztatus/index.md
@@ -0,0 +1,38 @@
+ztatus
+======
+usage: **ztatus** \[**-d**] \[**-n** <u>text</u>]
+
+ztatus creates a status bar for dwm, and other window managers using the root
+WM_NAME as input for displaying a status bar. Except for creating a status bar,
+ztatus also acts as a simple notification daemon.
+
+Measurements
+------------
+ztatus displays measurements from volume, battery, temperature, cpu usage,
+memory usage, mail, packages, and display date and time.
+
+Installation
+------------
+Edit config.mk to match your local setup (ztatus is installed into the
+/usr/local namespace by default), then simply enter the following command to
+install (if necessary as root):
+
+ make clean install
+
+Customization
+-------------
+ztatus can be customized by creating a custom config.h and (re)compiling the
+source code.
+
+
+Example usage of ztatus
+-----------------------
+Start the daemon
+
+ ztatus -d &
+
+Send notification
+
+ ztatus -n "hello world!"
+
+get source [here](//git.noxz.tech/ztatus/).
diff --git a/noxz.tech/twtxt.txt b/noxz.tech/twtxt.txt
@@ -0,0 +1,24 @@
+#
+# | |___ _| |___ _| |_
+# | __\ \ /\ / / __\ \/ / __|
+# | |_ \ V V /| |_ > <| |_
+# \__| \_/\_/ \__/_/\_\\__|
+#
+# Twtxt is an open, distributed
+# microblogging platform that
+# uses human-readable text files,
+# common transport protocols, and
+# free software.
+#
+# Learn more about twtxt at
+# https://github.com/buckket/twtxt
+#
+# --------------------------------
+#
+# nick : z0noxz
+# url : https://noxz.tech/twtxt.txt
+# lang : en
+#
+
+2019-09-17T08:56:19+02:00 First message of 'twtxt'
+2019-09-17T09:14:08+02:00 Apple, not so secure after all: https://www.youtube.com/watch?v=zvTKikwUMRg
diff --git a/twtxt b/twtxt
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+scrpath="$(cd "$(dirname "$0")"; pwd)"
+
+msg="$(printf '%s\t%s\n' $(date +%Y-%m-%dT%H:%M:%S%:z) "$1")"
+
+printf "Send this message (y/N)?\n> %s\n" "$msg"
+
+read answer && [ "$answer" = "${answer#[Yy]}" ] && return
+
+echo "$msg" >> "$scrpath/noxz.tech/twtxt.txt"