Ghostscript has a feature to merge multiple pdf files
- into one. Although ImageMagick also has this feature, I
- prefer this one, as it doesn’t rasterize and scales down the
- pdf files.
- gs -dNOPAUSE -sDEVICE = pdfwrite \
+
+
+
+
+
+
+
+
+Merge pdfs
+Using Ghostscript
+Ghostscript has a feature to merge multiple pdf files into one.
+Although ImageMagick also has this feature, I prefer this one, as it
+doesn’t rasterize and scales down the pdf files.
+gs -dNOPAUSE -sDEVICE = pdfwrite \
-sOUTPUTFILE = output.pdf \
-dBATCH 1.pdf 2.pdf
-
-
-
+
+
+
-
diff --git a/public_html/eh/eh/eh/eh-eh/rsync-android.html b/public_html/eh/eh/eh/eh-eh/rsync-android.html
index 98c0626..d291267 100644
--- a/public_html/eh/eh/eh/eh-eh/rsync-android.html
+++ b/public_html/eh/eh/eh/eh-eh/rsync-android.html
@@ -1,168 +1,148 @@
-
-
+
-
-
-
-
-
- Using rsync on Android to syncronise my Music library
-
-
-
-
+
+
+
+
+ Using rsync on Android to syncronise my Music library
+
+
+
-
-
-
-
-
-
-
-
-
- Setup Termux
- Install Termux using F-Droid.
- Update software repos.
-
- Grant file access permissions using.
-
- Establishing an ssh
- connection
- If network (such as eduroam) is blocking ssh trafic
- between machines, open a Wi-Fi Hotspot on your Linux machine
- and connect the Android device to it before using
- rsync or ssh.
- Configuring Android
- Install the openssh server on Termux.
-
- Start the ssh server daemon.
-
- Get the ip address of the Android machine (in the
- Hotspot).
-
- Warning: cannot open /proc/net/dev (Permission denied). Limited output.
+
+
+
+
+
+
+
+
+Setup Termux
+Install Termux using F-Droid.
+Update software repos.
+
+Grant file access permissions using.
+
+Establishing an ssh
+connection
+If network (such as eduroam) is blocking ssh trafic between machines,
+open a Wi-Fi Hotspot on your Linux machine and connect the Android
+device to it before using rsync or ssh.
+Configuring Android
+Install the openssh server on Termux.
+
+Start the ssh server daemon.
+
+Get the ip address of the Android machine (in the Hotspot).
+
+Warning: cannot open /proc/net/dev (Permission denied). Limited output.
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
@@ -174,49 +154,62 @@ rmnet0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1280
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.42.0.200 netmask 255.255.255.0 broadcast 10.42.0.210
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
- In this case 10.42.0.200.
- The ssh server should now be running and listening on
- port 8022. You can check by running
-
- For me <ip_address> whould be
- 10.42.0.200.
- Get the username.
-
- u0_a700
- Set a password for this user.
-
- Connecting to Android
- via ssh
- Make sure you have an ssh key pair on the Linux system.
- If not generate one using ssh-keygen.
- Now connect to Android by ssh.
- ssh < username> @< ip_address> -p 8022
- Syncronising files
- with rsync
- Install rsync on Termux and Linux. Make sure
- to keep your own openssl config.
-
- Now on your Linux machine, syncronise your Music library
- with rsync.
- rsync -av -e "ssh -p 8022" ~/Music < username> @< ip_address> :/data/data/com.termux/files/home/storage/music
-
-
-
+In this case 10.42.0.200.
+The ssh server should now be running and listening on port 8022. You
+can check by running
+
+For me <ip_address> whould be 10.42.0.200.
+Get the username.
+
+u0_a700
+Set a password for this user.
+
+Connecting to Android via
+ssh
+Make sure you have an ssh key pair on the Linux system. If not
+generate one using ssh-keygen.
+Now connect to Android by ssh.
+ssh < username> @< ip_address> -p 8022
+Syncronising files with
+rsync
+Install rsync on Termux and Linux. Make sure to keep
+your own openssl config.
+
+Now on your Linux machine, syncronise your Music library with
+rsync.
+rsync -av -e "ssh -p 8022" ~/Music < username> @< ip_address> :/data/data/com.termux/files/home/storage/music
+
+Android uses a Database to store files. In order to play your music,
+this database needs to be refreshed. This can be achieved by a reboot or
+by using adb to manually refresh it.
+
+Connect the Android device via USB and see if it is listed.
+
+If it is, restart adb in TCP mode with port 5555
+
+Connect to the device using its .
+
+Refresh MediaStore.
+adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN -d file:///data/data/com.termux/files/home/storage/music/
+
+
+
-
diff --git a/public_html/eh/eh/eh/eh-eh/scripts/shork.js b/public_html/eh/eh/eh/eh-eh/scripts/shork.js
deleted file mode 100644
index 4556b71..0000000
--- a/public_html/eh/eh/eh/eh-eh/scripts/shork.js
+++ /dev/null
@@ -1,102 +0,0 @@
-let shork_image = document.getElementById("shork");
-
-let zoomies = 4;
-let turnies = 0.2;
-
-let shork = {x: 4, y: 8};
-let rotation = 0;
-let shork_init = transform(shork, -rotation);
-shork_image.style.transform = `matrix(${shork_init.a}, ${shork_init.b}, ${shork_init.c}, ${shork_init.d}, ${shork_init.x}, ${shork_init.y})`;
-
-let mouse = {x: 0, y: 0};
-onmousemove = function(e){
- mouse.x = e.pageX;
- mouse.y = e.pageY;
-}
-
-let direction = 0;
-let movement = 0;
-let target = 0;
-
-function move() {
- direction = vector(shork, mouse);
-
- if (norm(direction) >= 4) {
- movement = scalar(angletovec(rotation), zoomies * norm(direction)/128);
- shork = add(shork, movement);
- target = angle(direction);
- rotation = interpolate(rotation, target, turnies) + Math.sin(norm(movement))/8;
- }
-
- let trans = transform(shork, -rotation);
- shork_image.style.transform = `matrix(${trans.a}, ${trans.b}, ${trans.c}, ${trans.d}, ${trans.x}, ${trans.y})`;
-
- setTimeout(move, 30);
-}
-
-shork_image.addEventListener("click", function(e) {move()}, {once: true});
-
-function vector(a, b) {
- return {
- x: b.x - a.x,
- y: b.y - a.y
- };
-}
-
-function angle(v) {
- return Math.atan2(v.y, v.x);
-}
-
-function angletovec(a) {
- return {x: Math.cos(a), y: Math.sin(a)};
-}
-
-function norm(v) {
- return Math.sqrt(Math.pow(v.x, 2) + Math.pow(v.y, 2));
-}
-
-function unit(v) {
- let length = norm(v);
-
- if (length == 0) return {x: 0, y: 0};
-
- return {x: v.x / length, y: v.y / length};
-}
-
-function scalar(v, a) {
- return {x: v.x * a, y: v.y * a};
-}
-
-function add(v, u) {
- return {x: v.x + u.x, y: v.y + u.y};
-}
-
-function round(v) {
- return {x: Math.round(v.x), y: Math.round(v.y)};
-}
-
-function clamp(a, min, max) {
- if (a < min) return min;
- if (a > max) return max;
- return a;
-}
-
-function interpolate(a, b, c) {
- let d = Math.abs(a - b)
- if (d > Math.abs(a - b - 2 * Math.PI)) a = a - 2 * Math.PI;
- if (d > Math.abs(a - b + 2 * Math.PI)) a = a + 2 * Math.PI;
-
- if (a < b) a = clamp(a + c, a, b);
- if (a > b) a = clamp(a - c, b, a);
-
- a += 3 * Math.PI;
- a = a % (2 * Math.PI);
- a -= Math.PI;
-
- return a;
-}
-
-function transform(v, a) {
- return {a: Math.cos(a), b: -Math.sin(a), c: Math.sin(a), d: Math.cos(a), x: v.x, y: v.y};
-}
-
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_left.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_left.svg
new file mode 100644
index 0000000..2412435
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_left.svg
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_left_dark.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_left_dark.svg
new file mode 100644
index 0000000..7ae7a67
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_left_dark.svg
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo.svg
new file mode 100644
index 0000000..cecb1db
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo.svg
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo_dark.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo_dark.svg
new file mode 100644
index 0000000..d01e673
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_logo_dark.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_right.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_right.svg
new file mode 100644
index 0000000..7da7c88
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_right.svg
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/cups_right_dark.svg b/public_html/eh/eh/eh/eh-eh/styles/images/cups_right_dark.svg
new file mode 100644
index 0000000..5770ecf
--- /dev/null
+++ b/public_html/eh/eh/eh/eh-eh/styles/images/cups_right_dark.svg
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.png b/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.png
index a08fa23..56e8624 100644
Binary files a/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.png and b/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.png differ
diff --git a/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.xcf b/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.xcf
index effd994..bd0e140 100644
Binary files a/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.xcf and b/public_html/eh/eh/eh/eh-eh/styles/images/shark-top-small.xcf differ
diff --git a/public_html/eh/eh/eh/eh-eh/styles/style.css b/public_html/eh/eh/eh/eh-eh/styles/style.css
index 056a20d..e6e14cc 100644
--- a/public_html/eh/eh/eh/eh-eh/styles/style.css
+++ b/public_html/eh/eh/eh/eh-eh/styles/style.css
@@ -1,221 +1,114 @@
:root {
- --foreground: #586e75;
- --background: #fdf6e3;
- --html-border: #eee8d5;
- --html-background: #268bd2;
- --body-background: linear-gradient(to bottom, #2aa198, #268bd2);
- --blockquote-text: #657b83;
- --blockquote-border: #eee8d5;
- --button-primary: #fdf6e3;
- --button-secondary: #eee8d5;
- --code-color: #657b83;
- --code-background: #fdf6e3;
- --code-line-number-color: #93a1a1;
- --code-line-number-background: #eee8d5;
- --code-comment-color: #93a1a1;
- --code-keyword-color: #586e75;
+ --foreground: #1a1a1a;
+ --background: #fdfdfdf0;
+ --border: #c9c9c9;
+ --html-background: #e3e3e3;
+ --blockquote-text: #606060;
+ --blockquote-border: #e6e6e6;
+ --button-border: #e3e3e3;
+ --button-background: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
:root {
- --foreground: #93a1a1;
- --background: #002b36;
- --html-border: #073642;
- --html-background: #6c71c4;
- --body-background: linear-gradient(to bottom, #268bd2, #6c71c4);
- --blockquote-text: #839496;
- --blockquote-border: #073642;
- --button-primary: #073642;
- --button-secondary: #002b36;
- --code-color: #839496;
- --code-background: #002b36;
- --code-line-number-color: #586e75;
- --code-line-number-background: #073642;
- --code-comment-color: #586e75;
- --code-keyword-color: #93a1a1;
+ --foreground: #fdfdfd;
+ --background: #1a1a1af0;
+ --border: #4c4c4c;
+ --html-background: #303030;
+ --blockquote-text: #e6e6e6;
+ --blockquote-border: #606060;
+ --button-border: #4c4c4c;
+ --button-background: #404040;
}
}
-pre.numberSource code > span > a:first-child::before {
- background-color: var(--code-line-number-background);
- color: var(--code-line-number-color);
-}
-
-pre.numberSource {
- margin-left: 3em;
- border-left: none;
- padding-left: 4px;
-}
-
-@media screen {
- pre > code.sourceCode > span > a:first-child::before { text-decoration: none; }
-}
-
-div.sourceCode {
- color: var(--code-color);
- background-color: var(--code-background);
- line-height: 80%;
-}
-
-code span.co { color: var(--code-comment-color); font-style: italic; } /* Comment */
-code span.do { color: var(--code-comment-color); font-style: italic; } /* Documentation */
-code span.kw { color: var(--code-keyword-color); font-weight: bold; } /* Keyword */
-
html {
color: var(--foreground);
+ /*background: url("recursion.gif");*/
background: var(--html-background);
+ background-repeat: repeat-y;
+ background-size: cover;
font-family: serif;
font-size: 14pt;
}
body {
- margin: 0;
- background: var(--body-background);
-}
-
-main {
- max-width: 48em;
-
+ background-color: var(--background);
+ border: solid 1px var(--border);
margin: 0 auto;
+ max-width: 48em;
padding-left: 50pt;
padding-right: 50pt;
padding-top: 50pt;
padding-bottom: 50pt;
-
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
-
- background-color: var(--background);
- border-left: solid 3pt var(--html-border);
- border-right: solid 3pt var(--html-border);
}
-#shork {
- position: absolute;
- z-index: 1;
- left: -36px;
- top: -32px;
- width: 64px;
- transform-origin: 50% 50%;
+#tv-screen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: -1;
}
#page-header {
display: flex;
flex-direction: row;
- gap: 2pt;
+ flex-wrap: nowrap;
justify-content: space-between;
- max-width: 60em;
-
- margin: 0 auto;
- padding: 4pt;
-
+ text-align: left;
+ border: 4pt ridge var(--border);
background: url("images/shark-top-small.png");
background-size: contain;
- border: solid 3pt var(--html-border);
}
-#page-header div {
- display: flex;
- justify-content: center;
- gap: 2pt;
+#page-header li {
+ list-style: none;
+ display: inline-block;
+}
+
+#page-header a:active {
+ border: 2pt inset var(--button-border)
}
#page-header a {
- display: block;
color: var(--foreground);
text-decoration: none;
- padding: 2pt;
- border-radius: 3pt;
-}
-
-.page-header-button {
- background: linear-gradient(to bottom, var(--button-primary) 0%, var(--button-secondary) 100%);
- border: 1pt solid var(--blockquote-border);
-}
-
-.page-header-button:active {
- background: linear-gradient(to bottom, var(--button-secondary) 0%, var(--button-primary) 100%);
-}
-
-.rss-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ff925a 0%, #d95c29 100%);
- border: 1pt solid #f87741;
-}
-
-.rss-button:active {
- background: linear-gradient(to bottom, #d95c29 0%, #fb9d3a 100%);
-}
-
-.hedgedoc-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #f45c39 0%, #b51f08 100%);
- border: 1pt solid #d44021;
-}
-
-.hedgedoc-button:active {
- background: linear-gradient(to bottom, #b51f08 0%, #f45c39 100%);
-}
-
-.nextcloud-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #539ad5 0%, #00679e 100%);
- border: 1pt solid #3480b9;
-}
-
-.nextcloud-button:active {
- background: linear-gradient(to bottom, #00679e 0%, #539ad5 100%);
-}
-
-.forgejo-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ff7740 0%, #c2410c 100%);
- border: 1pt solid #e15c27;
-}
-
-.forgejo-button:active {
- background: linear-gradient(to bottom, #c2410c 0%, #ff7740 100%);
-}
-
-.jupyter-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ffae5c 0%, #f37524 100%);
- border: 1pt solid #ff903f;
-}
-
-.jupyter-button:active {
- background: linear-gradient(to bottom, #f37524 0%, #ffae5c 100%);
+ margin: 4pt;
+ padding: 4pt;
+ border: 2pt outset var(--button-border);
+ background-color: var(--button-background)
}
+#page-header ul,
#articles ul {
padding-left: 0;
}
#articles li {
list-style: none;
+ display: block;
}
.articles-header {
- margin: 8pt 0 4pt 0;
- text-align: left;
-}
-
-.articles-footer {
display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
justify-content: space-between;
- margin-top: 4pt;
}
.articles-title {
+ margin: 8pt 0 4pt 0;
font-size: 14pt;
font-weight: bold;
}
.articles-author {
- font-style: italic;
+ margin: 12pt 0 4pt 0;
}
.articles-summary {
@@ -223,29 +116,42 @@ main {
}
.articles-date {
+ margin: 0;
text-align: right;
}
#page-footer {
- display: flex;
- justify-content: center;
- max-width: 60em;
-
- margin: 0 auto;
- padding: 4pt;
-
+ border: 4pt ridge var(--border);
background: url("images/shark-top-small.png");
background-size: contain;
- border: solid 3pt var(--html-border);
+ display: flex;
+ justify-content: center;
}
-#page-footer nav {
+#page-footer p {
display: flex;
+ flex-direction: row;
align-items: center;
}
+/*
+#TOC {
+ padding: 24px;
+}
+
+section {
+ display: flex;
+ flex-direction: row;
+}
+
+article {
+ padding: 12px;
+ overflow: auto;
+}
+*/
+
@media (max-width: 600px) {
- main {
+ body {
font-size: 0.9em;
padding: 12pt;
}
@@ -253,10 +159,6 @@ main {
h1 {
font-size: 1.8em;
}
-
- #page-header {
- flex-direction: column;
- }
}
@media print {
@@ -284,14 +186,6 @@ main {
page-break-after: avoid;
}
- a {
- color: black;
- }
-
- #page {
- border: none;
- }
-
#page-header,
#page-footer {
display: none;
@@ -390,20 +284,8 @@ hr {
margin: 1em 0;
}
-figure {
- margin: 1em 0;
- width: 100%;
- overflow-x: auto;
- display: block;
- text-align: center;
-}
-
-figcaption {
- margin-top: 0.75em;
-}
-
table {
- margin: 1em auto;
+ margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
diff --git a/public_html/eh/eh/eh/index.html b/public_html/eh/eh/eh/index.html
old mode 100644
new mode 100755
index a3c963c..9ec3fb5
--- a/public_html/eh/eh/eh/index.html
+++ b/public_html/eh/eh/eh/index.html
@@ -1,7 +1,7 @@
- EH-EH
+ Page Title
diff --git a/public_html/eh/eh/index.html b/public_html/eh/eh/index.html
old mode 100644
new mode 100755
index 7c98223..504e6ec
--- a/public_html/eh/eh/index.html
+++ b/public_html/eh/eh/index.html
@@ -1,7 +1,7 @@
- EH
+ Page Title
diff --git a/public_html/eh/index.html b/public_html/eh/index.html
old mode 100644
new mode 100755
index b89dfe6..f539053
--- a/public_html/eh/index.html
+++ b/public_html/eh/index.html
@@ -1,7 +1,7 @@
- EH
+ Page Title
diff --git a/public_html/index.html b/public_html/index.html
index 130854e..753c302 100644
--- a/public_html/index.html
+++ b/public_html/index.html
@@ -1,7 +1,7 @@
- NEVER EVER EVER. DEH
+ Page Title
diff --git a/scripts/shork.js b/scripts/shork.js
deleted file mode 100644
index 4556b71..0000000
--- a/scripts/shork.js
+++ /dev/null
@@ -1,102 +0,0 @@
-let shork_image = document.getElementById("shork");
-
-let zoomies = 4;
-let turnies = 0.2;
-
-let shork = {x: 4, y: 8};
-let rotation = 0;
-let shork_init = transform(shork, -rotation);
-shork_image.style.transform = `matrix(${shork_init.a}, ${shork_init.b}, ${shork_init.c}, ${shork_init.d}, ${shork_init.x}, ${shork_init.y})`;
-
-let mouse = {x: 0, y: 0};
-onmousemove = function(e){
- mouse.x = e.pageX;
- mouse.y = e.pageY;
-}
-
-let direction = 0;
-let movement = 0;
-let target = 0;
-
-function move() {
- direction = vector(shork, mouse);
-
- if (norm(direction) >= 4) {
- movement = scalar(angletovec(rotation), zoomies * norm(direction)/128);
- shork = add(shork, movement);
- target = angle(direction);
- rotation = interpolate(rotation, target, turnies) + Math.sin(norm(movement))/8;
- }
-
- let trans = transform(shork, -rotation);
- shork_image.style.transform = `matrix(${trans.a}, ${trans.b}, ${trans.c}, ${trans.d}, ${trans.x}, ${trans.y})`;
-
- setTimeout(move, 30);
-}
-
-shork_image.addEventListener("click", function(e) {move()}, {once: true});
-
-function vector(a, b) {
- return {
- x: b.x - a.x,
- y: b.y - a.y
- };
-}
-
-function angle(v) {
- return Math.atan2(v.y, v.x);
-}
-
-function angletovec(a) {
- return {x: Math.cos(a), y: Math.sin(a)};
-}
-
-function norm(v) {
- return Math.sqrt(Math.pow(v.x, 2) + Math.pow(v.y, 2));
-}
-
-function unit(v) {
- let length = norm(v);
-
- if (length == 0) return {x: 0, y: 0};
-
- return {x: v.x / length, y: v.y / length};
-}
-
-function scalar(v, a) {
- return {x: v.x * a, y: v.y * a};
-}
-
-function add(v, u) {
- return {x: v.x + u.x, y: v.y + u.y};
-}
-
-function round(v) {
- return {x: Math.round(v.x), y: Math.round(v.y)};
-}
-
-function clamp(a, min, max) {
- if (a < min) return min;
- if (a > max) return max;
- return a;
-}
-
-function interpolate(a, b, c) {
- let d = Math.abs(a - b)
- if (d > Math.abs(a - b - 2 * Math.PI)) a = a - 2 * Math.PI;
- if (d > Math.abs(a - b + 2 * Math.PI)) a = a + 2 * Math.PI;
-
- if (a < b) a = clamp(a + c, a, b);
- if (a > b) a = clamp(a - c, b, a);
-
- a += 3 * Math.PI;
- a = a % (2 * Math.PI);
- a -= Math.PI;
-
- return a;
-}
-
-function transform(v, a) {
- return {a: Math.cos(a), b: -Math.sin(a), c: Math.sin(a), d: Math.cos(a), x: v.x, y: v.y};
-}
-
diff --git a/src/articles.json b/src/articles.json
index ee77c50..4872ffd 100644
--- a/src/articles.json
+++ b/src/articles.json
@@ -2,41 +2,26 @@
"articles": [
{
"author": "Never",
- "date": "2026-06-22",
- "email": "n.gude@posteo.de",
- "summary": "Inspiriert von der Küche der Kuhtreiber des Wilden Westens.",
- "title": "Bohnen und Maisbrot",
- "updated": "2026-06-22T20:47+02:00",
- "filename": "beans-and-cornbread"
- },
- {
- "author": "Never",
- "date": "2026-01-12",
- "email": "n.gude@posteo.de",
- "summary": "As Spotify is getting enshittified by capitalism, keeping a music library is kind of essential. Here I use rsync to syncronise my library with my Android smartphone.",
- "title": "Using rsync on Android to syncronise my Music library",
- "updated": "2026-01-12T16:24+01:00",
- "filename": "rsync-android"
- },
- {
- "author": "Never",
- "date": "2026-01-09",
- "email": "n.gude@posteo.de",
+ "date": "9.1.2026",
"subtitle": "Some unintuitive quirks of Latex",
"summary": "Latex undoubtedly has some quirks. Some of them have a rather unintuitive solution. In this article I cover some quirks and solutions I have encountered.",
"title": "Latex Endeavors",
- "updated": "2026-01-10T16:23+01:00",
- "filename": "latex-endeavors"
+ "filename": " latex-endeavors"
},
{
"author": "Never",
- "date": "2025-07-25",
- "email": "n.gude@posteo.de",
+ "date": "25.7.2025",
"subtitle": "Neat things I picked up along the way",
"summary": "Tricks and tools I learned about, while tweaking my Linux sytem or trying to do productive things.",
"title": "Random linux utilities",
- "updated": "2025-07-25T16:24+01:00",
- "filename": "random-linux-utils"
+ "filename": " random-linux-utils"
+ },
+ {
+ "author": "Never",
+ "date": "12.01.2026",
+ "summary": "As Spotify is getting enshittified by capitalism, keeping a music library is kind of essential. Here I use rsync to syncronise my library with my Android smartphone.",
+ "title": "Using rsync on Android to syncronise my Music library",
+ "filename": " rsync-android"
}
]
}
diff --git a/src/articles/beans-and-cornbread.md b/src/articles/beans-and-cornbread.md
deleted file mode 100644
index 9a80595..0000000
--- a/src/articles/beans-and-cornbread.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-title: Bohnen und Maisbrot
-author: Never
-email: n.gude@posteo.de
-date: 2026-06-22
-updated: 2026-06-22T20:47+02:00
-summary: Inspiriert von der Küche der Kuhtreiber des Wilden Westens.
----
-
-# Bohnen
-| Maße | Zutaten |
-|-------------:|:--------|
-| 2 | Zwiebeln |
-| 2 | Knoblauchzehen |
-| 1 | rote Chili (Peperoni/Chile de árbol[^arbol]) |
-| | Kreuzkümmel |
-| | Speckwürfel (Optional) |
-| 1 l | Brühe (Gemüse/Huhn/Rind) |
-| 1 Dose | Kidneybohnen |
-| 1 Dose | Pintobohnen oder andere Bohnen |
-| 1 | Chile Ancho[^ancho] oder geräuchertes Paprikapulver |
-| | Petersilienstängel |
-| | Limettensaft |
-| | Salz
-
-[^arbol]: [Chile de árbol](https://en.wikipedia.org/wiki/Chile_de_%C3%A1rbol); Eine kleine, scharfe, rote Chili. Meist getrocknet zu finden.
-[^ancho]: [Chile Ancho](https://en.wikipedia.org/wiki/Poblano); Eine große getrocknete Chili mit rauchigem Geschmack.
-
-## Zubereitung
-
-1. Zwiebeln, Knoblauch, rote Chili, Kreuzkümmel und Speckwürfel anbraten.
-
-2. Mit Brühe ablöschen und die Bohnen, Ancho Chili und Petersilienstängel hinzufügen.
- Köcheln und etwas reduzieren lassen.
-
-3. Mit Salz und Limettensaft abschmecken.
-
-# Maisbrot
-
-| Maße | Zutaten |
-|-------------:|:--------|
-| 1 Tasse | Mehl |
-| 1 Tasse | Maismehl |
-| 4 TL | Backpulver |
-| | Salz |
-| 1/4 Tasse | brauner Zucker |
-| 1 | Ei |
-| 1/3 Tasse | flüssige Butter |
-| 1 - 2 Tassen | Milch oder Buttermilch |
-| 1/3 Tasse | flüssige Butter |
-| | Speckwürfel (Optional) |
-| | Gehackte grüne Chilis (Optional) |
-
-## Zubereitung
-
-1. Trockene Zutaten mischen.
-
-2. Ei und Butter unterrühren.
-
-3. Schrittweise die Milch hinzugeben, bis eine zähflüssige Masse
- entstanden ist.
-
diff --git a/src/articles/latex-endeavors.md b/src/articles/latex-endeavors.md
index 9ce1d3d..fb19c9a 100644
--- a/src/articles/latex-endeavors.md
+++ b/src/articles/latex-endeavors.md
@@ -2,9 +2,7 @@
title: Latex Endeavors
subtitle: Some unintuitive quirks of Latex
author: Never
-email: n.gude@posteo.de
-date: 2026-01-09
-updated: 2026-01-10T16:23+01:00
+date: 9.1.2026
summary: Latex undoubtedly has some quirks. Some of them have a rather unintuitive solution.
In this article I cover some quirks and solutions I have encountered.
---
diff --git a/src/articles/random-linux-utils b/src/articles/random-linux-utils
new file mode 100644
index 0000000..27d3079
--- /dev/null
+++ b/src/articles/random-linux-utils
@@ -0,0 +1,18 @@
+ [1m[23m[39m[49m[24m[29mLatex Endeavors[0m
+ Some unintuitive quirks of Latex
+
+ Never
+
+ [22m[3m[39m[49m[24m[29m9.1.2026[0m
+
+ ────────────────────
+
+[1m[23m[39m[49m[24m[29mBIBLATEX AND BIBER[0m
+
+[1m[23m[39m[49m[24m[29mBiber doesn’t run[0m
+
+Biber doens’t run if the (fedora) package [22m[23m[31m[47m[24m[29m libxcrypt-compat [0m is missing.
+It will fail with the error message
+
+ [22m[23m[31m[49m[24m[29mbiber: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory[0m
+[0m]8;;\
\ No newline at end of file
diff --git a/src/articles/random-linux-utils.html b/src/articles/random-linux-utils.html
new file mode 100644
index 0000000..df33063
--- /dev/null
+++ b/src/articles/random-linux-utils.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+ Latex Endeavors
+
+
+
+
+
+
+
+
+
+
+
+
+
+BibLaTeX and Biber
+Biber doesn’t run
+Biber doens’t run if the (fedora) package
+libxcrypt-compat is missing. It will fail with the error
+message
+biber: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory
+
+
+
+
+
+
diff --git a/src/articles/random-linux-utils.md b/src/articles/random-linux-utils.md
index 852e7a3..6b5c743 100644
--- a/src/articles/random-linux-utils.md
+++ b/src/articles/random-linux-utils.md
@@ -2,9 +2,7 @@
title: Random linux utilities
subtitle: Neat things I picked up along the way
author: Never
-email: n.gude@posteo.de
-date: 2025-07-25
-updated: 2025-07-25T16:24+01:00
+date: 25.7.2025
summary: Tricks and tools I learned about, while tweaking my Linux sytem or trying to do productive things.
---
diff --git a/src/articles/rsync-android b/src/articles/rsync-android
new file mode 100644
index 0000000..27d3079
--- /dev/null
+++ b/src/articles/rsync-android
@@ -0,0 +1,18 @@
+ [1m[23m[39m[49m[24m[29mLatex Endeavors[0m
+ Some unintuitive quirks of Latex
+
+ Never
+
+ [22m[3m[39m[49m[24m[29m9.1.2026[0m
+
+ ────────────────────
+
+[1m[23m[39m[49m[24m[29mBIBLATEX AND BIBER[0m
+
+[1m[23m[39m[49m[24m[29mBiber doesn’t run[0m
+
+Biber doens’t run if the (fedora) package [22m[23m[31m[47m[24m[29m libxcrypt-compat [0m is missing.
+It will fail with the error message
+
+ [22m[23m[31m[49m[24m[29mbiber: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory[0m
+[0m]8;;\
\ No newline at end of file
diff --git a/src/articles/rsync-android.html b/src/articles/rsync-android.html
new file mode 100644
index 0000000..df33063
--- /dev/null
+++ b/src/articles/rsync-android.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+ Latex Endeavors
+
+
+
+
+
+
+
+
+
+
+
+
+
+BibLaTeX and Biber
+Biber doesn’t run
+Biber doens’t run if the (fedora) package
+libxcrypt-compat is missing. It will fail with the error
+message
+biber: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory
+
+
+
+
+
+
diff --git a/src/articles/rsync-android.md b/src/articles/rsync-android.md
index bf377fa..97a63f4 100644
--- a/src/articles/rsync-android.md
+++ b/src/articles/rsync-android.md
@@ -1,9 +1,7 @@
---
title: Using rsync on Android to syncronise my Music library
author: Never
-email: n.gude@posteo.de
-date: 2026-01-12
-updated: 2026-01-12T16:24+01:00
+date: 12.01.2026
summary: As Spotify is getting enshittified by capitalism, keeping a music library
is kind of essential. Here I use rsync to syncronise my library with my Android smartphone.
---
@@ -99,3 +97,31 @@ Now on your Linux machine, syncronise your Music library with rsync.
rsync -av -e "ssh -p 8022" ~/Music @:/data/data/com.termux/files/home/storage/music
```
+## Refreshing the Android MediaStore
+Android uses a Database to store files. In order to play your music, this database
+needs to be refreshed. This can be achieved by a reboot or by using adb to manually
+refresh it.
+
+```sh
+sudo dnf install adb
+```
+
+Connect the Android device via USB and see if it is listed.
+```sh
+adb devices
+```
+
+If it is, restart adb in TCP mode with port 5555
+```sh
+adb tcpip 5555
+```
+
+Connect to the device using its .
+```sh
+adb connect
+```
+
+Refresh MediaStore.
+```sh
+adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN -d file:///data/data/com.termux/files/home/storage/music/
+```
diff --git a/src/feed.md b/src/feed.md
deleted file mode 100644
index b71bec4..0000000
--- a/src/feed.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: nevereverever.de
-link: https://nevereverever.de/eh/eh/eh/eh-eh
-subtitle: Here I post random stuff.
-author: Never
-date: 2026-03-10
-id: nevereverever.de
----
diff --git a/src/index.md b/src/index.md
index 3cc04ec..fd1105f 100644
--- a/src/index.md
+++ b/src/index.md
@@ -1,15 +1,4 @@
---
title: Home
---
-
-Hello! I am Never and this is my little place on the internet where I post the
-stuff that I am currently nerding out about.
-
-This Website itself is one of those projects, that I like to tweak and tinker
-with. Maybe I'll write an article about its build system. It is also viewable
-via `curl`. Just run
-```sh
-curl nevereverever.de
-```
-
-There also is an Atom Feed to stay updated about my doings.
+Hello World
diff --git a/styles/images/shark-top-small.png b/styles/images/shark-top-small.png
index a08fa23..56e8624 100644
Binary files a/styles/images/shark-top-small.png and b/styles/images/shark-top-small.png differ
diff --git a/styles/images/shark-top-small.xcf b/styles/images/shark-top-small.xcf
index effd994..bd0e140 100644
Binary files a/styles/images/shark-top-small.xcf and b/styles/images/shark-top-small.xcf differ
diff --git a/styles/style.css b/styles/style.css
index 056a20d..e6e14cc 100644
--- a/styles/style.css
+++ b/styles/style.css
@@ -1,221 +1,114 @@
:root {
- --foreground: #586e75;
- --background: #fdf6e3;
- --html-border: #eee8d5;
- --html-background: #268bd2;
- --body-background: linear-gradient(to bottom, #2aa198, #268bd2);
- --blockquote-text: #657b83;
- --blockquote-border: #eee8d5;
- --button-primary: #fdf6e3;
- --button-secondary: #eee8d5;
- --code-color: #657b83;
- --code-background: #fdf6e3;
- --code-line-number-color: #93a1a1;
- --code-line-number-background: #eee8d5;
- --code-comment-color: #93a1a1;
- --code-keyword-color: #586e75;
+ --foreground: #1a1a1a;
+ --background: #fdfdfdf0;
+ --border: #c9c9c9;
+ --html-background: #e3e3e3;
+ --blockquote-text: #606060;
+ --blockquote-border: #e6e6e6;
+ --button-border: #e3e3e3;
+ --button-background: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
:root {
- --foreground: #93a1a1;
- --background: #002b36;
- --html-border: #073642;
- --html-background: #6c71c4;
- --body-background: linear-gradient(to bottom, #268bd2, #6c71c4);
- --blockquote-text: #839496;
- --blockquote-border: #073642;
- --button-primary: #073642;
- --button-secondary: #002b36;
- --code-color: #839496;
- --code-background: #002b36;
- --code-line-number-color: #586e75;
- --code-line-number-background: #073642;
- --code-comment-color: #586e75;
- --code-keyword-color: #93a1a1;
+ --foreground: #fdfdfd;
+ --background: #1a1a1af0;
+ --border: #4c4c4c;
+ --html-background: #303030;
+ --blockquote-text: #e6e6e6;
+ --blockquote-border: #606060;
+ --button-border: #4c4c4c;
+ --button-background: #404040;
}
}
-pre.numberSource code > span > a:first-child::before {
- background-color: var(--code-line-number-background);
- color: var(--code-line-number-color);
-}
-
-pre.numberSource {
- margin-left: 3em;
- border-left: none;
- padding-left: 4px;
-}
-
-@media screen {
- pre > code.sourceCode > span > a:first-child::before { text-decoration: none; }
-}
-
-div.sourceCode {
- color: var(--code-color);
- background-color: var(--code-background);
- line-height: 80%;
-}
-
-code span.co { color: var(--code-comment-color); font-style: italic; } /* Comment */
-code span.do { color: var(--code-comment-color); font-style: italic; } /* Documentation */
-code span.kw { color: var(--code-keyword-color); font-weight: bold; } /* Keyword */
-
html {
color: var(--foreground);
+ /*background: url("recursion.gif");*/
background: var(--html-background);
+ background-repeat: repeat-y;
+ background-size: cover;
font-family: serif;
font-size: 14pt;
}
body {
- margin: 0;
- background: var(--body-background);
-}
-
-main {
- max-width: 48em;
-
+ background-color: var(--background);
+ border: solid 1px var(--border);
margin: 0 auto;
+ max-width: 48em;
padding-left: 50pt;
padding-right: 50pt;
padding-top: 50pt;
padding-bottom: 50pt;
-
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
-
- background-color: var(--background);
- border-left: solid 3pt var(--html-border);
- border-right: solid 3pt var(--html-border);
}
-#shork {
- position: absolute;
- z-index: 1;
- left: -36px;
- top: -32px;
- width: 64px;
- transform-origin: 50% 50%;
+#tv-screen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: -1;
}
#page-header {
display: flex;
flex-direction: row;
- gap: 2pt;
+ flex-wrap: nowrap;
justify-content: space-between;
- max-width: 60em;
-
- margin: 0 auto;
- padding: 4pt;
-
+ text-align: left;
+ border: 4pt ridge var(--border);
background: url("images/shark-top-small.png");
background-size: contain;
- border: solid 3pt var(--html-border);
}
-#page-header div {
- display: flex;
- justify-content: center;
- gap: 2pt;
+#page-header li {
+ list-style: none;
+ display: inline-block;
+}
+
+#page-header a:active {
+ border: 2pt inset var(--button-border)
}
#page-header a {
- display: block;
color: var(--foreground);
text-decoration: none;
- padding: 2pt;
- border-radius: 3pt;
-}
-
-.page-header-button {
- background: linear-gradient(to bottom, var(--button-primary) 0%, var(--button-secondary) 100%);
- border: 1pt solid var(--blockquote-border);
-}
-
-.page-header-button:active {
- background: linear-gradient(to bottom, var(--button-secondary) 0%, var(--button-primary) 100%);
-}
-
-.rss-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ff925a 0%, #d95c29 100%);
- border: 1pt solid #f87741;
-}
-
-.rss-button:active {
- background: linear-gradient(to bottom, #d95c29 0%, #fb9d3a 100%);
-}
-
-.hedgedoc-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #f45c39 0%, #b51f08 100%);
- border: 1pt solid #d44021;
-}
-
-.hedgedoc-button:active {
- background: linear-gradient(to bottom, #b51f08 0%, #f45c39 100%);
-}
-
-.nextcloud-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #539ad5 0%, #00679e 100%);
- border: 1pt solid #3480b9;
-}
-
-.nextcloud-button:active {
- background: linear-gradient(to bottom, #00679e 0%, #539ad5 100%);
-}
-
-.forgejo-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ff7740 0%, #c2410c 100%);
- border: 1pt solid #e15c27;
-}
-
-.forgejo-button:active {
- background: linear-gradient(to bottom, #c2410c 0%, #ff7740 100%);
-}
-
-.jupyter-button {
- color: #fdf6e3 !important;
- background: linear-gradient(to bottom, #ffae5c 0%, #f37524 100%);
- border: 1pt solid #ff903f;
-}
-
-.jupyter-button:active {
- background: linear-gradient(to bottom, #f37524 0%, #ffae5c 100%);
+ margin: 4pt;
+ padding: 4pt;
+ border: 2pt outset var(--button-border);
+ background-color: var(--button-background)
}
+#page-header ul,
#articles ul {
padding-left: 0;
}
#articles li {
list-style: none;
+ display: block;
}
.articles-header {
- margin: 8pt 0 4pt 0;
- text-align: left;
-}
-
-.articles-footer {
display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
justify-content: space-between;
- margin-top: 4pt;
}
.articles-title {
+ margin: 8pt 0 4pt 0;
font-size: 14pt;
font-weight: bold;
}
.articles-author {
- font-style: italic;
+ margin: 12pt 0 4pt 0;
}
.articles-summary {
@@ -223,29 +116,42 @@ main {
}
.articles-date {
+ margin: 0;
text-align: right;
}
#page-footer {
- display: flex;
- justify-content: center;
- max-width: 60em;
-
- margin: 0 auto;
- padding: 4pt;
-
+ border: 4pt ridge var(--border);
background: url("images/shark-top-small.png");
background-size: contain;
- border: solid 3pt var(--html-border);
+ display: flex;
+ justify-content: center;
}
-#page-footer nav {
+#page-footer p {
display: flex;
+ flex-direction: row;
align-items: center;
}
+/*
+#TOC {
+ padding: 24px;
+}
+
+section {
+ display: flex;
+ flex-direction: row;
+}
+
+article {
+ padding: 12px;
+ overflow: auto;
+}
+*/
+
@media (max-width: 600px) {
- main {
+ body {
font-size: 0.9em;
padding: 12pt;
}
@@ -253,10 +159,6 @@ main {
h1 {
font-size: 1.8em;
}
-
- #page-header {
- flex-direction: column;
- }
}
@media print {
@@ -284,14 +186,6 @@ main {
page-break-after: avoid;
}
- a {
- color: black;
- }
-
- #page {
- border: none;
- }
-
#page-header,
#page-footer {
display: none;
@@ -390,20 +284,8 @@ hr {
margin: 1em 0;
}
-figure {
- margin: 1em 0;
- width: 100%;
- overflow-x: auto;
- display: block;
- text-align: center;
-}
-
-figcaption {
- margin-top: 0.75em;
-}
-
table {
- margin: 1em auto;
+ margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;