migrate site to blatt: content, templates, blog post with old-steam theme

This commit is contained in:
2026-04-15 07:57:30 +02:00
parent c9b15c854b
commit 1f0939e27c
1312 changed files with 18774 additions and 194154 deletions

1
.claude/memory/MEMORY.md Normal file
View File

@@ -0,0 +1 @@
- [Blatt project](project_blatt.md) — custom flat-file markdown server replacing WriteFreely on Unraid

View File

@@ -0,0 +1,19 @@
---
name: Blatt project
description: Custom flat-file markdown publishing server replacing WriteFreely on Unraid. Spec and plan in docs/superpowers/.
type: project
---
Blatt is a zero-config, single-person markdown publishing server built with Bun + Hono + remark/rehype + Nunjucks.
**Why:** WriteFreely had poor UX, Grav had premium upsells. Blatt is the "anti-CMS" — drop markdown files in a folder, they're served as HTML with templates.
**How to apply:** The project lives at `~/Developer/blatt/` (new repo). The `felixfoertsch.de` repo holds the content and spec/plan docs. Content will be served from an Unraid Docker container (port 8087, replacing the old Grav/WriteFreely containers).
**Key decisions:**
- Runtime: Bun (dev + Docker)
- Content model: folder-per-page with co-located assets, ISO 8601 date prefixes
- Templates: Nunjucks with inheritance, per-page selection via frontmatter
- Drafts: `published: false` in frontmatter, visible on trusted network or with token
- Config: single `config.toml`, everything on by default
- WriteFreely content needs importing into the new format

164
.gitignore vendored
View File

