Compare commits

..

No commits in common. "master" and "about-page" have entirely different histories.

21 changed files with 310 additions and 9584 deletions

View file

@ -6,7 +6,7 @@ pages:
interruptible: true interruptible: true
timeout: 5m timeout: 5m
rules: rules:
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH" - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
when: always when: always
before_script: before_script:
- pacman --needed --noconfirm --sync --refresh --sysupgrade zola - pacman --needed --noconfirm --sync --refresh --sysupgrade zola

View file

@ -1,14 +1,12 @@
base_url = "https://www.jotoho.de/" base_url = "https://www.jotoho.de/"
default_language = "en" default_language = "en"
minify_html = true minify_html = true
generate_feeds = true generate_feed = true
feed_filenames = ["atom.xml", "rss.xml"]
author = "Jonas Tobias Hopusch"
[markdown] [markdown]
highlight_code = true highlight_code = true
render_emoji = true render_emoji = true
external_links_no_referrer = true external_links_no_referrer = true
smart_punctuation = true
lazy_async_image = true [extra]
bottom_footnotes = true # Put all your custom variables here

View file

@ -1,44 +1,19 @@
+++ +++
title = "About me" title = "About me / Über mich"
description = "Here's where I introduce myself." description = "Here's where I introduce myself. Hier stelle ich mich selbst vor."
date = "2022-02-06 00:00:00+01:00" date = "2022-02-06 00:00:00+01:00"
updated = "2023-03-01T23:10:47+01:00"
draft = true draft = true
+++ +++
Hello visitor, ### Über mich
I am Jonas (Tobias) Hopusch, usually known online as by my username "jotoho". Hallo,
I am male, German, currently <span id="age-display">_javascript failed_</span> years old mein Name ist Jonas Hopusch, im Internet normalerweise bekannt als "jotoho".
and a student of computer science at the [South Westphalia University of Applied Ich bin <span class="age-display">x</span> Jahre alt.
Sciences](https://fh-swf.de) working towards earning a Bachelor degree.
### Why I chose to work with computers -----
### My Hobbies ### About me
In my free time I usually watch videos on the Internet, <script style="display: none;" src="/scripts/calcage.js" async></script>
read fiction stories online or on my eReader,
play some videogames or
learn about topics that interest me.
When I don't need my ears for something else, I usually
have music playing or listen to something else.
I like to listen to multiple kinds of music
that are very different to each other, so I have
trouble concretely defining the genres I listen to.
### My Desktop-PC
| PC Part | Installed Component |
| :------------ | :--------------------------------------------------------------------------------------------------------------------------------: |
| CPU | [AMD Ryzen 7 5800X (8 cores, 16 threads)](https://www.amd.com/en/products/cpu/amd-ryzen-7-5800x) |
| Motherboard | [ASRock X570M Pro4](https://www.asrock.com/MB/AMD/X570M%20Pro4/) |
| Graphics Card | [ASUS Dual Radeon RX 6750XT 12GB OC Edition](https://www.asus.com/motherboards-components/graphics-cards/dual/dual-rx6750xt-o12g/) |
| Memory | 20GiB (2\*8G+4G) DDR4 2133MHz |
| Monitors | 2 1920x1080 32" 60Hz screens |
| Storage | 1TB SATA-SSD + 1TB SATA-HDD |
<script style="display: none;" src="/scripts/calcage.js" defer></script>

View file

@ -2,7 +2,7 @@
title = "My online profiles and different communication channels" title = "My online profiles and different communication channels"
description = "On this page I list a selection of different online accounts owned by me and communication services that can be used to talk with me." description = "On this page I list a selection of different online accounts owned by me and communication services that can be used to talk with me."
date = "2021-08-17 10:21:34+02:00" date = "2021-08-17 10:21:34+02:00"
updated = "2024-07-14T10:34:11+02:00" updated = "2021-11-02 19:00:03+01:00"
+++ +++
I have recently heard of the practice of listing available communication channels and online profiles on the internet to I have recently heard of the practice of listing available communication channels and online profiles on the internet to
@ -13,11 +13,8 @@ but hopefully even a list with only the less sensitive profiles and contact info
The following list is probably not complete and will change over time. The following list is probably not complete and will change over time.
| Service/Protocol | Hyperlink | Notes | | Service/Protocol | Hyperlink | Notes |
| ------------------ | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |-|-|-|
| E-Mail | [contact@jotoho.de](mailto:contact@jotoho.de) | [OpenPGP keys here](https://downloads.jotoho.de/openpgp/) and [via WKD](https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/) | | E-Mail | [contact@jotoho.de](mailto:contact@jotoho.de) | OpenPGP keys [here](https://downloads.jotoho.de/openpgp/) and [via WKD](https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/) |
| Mastodon/Fediverse | [@jotoho@ruhr.social](https://ruhr.social/@jotoho) | | | Mastodon/Fediverse | [@jotoho@ruhr.social](https://ruhr.social/@jotoho) | |
| GitLab | [@jotoho](https://gitlab.com/jotoho) | Preferred Git hosting platform | | GitLab | [@jotoho](https://gitlab.com/jotoho) | Preferred Git hosting platform |
| GitHub | [@jotoho](https://github.com/jotoho) | | | GitHub | [@jotoho](https://github.com/jotoho) | |
| Threema | [8WEESJ8K](https://threema.id/8WEESJ8K) | <details><summary>QR-Code containing Threema-ID</summary><img src="threema-scanid-8weesj8k.svg" alt="Scannable QR-Code" width="1000px" height="1000px" loading="lazy" class="black-white-svg" /></details> |
| Matrix | [@jotoho:jotoho.de](matrix:u/jotoho:jotoho.de?action=chat) | |
| Signal | [jotoho.68](https://signal.me/#eu/u_D8b5Ha39JGdbEJ5d4ULShg4VOx80uMc7q2-2ST0Pnx9UDsASZAqaJWL6DRFu59) | |

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 171 KiB

View file

@ -2,44 +2,45 @@
title = "Services hosted on jotoho.de" title = "Services hosted on jotoho.de"
description = "This page lists the various servers running under the jotoho.de domain name and by who and how they may be accessed." description = "This page lists the various servers running under the jotoho.de domain name and by who and how they may be accessed."
date = "2021-06-29 22:14:11+02:00" date = "2021-06-29 22:14:11+02:00"
updated = "2023-03-02T16:57:24+01:00" updated = "2022-01-06 21:52:00+01:00"
+++ +++
Besides this website, my domain also has a number of other services/servers running that are set up for learning purposes or for personal use by myself, family and acquaintances. The list only contains services available from the public internet. Besides this website, my domain also has a number of other services/servers running that are set up for learning purposes or for personal use by myself, family and acquaintances. The list only contains services available from the public internet.
--- -----
### Publicly accessible services ### Publicly accessible services
- [**This website**](https://www.jotoho.de): www.jotoho.de is currently being self-hosted using * [**Personal Nextcloud**](https://nextcloud.jotoho.de): This Nextcloud instance is set up for use by myself and those I have invited to store, conveniently access and exchange files and other information.
[a customized Caddy docker image](https://gitea.jotoho.de/jotoho/site-deployer) * [**Gitea**](https://gitea.jotoho.de): I'm currently experimenting with the Git Server software Gitea as a lightweight alternative or addon to GitLab.
- [**Personal Nextcloud**](https://nextcloud.jotoho.de): This Nextcloud instance is set up for use by myself and those I have invited to store, conveniently access and exchange files and other information. Account Registration is limited to whitelisted email domains and accounts need to manually be confirmed by me before becoming active.
- [**Forgejo**](https://gitea.jotoho.de): This git server was migrated from Gitea to Forgejo on 2023-01-17 as an emergency measure due to the potentially hostile takeover * [**Vaultwarden**](https://bitwarden.jotoho.de): Bitwarden Fork for storing and synchronizing my access credentials and other secrets on my own infrastructure.
of the Gitea project. * [**Caddy Fileserver**](https://downloads.jotoho.de): For holding and serving public files directly without needing to go through Nextcloud.
Account Registration is limited to whitelisted email domains and accounts need to manually be confirmed by me before becoming active. Has increased compatibility for use-cases like embedding images or media on this website.
- [**Caddy public fileserver**](https://downloads.jotoho.de): For holding and serving public files directly via HTTPS without needing to go through Nextcloud. * [**This website**](https://www.jotoho.de): www.jotoho.de is currently being self-hosted using
Has increased compatibility for use-cases like embedding images or media on this website. [a customized Caddy docker image](https://gitea.jotoho.de/jotoho/site-deployer)
- [**Vikunja Task Management**](https://tasks.jotoho.de): Online To-Do list and Tasks management. Family and Friends can request accounts to be created for them
in order to be able to share to-do lists.
It supports CalDAV synchronization with client devices.
--- -----
### Restricted/Internal Services
These services/servers are only available from whilelisted IP addresses and are exclusively meant for use by myself or family.
* [Pi-Hole](https://pihole.jotoho.de) (including Webinterface)
* PHPMyAdmin
-----
### Special Purpose Subdomains ### Special Purpose Subdomains
- **lab.jotoho.de**: Delegated to DigitalOcean Nameservers for quick configuration of droplets and other testing projects hosted there. * **lab.jotoho.de**: Delegated to DigitalOcean Nameservers for quick configuration of droplets and other testing projects hosted there.
Do not expect anything hosted under this subdomain or one of it's subdomains to live for more than a few hours or days. Do not expect anything hosted under this subdomain or one of it's subdomains to live for more than a few hours or days.
Security issues, Anomalies or detected abuse of this subdomain [should be immediately reported to me via email](mailto:security@jotoho.de), Security issues, Anomalies or detected abuse of this subdomain [should be immediately reported to me via email](mailto:security@jotoho.de), so I can investigate and implement corrective measures, if necessary.
so I can investigate and implement corrective measures, if necessary.
---
-----
### Potential future additions or experiments ### Potential future additions or experiments
When I bought this domain, it became clear to me how very versatile and useful it can be to have a publicly listed internet namespace so I am always trying to find and learn new ways to put the domain to good use and try out new technologies & server-side software that I view as interesting or useful. When I bought this domain, it became clear to me how very versatile and useful it can be to have a publicly listed internet namespace so I am always trying to find and learn new ways to put the domain to good use and try out new technologies & server-side software that I view as interesting or useful.
Things I may set up and play with in the future: Things I may set up and play with in the future:
- personal mastodon or activitypub-compatible server * personal mastodon or activitypub-compatible server
- outgoing SMTP server for service notifications * outgoing SMTP server for service notifications
- Apache Guacamole for remote control of devices * Apache Guacamole for remote control of devices

View file

@ -1,5 +0,0 @@
{
"m.homeserver": {
"base_url": "https://matrix.jotoho.de:8448"
}
}

View file

@ -1,3 +1,3 @@
{ {
"m.server": "matrix.jotoho.de:8448" "m.server": "dendrite2.jotoho.de:8448"
} }

View file

@ -1,25 +1,5 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Contact: mailto:security@jotoho.de Contact: mailto:security@jotoho.de
Expires: 2025-09-17T00:00:00.000Z Expires: Sat, 27 Jan 2024 00:00 +0100
Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1F42EF02BE3E6FE8F624C8BC612F3350DB59D359 Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1F42EF02BE3E6FE8F624C8BC612F3350DB59D359
Encryption: https://downloads.jotoho.de/openpgp/1F42EF02BE3E6FE8F624C8BC612F3350DB59D359.asc
Preferred-Languages: de, en Preferred-Languages: de, en
Canonical: https://www.jotoho.de/.well-known/security.txt Canonical: https://jotoho.de/.well-known/security.txt
-----BEGIN PGP SIGNATURE-----
iQI5BAEBCgAjFiEETvwvjG0vxDxbX2QpFQE63pZQIWQFAmMlz+YFgxLMAwAACgkQ
FQE63pZQIWTKxRAAvS2CLpKosuwzuklXI5/gjulSgqy4KMM3QX3lmgzogV6nK0L2
YpEvH4e89kldGyDjVKNHWBFRca3eI8OXNlWGTgX5BZ7t7tz7qFccxhsiZBpUiRq3
EVRJEwdLj2QLHqIAd8RIA/JGsb7AaEeoTcY/BNmTUWwOYZ6uYzq+XhHKnIOjrQDv
iWr+LYa+Pc/w8s5C6No1rmAEWOA1ZbTNduu6eZiwPjytjn/APs1/1WKn6Mee18oY
YHdOdfeSJSaIxvMzSCpdFvQdF0HWdJ5yCsE83Un8WA3yI3sRB+YMdVgFDXhEDQaD
F9b6VtaQzA805XpbwEaLYPBJjE7jVfKVPXokMMHF0+k9003T34aw9JTLw4YZztIH
JwMBUmOkfBiWCXC2cX1d00WMmJd8MVRwcU5SVh6ENjbAOxkpUitS+cFs67YkrtcX
AOGDYRnMIAVuV9/SmooJUd+lV/XPjztxmMS9yBmZffwO/DmOvkMEinjhrIV/0tNh
Wqjs6GSXbkDdQ33FInPr6bb1AXG2u8IJK8vwi4jTl/ojS8G6zAIoUzCqm1QuGbuA
+2YpmZdnHlMFsTUp4zfUDVuGzS6udqcFFsrUsSgit1XkTVjyq44CZbJVXJFp1+w6
QjbFVi7KCp89TU0dQ+n7QUZn3USeINGBB4yxglGwajZusxif6pIF5VRuB0g=
=lQ4n
-----END PGP SIGNATURE-----

View file

@ -1 +0,0 @@
{"subject":"acct:jotoho@ruhr.social","aliases":["https://ruhr.social/@jotoho","https://ruhr.social/users/jotoho"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ruhr.social/@jotoho"},{"rel":"self","type":"application/activity+json","href":"https://ruhr.social/users/jotoho"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ruhr.social/authorize_interaction?uri={uri}"}]}

View file

@ -3,92 +3,55 @@
margin: 0; margin: 0;
border: none; border: none;
border-collapse: collapse; border-collapse: collapse;
box-sizing: border-box !important; box-sizing: border-box;
overflow-wrap: anywhere;
object-fit: scale-down;
scroll-behavior: smooth;
} }
:root { body {
max-width: inherit;
overflow-x: hidden;
overflow-y: auto;
}
html:not(:root),
body:not(:root) {
max-width: inherit;
}
#root {
font-family: monospace; font-family: monospace;
display: flex; max-width: 100vw;
flex-direction: column;
flex-wrap: nowrap;
min-height: 100vh;
} }
#root > * { header, footer {
flex-grow: 0;
flex-shrink: 0;
}
header,
footer {
text-align: center; text-align: center;
} }
#header-title { header {
display: block; padding-bottom: 1rem;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
} }
footer { footer {
padding-top: 0.5rem; padding-top: 1rem;
} }
#header-delimiter { .globalnav{
padding-top: 0;
margin-top: 0;
}
#footer-delimiter {
padding-bottom: 0;
margin-bottom: 0;
}
.globalnav {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
flex-direction: row; flex-direction: row;
text-align: center; text-align: center;
gap: 2px; gap: max(1px, 0.1rem);
height: max-content;
} }
.globalnav-element { .globalnav-element {
display: block; display: block;
background-color: rgb(90% 90% 90%); background-color: #ddd;
text-align: center; text-align: center;
flex-basis: 0; flex-basis: 0;
flex-grow: 1; flex-grow: 1;
min-width: fit-content; min-width: fit-content;
padding-top: 0.5rem; min-height: fit-content;
padding-bottom: 0.5rem; padding: 0.5rem 0;
} }
/* Code Blocks */ /* Code Blocks */
pre { pre {
display: block;
padding: 0.75rem; padding: 0.75rem;
margin-top: 1.5rem; margin-top: 1.5rem;
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
width: fit-content; width: 100%;
max-width: 100%; max-width: max-content;
overflow-x: auto; overflow-y: auto;
line-break: strict; line-break: strict;
} }
@ -100,8 +63,11 @@ code {
} }
p { p {
margin-top: 0.5rem; padding: 0.5rem;
margin-bottom: 0.5rem; }
article {
padding: 0.5rem;
} }
h2 { h2 {
@ -110,106 +76,37 @@ h2 {
} }
#mainarticle { #mainarticle {
width: fit-content; width: max-content;
max-width: min(100%, 72rem); max-width: min(80rem, 100%);
margin-left: auto; margin: 0 auto;
margin-right: auto;
flex-grow: 1;
text-align: justify;
} }
#mainarticle h3 { li, ul, ol {
margin-top: 1rem; margin: 1rem;
margin-bottom: 1rem;
}
ul > li,
ol > li {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
li::marker {
width: 1rem;
max-width: 100%;
padding: 0;
margin: 0;
border: none;
}
li {
margin-inline-start: 1rem;
} }
hr { hr {
border-style: inset; border-style: inset;
border-width: 1px; border-width: 1px;
margin-top: 0.5rem; margin: 0.5rem 0;
margin-bottom: 0.5rem;
} }
table { table {
display: block; display: block;
border-collapse: collapse; border-collapse: collapse;
margin: 1rem auto; margin: 1rem auto;
width: fit-content; width: max-content;
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-y: auto;
} }
tr { td, th {
width: fit-content;
}
td,
th {
border-style: solid; border-style: solid;
border-color: black; border-color: black;
border-collapse: collapse; border-collapse: collapse;
padding: 0.5rem; padding: 0.5rem;
} }
img {
display: block;
min-height: unset;
min-width: unset;
height: auto;
width: auto;
max-width: 100%;
max-height: unset;
margin-left: auto;
margin-right: auto;
object-fit: scale-down;
object-position: center;
}
details {
backdrop-filter: invert(100%);
padding: max(1mm, 1px);
width: min-content;
max-width: fit-content;
min-width: unset;
display: block;
color: black;
}
details > summary {
max-width: fit-content;
width: max-content;
display: block;
}
details:not([open]) > summary::after {
content: "Click to expand";
display: block;
max-width: fit-content;
font-weight: bold;
}
details[open] > summary {
margin-bottom: max(1mm, 1px);
}
#licenseimg { #licenseimg {
vertical-align: middle; vertical-align: middle;
height: inherit; height: inherit;
@ -221,32 +118,20 @@ details[open] > summary {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.visible-article-metadata { @media (max-width: 20rem), (max-width: 300px) {
display: contents; * {
font-size: small; word-wrap: break-word;
font-style: italic; }
}
.article-metadata-label {
font-weight: bold;
}
.article-missinglicense {
font-size: xx-small;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
* {
scrollbar-color: white black;
}
html { html {
background-color: black; background-color: #111;
color: white; color: white;
} }
.globalnav-element { .globalnav-element {
background-color: rgb(10% 10% 10%); background-color: #222;
} }
code { code {
@ -257,15 +142,9 @@ details[open] > summary {
color: lightskyblue; color: lightskyblue;
} }
table, table, td, th {
td,
th {
border-color: white; border-color: white;
} }
details {
color: black;
}
} }
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
@ -275,20 +154,14 @@ details[open] > summary {
} }
.globalnav-element { .globalnav-element {
background-color: rgb(90% 90% 90%); background-color: #ddd;
} }
code { code {
color: green; color: green;
} }
table, table, td, th {
td,
th {
border-color: black; border-color: black;
} }
details {
color: white;
}
} }

View file

@ -1,121 +0,0 @@
<?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://web.resource.org/cc/"
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="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nc-nd.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-NC-ND"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-411.87964)">
<g
id="g3783"
transform="translate(158,204)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3785"
width="80"
height="15"
x="170.5"
y="237.86218" />
<rect
y="239.36218"
x="172"
height="12"
width="77"
id="rect3787"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
id="path3789"
sodipodi:nodetypes="cccscc" />
<g
id="g3791"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
clip-path="url(#clipPath3442)">
<path
id="path3793"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3795"
style="opacity:1" />
</g>
</g>
<path
id="text3797"
d="M 357.4197,448.68503 C 357.66518,448.68504 357.85131,448.63146 357.9781,448.52428 C 358.10488,448.41712 358.16827,448.25905 358.16828,448.05008 C 358.16827,447.84378 358.10488,447.68705 357.9781,447.57988 C 357.85131,447.47004 357.66518,447.41512 357.4197,447.41511 L 356.55784,447.41511 L 356.55784,448.68503 L 357.4197,448.68503 M 357.4723,451.30929 C 357.78522,451.30929 358.0199,451.24364 358.17637,451.11236 C 358.33552,450.98109 358.4151,450.78283 358.4151,450.51759 C 358.4151,450.25771 358.33686,450.06347 358.18041,449.93488 C 358.02396,449.80359 357.78792,449.73796 357.4723,449.73795 L 356.55784,449.73795 L 356.55784,451.30929 L 357.4723,451.30929 M 358.92089,449.15122 C 359.25538,449.24767 359.51434,449.42583 359.69779,449.68571 C 359.88121,449.94559 359.97293,450.26441 359.97294,450.64217 C 359.97293,451.22087 359.776,451.65222 359.38217,451.93621 C 358.98833,452.2202 358.38947,452.36219 357.5856,452.36219 L 355.00001,452.36219 L 355.00001,446.3622 L 357.33878,446.3622 C 358.17771,446.36221 358.78466,446.48813 359.15962,446.73996 C 359.53727,446.99181 359.7261,447.39502 359.7261,447.9496 C 359.7261,448.24164 359.65732,448.4908 359.51975,448.69709 C 359.38217,448.90072 359.18255,449.05209 358.92089,449.15122 M 359.83746,446.3622 L 361.54096,446.3622 L 362.91671,448.50018 L 364.29245,446.3622 L 366,446.3622 L 363.69764,449.8344 L 363.69764,452.36219 L 362.13982,452.36219 L 362.13982,449.8344 L 359.83746,446.3622 M 365.15837,449.40842 L 367.69946,449.40842 L 367.69946,450.57787 L 365.15837,450.57787 L 365.15837,449.40842 M 368.9174,446.3622 L 370.65732,446.3622 L 372.85447,450.47741 L 372.85447,446.3622 L 374.33138,446.3622 L 374.33138,452.36219 L 372.59146,452.36219 L 370.3943,448.24699 L 370.3943,452.36219 L 368.9174,452.36219 L 368.9174,446.3622 M 380.65173,452.03266 C 380.36579,452.18002 380.0677,452.2912 379.75749,452.36622 C 379.44727,452.44123 379.12357,452.47875 378.78638,452.47875 C 377.78019,452.47875 376.98307,452.20011 376.395,451.64284 C 375.80693,451.08289 375.5129,450.32469 375.5129,449.36823 C 375.5129,448.40909 375.80693,447.65089 376.395,447.09361 C 376.98307,446.53367 377.78019,446.2537 378.78638,446.25369 C 379.12357,446.2537 379.44727,446.29121 379.75749,446.36621 C 380.0677,446.44124 380.36579,446.55243 380.65173,446.69977 L 380.65173,447.94157 C 380.36309,447.746 380.0785,447.60266 379.79796,447.51156 C 379.5174,447.42047 379.22203,447.37493 378.91181,447.37493 C 378.35611,447.37493 377.91911,447.55175 377.6008,447.9054 C 377.28249,448.25905 377.12333,448.74666 377.12333,449.36823 C 377.12333,449.98712 377.28249,450.47339 377.6008,450.82703 C 377.91911,451.18069 378.35611,451.35751 378.91181,451.35751 C 379.22203,451.35751 379.5174,451.31197 379.79796,451.22087 C 380.0785,451.12978 380.36309,450.98644 380.65173,450.79086 L 380.65173,452.03266 M 381.82921,449.40842 L 384.3703,449.40842 L 384.3703,450.57787 L 381.82921,450.57787 L 381.82921,449.40842 M 385.58824,446.3622 L 387.32815,446.3622 L 389.52531,450.47741 L 389.52531,446.3622 L 391.00222,446.3622 L 391.00222,452.36219 L 389.26229,452.36219 L 387.06515,448.24699 L 387.06515,452.36219 L 385.58824,452.36219 L 385.58824,446.3622 M 394.08956,447.53165 L 394.08956,451.19274 L 394.64795,451.19274 C 395.28456,451.19274 395.77013,451.03602 396.10462,450.72255 C 396.44181,450.40909 396.61041,449.95363 396.61042,449.35617 C 396.61041,448.7614 396.44317,448.30862 396.10867,447.99783 C 395.77417,447.68705 395.28726,447.53166 394.64795,447.53165 L 394.08956,447.53165 M 392.53172,446.3622 L 394.17453,446.3622 C 395.09169,446.36221 395.77417,446.42784 396.22197,446.55912 C 396.67245,446.68772 397.0582,446.90742 397.37922,447.2182 C 397.66246,447.48879 397.87286,447.80092 398.01044,448.15456 C 398.14801,448.50822 398.2168,448.90875 398.21681,449.35617 C 398.2168,449.80896 398.14801,450.21351 398.01044,450.56983 C 397.87286,450.92349 397.66246,451.23561 397.37922,451.50621 C 397.05551,451.81699 396.66706,452.03802 396.21387,452.1693 C 395.76069,452.29789 395.0809,452.36219 394.17453,452.36219 L 392.53172,452.36219 L 392.53172,446.3622"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1,11 +0,0 @@
<!doctype html>
<html>
<head>
<title>CI/CD Presentation redirect</title>
<meta name="robots" content="noindex, nofollow" />
<meta http-equiv="Refresh" content="0; url='https://docs.google.com/presentation/d/1NwD6r3W2T0cprsixUUWzM7nKkDZX1GuGmrlK32QpOmo/edit?usp=sharing'" />
</head>
<body>
<p>You should be automatically redirected now...</p>
</body>
</html>

View file

@ -1,19 +1,9 @@
"use strict"; (() => {
"use strict";
{ let ageElements = document.getElementsByClassName("age-display")
// Month index must be two because counting begins at 0 (for January) for (let i = 0; i < ageElements.length; i++) {
const myBirthDate = new Date(2001, 2, 29); ageElements[i].innerText = (Math.floor(((new Date()).getTime() - (new Date(2001, 3, 29)).getTime())
const today = new Date(); / 1000 / 60 / 60 / 24 / 365))
.toString()
let yearsSinceBirth = today.getFullYear() - myBirthDate.getFullYear(); }
})()
// Correct yearsSinceBirth if between New Year and my birthday
if (today.getMonth() < myBirthDate.getMonth()) yearsSinceBirth--;
else if (
today.getMonth() == myBirthDate.getMonth() &&
today.getDate() < myBirthDate.getDate()
)
yearsSinceBirth--;
document.getElementById("age-display").innerText = yearsSinceBirth.toString();
}

View file

@ -1,12 +0,0 @@
"use strict";
Array.from(document.getElementsByClassName("relative-timestamp")).forEach(
function (timestamp) {
if (timestamp?.dateTime) {
timestamp.innerText = new Intl.DateTimeFormat(undefined, {
dateStyle: "long",
timeStyle: "short",
}).format(new Date(timestamp.dateTime));
}
}
);

View file

@ -1,15 +0,0 @@
"use strict";
{
const copyrightYearElement = document.getElementById("footer-copyrightyear");
if (copyrightYearElement) {
const currentYearAsStr = new Date().getFullYear().toString();
copyrightYearElement.innerText = currentYearAsStr;
copyrightYearElement.dateTime = currentYearAsStr;
} else
console.error(
"Could not find the footer entry for the year of the copyright notice."
);
}

View file

@ -20,15 +20,17 @@
/> />
<!--Mastodon account ownership verification--> <!--Mastodon account ownership verification-->
<link rel="me" href="https://ruhr.social/@jotoho" /> <link rel="me" href="https://ruhr.social/@jotoho" />
<script defer src="/scripts/updatecopyrightyear.js"></script>
<title>jotoho.de - A personal website</title> <title>jotoho.de - A personal website</title>
{% block metadata %} {% endblock %} {% block metadata %} {% endblock %}
</head> </head>
<body id="root"> <body>
<header> <header>
<a id="header-title" href="{{ config.base_url }}"> <div>
<h1>jotoho.de - My personal website</h1> <a href="{{ config.base_url }}"
</a> ><h1>jotoho.de - My personal website</h1></a
>
</div>
</header>
<nav class="globalnav"> <nav class="globalnav">
<!--<a class="globalnav-element" href="{{ get_url(path='@/blog/_index.md') }}"> Blog </a>--> <!--<a class="globalnav-element" href="{{ get_url(path='@/blog/_index.md') }}"> Blog </a>-->
<a <a
@ -44,23 +46,23 @@
Profiles Profiles
</a> </a>
</nav> </nav>
</header> <hr />
<hr id="header-delimiter" />
<article id="mainarticle">{% block content %} {% endblock %}</article> <article id="mainarticle">{% block content %} {% endblock %}</article>
<hr id="footer-delimiter" /> <hr />
<footer> <footer>
<p> <p>
<!--{% set current_year = now() | date(format="%Y", <!--{% set current_year = now() | date(format="%Y",
timezone="Europe/Berlin") %} --> timezone="Europe/Berlin") %} -->
Copyright Copyright
<time id="footer-copyrightyear" datetime="{{ current_year }}"> <time datetime="{{ current_year }}">{{ current_year }}</time>
{{ current_year }} Jonas Tobias Hopusch (<a
</time> rel="noreferer"
Jonas Tobias Hopusch (@jotoho) href="https://gitlab.com/jotoho"
<!-- >@jotoho</a
>)
<br /> <br />
Licensed under Licensed under
<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/"
@ -68,19 +70,19 @@
id="licenseimg" id="licenseimg"
alt="CC BY-NC-ND 4.0" alt="CC BY-NC-ND 4.0"
title="CC BY-NC-ND 4.0" title="CC BY-NC-ND 4.0"
src="/images/copyright/cc-by-nc-nd-4.0-small.svg" src="https://licensebuttons.net/l/by-nc-nd/4.0/80x15.png"
/></a> /></a>
(unless otherwise specified) (unless otherwise specified)
-->
</p> </p>
<p> <p>
<a href="https://gitea.jotoho.de/jotoho/my-website">This page</a> <a href="https://gitea.jotoho.de/jotoho/my-website"
>This page</a
>
is being served using is being served using
<a rel="noreferer" href="https://caddyserver.com/">Caddy</a> <a rel="noreferer" href="https://caddyserver.com/">Caddy</a>
and was generated using and was generated using
<a rel="noreferer" href="https://www.getzola.org/">Zola</a>. <a rel="noreferer" href="https://www.getzola.org/">Zola</a>. You
<br /> may contact me via
You may contact me via
<a href="mailto:webmaster@jotoho.de">email</a> <a href="mailto:webmaster@jotoho.de">email</a>
regarding any issues with this website. regarding any issues with this website.
</p> </p>

View file

@ -1,8 +1,11 @@
{% extends "base.html" %} {% block metadata %} {% extends "base.html" %}
<meta
name="description" {% block metadata %}
content="This is the personal website of Jonas Tobias Hopusch (@jotoho)" <meta name="description" content="This is the personal website of Jonas Tobias Hopusch (@jotoho)" />
/> {% endblock metadata %}
{% endblock metadata %} {% block content %}
<p>This is some placeholder text because I don't know what to put here, yet.</p> {% block content %}
<p>
This is some placeholder text because I don't know what to put here, yet.
</p>
{% endblock content %} {% endblock content %}

View file

@ -1,47 +1,30 @@
{% extends "base.html" %} {% block metadata %} {% extends "base.html" %} {% block metadata %}
<meta name="description" content="{{ page.description }}" /> <meta name="description" content="{{ page.description }}" />
<script defer src="/scripts/relativetime.js"></script>
{% endblock %} {% block content %} {% endblock %} {% block content %}
<h2>{{ page.title }}</h2> <h2>{{ page.title }}</h2>
<div class="visible-article-metadata"> {% if page.date and page.date is defined %}
{% if page.date and page.date is defined %} <p>
<p> <em
<span class="article-metadata-label">First published</span>: ><strong>Published on</strong>:
<time class="relative-timestamp" datetime="{{page.date}}" <time datetime="{{page.date}}"
>{{ page.date | date(format="%F %R (%Z)", timezone="Europe/Berlin") >{{ page.date | date(format="%A, %e %B %Y %R %Z",
}}</time timezone="Europe/Berlin") }}</time
></em
> >
</p> </p>
{% endif %} {% if page.updated and page.updated != page.date %} {% endif %} {% if page.updated and page.updated != page.date %}
<p> <p>
<span class="article-metadata-label">Last updated on</span>: <em
<time class="relative-timestamp" datetime="{{page.updated}}" ><strong>Last updated on</strong>:
>{{ page.updated | date(format="%F %R (%Z)", timezone="Europe/Berlin") <time datetime="{{page.updated}}"
}}</time >{{ page.updated | date(format="%A, %e %B %Y %R %Z",
timezone="Europe/Berlin") }}</time
></em
> >
</p> </p>
{% endif %} {% if page.extra.author and page.extra.author != "" %} {% endif %}
<p>
<span class="article-metadata-label">Author(s)</span>: {{page.extra.author}}
</p>
{% else %}
<p>
<span class="article-metadata-label">Author</span>: Jonas Tobias Hopusch
</p>
{% endif %} {% if page.extra.license and page.extra.license != "" %}
<p id="article-license">
<span class="article-metadata-label"
>Article is provided under the following license</span
>: {{page.extra.license}}
</p>
{% else %}
<p class="article-missinglicense">
No license is granted for this article. All rights reserved.
</p>
{% endif %}
</div>
<hr id="last-article-metadata" /> <hr id="last-article-metadata" />
<div>{{ page.content | safe }}</div> <div>{{ page.content | safe }}</div>
{% endblock content %} {% endblock content %}

View file

@ -5,5 +5,7 @@
<li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li> <li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
<div>{{ section.content | safe }}</div> <div>
{{ section.content | safe }}
</div>
{% endblock content %} {% endblock content %}