noxz-sites

A collection of a builder and various scripts creating the noxz.tech sites
git clone git://git.noxz.tech/noxz-sites
Log | Files | Refs | README | LICENSE

commit 144fdd050f6f5612a9ccbc48a7303c0a9797626a
Author: Chris Noxz <chris@noxz.tech>
Date:   Thu, 19 Sep 2019 13:51:16 +0200

Initial commit for public release

Diffstat:
A.gitignore | 12++++++++++++
ALICENSE | 21+++++++++++++++++++++
AMakefile | 49+++++++++++++++++++++++++++++++++++++++++++++++++
AREADME.md | 14++++++++++++++
Aapply-extensions.sh | 23+++++++++++++++++++++++
Abuild-blog.sh | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abuild-git.sh | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abuilder.c | 429+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig.def.h | 32++++++++++++++++++++++++++++++++
Aconfig.mk | 6++++++
Agit.noxz.tech/pub/logo.svg | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Agit.noxz.tech/pub/style.css | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc.noxz.tech/.buildignore | 0
Airc.noxz.tech/index.swps | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/.title | 1+
Anoxz.tech/about/copying-policy/index.md | 19+++++++++++++++++++
Anoxz.tech/about/index.md | 41+++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/about/questions-&-answers/index.md | 19+++++++++++++++++++
Anoxz.tech/about/tools/index.md | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/articles.nobuild/.buildignore | 0
Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore | 0
Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate | 1+
Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md | 21+++++++++++++++++++++
Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png | 0
Anoxz.tech/dictionary/index.md | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/dotfiles/index.md | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/index.md | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/music/.buildignore | 0
Anoxz.tech/pub/.buildignore | 0
Anoxz.tech/pub/chrisnoxz.pub | 1+
Anoxz.tech/pub/gpg-public-key.asc | 30++++++++++++++++++++++++++++++
Anoxz.tech/pub/logo.black.svg | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/pub/logo.svg | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/pub/rss.svg | 34++++++++++++++++++++++++++++++++++
Anoxz.tech/pub/style.css | 223+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/pub/twtxt.svg | 27+++++++++++++++++++++++++++
Anoxz.tech/software/cidr2ip/.buildignore | 0
Anoxz.tech/software/cidr2ip/index.md | 24++++++++++++++++++++++++
Anoxz.tech/software/endrilo/.buildignore | 0
Anoxz.tech/software/index.md | 44++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/software/ip2cidr/.buildignore | 0
Anoxz.tech/software/ip2cidr/index.md | 22++++++++++++++++++++++
Anoxz.tech/software/mpvd/index.md | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anoxz.tech/software/ncscpl/.buildignore | 0
Anoxz.tech/software/rspan/index.md | 27+++++++++++++++++++++++++++
Anoxz.tech/software/satan-gh60/index.md | 38++++++++++++++++++++++++++++++++++++++
Anoxz.tech/software/satan-gh60/keyboard.png | 0
Anoxz.tech/software/swps/index.md | 23+++++++++++++++++++++++
Anoxz.tech/software/wikid/.buildignore | 0
Anoxz.tech/software/wikid/index.md | 30++++++++++++++++++++++++++++++
Anoxz.tech/software/ztatus/index.md | 38++++++++++++++++++++++++++++++++++++++
Anoxz.tech/twtxt.txt | 24++++++++++++++++++++++++
Atwtxt | 11+++++++++++
53 files changed, 2484 insertions(+), 0 deletions(-)

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\">&nbsp;</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://git.noxz.tech/$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://git.noxz.tech/\">...</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("&raquo; ", stdout); + else + fputs("&rsaquo; ", 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" + " &copy; 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! diff --git a/noxz.tech/about/questions-&-answers/index.md b/noxz.tech/about/questions-&-answers/index.md @@ -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 Binary files differ. 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 Binary files differ. 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"