@@ -1,164 +1,2 @@
.DS_Store .DS_Store
/build .superpowers/
/.build
/.swiftpm
/*.xcodeproj
.publish
Output
Package.resolved
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# Accio dependency management
Dependencies/
.accio/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

13
.project.toml Normal file
View File

@@ -0,0 +1,13 @@
[project]
name = "felixfoertsch.de"
description = "Personal website content, served by Blatt (https://github.com/felixfoertsch/blatt)."
status = "aktiv"
priority = "mittel"
location = "~/Developer/felixfoertsch.de"
[dates]
created = "2024-03-24"
last_activity = "2026-04-04"
[notes]
next_steps = "Set up Syncthing to sync content/ to Unraid, refine design"

24
.vscode/launch.json vendored
View File

@@ -1,24 +0,0 @@
{
"configurations": [
{
"type": "lldb",
"request": "launch",
"sourceLanguages": ["swift"],
"args": [],
"cwd": "${workspaceFolder:felixfoertsch.de}",
"name": "Debug felixfoertsch.de",
"program": "${workspaceFolder:felixfoertsch.de}/.build/debug/felixfoertsch.de",
"preLaunchTask": "swift: Build Debug felixfoertsch.de"
},
{
"type": "lldb",
"request": "launch",
"sourceLanguages": ["swift"],
"args": [],
"cwd": "${workspaceFolder:felixfoertsch.de}",
"name": "Release felixfoertsch.de",
"program": "${workspaceFolder:felixfoertsch.de}/.build/release/felixfoertsch.de",
"preLaunchTask": "swift: Build Release felixfoertsch.de"
}
]
}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,175 +0,0 @@
# Setup a publishing environment
This tutorial explains how to set up a basic publishing environment using Swift. It uses the Swift Package Manager (SPM) and the library [Publish](https://github.com/johnsundell/publish) to achieve that goal. The whole process avoids using Xcode and I restrict the tooling to the command line. It uses my personal site `felixfoertsch.de` as the example project.
This tutorial is for people who want to understand the process, the tools, and the file structure involved. It shows the manual steps that the Publish CLI tool can do out-of-the-box. You can install it via [Homebrew](https://brew.sh) to create a new project and set up the environment: `brew install publish`.
## Set up the project structure
The first step to create a Swift project is to use the SPM to initialize the folder. By default, the SPM creates projects of type `library`. Since Publish requires a Swift project of type `executeable`, we have to tell that to SPM. Additionally we pass in a name for the project, in this case `felixfoertsch.de`.
```bash
mkdir ~/Developer/felixfoertsch.de
cd ~/Developer/felixfoertsch.de
swift package init --type executeable --name "felixfoertsch.de"
```
The SPM creates the default folder structure for an executable in the current directory. It looks like this:
```bash
📁 Sources
📄 .gitignore
📄 Package.swift
```
Side note: Because it is of type `executeable`, the SPM **skips** creating a `Tests` folder.
## Add the required configuration to the `Package.swift` file
The main configuration file of a Swift project is called `Package.swift`. Its home is the root folder and it contains the project's metadata, such as its name, dependencies, and targets.
The default file is pretty empty. I removed the default comments for better legibility. It looks like this:
```swift
// swift-tools-version:5.10
import PackageDescription
let package = Package(
name: "felixfoertsch.de",
targets: [
.executableTarget(
name: "felixfoertsch.de"),
]
)
```
At the time of writing, the current Swift tools are version 5.10, which is set in the first line of the `Package.swift` file.
You can see, that we are instantiating a `Package` object. We are injecting the dependencies -- or rather we are defining them there and during the build process the package takes the configuration into account. It is therefore a list of parameters we are passing to the `Package` object, separated by commas `,`. The order also matters.
### Minimum platform version
Because Publish comes with a minimum platform version, we have to set it. This goes on the top level.
```swift
platforms: [.macOS(.v12)]
```
### Product: Executable
Even though the product of our publishing project is going to be a static website, within the system we are building an executable Package.
```swift
products: [
.executable(
name: "felixfoertsch.de",
targets: ["felixfoertsch.de"]
)
],
```
### Dependencies
The next entry is the list of dependencies. We have only one dependency at the moment: we add the `Publish` library to the `Package.swift` in the right place on the top level.
```swift
dependencies: [
.package(url: "https://github.com/johnsundell/publish.git", from: "0.9.0")
],
```
Since this is also a dependency of our executable target, we have to tell that to the compiler. We are referencing by the package name -- within the target array and for our executable target.
```swift
dependencies: [.product(name: "Publish", package: "publish")]
```
### The complete `Package.swift` file
After adding the dependencies, the complete file should look like this:
```swift
// swift-tools-version:5.10
import PackageDescription
let package = Package(
name: "felixfoertsch.de",
platforms: [.macOS(.v12)],
products: [
.executable(
name: "felixfoertsch.de",
targets: ["felixfoertsch.de"]
)
],
dependencies: [
.package(url: "https://github.com/johnsundell/publish.git", from: "0.9.0")
],
targets: [
.executableTarget(
name: "felixfoertsch.de",
dependencies: [.product(name: "Publish", package: "publish")]
)
]
)
```
This concludes the minimal required configuration. The next step is to add the website structure in Swift and its content in Markdown.
## Create the Hello, World website
The website structure written in Swift goes into the `Sources` and Markdown content in the `Content` folder. We are creating dummy files in both folders to get started.
Create a `index.swift` file in the `Sources` folder and a `index.md` in the `Content` folder. The file structure should now look like this:
```bash
📁 Content
📄 index.md
📁 Sources
📄 index.swift
📄 .gitignore
📄 Package.swift
```
Add `# Hello, World!` to the `index.md` file.
The `index.swift` file is the entry point of the website. Note that we are using an additional dependency called `Plot` that is required and automatically resolved by the `Publish` library. It is a library that allows writing HTML in Swift and is used to generate the output.
Add the following code to the `index.swift` file.
```swift
import Foundation
import Publish
import Plot
struct Index: Website {
enum SectionID: String, WebsiteSectionID {
case posts
}
struct ItemMetadata: WebsiteItemMetadata {
}
// Update these properties to configure your website:
var url = URL(string: "https://felixfoertsch.de")!
var name = "felixfoertsch.de"
var description = "A description of felixfoertsch.de"
var language: Language { .english }
var imagePath: Path? { nil }
}
// This will generate your website using the built-in Foundation theme:
try Index().publish(withTheme: .foundation)
```
```swift
swift package resolve
swift build
swift run
```
## Glossary
- **Products** define the executables and libraries a package produces, making them visible to other packages.
- **Targets** are the basic building blocks of a package, defining a module or a test suite. Targets can depend on other targets in this package and products from dependencies.

View File

@@ -1,34 +0,0 @@
Apps
Backend
- [ ] Write a text about the PLAN to gather the thoughts
- [ ] Use Ansible to setup infrastructure
- [ ] (Deploy a postgres)
- [ ] Connect to postgres
Frontend
- [ ] Setup Hello-World app
- [ ] Deploy app with pipeline to Backend 👆
The single-player app developer guide
So you want to finally develop an app? Do you really want to do it? You might rather open a café… but anyway here it goes.
I have been struggling with organizing my thoughts for a very long time. You might be smart, capable, and focused. However, you cant seem to find a starting point. Not only you. Let me give you your new mantra: Complexity is the enemy. You need to stop daydreaming and start doing. I know you can. But I also now its hard to find out where?! to start.
Let me help you.
Part 1: The infrastructure
It doesnt matter what your idea is. 95 % of all apps need the same backend structure. And backend structure has been solved. Dont do it again.
If your app does not require a cross-platform backend and a web component, use the most native system, that is: CoreData for iOS. And for Android you are shit-out-of-luck, because there is a million different ones. Try Realm DB.
If your app requires a cross-platform backend or have a web component (most apps with user-interaction will at some point), use an infrastructure framework like Appwrite or Supabase. You can also a proprietary one like Firebase from Google. It doesnt really matter. But dont do the backend again. All of these frameworks solve your user-management issues and provide easy access to persistent storage.
However, take a minute and really think about the cross-platform and web requirement. Because if you can avoid it, you can avoid all of the infrastructure and security problems that come with infrastructure that is accessible from the web.
What you need to do, however, is controlling the infrastructure at some point. If you dont, you will get leeched dry. Your app will not earn lottsamoneyyysss. There is a good chance that it will take a long time to be profitable. Hence you pick a provide that offers reasonable infrastructure cost and uses open standards and tools you can freely move around. Also, if you control the infrastructure, you control the required app components and you are not depending on some third party to patch security or to
Lets use the most economic choice that I know of: Uberspace.de. They already have Postgres and Mysql ready for you

View File

@@ -1,110 +0,0 @@
# Using Apple Apps Efficiently
## TODO
Um das Buch mit sinnvollem Inhalt zu füllen: Checkliste erstellen, die man Personen schicken/schenken kann, um herauszufinden, welche Bedürfnisse existieren
## AUSBLICK
* Progressive Disclosure
* The option key
* Using iOS apps for personal fitness goals
* FoodNoms
* Health
* Journaling
* MoodLog
* Meditation (?)
## Introduction
Welcome to the Apple ecosystem.
I became an Apple fanboy a long time ago. Around 2010. At first, my main reason was their well built products. I am a computer worker and hence, I have to use one every day. Having used many plastic bombers in my life, switching to a MacBook felt great. I got the tiny MacBook Air in 2010. It had a tiny screen and was very mobile. But it was still super usable, because it had a proper keyboard. And Apples touchpads are just very, very good. Long story short: Its just very nice to use a well built product everyday.
After I started using said MacBook and became more acquainted with macOS and the other Apple software products, I realized one thing: the quality is not only in the hardware. Its also software. And furthermore, there are app developers that specifically target macOS and its design and organizational language, that makes their software also very, very good.
This book teaches you two things:
1. What all the Apple apps actually are and what functions they provide and
2. how to integrate and use them in everyday life for everything.
The Reason this Book is useful now
In the last major update cycle a new app joined the roster of Apple apps: Freeform.
This September will bring the release of macOS Sonoma (macOS 14), iOS 17 and iPadOS 17. It will bring a few incremental updates to the various Apple apps that increases their power level in a way that I can confidently say that they can replace your whole personal organizational tool stack. This holds true whether you already have one or are a complete beginner. You can organize your whole life without spending a cent extra for software.
Every app will become even more accessible as well.
This book will cover the following Apple apps in detail:
* Notes
* Reminders
* Calendar
* Freeform
* Mail
* Messages
* FaceTime
It will teach about system level configuration:
* Focus States
* Notification management
Advanced usage and automation:
* Shortcuts
It will give an overview for the following apps:
* Preview
* Pages
* Number
* Keynote
* Opinion: 4:3
And it will tease a few programs you could have a use case for:
* GarageBand
* iMovie
There are also a few third-party apps that are noteworthy for sticking close to Apples design principles. These are mostly not free, but worth buying to further integrate into the workflow:
* StopTheMadness
* 1Password
Collaboration
## Reminders
Reminders — at first glance — is just a simple todo app. This basic functionality is accessible very easily.
As is the theme with this book, we will focus on the more advanced ways of using the app.
## Shortcuts
Übergreifende Ziele:
* Kommunikationsabhängigkeit minimieren
* Wie mit Notification umgehen?
* Scheduled Summary
* Badges
* Notification Center
* Watch Faces umstellen, wenn ich zu Hause bin vs unterwegs -> Timer zB nur zuhause notwendig, Infograph hässlich
* zu Hause
* Timer
* AutoSleep
* Standard
* Workout starten
* Activity
* Calendar
*
* Nur Aufgaben-Notifications erlauben (Kalender, Reminders?)
* Chat, Ziele:
*
* Standard, Ziel:
*
* DND, Ziele
* Alles lautlos
* keine Notifications
* Arbeitsmodus? Wenn das der Arbeitsmodus ist, was macht dann Standard?

View File

@@ -1,133 +0,0 @@
# Install Syncthing on Uberspace 6 in a Subdomain
<div class="alert alert-warning">
<h2 class="alert-heading">Uberspace 6 has reached <a href="https://en.wikipedia.org/wiki/End-of-life_(product)">EOL</a></h2>
<p>If you want to use Syncthing, you should create an Uberspace 7 and refer to the the <a href="https://lab.uberspace.de/guide_syncthing.html">Syncthing tutorial from the Uberlab</a>!</p>
</div>
This short tutorial explains how to install [Syncthing](https://syncthing.net) on a [Uberspace](https://uberspace.de). It is based on the [~~Tutorial~~](https://maxhaesslein.de/dachboden/syncthing-auf-uberspace/) from [Max Haesslein](http://maxhaesslein.blog). Thanks Max!
<!--more-->
# Download newest Syncthing version
Connect to your uberspace:
```
ssh <user>@<uberspace>
```
Download the [newest Syncthing version](https://github.com/syncthing/syncthing/releases/latest) for Linux:
```
cd ~/etc/
wget <NEWEST AMD64 LINUX VERSION>
```
Extract the file (eXtract Ze Files!) and move it to its own folder:
```
tar -xzf <FILENAME>
mv <FOLDERNAME> syncthing/
```
Link it to your binaries folder and start it once:
```
ln -s ~/etc/syncthing/syncthing ~/bin/syncthing
syncthing
```
Close the program with CTRL-C.
# Prepare your Uberspace
Get the ports we are going to use for GUI and sync:
```
uberspace-add-port -p tcp --firewall
🚀 All good! Opened tcp port <PORT1>.
uberspace-add-port -p both --firewall
🚀 All good! Opened tcp port <PORT2>.
```
Add a subdomain to make your Syncthing easily accessible; also make sure it is possible to connect through HTTPS:
```
uberspace-add-domain -w -d sync.<DOMAIN>.de
uberspace-letsencrypt
uberspace-letsencrypt-renew -f
```
If you already use LetsEncrypt, you have to add the domain to your configuration. Just follow the steps displayed after the `uberspace-letsencrypt`. Don't forget to add the subdomain to your domain registrar DNS records aswell, so it gets redirected correctly!
Now, create the corresponding folder on the Uberspace:
```
mkdir /var/www/virtual/<UBERSPACE>/sync.<DOMAIN>.de
```
Edit the `.htaccess` so it sends you to the correct port:
```
cd /var/www/virtual/<UBERSPACE>/sync.<DOMAIN>.de/
vim .htaccess
```
```
RewriteEngine On
RewriteRule (.*) http://localhost:<PORT1>/$1 [P]
```
# Modify the Syncthing config file
Open the syncthing config file:
```
cd ~/.config/syncthing
vim config.xml
```
Find the GUI entry and replace the port with `<PORT1>`:
```
...
<gui enabled="true" tls="false" debugging="false">
<address>127.0.0.1:<PORT1></address>
...
```
Find the options entry and replace the port with `<PORT2>`:
```
...
<options>
...
<localAnnouncePort><PORT2></localAnnouncePort>
<localAnnounceMCAddr>[ff12::8384]<PORT2></localAnnounceMCAddr>
...
```
# Setup Syncthing as a service
If you don't have any services running, you have to setup the Daemon Tools first: [Uberspace Wiki, Daemon Tools](https://wiki.uberspace.de/system:daemontools).
After setting up the services, you can add Syncthing as a service and restart it once:
```
uberspace-setup-service syncthing ~/bin/syncthing
svc -du ~/services/syncthing
```
# Secure your Syncthing instance
Your Syncthing is now available via `sync.<DOMAIN>.de`. However, it is accessible by everyone on the web. Therefore you should secure it. Got to the Syncthing Settings:
![You can access your settings via Actions -> Settings](/img/20180602-Syncthing-settings.png)
**IMPORTANT: Do not check `Use HTTPS for GUI` you will lose access to your GUI. To get it back you have to find the TLS option in your Syncthing config and set it to `false` again. You connections will have TLS and will be secure without checking this box.**
And now enter your admin user and password in the corresponding fields:
![You can access your settings via Actions -> Settings](/img/20180602-Syncthing-settings2.png)
# The end
Save and that's it! You now have a Syncthing service running on Uberspace! Ideal for private documents you don't want the NSA to have.

View File

@@ -1,36 +0,0 @@
# Basic Things to Consider When Starting an Online Business
This post is a really short excerpt from a flyer I found a while ago. It lists thing you should consider, if you want to try to start an online business. Think about it as a checklist.
<!--more-->
# Fundamental rules
- You must care about it.
- You must be able to become the authority on it.
- You must be able to differentiate yourself.
- You must fulfill a need.
- Your niche must be commercial.
# Ways to make money
- Affiliate marketing.
- Advertising.
- Selling your own products.
- Drop shipping (white labeling) - offer products redirect order to supplier.
# Setup process
- Deciding on a decent name for your online business.
- Registering your domain name, web hosting, and installing WordPress.
- Designing your website & logo.
- Registering social media profiles.
- Creating an online store.
- Setting up advertising, affiliate, and merchant accounts.
- Setting up Google Analytics.
# Necessary systems
- A system for getting attention (Venture Harbour, What Is My Comfort Zone, FanDistro).
- A system for capturing data.
- A system for selling products.

View File

@@ -1,16 +0,0 @@
# Use Picture-in-Picture Mode on Mac and iPad with a Bookmarklet
[Quinn](https://twitter.com/SnazzyQ) from [Snazzy Labs](https://www.youtube.com/channel/UCO2x-p9gg9TLKneXlibGR7w) just posted an [interesting video](https://www.youtube.com/watch?v=cqjpa8-Cp-s) about some macOS utilities. I love small utilities, but I like it even better, when a problem can be solved with system functions. That is the case here. He mentions Helium - an app to use a form of picture in picture mode for websites that don't support the native PIP.
However, there is a better solution! And this solution works on Mac as well as iPad!
<!--more-->
You can use a small [bookmarklet](https://en.wikipedia.org/wiki/Bookmarklet) that pushes the current HTML5 video on screen into the native PIP. And yes, it also works with Netflix, **if** you are on macOS Mojave or up (as far as I can tell, Netflix doesn't run in the previous versions of Safari).
Create a new bookmark, enter the following string as the address, give it a nice emoji (like this: ⤵️), voilà! You can now use the native PIP for nearly all your videos!
Here is the code:
```
javascript:document.querySelector(%22video%22).webkitSetPresentationMode(%22picture-in-picture%22);
```

View File

@@ -1,60 +0,0 @@
# How to Begin an English Sentence
During the writing of my thesis, I collected some English words you can use two empower your writing style.
<!--more-->
Addition:
also, again, as well as, besides, coupled with, furthermore, in addition, likewise, moreover, similarly
Consequence:
accordingly, as a result, consequently, for this reason, for this purpose,
hence, otherwise, so then, subsequently, therefore, thus, thereupon, wherefore
Generalizing:
as a rule, as usual, for the most part,
generally, generally speaking, ordinarily, usually
Exemplifying:
chiefly, especially, for instance, in particular, markedly, namely,
particularly, including, specifically, such as
Illustration:
for example, for instance, for one thing, as an illustration,
illustrated with, as an example, in this case
Emphasis
above all, chiefly, with attention to, especially, particularly, singularly
Similarity:
comparatively, coupled with, correspondingly, identically, likewise, similar, moreover, together with
Exception:
aside from, barring, besides, except, excepting, excluding, exclusive of, other than, outside of, save
Restatement:
in essence, in other words, namely, that is, that is to say,
in short, in brief, to put it differently
Contrast and Comparison:
contrast, by the same token, conversely, instead, likewise,
on one hand, on the other hand, on the contrary, rather,
similarly, yet, but, however, still, nevertheless, in contrast
Sequence:
at first, first of all, to begin with, in the first place, at the same time,
for now, for the time being, the next step, in time, in turn, later on,
meanwhile, next, then, soon, the meantime, later, while, earlier,
simultaneously, afterward, in conclusion, with this in mind,
Summarizing:
after all, all in all, all things considered, briefly, by and large, in any case, in any event,
in brief, in conclusion, on the whole, in short, in summary, in the final analysis,
in the long run, on balance, to sum up, to summarize, finally
Diversion:
by the way, incidentally
Direction:
here, there, over there, beyond, nearly, opposite, under, above,
to the left, to the right, in the distance

View File

@@ -1,15 +0,0 @@
# Die Rechnung
Die Rechnung ist eines der wesentlichsten Dokumente des Geschäftsverkehrs. Da sie ein formales Dokument ist, müssen einige Regeln eingehalten werden, damit eine Rechnung _gültig_ ist und der Kunde bezahlen muss. Der Gesetzgeber hat eindeutig festgelegt, welche Angaben enthalten sein müssen ([§ 14 UStG](https://www.gesetze-im-internet.de/ustg_1980/__14.html)):
<!--more-->
- Der vollständige Name und die Anschrift des Rechnungs**steller**
- Der vollständige Name und die Anschrift des Rechnungs**empfänger**
- Die Steuernummer des Rechnungs**stellers**
- Das Ausstellungsdatum
- Eine eindeutig Rechnungsnummer
- Die Menge und Art der gelieferten Leistung
- Das Datum der Lieferung (auch wenn identisch mit oben!)
- Der Netto-Betrag der Lieferung
- Den anzuwendenden Steuersatz
- Den anfallenden Steuerbetrag

View File

@@ -1,15 +0,0 @@
# Collection of High Quality Swift Libraries
Libraries are an important part of programming. However, there should be a **really** good reason, if you decide to use a library. And if you use one, it should be a good one. These are some from my collection:
<!--more-->
- [JTAppleCalendar](https://github.com/patchthecode/JTAppleCalendar): Need a calendar view? Don't roll your own.
- [Keychain](https://github.com/evgenyneu/keychain-swift): Have something that need secure storage, like a password? Put it in the keychain.
- [SPPermission](https://github.com/IvanVorobei/SPPermission): Your app needs permissions? Inform the user properly. It's important.
- [SwiftDate](https://github.com/malcommac/SwiftDate): Handles all your date and time needs. [Don't roll your own](https://www.youtube.com/watch?v=-5wpm-gesOY).
- [WhatsNewKit](https://github.com/SvenTiigi/WhatsNewKit): Welcome your new user like apple does.
# Helper
- [SwiftyUserDefaults](https://github.com/radex/SwiftyUserDefaults): A small wrapper around NSUserDefaults that makes the usage swifter.

View File

@@ -1,70 +0,0 @@
# Use the Pumping Lemma for Regular Languages
This semester I finished my course about automata and languages. I learned a lot and it was really enjoyable. From this field, there was [a question about the Pumping Lemma on the computer science subreddit](https://old.reddit.com/r/computerscience/comments/atrs4y/pumping_lemma_in_theory_of_computation/). So naturally, if someone ask about a thing I know about, I'll try to explain it as best as I can -- repetition is key for retaining knowledge!
<!--more-->
# lang pollenMy Explanation
[My original post on Reddit.](https://old.reddit.com/r/computerscience/comments/atrs4y/pumping_lemma_in_theory_of_computation/eh3aw9k/)
To understand the PL, we think about it in two steps. I'll do it for the regular languages. You can do the same on your own for the context free languages. The idea is the same.
1. We create a visual model to understand what it is about.
2. We do a PL proof.
# 1. Creating a visual model in your mind.
Firstly, we have to keep in mind that we want to show that a language is not regular. Let's reason a little bit more about regular languages:
- Regular languages can be accepted by finite automata (FA). That means: if your language is regular, there is an FA that accepts this language.
- To check, whether a word is accepted by an FA, you start in a state, start reading in letters of your word and follow the edges through the FA. If the whole word is read and we end up in a final state, the FA accepts the word.
- But hold on a second! FA can also accept words that have more letters than we have states and edges. How can that be?! The answer: loops.
- Now, given any regular language, we **know** that there is an FA that accepts it (this is a theorem).
- That means: if we have a word, that has more letters than we have states, but is still accepted by our FA, we **have to have** a loop in our FA.
- Think about it: we can repeat this loop as many times as we want and the FA would still accept words that are processed by going through the loop repeatedly. **It has to!**
- This repeating of the loop is referred to as pumping a word up or down.
# 2. Doing a proof.
Now, secondly, you want to proof something using this lemma. Let's start with the PL (really try to understand this line!):
`L ∈ REG → ∃n ∈ ∀x ∈ L: |x| ≥ n ∃u, v, w: x = u ∘ v ∘ w, |v| ≥ 1, |uv| ≤ n ∀i ∈ : u ∘ vⁱ ∘ w ∈ L`
I'll break it down. Remember: This is a theorem. If you meet the conditions of the implication (part on the left), you now **know** that the part on the right is true.
1. `L ∈ REG →`: "Given a regular language, the following is true."
2. `∃n ∈ `: "There is a natural number"
3. `∀x ∈ L: |x| ≥ n`: "For every word `x` that is in the language and longer than this natural number"
- Remember the argument with the loops from part 1. This just says: we now have a word that has more letters than we have states.
4. `∃u, v, w: x = u ∘ v ∘ w, |v| ≥ 1, |uv| ≤ n`: "You can split up the word `x` into three parts: `u, v, w` where the length of `v` is equal to or bigger than `1` and the length of `u ∘ v` is smaller than our natural number from before"
- Here we describe the loop in more detail. `v` is the part that we can pump, because there is a loop that processes v (and can thus process arbitrary iterations of v - or skip it altogether. And because `u ∘ v` is smaller than `n`, we didn't need a loop until now. We only really **need** a loop, if our word has more letters than we have states!
5. `∀i ∈ : u ∘ vⁱ ∘ w ∈ L`: "If all the conditions before have been met, we can now pump `v` up or down and the resulting word is still in the language!"
- Since it is a loop, pumping doesn't make a difference. If you go the loop a million times, the word is still in the language.
That's it. Again, because it is proved, you **know** it's true if all the conditions are met.
We want to use the lemma to show, that a language **is not** a regular language. Let's have a look at the implication from above. Think about the left part of the implication (`L ∈ REG`) as `A` and the right part (`∃n ∈ ∀x ∈ L: |x| ≥ n ∃u, v, w: x = u ∘ v ∘ w, |v| ≥ 1, |uv| ≤ n ∀i ∈ : u ∘ vⁱ ∘ w ∈ L`) as `B`: `A → B`.
We can now do the following transformation:
`A → B ≡ ¬B → ¬A`
To pull in the negation on the right side of this transformation, all the quantifiers have to "flip around". This means the sentence now looks like this:
`∀n ∈ ∃x ∈ L: |x| ≥ n ∀u, v, w: x = u ∘ v ∘ w, |v| ≥ 1, |uv| ≤ n ∃i ∈ : u ∘ vⁱ ∘ w ∉ L → L ∉ REG`
Again, this is still the Pumping Lemma. We didn't change it, we just used an transformation for the implication that is equivalent. If you meet the conditions on the left, you **know** the sentence on the right is true.
Let's use this on an example: Show that `L = {aᵏ ∘ bᵏ | k ≥ 0}` is not regular.
1. Take any number `n`.
2. Select a word with the requirement `x ∈ L` with `|x| ≥ n`. Your mathematical creativity is requested here! You need to pick a word that helps you show the rest of the conditions easily! We are going to pick: `x = aⁿbⁿ`. This is convenient, because its obvious that it is as least as long as n (n occurs twice in it as an exponent). The important property to note: there are exactly as many `a` as there are `b` in this word. So if we can pump it in a way, that this is not the case anymore, we are golden!
3. Now we have to look at **all** of the partitions `x = uvw` with the conditions `|v| ≥ 1` and `|uv| ≤ n`. Since we have to look at all of them we just say: Let's assume these conditions are met (we can now use them in the next step).
4. Pick an `i` that shows that `u ∘ vⁱ ∘ w ∉ L`. Let's take `i = 0`.
- Since our word is `aⁿbⁿ` and one of the conditions is `|uv| ≤ n`, we know that `uv` can **only** consist of the letter `a`.
- And because we have the condition `|v| ≥ 1`, we also know that `v` has to contain **at least** one letter `a`.
- If we now remove this letter (or maybe its more than one letter, it doesn't matter), the amount of letters `a` in the word `x` is now not equal to the amount of letters `b` in the word.
- Hence: Our word is not part of the language any more (`u ∘ v⁰ ∘ w ∉ L`), violating the PL.
This shows that `L = {aᵏ ∘ bᵏ | k ≥ 0}` is not a regular language.

View File

@@ -1,132 +0,0 @@
# Install Mailtrain on Uberspace.de
This tutorial explains how to install [Mailtrain](https://mailtrain.org) on a [Uberspace 7](uberspace.de). [Mailtrain](https://mailtrain.org/) is a self-hosted open-source (released under the [GPL
v3.0](https://github.com/Mailtrain-org/mailtrain/blob/master/LICENSE).) newsletter app built on top of [Nodemailer](https://nodemailer.com/). I am following the [manual installation guide](https://github.com/Mailtrain-org/mailtrain#quick-start---manual-install-any-os-that-supports-nodejs) from the official Mailtrain repo and add some additional Uberspace infos. I contributed [this guide](https://lab.uberspace.de/guide_mailtrain.html) to the [Uberlab](https://lab.uberspace.de/) and earned my first [Ubercup](https://github.com/Uberspace/lab/blob/master/CONTRIBUTING.md#reward).
<!--more-->
# Installation
This guide uses Node.js version 12, which is the [default](https://manual.uberspace.de/lang-nodejs.html#standard-version) on Uberspace 7 at at the moment.
Clone the [GitHub](https://github.com/Mailtrain-org/mailtrain)
repository:
```console
[isabell@stardust ~]$ git clone git://github.com/Mailtrain-org/mailtrain.git
[isabell@stardust ~]$
```
Install the required dependencies:
```console
[isabell@stardust ~]$ cd mailtrain
[isabell@stardust mailtrain]$ npm install --production
[isabell@stardust mailtrain]$
```
# Configuration
## Database Setup
Create a new database:
```console
[isabell@stardust mailtrain]$ mysql -e "CREATE DATABASE ${USER}_mailtrain;"
[isabell@stardust mailtrain]$
```
## Mailtrain Config
Copy the example config file:
```console
[isabell@stardust mailtrain]$ cp config/default.toml config/production.toml
[isabell@stardust mailtrain]$
```
Update `production.toml` with your MySQL settings; look for the
`[mysql]` block:
```console
...
[mysql]
host="localhost"
user="isabell"
password="MySuperSecretPassword"
database="isabell_mailtrain"
...
```
## Web Backend Config
[Mailtrain](https://mailtrain.org/) is running on port 3000. Configure the server to respond to port 3000 using web backends:
``` console
[isabell@stardust ~]$ uberspace web backend set / --http --port 3000
[isabell@stardust ~]$
```
## Supervisord Daemon Setup
Create `~/etc/services.d/mailtrain.ini` with the following content:
```ini
[program:mailtrain]
directory=%(ENV_HOME)s/mailtrain/
command=env NODE_ENV=production /bin/node index.js
autostart=yes
autorestart=yes
```
If it's not in state RUNNING, check your configuration.
## Login and Change Admin Credentials
{% include bootstrap/alert.html
content="Change the default admin credentials to prevent unauthorized access of your data!"
style="danger"
%}
Your [Mailtrain](https://mailtrain.org/) installation should now be
reachable on `https://isabell.uber.space`. Log in with the username
`admin` and the password `test`.
Go to `https://isabell.uber.space/users/account` and change your email
address as well as your password.
{% include bootstrap/alert.html
content="It is not possible to change the username in the GUI. If you want to change the default username `admin` to something else or add additional users, you have to do it directly in the database."
style="info"
%}
# Finishing installation
Go to `https://isabell.uber.space/settings`. In the **General Settings** section change the **Service Address (URL)**
to `https://isabell.uber.space/`.
In the **Mailer Settings** section change the
> - *Hostname*,
> - *Port*,
> - *Encryption*,
> - *username*,
> - *password*, and
> - test your settings by pressing the Button **Check Mailer Config**.
{% include bootstrap/alert.html
content="Uberspace does not allow mass mailings from their servers according to their House Rules. However, you can use Mailtrain as the admin interface for your mailing needs. Use the SMTP services from AWS SES, Sendgrid, Mailgun, etc. for the actual mailing."
style="warning"
%}
# Best Practices
- Test the configuration by creating a new list and subscribing yourself
to it.
- Craft your campaign with love and dedication.
- Dont spam users that dont want your newsletter.
------------------------------------------------------------------------
Tested on Uberspace v7.7.0 with NodeJS v12 and MariaDB 10.3.23.

View File

@@ -1,18 +0,0 @@
# Strategies from the Happiness Lab
I love listening to podcasts while I am out running. The latest one I found is [The Happiness Lab](https://www.happinesslab.fm/) from and with Dr. Laurie Santos, a professor teaching at Yale. She looks at happiness scientifically and takes an active approach: [You have it in your own hands to improve your happiness](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000449594792). The podcast discusses various strategies with various scientists and experts from their respective field.
This is a collection of these strategies you can employ; with the link to the corresponding episode for more information.
<!--more-->
* [Meditate.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000469606673) You have probably heard about people recommending meditating a thousand times. Do it. Start with 1 minute every day. The research of the benefits seems to be overwhelming.
* [Sleep enough.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000463759567) Trivial. Humans need sleep. Get. Some. Make it a ritual to go to bed. Make the bed a sanctuary. No screens, no distractions. If you are lying in bed, you sleep. If you can't sleep, leave the bed and try again later. You can combine the ritual with meditation (see above).
* [Remove choice.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000455959891) Being in control of and having to decide everything is exhausting. Remove unnecessary choices from your life. Have a big wardrobe? Reduce it and go minimal. Or to quote President Obama who always wore a white shirt and cycled through his suits: "Do you know how many decision I have to make throughout the day? You think I also want to decide what to wear?"
* [Coach yourself from the third person.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000468907282) The research suggests that you perform better and are happier, if you think about the challenges you are facing from a third person perspective. The key term is **distancing**. Distance yourself to get a clearer picture of what is going on. You can use personal distancing (use your name instead of "I"): "Felix knows what he is doing and has experience. Trust him." You can use temporal distancing: "Felix has faced this threat before and came out successful." You can use group distancing: "We are a strong society and can solve this challenge together."
* [Connect with others. Even strangers.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000452731206) Modern life aims at removing all inconveniences. But it also removes social connections with other people. The example from the podcast is from the guy that invented the ATM. When there were still bank tellers, you had to wait in line -- where you might have to interact socially -- and had to interact with the teller. A person. Research suggests that happiness improves just by interacting with other people
* [Frame your emotions.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000469255597) When encountering an emotion, you have 5 seconds to decide how to react to it. Use different frames depending on the situation. Examples for these frames:
* **The comedic frame** Try to tell a joke about the situation.
* **The future storytelling frame** Live your life in a way so that your story, told **truthfully**, makes you look like the person you strife to be. Which story sounds better to you? The story about a miserable and frustrated person that gave up on the slightest problem **or** the story about the person that strongly and cleverly encounters the challenges life throws at her and masters these challenges while smiling.
* **The stoic gods challenge frame** Use stoic, imaginary gods as a psychological device: Every setback you face in life is a test these gods have designed to test you and your character. And you want and can prove to them that you are up to the challenge. The harder the challenge is, the more trust the gods have in you.
* [Practice negative visualization.](https://podcasts.apple.com/de/podcast/the-happiness-lab-with-dr-laurie-santos/id1474245040?l=en&i=1000469255597) Pause every once in a while during the day and think about what you could lose and how that would make you feel. Don't dwell on these thoughts. Just let them flicker for a second. This aims at increasing your appreciation for the people and things you have in your life.

View File

@@ -1,73 +0,0 @@
# Ideas
Many people have ideas. Ideas are not special. What makes and breaks an idea is its realization and/or implementation. Here are some of **my** product ideas. Implement them, if you like them! Then send me an [email](mailto:felixfoertsch@gmail.com) to show them to me, please. 😁
<!--more-->
# Product Ideas
**Flatpen:** Pens have a problem. They are round and stiff and that makes them harder to carry around. The idea: Create a pen that uses regular pen mines, but folds flat so it can be put inside of a notebook without making it wobble.
**Process Visualization with Z-Layers:** Processes are an important part of business development and optimization. Their visualization is important for communicating them. Most process visualization software is clunky to use. Finding the right layer of abstractions with processes is hard by default -- software should make it easier. This has to be a combined solution: From the editor to the reader. The core idea is using Z-layer zooming to make it more intuitive (e.g. pinching in mobile and tablet apps).
**Magic Handshake:** Create a system that supports favors. Being in the system opens you doors, because you know someone. Like an exclusive club.
**10 Minute Mentor:** Finding is a mentor is difficult. Make it easier.
**Sane Games:** Create a list of games that are *sane*: no IAP, no psycho abuse, etc.
# Web App Ideas
**Sign-up:** Create an event where people can sign up really easily. Like [Raid Helper](https://raid-helper.com/), but generalized.
**WOOP:** PWA that implements the [GROW](https://en.wikipedia.org/wiki/GROW_model) or [WOOP](https://en.wikipedia.org/wiki/Gabriele_Oettingen) mental model.
**Predefined Workflow Builder/Checklister/Show the Way:** Many task in modern life follow step-by-step processes. It is **really** inefficient that everybody has to learn them individually. It should be easy to download a pre-created checklist for a specific task and then succeed with just following this checklist. E.g. "How to do a product launch" --> Step 1: Do X. Step 2: Do Y., "How to learn JavaFX" --> etc. Specialised Version of this could be a "You should app". A collection of things everybody should do and/or have. Have a bank account, have insurance, etc.
**GitHub Contributions for Everything:** GitHub Contributions are awesome. They give a quick and intuitive overview about progress. Create a way that allows tracking everything like this.
**Applicant Oriented Applications:** Applications are awful for the applicant. They are at the mercy of organizations. They have to send in all their information and then they have to wait. And they have to do that multiple times. Use different interfaces, create different formats, and so on. It should be easier.
**Make it very easy to donate to a good cause/org:** One click donations. It is not easy to set up donations in Germany. There is a lot of hassle involved with creating receipts etc. This should be super easy for the associated organizations and should allow integrated systems like PayPal and Stripe for payments.
**Local Twitter:** It's not always easy to know what's happening around your. Make an app that makes it really easy to know what public events are happening right now around you. Concert? Demonstration? Check and know.
**Gamekey Exchange:**
Enable people that buy things like humble bundle to trade their unused keys with each other.
# Computer and Phone App Ideas
**On time:** Calendar integration that allows one click information to others, if you are on time or not.
**Hierarchical Documentation:** Documentation of software is often flat, even though hierarchies are at the core of many projects. Tools should display hierarchies to make it easier to quickly grasp software libraries.
**Moderator Toolbox:** Organizing groups is hard. Make using speech lists, protocols, etc. easy to do.
**Cadence and Heartbeat Music:** Generate electronic music (e.g. with AI) and use the heartbeat sensor of the Apple Watch attach it to the cadence and/or heart rate of the person.
**Vaccination Card:** There is a yellow book that helps track vaccinations. Make one that's on your phone.
**Walk the City:** Exploring a city is awesome. Make an app that tracks all routes/streets you have already been to on the map to facilitate walking every road once.
**Checkpoints:** Create a system that allows people with bad time management to tell an accurate prediction on when they'll get somewhere. Use map data and checkpoints to find out the time.
**Color Clipboard:** Monitor clipboard and store Hex codes. Give a nice UI to create palettes, etc.
**Kontakte:** Create a Tinder-like interface to clean-up contacts: Keep, delete, edit. Have a nice and easy way to add notes and tags. Potentially: Add whitelist/blocklist.
**Business Plan Archive:** Like ideas business plans have way less value than people think. Put them in the public domain.
**Track a Thing:** App that has a unified interface to track things **very** easily. Did a run: Track. How many days since you last called your mother: Track. Is your Doner bigger or smaller than average: Track.
**Single Player Raider (Game):** A game where you do a 40-person raid, but you do it solo on your own terms.
# Apps that already exist (or probably exists), but require better design, should not cost money or should be open source
- **Tiddlywiki for Mac**
- **Anki for Mac**
- **Twitch for Mac:** mpv/IINA as player and chat on the bottom (native portrait mode)
- **Ebook reader for Mac:** Books always adds the PDF/ePub to the library, which is not always required
- **Reddit but with a limit:** Scrolling is unhealthy.
- **Archiver for Mac:** Easy archiving of things. YouTube via youtube-dl, etc.
- <https://www.progressbarosx.com/>
- **Ambience:** Menu bar one-click music player for study/background music

View File

@@ -1,71 +0,0 @@
# Zusammenfassung von Fredmund Maliks Führen, Leisten, Leben
[Fredmund Maliks](https://de.wikipedia.org/wiki/Fredmund_Malik) [Führen, Leisten, Leben](https://www.amazon.de/dp/3593501279/) ist ein Management-Standardwerk. Es schildert wichtige Aspekte des Managements und die Philosophie des Autors. Dabei steht vor allem eine These im Zentrum: Gutes Management kann man lernen und ist **keine** gottgegebene Fähigkeit. Das Buch legt dar, wie man diese Fähigkeit lernen kann. Ich habe das Buch gelesen und für Dich zusammengefasst.
<!--more-->
# Der Manager
* Der Manager ist eine der wichtigsten Personen in der modernen Gesellschaft, da die Schnittstellen zwischen Berufen immer größer und das Leben immer schneller wird.
* Der Manager muss als Organisation denken. Er ist Teil eines größeren Komplex und trägt zu der Wirksamkeit und zum Erfolg der Gesamtheit bei.
* Wie bei vielen Berufen, wird Exzellenz als Manager durch Üben erzielt. Dabei spielt Talent zwar eine große Rolle: nur wer Talent mitbringt kann Management beherrschen. Aber prinzipiell kann **jeder** solide Management-Erfolge erzielen.
# Management-Prinzipien
Die wichtigsten Grundprinzipien der wirksamen und qualitativ wertvollen Führung sind:
* Resultat- und Zielorientierung
* Das Denken als Organisation und der Beitrag zum Ganzen
* Fokussierung auf einige wenige wichtige Punkte und Herausdestillieren dieser Punkte: Fokus!
* Stärken-Denken und nicht Schwächen-Denken, wie es in der Gesellschaft üblich ist: Stärken stärken!
* Positives Denken und Chancen-Fokus, nicht Problem-Fokus
* Vertrauen und Integrität, also z.B. Schutz der Mitarbeiter nach außen und oben und nicht Beschmücken mit fremder Leistung
* Kontrollieren, aber auch mal *fünfe gerade sein lassen*; Kontrolle basiert auf Vertrauen
* Individuelle Förderung der Mitarbeiter
# Führung einer Organisation
* Zur Umsetzung dieser Art der Führung:
* Arbeiten mit Zielen (unbürokratisch!) und auch (persönlichen) Jahreszielen
* Effiziente Organisation und vermeiden von zu viel “Organisitis”; aber nicht jedes Problem durch Neu-Organisation lösen, wenn es nicht dadurch zu lösen ist
* Die drei Grundfragen der Organisation:
1. Wie müssen wir uns organisieren, damit das, wofür der **Kunde** uns bezahlt, im Zentrum der Aufmerksamkeit steht und von dort nicht wieder verschwinden kann?
2. Wie müssen wir uns organisieren, damit das, wofür wir unsere **Mitarbeiter** bezahlen, von diesen auch wirklich getan werden kann?
3. Wie müssen wir uns organisieren, damit das, wofür die Firmenspitze/das Top-Management, bezahlt wird, von diesem auch wirklich getan werden kann?
* Zeichen schlechter Organisation:
* Zu viele, unnötige Managementebenen
* Zu viel bereichsübergreifende Arbeit: eine Organisation funktioniert dann am besten, wenn man so wenig wie nötig bereichsübergreifend arbeiten muss
* Zu viele Sitzungen, zu viele Leute
* Zu viele Arbeiter auf Projekten; am effizientesten ist es, wenn ein kompetenter Mitarbeiter ungestört arbeiten kann
* Zu viele Koordinatoren und Assistenten
* Umfokussierte Jobs
# Entscheidungen richtig treffen
Fundierte Entscheidungen treffen, dabei die Schlüssel-Spieler in den Prozess mit einbeziehen (dabei aber nicht aus Wohlwollen berücksichtigen, sondern nur aufgrund von tatsächlicher Wichtigkeit im Rahmen der Entscheidung!).
Der Entscheidungsprozess:
1. Die präzise Bestimmung des Problems
2. Die Spezifikation der Anforderungen, die die Entscheidung erfüllen muss
3. Das Herausarbeiten aller Alternativen
4. Die Analyse der Risiken und Folgen für jede Alternative und die Festlegung der Grenzbedingungen
5. Der Entschluss selbst
6. Der Einbau der Realisierung in die Entscheidung
7. Die Etablierung von Feedback, inklusive Follow-up und Follow-through
# Führungswerkzeuge
* **Die Sitzung:** davon nicht zu viele (s.o.), die Sitzungen nacharbeiten und bei den Verteilten Aufgaben auch Nachfassen (Follow-up)!
* Man sollte sich die Typen von Tagesordnungspunkten (TOP) klarmachen und vorher überlegen, wie man mit ihnen umgeht:
* Echte Standards (die wichtigsten Punkte die besprochen werden müssen).
* Dauerbrenner (wiederkehrende Themen, die man nicht richtig lösen kann, z.B. Probleme beim Betriebsklima): Sollte man langfristig nicht dulden; Lösung finden ist das A und O.
* Verschiedenes am Ende aller TOP: Sollte man nicht dulden; ist politisches Instrument, ggf. sogar um ein Thema “durchzudrücken”.
* Jeder TOP sollte auch eine Aktion beinhalten; ist das nicht der Fall, verkommt die Sitzung schnell zur “Laber-Runde”
* Protokolle wo nötig (ggf. gesetzlich vorgeschrieben); wo optional: sinnvolles Protokoll-Führen (z.B. die Aufgabenverteilung dokumentieren, um sie als Follow-up-Mittel zu verwenden)
* **Der Bericht:** der schriftliche Bericht ist das effizientes Mittel der Daten-Kommunikation. Der Bericht muss wirksam sein! Daher sollte Zielgruppen-orientiert gearbeitet (z.B. der Bericht geht an einen Juristen: Fokus auf Text, an einen Ingenieur: Fokus auf Grafiken und Statistik), auf realistische Struktur geachtet werden und der Bericht sollte keine unnötigen Inhalte enthalten
* **Job Design, Assignment Control:** Jobs sollten gut definiert werden. Nicht zu großer, nicht zu kleiner Aufgabenspielraum. Vermeiden von Unnötigkeiten. Und Positionen sollten nicht starr sein, sondern eine Möglichkeit der Weiterentwicklung der Arbeitsstelle (in diesem Fall nicht zwingend des Mitarbeiters!) haben. Ist eine bestimmte Position oder Aufgabe nicht mehr notwendig, muss sie überführt/abgeändert werden.
* **Budget und Budgetierung:** das wichtigste Tool eines Managers. Richtig benutzt, lässt sich darüber alles steuern. Auch Zeit-, Innovations-, Worst-Case-Budgets benutzen! Ggf. erweitern! Idee des Budgets: Ich habe limitierte Ressourcen, diese sinnvoll verteilen. Weiterführende Schlagworte: Zero-Base-Budgeting, Life-Cycle-Budgeting
* **Leistungsbeurteilung:** Möglichst nicht standardisieren.
* **Systematische Müllabfuhr:** Regelmäßige Reviews und überlegen, was noch notwendig ist und was nicht. Unnötiges ausmerzen! In allen Bereichen des Unternehmens.
* **Persönliche Arbeitsmethodik:** Man sollte sich angewöhnen, sie regelmäßig auf Wirksamkeit zu überprüfen. Wenn man in der Position ist zu delegieren, sollte man das nutzen. Ist hochgradig individuell.

View File

@@ -1,5 +0,0 @@
# Hello, world! Again?
I stumbled upon this simple blogging solution. Maybe this is the thing I was looking for?!
[WriteFreely](https://writefreely.org)

View File

@@ -1,125 +0,0 @@
# Publish, publish, published!
**A dive into Publishing Systems**
> Ready made knowledge can only be memorized. Knowledge is not truly our own, until we are capable of reproducing the given content in a form of our own making. Memorizing is but a negative condition. True or organic assimilation is impossible without inner transformation of what we learned.
>
> All rules for study are summed up in this one: Learn only in order to create. Only by his divine capacity for production is man truly man. Without it no more than a tolerably well devised machine.
>
> — Friedrich Schelling
## Some Requirements
I have so many ideas, but all of them have one thing in common: they have to be documented nicely. Only what's written is permanent. And only what's permanent is real. I need a system that helps me to publish my thoughts. Here are some additional requirements:
- Markdown (or equivalent)
- Needs to help me organize my thoughts
- Needs to be publishable
- Needs to be convertible into book/thesis form (I want to write master thesis with it)
- Needs to integrate into spaced repetition system?? -> Work through something, publish it, make it learnable?
- Write math in Unicode symbols?
One of the most important things to really understand something is to actually apply it. If application is not possible or straight-forward, an alternative is teaching someone else. The important aspect is the transformation. Transforming existing knowledge into your knowledge.
A good way that is completely independent of other people is simply forcing yourself to publish your transformed knowledge. It doesnt matter if they are being read, applied, or anything else. You are publishing for your own sake.
I have been using different blogging tools all my life. The latest one I tried was WriteFreely. The idea is great: have a blogging system that also speaks ActivityPub. This way, the integration with Mastodon is easy as pie.
However, after using it for a while, I cannot recommend the system. The UI is horribly confusing. And then there is issues like this where a feature is only half-baked, because it is “a design decision”. Sadly, as is often the case with open source software, you reach a point where something does not work, is not well thought out, and completely dismantles your use case.
And, to be honest, by now I am convinced that horrible UI is like a badge of honor for open-source projects.
## Researching Alternatives
I have not published in a while, because it is actually a hard thing to do. Learning something properly is difficult. But It is the only real way if you want to be qualified in a topic. And because is hard, encountering issues like the ones mentioned above are a hinderance for an enjoyable workflow. It can stop any motivation dead in its tracks. Therefore it is necessary to find new way to publish my knowledge and thoughts.
I have a few requirements for my new system. It needs to be able to read and convert Markdown files. I can have styling, but the source of the posts have to be files. A file based system is the only one that is really portable.
This means the system has to have one of the following:
- An idempotent way to import a folder.
- Serving directly from a folder on the fly.
- A compile and deploy step that converts a folder to a static website.
Additionally it needs a default design for a post, but it has to be possible completely change the styling of a single page, because I want to explore different designs for different topics.
It needs proper support to display mathematical formulas.
It needs to support a footnote/glossary system where terms like idempotent can be explained once and then being applied to the whole system.
Linking
Publishing as book
I have been collecting potential projects that I want to have a look into:
- Quarto
- Pollen
- Scribble
These are the results of my preliminary research: Quarto is a publishing system. TODO
Pollen and Scribble share a common root. They both use Racket, a Lisp dialect, to implement the programmatic aspects of the system. However, Pollen and Scribble differ in their goals. Pollen, similar to Quarto, is a complete publishing system that aims at creating beautiful books, websites, etc. That means it can render different formats as well. Its highly flexible and customizable. Scribbles main purpose, however, is to publish technical documentation, which results in a less stylized appearance of the document. Its single output format is HTML.
Decisionmaking
After weighing the pros and cons a little bit, I decided on trying Pollen first. It seems to be closest aligned with my goals in publishing different ideas on different pages. If it turns out to be the wrong choice, Ill try Quarto next.
The installation of Pollen on macOS is straight-forward. Install Racket with Homebrew then install pollen wir the Racket package manager. Thats it.
After diving deeper into Pollen, I decided against it. For one specific and maybe irrational reason: When Pollen renders files, it puts the output in the same folder. To me, that is horrible. It starts littering files. I want a clean working environment. At least it should clean up after itself, but it doesnt.
Lets try Quarto.
## Custom System
Based on the Unix philosophy it would be smart ot encapsulate every task in a single program. This way, the system can be easily extended and modified. So we need to have a step-by-step plan to convert the source files into the target files.
-
- The output files have to be copied to a directory on a web server via ssh and rsync
## Content
### Content Structure
- Archive: Folder that contains old ff.de-versions, should not be published
- Drafts: Folder that contains articles that are in progress. No stubs, only articles, that actually contain content.
- Ideas: Folder that contains stubs for articles.
- img: Folder that contains images for articles the filenames should be Time-based UUIDs so they can be sorted
- Published: Folder that contains the published articles in the source format. They have to be converted into the target format.
- Tweets: Tiny "articles" without a title.
### Content Types
- There are different types of files that have to be accounted for.
- Blog posts: Have a time stamp and are published on the web in chronological order
- Books: Have one root page and everything else is linked from there
- Papers/Thesis: Very similar to books (probably the same thing in our context)
- Glossary: Is a list of things that should be linked/underlined everywhere
- Footnotes: Can be part of all texts and should be at the bottom of the page.
- Bibliography:
- Sources should be linked on the page in the footnotes. The Bibliography should auto-generated from the used sources.
- Can have style-templates
- Markdown `*.md`
- Textile
- Asciidoc
## Converter
- Pandoc
- Hugo
- Jekyll
- Gatsby
- Eleventy
- VuePress
- Docusaurus
- Gridsome
- Nuxt.js
## Targets
- The converter converts the source using a template
- The template has to be specified in the front matter (if there is no template, use a default)
- HTML
- Templating
- PDF
- Epub

View File

@@ -1,137 +0,0 @@
---
layout: post
title: "Install Syncthing on Uberspace 6 in a Subdomain"
categories:
- Tutorials
tags:
- English
- Self-Hosted Software
last_modified_at: 2020-07-18
excerpt_separator: <!-- more -->
---
<div class="alert alert-warning">
<h2 class="alert-heading">Uberspace 6 has reached <a href="https://en.wikipedia.org/wiki/End-of-life_(product)">EOL</a></h2>
<p>If you want to use Syncthing, you should create an Uberspace 7 and refer to the the <a href="https://lab.uberspace.de/guide_syncthing.html">Syncthing tutorial from the Uberlab</a>!</p>
</div>
This short tutorial explains how to install [Syncthing](https://syncthing.net) on a [Uberspace](https://uberspace.de). It is based on the [~~Tutorial~~](https://maxhaesslein.de/dachboden/syncthing-auf-uberspace/) from [Max Haesslein](http://maxhaesslein.blog). Thanks Max!
<!-- more -->
## Download newest Syncthing version
Connect to your uberspace:
```
ssh <user>@<uberspace>
```
Download the [newest Syncthing version](https://github.com/syncthing/syncthing/releases/latest) for Linux:
```
cd ~/etc/
wget <NEWEST AMD64 LINUX VERSION>
```
Extract the file (eXtract Ze Files!) and move it to its own folder:
```
tar -xzf <FILENAME>
mv <FOLDERNAME> syncthing/
```
Link it to your binaries folder and start it once:
```
ln -s ~/etc/syncthing/syncthing ~/bin/syncthing
syncthing
```
Close the program with CTRL-C.
## Prepare your Uberspace
Get the ports we are going to use for GUI and sync:
```
uberspace-add-port -p tcp --firewall
🚀 All good! Opened tcp port <PORT1>.
uberspace-add-port -p both --firewall
🚀 All good! Opened tcp port <PORT2>.
```
Add a subdomain to make your Syncthing easily accessible; also make sure it is possible to connect through HTTPS:
```
uberspace-add-domain -w -d sync.<DOMAIN>.de
uberspace-letsencrypt
uberspace-letsencrypt-renew -f
```
If you already use LetsEncrypt, you have to add the domain to your configuration. Just follow the steps displayed after the `uberspace-letsencrypt`. Don't forget to add the subdomain to your domain registrar DNS records aswell, so it gets redirected correctly!
Now, create the corresponding folder on the Uberspace:
```
mkdir /var/www/virtual/<UBERSPACE>/sync.<DOMAIN>.de
```
Edit the `.htaccess` so it sends you to the correct port:
```
cd /var/www/virtual/<UBERSPACE>/sync.<DOMAIN>.de/
vim .htaccess
```
```
RewriteEngine On
RewriteRule (.*) http://localhost:<PORT1>/$1 [P]
```
## Modify the Syncthing config file
Open the syncthing config file:
```
cd ~/.config/syncthing
vim config.xml
```
Find the GUI entry and replace the port with `<PORT1>`:
```
...
<gui enabled="true" tls="false" debugging="false">
<address>127.0.0.1:<PORT1></address>
...
```
Find the options entry and replace the port with `<PORT2>`:
```
...
<options>
...
<localAnnouncePort><PORT2></localAnnouncePort>
<localAnnounceMCAddr>[ff12::8384]<PORT2></localAnnounceMCAddr>
...
```
## Setup Syncthing as a service
If you don't have any services running, you have to setup the Daemon Tools first: [Uberspace Wiki, Daemon Tools](https://wiki.uberspace.de/system:daemontools).
After setting up the services, you can add Syncthing as a service and restart it once:
```
uberspace-setup-service syncthing ~/bin/syncthing
svc -du ~/services/syncthing
```
## Secure your Syncthing instance
Your Syncthing is now available via `sync.<DOMAIN>.de`. However, it is accessible by everyone on the web. Therefore you should secure it. Got to the Syncthing Settings:
![You can access your settings via Actions -> Settings](/img/20180602-Syncthing-settings.png)
**IMPORTANT: Do not check `Use HTTPS for GUI` you will lose access to your GUI. To get it back you have to find the TLS option in your Syncthing config and set it to `false` again. You connections will have TLS and will be secure without checking this box.**
And now enter your admin user and password in the corresponding fields:
![You can access your settings via Actions -> Settings](/img/20180602-Syncthing-settings2.png)
## The end
Save and that's it! You now have a Syncthing service running on Uberspace! Ideal for private documents you don't want the NSA to have.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1 +0,0 @@
# Welcome to felixfoertsch.de!

View File

@@ -1,6 +0,0 @@
◊headline{Linklist}
◊items{
◊item{◊link["https://www.defmacro.org/ramblings/lisp.html"]{XML and Lisp have a kinship}}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Some files were not shown because too many files have changed in this diff Show More