Compare commits
10 Commits
8e4bcc2e08
...
9a5c90dc16
| Author | SHA1 | Date | |
|---|---|---|---|
|
9a5c90dc16
|
|||
|
8e8f38c8b5
|
|||
|
c203c8e9ef
|
|||
|
b45c29b83b
|
|||
|
9253bcbe80
|
|||
|
6405f8dd3b
|
|||
|
889e7047ac
|
|||
|
3cb1797091
|
|||
|
74ac93d349
|
|||
|
d99b4821d9
|
@@ -2,6 +2,7 @@
|
|||||||
title: "{{ replace (replaceRE "^[0-9]{4}-[0-9]{2}-" "" .Name) "-" " " | title }}"
|
title: "{{ replace (replaceRE "^[0-9]{4}-[0-9]{2}-" "" .Name) "-" " " | title }}"
|
||||||
date: {{ now.Format "2006-01-02" }}
|
date: {{ now.Format "2006-01-02" }}
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
|
|||||||
@@ -75,3 +75,9 @@ style = "emacs"
|
|||||||
[privacy.youtube]
|
[privacy.youtube]
|
||||||
disable = false
|
disable = false
|
||||||
privacyEnhanced = true
|
privacyEnhanced = true
|
||||||
|
|
||||||
|
# Modules
|
||||||
|
[[module.mounts]]
|
||||||
|
# Make static images available as image assets by default
|
||||||
|
source = "static/img/"
|
||||||
|
target = "assets/images/"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Organising micro task emails in Thunderbird
|
|||||||
date: 2013-10-27T23:12:55+00:00
|
date: 2013-10-27T23:12:55+00:00
|
||||||
aliases: organising-micro-task-emails-in-thunderbird
|
aliases: organising-micro-task-emails-in-thunderbird
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- email
|
- email
|
||||||
@@ -13,11 +14,11 @@ tags:
|
|||||||
The title of this post sounds very significant but to be honest, it’s a small thing.
|
The title of this post sounds very significant but to be honest, it’s a small thing.
|
||||||
|
|
||||||
Everybody has her/his/its own workflow regarding emails. For example me: I LOVE folders! When it comes to the crunch I probably would be able to organise my whole life into folders.
|
Everybody has her/his/its own workflow regarding emails. For example me: I LOVE folders! When it comes to the crunch I probably would be able to organise my whole life into folders.
|
||||||
|
|
||||||
Well, at least this is what I thought until I began my internship at [FSFE](https://fsfe.org/). I was used to a high income rate (do you say so?) before but something changed: Normally I read my emails and if something’s important, I open a new task in my taskmanager or simply write it down. In the office I also read lot’s of emails and can put them easily in folders via filters (in Thunderbird and with qmail/maildrop on my mailserver), for example emails in mailing lists.
|
Well, at least this is what I thought until I began my internship at [FSFE](https://fsfe.org/). I was used to a high income rate (do you say so?) before but something changed: Normally I read my emails and if something’s important, I open a new task in my taskmanager or simply write it down. In the office I also read lot’s of emails and can put them easily in folders via filters (in Thunderbird and with qmail/maildrop on my mailserver), for example emails in mailing lists.
|
||||||
|
|
||||||
But now it is more often the case that by reading those emails, there are beginning some mini-tasks: Commit this [translated](https://fsfe.org/contribute/translators/) file on the server, answer these emails, send out that package to a [fellow](https://fsfe.org/fellowship/) (but not today, do it next Monday), and most importantly, book some restaurants for the General Assembly. You see, these are all small tasks, but they exist. In dozens. And I’m quite sure they will increase. But creating for each micro task a new task in my task manager ([Getting Things Gnome](http://gtgnome.net/) by the way) is overload as well.
|
But now it is more often the case that by reading those emails, there are beginning some mini-tasks: Commit this [translated](https://fsfe.org/contribute/translators/) file on the server, answer these emails, send out that package to a [fellow](https://fsfe.org/fellowship/) (but not today, do it next Monday), and most importantly, book some restaurants for the General Assembly. You see, these are all small tasks, but they exist. In dozens. And I’m quite sure they will increase. But creating for each micro task a new task in my task manager ([Getting Things Gnome](http://gtgnome.net/) by the way) is overload as well.
|
||||||
|
|
||||||
For that I’m a forgetful technocrat sometimes, I wanted to pre-empt any mistakes and searched for methods to mark/tag those emails when reading them. Afterwards it should always be possible to find these marked/tagged with one click. In short, I needed a [Remembrall](http://harrypotter.wikia.com/wiki/Remembrall), that additionally tells me, what I exactly forgot.
|
For that I’m a forgetful technocrat sometimes, I wanted to pre-empt any mistakes and searched for methods to mark/tag those emails when reading them. Afterwards it should always be possible to find these marked/tagged with one click. In short, I needed a [Remembrall](http://harrypotter.wikia.com/wiki/Remembrall), that additionally tells me, what I exactly forgot.
|
||||||
|
|
||||||
Dear ladies and gentlemen, here’s my odyssey of finding the perfect method for me:
|
Dear ladies and gentlemen, here’s my odyssey of finding the perfect method for me:
|
||||||
@@ -37,7 +38,7 @@ Dear ladies and gentlemen, here’s my odyssey of finding the perfect method for
|
|||||||
Each method has its advantages. The tags are quite nice because you can differentiate between (own) tags and you can simply press the corresponding number on the keyboard to tag the mail. The marking method does not have such features but on my mobile (K-9 Mail) I cannot tag an email but only mark it. So I’m able to save some mails for later work when I’m sitting in the train for example.
|
Each method has its advantages. The tags are quite nice because you can differentiate between (own) tags and you can simply press the corresponding number on the keyboard to tag the mail. The marking method does not have such features but on my mobile (K-9 Mail) I cannot tag an email but only mark it. So I’m able to save some mails for later work when I’m sitting in the train for example.
|
||||||
|
|
||||||
No matter how you decide (I’m not quite sure as well what’s the best for me), it’s quite hard to find the emails if you have tagged them. Of course, if you look in the folder, you see colored mails or those with a star but to find them by hand in dozens of folder… good luck boy.
|
No matter how you decide (I’m not quite sure as well what’s the best for me), it’s quite hard to find the emails if you have tagged them. Of course, if you look in the folder, you see colored mails or those with a star but to find them by hand in dozens of folder… good luck boy.
|
||||||
|
|
||||||
I already mentioned virtual folders: You can open a virtual folder that lists all emails that match a (or more) special criteria which you can define. If you untag/unmark an email, it just disappears from the virtual folder, but still exists in the (now untagged/unmarked) way as before.
|
I already mentioned virtual folders: You can open a virtual folder that lists all emails that match a (or more) special criteria which you can define. If you untag/unmark an email, it just disappears from the virtual folder, but still exists in the (now untagged/unmarked) way as before.
|
||||||
|
|
||||||
{{< gallery >}}
|
{{< gallery >}}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Mounting a SFTP storage in GNU/Linux
|
|||||||
date: 2014-01-13T14:42:01+00:00
|
date: 2014-01-13T14:42:01+00:00
|
||||||
aliases: /blog/2014/mounting-a-sftp-storage-in-gnu-linux
|
aliases: /blog/2014/mounting-a-sftp-storage-in-gnu-linux
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- bash
|
- bash
|
||||||
@@ -47,10 +48,10 @@ The only prerequisite: You need a server/webspace/storage with full SSH access.
|
|||||||
Now we come to the technical part. For this post, following data is used. Most likely, this will look different in your case.
|
Now we come to the technical part. For this post, following data is used. Most likely, this will look different in your case.
|
||||||
|
|
||||||
```
|
```
|
||||||
SSH-Server: server1.net
|
SSH-Server: server1.net
|
||||||
Username on server: client
|
Username on server: client
|
||||||
Home directory of user on server: /home/client
|
Home directory of user on server: /home/client
|
||||||
Username local machine: user
|
Username local machine: user
|
||||||
Local mount directory: /home/user/remote/server1
|
Local mount directory: /home/user/remote/server1
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -87,9 +88,9 @@ In the next step, we will make the connection and mounting more comfortable, eve
|
|||||||
Now that you know how (and that) the system works, we will make it easier. Of course it is quite annoying to type in the whole server-address and port each time. Instead of _sshfs -p 22 client@server1.net[…]_, you can simply type _sshfs server1_. How? Just open the SSH configuration file _/home/user/.ssh/config_ with you desired text editor and add:
|
Now that you know how (and that) the system works, we will make it easier. Of course it is quite annoying to type in the whole server-address and port each time. Instead of _sshfs -p 22 client@server1.net[…]_, you can simply type _sshfs server1_. How? Just open the SSH configuration file _/home/user/.ssh/config_ with you desired text editor and add:
|
||||||
|
|
||||||
```
|
```
|
||||||
Host server1
|
Host server1
|
||||||
HostName server1.net
|
HostName server1.net
|
||||||
Port 22
|
Port 22
|
||||||
User client
|
User client
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ Let’s say, the public key is a chest that no one except the owner can open. In
|
|||||||
It is quite easy to make this system happen. Again we need a terminal to generate the two keys:
|
It is quite easy to make this system happen. Again we need a terminal to generate the two keys:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.ssh/
|
cd ~/.ssh/
|
||||||
ssh-keygen -t dsa
|
ssh-keygen -t dsa
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -141,86 +142,86 @@ And these steps were quite important for the next section where we will write a
|
|||||||
Our setting is very smooth now, but it could still be improved. If you want to connect to many servers and don’t want to use your shell every time or don’t want to remember the HOSTs you used in your .ssh/config, you’re free to modify and use this shell script:
|
Our setting is very smooth now, but it could still be improved. If you want to connect to many servers and don’t want to use your shell every time or don’t want to remember the HOSTs you used in your .ssh/config, you’re free to modify and use this shell script:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
### VARIABLES TO BE CHANGED ###
|
### VARIABLES TO BE CHANGED ###
|
||||||
# Preconfigured HOSTs in ~/.ssh/config that should be used
|
# Preconfigured HOSTs in ~/.ssh/config that should be used
|
||||||
PRESSH[0]=server1
|
PRESSH[0]=server1
|
||||||
PRESSH[1]=server2
|
PRESSH[1]=server2
|
||||||
PRESSH[2]=server3
|
PRESSH[2]=server3
|
||||||
|
|
||||||
# Local directory where the remote storages should be mounted to
|
# Local directory where the remote storages should be mounted to
|
||||||
LOCALMOUNTDIR=/home/user/remote
|
LOCALMOUNTDIR=/home/user/remote
|
||||||
|
|
||||||
### THE SCRIPT BEGINS HERE ###
|
### THE SCRIPT BEGINS HERE ###
|
||||||
|
|
||||||
# Add SSH key to local keyring if not already happened
|
# Add SSH key to local keyring if not already happened
|
||||||
function sshadd {
|
function sshadd {
|
||||||
ssh-add -l > /dev/null || ssh-add
|
ssh-add -l > /dev/null || ssh-add
|
||||||
}
|
}
|
||||||
|
|
||||||
# Choose preconfigured HOST to mount
|
# Choose preconfigured HOST to mount
|
||||||
function mount {
|
function mount {
|
||||||
if ! SSH=$(zenity --list \
|
if ! SSH=$(zenity --list \
|
||||||
--height=300 \
|
--height=300 \
|
||||||
--text="Please choose. Cancel to unmount drives." \
|
--text="Please choose. Cancel to unmount drives." \
|
||||||
--title="Choose SSH server" \
|
--title="Choose SSH server" \
|
||||||
--column "Preconfigured SSH servers" \
|
--column "Preconfigured SSH servers" \
|
||||||
${PRESSH[*]}); then
|
${PRESSH[*]}); then
|
||||||
unmountquestion # If you press cancel, it should ask you to unmount all drives
|
unmountquestion # If you press cancel, it should ask you to unmount all drives
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If you double click on an entry, it gives 'server1|server1' as result instead of 'server1'
|
# If you double click on an entry, it gives 'server1|server1' as result instead of 'server1'
|
||||||
# This command cuts of everything after |
|
# This command cuts of everything after |
|
||||||
SSH=$(echo $SSH | awk -F\| '{ print $1 }')
|
SSH=$(echo $SSH | awk -F\| '{ print $1 }')
|
||||||
|
|
||||||
# Make a local directory if not available
|
# Make a local directory if not available
|
||||||
if [ ! -e "$LOCALMOUNTDIR"/"$SSH" ]; then
|
if [ ! -e "$LOCALMOUNTDIR"/"$SSH" ]; then
|
||||||
mkdir -p "$LOCALMOUNTDIR"/"$SSH"
|
mkdir -p "$LOCALMOUNTDIR"/"$SSH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Command to mount actually
|
# Command to mount actually
|
||||||
sshfs "$SSH": "$LOCALMOUNTDIR"/"$SSH"/ -o follow_symlinks &
|
sshfs "$SSH": "$LOCALMOUNTDIR"/"$SSH"/ -o follow_symlinks &
|
||||||
|
|
||||||
quitquestion # one more ssh server or quit?
|
quitquestion # one more ssh server or quit?
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ask if all preconfigured SSHFS drives should be unmounted
|
# Ask if all preconfigured SSHFS drives should be unmounted
|
||||||
function unmountquestion {
|
function unmountquestion {
|
||||||
zenity --question --text="Unmount all preconfigured\nSSHFS drives now?"
|
zenity --question --text="Unmount all preconfigured\nSSHFS drives now?"
|
||||||
if [ "$?" = "0" ]; then
|
if [ "$?" = "0" ]; then
|
||||||
unmount # unmount function
|
unmount # unmount function
|
||||||
else
|
else
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Procedure to unmount all preconfigured SSHFS drives and exit program afterwards
|
# Procedure to unmount all preconfigured SSHFS drives and exit program afterwards
|
||||||
function unmount {
|
function unmount {
|
||||||
for ((i = 0; i < ${#PRESSH[*]}; i++))
|
for ((i = 0; i < ${#PRESSH[*]}; i++))
|
||||||
do
|
do
|
||||||
fusermount -u "$LOCALMOUNTDIR"/"${PRESSH[$i]}"
|
fusermount -u "$LOCALMOUNTDIR"/"${PRESSH[$i]}"
|
||||||
echo ""${PRESSH[$i]}" unmounted."
|
echo ""${PRESSH[$i]}" unmounted."
|
||||||
done
|
done
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Should another SSHFS storage be mounted?
|
# Should another SSHFS storage be mounted?
|
||||||
function quitquestion {
|
function quitquestion {
|
||||||
zenity --question \
|
zenity --question \
|
||||||
--text="Mount another SSHFS storage?"
|
--text="Mount another SSHFS storage?"
|
||||||
if [ "$?" = "1" ]; then
|
if [ "$?" = "1" ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
sshadd # sshadd function
|
sshadd # sshadd function
|
||||||
|
|
||||||
# Loop for endless mounts until stopped by unmount or unmountquestion
|
# Loop for endless mounts until stopped by unmount or unmountquestion
|
||||||
while :
|
while :
|
||||||
do
|
do
|
||||||
mount # mount function
|
mount # mount function
|
||||||
done
|
done
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Why free choice of routers is a must
|
|||||||
date: 2014-01-14T17:47:43+00:00
|
date: 2014-01-14T17:47:43+00:00
|
||||||
aliases: why-free-choice-of-routers-is-an-unnegotiable-must
|
aliases: why-free-choice-of-routers-is-an-unnegotiable-must
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: 'I love ZNC because #ilovefs'
|
|||||||
date: 2014-02-14T05:00:14+00:00
|
date: 2014-02-14T05:00:14+00:00
|
||||||
url: /blog/2014/i-love-znc-because-ilovefs
|
url: /blog/2014/i-love-znc-because-ilovefs
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Wirklich sichere WhatsApp Alternativen
|
|||||||
date: 2014-02-21T09:41:54+00:00
|
date: 2014-02-21T09:41:54+00:00
|
||||||
aliases: wirklich-sichere-whatsapp-alternativen
|
aliases: wirklich-sichere-whatsapp-alternativen
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Guter E-Mail-Stil
|
|||||||
date: 2014-05-19T12:56:12+00:00
|
date: 2014-05-19T12:56:12+00:00
|
||||||
aliases: guter-e-mail-stil
|
aliases: guter-e-mail-stil
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
@@ -11,7 +12,7 @@ tags:
|
|||||||
|
|
||||||
---
|
---
|
||||||
Heutzutage ist schriftlicher Stil in E-Mails ebenso wichtig wie eine angemessene Sprechweise oder standardisierte Floskeln und Höflichkeiten in Briefen. E-Mails sind trotz Short Messaging wie per SMS, WhatsApp oder Facebook weiterhin die bedeutenste digitale Kommunikationsmöglichkeit.
|
Heutzutage ist schriftlicher Stil in E-Mails ebenso wichtig wie eine angemessene Sprechweise oder standardisierte Floskeln und Höflichkeiten in Briefen. E-Mails sind trotz Short Messaging wie per SMS, WhatsApp oder Facebook weiterhin die bedeutenste digitale Kommunikationsmöglichkeit.
|
||||||
|
|
||||||
Das ist auch der Grund, weshalb ein guter E-Mail-Stil so enorm wichtig ist: Wir werden von E-Mails regelrecht bombardiert, auch wenn man den Spam nicht einmal mit einberechnet. Daher sollten wir uns und unseren Kommunikationspartnern die Sache erleichtern, indem wir einen guten, effizienten und dennoch freundlichen Umgang und Stil pflegen.
|
Das ist auch der Grund, weshalb ein guter E-Mail-Stil so enorm wichtig ist: Wir werden von E-Mails regelrecht bombardiert, auch wenn man den Spam nicht einmal mit einberechnet. Daher sollten wir uns und unseren Kommunikationspartnern die Sache erleichtern, indem wir einen guten, effizienten und dennoch freundlichen Umgang und Stil pflegen.
|
||||||
|
|
||||||
## Der Erstkontakt
|
## Der Erstkontakt
|
||||||
@@ -21,7 +22,7 @@ Sollte man derjenige sein, der eine E-Mail versendet, sind bereits einige Dinge
|
|||||||
### Betreff
|
### Betreff
|
||||||
|
|
||||||
Der Betreff ist das erste, was der Empfänger erhält und auch das, an was er sich bei weiterer Kommunikation erinnert.
|
Der Betreff ist das erste, was der Empfänger erhält und auch das, an was er sich bei weiterer Kommunikation erinnert.
|
||||||
|
|
||||||
Betreffe wie "Echt wichtig!", "Das könnte dich interessieren", ":-)" oder "Es geht um die Webseite ``http://example.com`` zu der ich dich was fragen muss" sind entweder nicht informativ genug, zu kurz oder zu lang. Betreffe sollten das Thema präzise in nicht mehr als 5 Wörtern zusammenfassen, etwa "Fehlerhaftes Bild in Thunderbird-Artikel".
|
Betreffe wie "Echt wichtig!", "Das könnte dich interessieren", ":-)" oder "Es geht um die Webseite ``http://example.com`` zu der ich dich was fragen muss" sind entweder nicht informativ genug, zu kurz oder zu lang. Betreffe sollten das Thema präzise in nicht mehr als 5 Wörtern zusammenfassen, etwa "Fehlerhaftes Bild in Thunderbird-Artikel".
|
||||||
|
|
||||||
### Adressierung
|
### Adressierung
|
||||||
@@ -40,7 +41,7 @@ Viele E-Mail-Clients bieten an, E-Mails in HTML zu verfassen. HTML ermöglicht e
|
|||||||
### Umbruch
|
### Umbruch
|
||||||
|
|
||||||
Wenn wie empfohlen Reintext verwendet wird, empfiehlt sich auch, dass man einen automatischen Umbruch aktiviert. Das bedeutet, dass nach 70-80 Zeichen automatisch eine neue Zeile begonnen wird.
|
Wenn wie empfohlen Reintext verwendet wird, empfiehlt sich auch, dass man einen automatischen Umbruch aktiviert. Das bedeutet, dass nach 70-80 Zeichen automatisch eine neue Zeile begonnen wird.
|
||||||
|
|
||||||
Dadurch wird verhindert, dass Leute mit sehr breiten Bildschirmen elends lange Zeilen haben, was den Lesefluss erschwert.
|
Dadurch wird verhindert, dass Leute mit sehr breiten Bildschirmen elends lange Zeilen haben, was den Lesefluss erschwert.
|
||||||
|
|
||||||
### Stil
|
### Stil
|
||||||
@@ -50,7 +51,7 @@ Sollte eigentlich selbstverständlich sein, aber leider sieht man viel zu oft E-
|
|||||||
## Antworten
|
## Antworten
|
||||||
|
|
||||||
Hat man eine neue E-Mail bekommen und möchte diese beantworten, gibt es auch wieder einige Dinge, die man beachten sollte, um seine Informationen möglichst leicht und übersichtlich unterzubringen und es dem entfernten Gegenüber leicht zu machen.
|
Hat man eine neue E-Mail bekommen und möchte diese beantworten, gibt es auch wieder einige Dinge, die man beachten sollte, um seine Informationen möglichst leicht und übersichtlich unterzubringen und es dem entfernten Gegenüber leicht zu machen.
|
||||||
|
|
||||||
Prinzipiell sollte man immer auf *Antworten* in seinem Mailprogramm drücken und nicht etwa eine neue E-Mail mit neuem Betreff verfassen.
|
Prinzipiell sollte man immer auf *Antworten* in seinem Mailprogramm drücken und nicht etwa eine neue E-Mail mit neuem Betreff verfassen.
|
||||||
|
|
||||||
### Betreff
|
### Betreff
|
||||||
@@ -65,59 +66,59 @@ Beim Antworten gibt es in puncto Betreff nur zwei Regeln:
|
|||||||
Ganz wichtig bei längeren Unterhaltungen ist der richtige Zitierstil. Wenn wir mit Leuten reden, sind wir gewöhnt, meist immer unmittelbar auf ein Thema antworten zu können, womit dem Gegenüber klar wird, auf was wir anspielen. In E-Mails ist das meist nicht so einfach. Hier sollte man darauf achten, dass man den sogenannten Inlinequote benutzt und kein [TOFU](https://de.wikipedia.org/wiki/TOFU) (Text oben, Fullquote unten). Zwei aus der Wikipedia abgeleitete Beispiele, die das verdeutlichen:
|
Ganz wichtig bei längeren Unterhaltungen ist der richtige Zitierstil. Wenn wir mit Leuten reden, sind wir gewöhnt, meist immer unmittelbar auf ein Thema antworten zu können, womit dem Gegenüber klar wird, auf was wir anspielen. In E-Mails ist das meist nicht so einfach. Hier sollte man darauf achten, dass man den sogenannten Inlinequote benutzt und kein [TOFU](https://de.wikipedia.org/wiki/TOFU) (Text oben, Fullquote unten). Zwei aus der Wikipedia abgeleitete Beispiele, die das verdeutlichen:
|
||||||
|
|
||||||
```
|
```
|
||||||
Lieber Oskar,
|
Lieber Oskar,
|
||||||
|
|
||||||
das stimmt doch gar
|
das stimmt doch gar
|
||||||
nicht. Richtig ist 4.
|
nicht. Richtig ist 4.
|
||||||
|
|
||||||
Ich hätte gerne einen Bierkrug.
|
Ich hätte gerne einen Bierkrug.
|
||||||
|
|
||||||
Gruß
|
Gruß
|
||||||
Max
|
Max
|
||||||
|
|
||||||
--Ursprüngliche Nachricht--
|
--Ursprüngliche Nachricht--
|
||||||
Von: Oskar
|
Von: Oskar
|
||||||
[mailto:oskar@example.net]
|
[mailto:oskar@example.net]
|
||||||
Gesendet: Sonntag, 24.
|
Gesendet: Sonntag, 24.
|
||||||
Dezember 2006 12:00
|
Dezember 2006 12:00
|
||||||
An: Max
|
An: Max
|
||||||
Betreff: (kein Betreff)
|
Betreff: (kein Betreff)
|
||||||
|
|
||||||
Lieber Max,
|
Lieber Max,
|
||||||
|
|
||||||
eines wollte ich Dir schon
|
eines wollte ich Dir schon
|
||||||
immer einmal sagen - das
|
immer einmal sagen - das
|
||||||
habe ich mich bisher bloß
|
habe ich mich bisher bloß
|
||||||
nicht getraut. Es lässt
|
nicht getraut. Es lässt
|
||||||
mir aber einfach keine
|
mir aber einfach keine
|
||||||
Ruhe, deshalb muss es nun
|
Ruhe, deshalb muss es nun
|
||||||
heraus:
|
heraus:
|
||||||
2 + 2 = 5
|
2 + 2 = 5
|
||||||
Wie jedermann weiß.
|
Wie jedermann weiß.
|
||||||
|
|
||||||
Außerdem fahre ich bald nach Mallorca,
|
Außerdem fahre ich bald nach Mallorca,
|
||||||
soll ich dir was mitbringen?
|
soll ich dir was mitbringen?
|
||||||
|
|
||||||
Beste Grüße
|
Beste Grüße
|
||||||
Oskar
|
Oskar
|
||||||
```
|
```
|
||||||
|
|
||||||
Wenn man diese Mail nach einigen Tagen öffnet, fragt man sich zurecht, was denn nun ein Bierkrug mit einer falschen Behauptung zu tun hat. Besser ist dabei der bereits erwähnte Inlinequote ("Zitat zwischen den Zeilen"):
|
Wenn man diese Mail nach einigen Tagen öffnet, fragt man sich zurecht, was denn nun ein Bierkrug mit einer falschen Behauptung zu tun hat. Besser ist dabei der bereits erwähnte Inlinequote ("Zitat zwischen den Zeilen"):
|
||||||
|
|
||||||
```
|
```
|
||||||
Lieber Oskar,
|
Lieber Oskar,
|
||||||
|
|
||||||
Oskar schrieb:
|
Oskar schrieb:
|
||||||
> 2 + 2 = 5
|
> 2 + 2 = 5
|
||||||
|
|
||||||
das stimmt doch gar
|
das stimmt doch gar
|
||||||
nicht. Richtig ist 4.
|
nicht. Richtig ist 4.
|
||||||
|
|
||||||
> Außerdem fahre ich bald nach Mallorca,
|
> Außerdem fahre ich bald nach Mallorca,
|
||||||
> soll ich dir was mitbringen?
|
> soll ich dir was mitbringen?
|
||||||
|
|
||||||
Ich hätte gerne einen Bierkrug.
|
Ich hätte gerne einen Bierkrug.
|
||||||
|
|
||||||
Gruß Max
|
Gruß Max
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -134,16 +135,16 @@ Auch Weiterleitungen sind ein wichtiger Bestandteil des E-Mail-Systems. Bekommt
|
|||||||
Jedoch sollte man darauf achten, es dem Empfänger so einfach wie möglich zu machen. Einfach nur Weiterleiten ist nicht gern gesehen, man sollte auch eine grobe Zusammenfassung hinzufügen, um was es denn überhaupt geht. In dem konkreten Beispiel sollte man also vorweg schreiben:
|
Jedoch sollte man darauf achten, es dem Empfänger so einfach wie möglich zu machen. Einfach nur Weiterleiten ist nicht gern gesehen, man sollte auch eine grobe Zusammenfassung hinzufügen, um was es denn überhaupt geht. In dem konkreten Beispiel sollte man also vorweg schreiben:
|
||||||
|
|
||||||
```
|
```
|
||||||
Hallo Peter,
|
Hallo Peter,
|
||||||
|
|
||||||
anbei eine Einladung zu einem interessanten Vortrag über die Geschichte der E-Mail. Er findet nächste Woche statt und ich würde mich freuen, wenn Du auch dabei wärst. Lies Dir doch die Einladung durch und sag mir Bescheid.
|
anbei eine Einladung zu einem interessanten Vortrag über die Geschichte der E-Mail. Er findet nächste Woche statt und ich würde mich freuen, wenn Du auch dabei wärst. Lies Dir doch die Einladung durch und sag mir Bescheid.
|
||||||
|
|
||||||
Gruß
|
Gruß
|
||||||
Julian
|
Julian
|
||||||
|
|
||||||
----- Weitergeleitete Nachricht -----
|
----- Weitergeleitete Nachricht -----
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
## Fazit
|
## Fazit
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Birthday Calendar with ownCloud via CalDAV
|
|||||||
date: 2014-09-17T22:56:46+00:00
|
date: 2014-09-17T22:56:46+00:00
|
||||||
aliases: birthday-calendar-with-owncloud-via-caldav
|
aliases: birthday-calendar-with-owncloud-via-caldav
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- email
|
- email
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Setting Openstreetmap as default in Thunderbird’s contacts
|
|||||||
date: 2014-09-28T10:40:42+00:00
|
date: 2014-09-28T10:40:42+00:00
|
||||||
aliases: setting-openstreetmap-as-default-in-thunderbird-contacts
|
aliases: setting-openstreetmap-as-default-in-thunderbird-contacts
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- email
|
- email
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: My internship at FSFE
|
|||||||
date: 2014-10-24T10:39:54+00:00
|
date: 2014-10-24T10:39:54+00:00
|
||||||
aliases: my-internship-at-fsfe
|
aliases: my-internship-at-fsfe
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Freie Kommunikation ist die Essenz des Menschseins
|
|||||||
date: 2014-11-10T13:15:19+00:00
|
date: 2014-11-10T13:15:19+00:00
|
||||||
aliases: freie-kommunikation-ist-essenz-des-lebens
|
aliases: freie-kommunikation-ist-essenz-des-lebens
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Sharing is caring – my Git instance
|
|||||||
date: 2014-11-28T17:16:50+00:00
|
date: 2014-11-28T17:16:50+00:00
|
||||||
aliases: sharing-is-caring-my-git-instance
|
aliases: sharing-is-caring-my-git-instance
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- server
|
- server
|
||||||
@@ -10,11 +11,11 @@ tags:
|
|||||||
|
|
||||||
---
|
---
|
||||||
Some days ago I noticed another time that I have far too little knowledge about Git.
|
Some days ago I noticed another time that I have far too little knowledge about Git.
|
||||||
|
|
||||||
„Time to change that!“, I thought and set up [my own Git instance][1] and also installed gitweb for better usability.
|
„Time to change that!“, I thought and set up [my own Git instance][1] and also installed gitweb for better usability.
|
||||||
|
|
||||||
Upside 1: I can keep track of the many (mainly bash) scripts I wrote in the past and all the changes I will adopt in the future.
|
Upside 1: I can keep track of the many (mainly bash) scripts I wrote in the past and all the changes I will adopt in the future.
|
||||||
|
|
||||||
Upside 2: You can hopefully benefit from using and reading my code. All code is licensed under GNU GPL v3 so please feel free to use, study, share and improve my work!
|
Upside 2: You can hopefully benefit from using and reading my code. All code is licensed under GNU GPL v3 so please feel free to use, study, share and improve my work!
|
||||||
|
|
||||||
Some noteworthy projects I’m (a bit) proud of:
|
Some noteworthy projects I’m (a bit) proud of:
|
||||||
@@ -27,7 +28,7 @@ Some noteworthy projects I’m (a bit) proud of:
|
|||||||
Any questions, ideas or improvements? Please contact me!
|
Any questions, ideas or improvements? Please contact me!
|
||||||
|
|
||||||
### Update 26.02.2016
|
### Update 26.02.2016
|
||||||
|
|
||||||
I washed away the quite basic gitweb instance and moved to Gogs. Here’s [why and how][6]. Links to the project may have changed because of that (and I’m too lazy to change them here).
|
I washed away the quite basic gitweb instance and moved to Gogs. Here’s [why and how][6]. Links to the project may have changed because of that (and I’m too lazy to change them here).
|
||||||
|
|
||||||
[1]: https://src.mehl.mx
|
[1]: https://src.mehl.mx
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ aliases:
|
|||||||
- next-station-tanzania
|
- next-station-tanzania
|
||||||
- naechste-station-tansania
|
- naechste-station-tansania
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- tanzania
|
- tanzania
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Yourls URL Shortener for Turpial
|
|||||||
date: 2015-01-24T01:58:32+00:00
|
date: 2015-01-24T01:58:32+00:00
|
||||||
aliases: yourls-url-shortener-for-turpial
|
aliases: yourls-url-shortener-for-turpial
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
@@ -21,19 +22,19 @@ And maybe you also know [Turpial][2], a Twitter client for GNU/Linux systems (I
|
|||||||
Turpial already offers some link shorteners but not Yourls. But we can add it manually. To do so, open the file `/usr/lib/python2.7/dist-packages/libturpial/lib/services/url/shortypython/shorty.py` as root. Now add the following somewhere between the already existing shorteners
|
Turpial already offers some link shorteners but not Yourls. But we can add it manually. To do so, open the file `/usr/lib/python2.7/dist-packages/libturpial/lib/services/url/shortypython/shorty.py` as root. Now add the following somewhere between the already existing shorteners
|
||||||
|
|
||||||
```py
|
```py
|
||||||
# Yourls
|
# Yourls
|
||||||
class Yourls(Service):
|
class Yourls(Service):
|
||||||
|
|
||||||
def shrink(self, bigurl):
|
def shrink(self, bigurl):
|
||||||
resp = request('http://YOUR_DOMAIN/yourls-api.php', {'action': 'shorturl', 'format': 'xml', 'url': bigurl, 'signature': 'YOUR_SIGNATURE'})
|
resp = request('http://YOUR_DOMAIN/yourls-api.php', {'action': 'shorturl', 'format': 'xml', 'url': bigurl, 'signature': 'YOUR_SIGNATURE'})
|
||||||
returned_data = resp.read()
|
returned_data = resp.read()
|
||||||
matched_re = re.search('(http://YOUR_DOMAIN/[^"]+)', returned_data)
|
matched_re = re.search('(http://YOUR_DOMAIN/[^"]+)', returned_data)
|
||||||
if matched_re:
|
if matched_re:
|
||||||
return matched_re.group(1)
|
return matched_re.group(1)
|
||||||
else:
|
else:
|
||||||
raise ShortyError('Failed to shrink url')
|
raise ShortyError('Failed to shrink url')
|
||||||
|
|
||||||
yourls = Yourls()
|
yourls = Yourls()
|
||||||
```
|
```
|
||||||
|
|
||||||
Just replace `YOUR_DOMAIN` and `YOUR_SIGNATURE` accordingly. The usage of a signature enables you to hide your username and password when sending the shorten requests, like an API key and looks like `f51qw35w6` ([more about passwordlessAPI][4]). You can retrieve your signature on your Yourls‘ Admin page via *Tools*.
|
Just replace `YOUR_DOMAIN` and `YOUR_SIGNATURE` accordingly. The usage of a signature enables you to hide your username and password when sending the shorten requests, like an API key and looks like `f51qw35w6` ([more about passwordlessAPI][4]). You can retrieve your signature on your Yourls‘ Admin page via *Tools*.
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: I love Taskwarrior, therefore I love Free Software
|
|||||||
date: 2015-02-14T12:05:42+00:00
|
date: 2015-02-14T12:05:42+00:00
|
||||||
aliases: i-love-taskwarrior-therefore-i-love-free-software
|
aliases: i-love-taskwarrior-therefore-i-love-free-software
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- bash
|
- bash
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: In The End Freedom Is What Matters
|
|||||||
date: 2015-02-25T02:03:04+00:00
|
date: 2015-02-25T02:03:04+00:00
|
||||||
aliases: in-the-end-freedom-is-what-matters
|
aliases: in-the-end-freedom-is-what-matters
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
@@ -24,5 +25,5 @@ In these cases **software privacy is of little use**. It’s about regulations,
|
|||||||
This, dear friend, is the reason why I volunteer for the FSFE – and therefore also for privacy.
|
This, dear friend, is the reason why I volunteer for the FSFE – and therefore also for privacy.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
¹ Means software which you are allowed to use for every purpose, which everybody can inspect, modify and redistribute
|
¹ Means software which you are allowed to use for every purpose, which everybody can inspect, modify and redistribute
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Erste Eindrücke aus Tansania
|
|||||||
date: 2015-04-14T08:05:07+00:00
|
date: 2015-04-14T08:05:07+00:00
|
||||||
aliases: erste-eindruecke-aus-tansania
|
aliases: erste-eindruecke-aus-tansania
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- tanzania
|
- tanzania
|
||||||
|
|||||||
@@ -3,12 +3,14 @@ title: 'Nächster Halt: Endstation.'
|
|||||||
date: 2015-05-20T08:04:10+00:00
|
date: 2015-05-20T08:04:10+00:00
|
||||||
aliases: naechster-halt-endstation
|
aliases: naechster-halt-endstation
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- germany
|
- germany
|
||||||
- policy
|
- policy
|
||||||
- tanzania
|
- tanzania
|
||||||
headerimage: /blog/weselsky-putin.jpg
|
headerimage:
|
||||||
|
src: /blog/weselsky-putin.jpg
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Technology and Free Software in Tanzania
|
|||||||
date: 2015-05-08T07:34:19+00:00
|
date: 2015-05-08T07:34:19+00:00
|
||||||
aliases: technology-and-free-software-in-tz
|
aliases: technology-and-free-software-in-tz
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- tanzania
|
- tanzania
|
||||||
@@ -39,7 +40,7 @@ However, I was able to convince my students that in the case of Free Software mo
|
|||||||
## Misconception III
|
## Misconception III
|
||||||
|
|
||||||
I’ve been tinkering with computers and software since my youth when I reinstalled my operating systems at least once a month and started exploring the internet. I did this because I was interested in technology and wanted to explore its and my limits, but also because even back then I knew that IT will become more and more important and those who don’t understand it will rather be left behind.
|
I’ve been tinkering with computers and software since my youth when I reinstalled my operating systems at least once a month and started exploring the internet. I did this because I was interested in technology and wanted to explore its and my limits, but also because even back then I knew that IT will become more and more important and those who don’t understand it will rather be left behind.
|
||||||
|
|
||||||
I thought in Tanzania it’s a similar situation but somehow easier for the population. I thought that they have very limited technology here but that they know about the importance of computers and software in the industrial countries – and it’s quite obvious that with several years delay they will reach the same level of IT-dependency than we have today. So I thought the people here would care about technology and will try to learn as much as possible about it to improve their career chances and catch up the industrial countries.
|
I thought in Tanzania it’s a similar situation but somehow easier for the population. I thought that they have very limited technology here but that they know about the importance of computers and software in the industrial countries – and it’s quite obvious that with several years delay they will reach the same level of IT-dependency than we have today. So I thought the people here would care about technology and will try to learn as much as possible about it to improve their career chances and catch up the industrial countries.
|
||||||
|
|
||||||
## Reality III
|
## Reality III
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: splitDL – Downloading huge files from slow and unstable internet connec
|
|||||||
date: 2015-06-26T15:59:03+00:00
|
date: 2015-06-26T15:59:03+00:00
|
||||||
aliases: splitdl-downloading-huge-files-from-slow-and-unstable-internet-connections
|
aliases: splitdl-downloading-huge-files-from-slow-and-unstable-internet-connections
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- bash
|
- bash
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Weiterer Teilerfolg beim Routerzwang
|
|||||||
date: 2015-07-22T06:48:01+00:00
|
date: 2015-07-22T06:48:01+00:00
|
||||||
aliases: weiterer-teilerfolg-beim-routerzwang
|
aliases: weiterer-teilerfolg-beim-routerzwang
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
@@ -19,7 +20,7 @@ Die [Free Software Foundation Europe][1] und alle Freunde Freier Software, Verbr
|
|||||||
> **Kurzinfo: Was ist Routerzwang?**
|
> **Kurzinfo: Was ist Routerzwang?**
|
||||||
>
|
>
|
||||||
> In unserer Gesellschaft sollte es selbstverständlich sein, sich für technische Geräte frei entscheiden zu können, die man in seinem Zuhause in Betrieb nehmen möchte, genauso wie wir entscheiden können, welches Mobiltelefon wir kaufen. Doch einige Internetanbieter widersprechen diesem Prinzip und schreiben ihren Kunden vor, welches Gerät sie zur Einwahl in das Internet nutzen müssen oder diskriminieren Besitzer alternativer Geräte. Diese Verletzung eigentlich selbstverständlicher Rechte wird Routerzwang genannt und wird von der Free Software Foundation Europe und vielen anderen Organisationen, Projekten und Individuen stark kritisiert. Routerzwang ist nicht nur ein Thema für Technikexperten, sondern betrifft uns alle.
|
> In unserer Gesellschaft sollte es selbstverständlich sein, sich für technische Geräte frei entscheiden zu können, die man in seinem Zuhause in Betrieb nehmen möchte, genauso wie wir entscheiden können, welches Mobiltelefon wir kaufen. Doch einige Internetanbieter widersprechen diesem Prinzip und schreiben ihren Kunden vor, welches Gerät sie zur Einwahl in das Internet nutzen müssen oder diskriminieren Besitzer alternativer Geräte. Diese Verletzung eigentlich selbstverständlicher Rechte wird Routerzwang genannt und wird von der Free Software Foundation Europe und vielen anderen Organisationen, Projekten und Individuen stark kritisiert. Routerzwang ist nicht nur ein Thema für Technikexperten, sondern betrifft uns alle.
|
||||||
>
|
>
|
||||||
> Routerzwang beschäftigt die FSFE [seit dem Januar 2013][2], die öffentlich in vielen Anhörungen und im Hintergrund Stellung bezogen hat. Mehr Informationen über das Thema auf [unserer ausführlichen Übersichtsseite][3].
|
> Routerzwang beschäftigt die FSFE [seit dem Januar 2013][2], die öffentlich in vielen Anhörungen und im Hintergrund Stellung bezogen hat. Mehr Informationen über das Thema auf [unserer ausführlichen Übersichtsseite][3].
|
||||||
|
|
||||||
Passend zum Ende dieser Phase hat der Journalist Jan Rähm für den Deutschlandfunk einen Beitrag gesendet, der das Thema sehr differenziert betrachtet, den aktuellen Stand darlegt und sowohl Gegner als auch Befürworter des Routerzwangs zu Wort kommen lässt. Der Beitrag ist als [verkürzte Textversion][4] und in der [vollen Audioversion][5] (5:48) auf der Webseite des Deutschlandfunks zu finden. So sagt etwa der Pressesprecher von Tele Columbus, einer der wenigen Befürworter des Routerzwangs:
|
Passend zum Ende dieser Phase hat der Journalist Jan Rähm für den Deutschlandfunk einen Beitrag gesendet, der das Thema sehr differenziert betrachtet, den aktuellen Stand darlegt und sowohl Gegner als auch Befürworter des Routerzwangs zu Wort kommen lässt. Der Beitrag ist als [verkürzte Textversion][4] und in der [vollen Audioversion][5] (5:48) auf der Webseite des Deutschlandfunks zu finden. So sagt etwa der Pressesprecher von Tele Columbus, einer der wenigen Befürworter des Routerzwangs:
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: German Government wants authorities to advertise PDFreaders
|
|||||||
date: 2015-09-19T17:27:20+00:00
|
date: 2015-09-19T17:27:20+00:00
|
||||||
aliases: german-government-wants-authorities-to-advertise-pdfreaders
|
aliases: german-government-wants-authorities-to-advertise-pdfreaders
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: I love Free Software (Apps)
|
|||||||
date: 2016-02-14T09:00:18+00:00
|
date: 2016-02-14T09:00:18+00:00
|
||||||
aliases: i-love-free-software-apps
|
aliases: i-love-free-software-apps
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Switching my code from gitweb to Gogs
|
|||||||
date: 2016-02-26T17:05:18+00:00
|
date: 2016-02-26T17:05:18+00:00
|
||||||
aliases: switching-my-code-from-gitweb-to-gogs
|
aliases: switching-my-code-from-gitweb-to-gogs
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- tools
|
- tools
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: 'Getting oldschool, oder: Wie ich uncool wurde'
|
|||||||
date: 2016-03-28T13:39:45+00:00
|
date: 2016-03-28T13:39:45+00:00
|
||||||
aliases: getting-oldschool-oder-wie-ich-uncool-wurde
|
aliases: getting-oldschool-oder-wie-ich-uncool-wurde
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- chat
|
- chat
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Der Routerzwang fällt – Und was bringt mir das?
|
|||||||
date: 2016-07-30T11:02:38+00:00
|
date: 2016-07-30T11:02:38+00:00
|
||||||
aliases: der-routerzwang-faellt-was-bringt-mir-das
|
aliases: der-routerzwang-faellt-was-bringt-mir-das
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Erste Testgeräte für Routerfreiheit versendet
|
|||||||
date: 2016-08-08T09:11:51+00:00
|
date: 2016-08-08T09:11:51+00:00
|
||||||
aliases: erste-testgeraete-fuer-routerfreiheit-versendet
|
aliases: erste-testgeraete-fuer-routerfreiheit-versendet
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: FrOSCon 2016 – Ein Rückblick
|
|||||||
date: 2016-08-26T13:57:48+00:00
|
date: 2016-08-26T13:57:48+00:00
|
||||||
aliases: froscon-2016-ein-rueckblick
|
aliases: froscon-2016-ein-rueckblick
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Endgerätefreiheit testen – Es sind wieder Router verfügbar!
|
|||||||
date: 2016-09-23T09:23:09+00:00
|
date: 2016-09-23T09:23:09+00:00
|
||||||
aliases: endgeraetefreiheit-testen-es-sind-wieder-router-verfuegbar
|
aliases: endgeraetefreiheit-testen-es-sind-wieder-router-verfuegbar
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: „Schluss mit dem Routerzwang“ – Radiosendung im Deutschlandfunk
|
|||||||
date: 2016-09-01T16:44:26+00:00
|
date: 2016-09-01T16:44:26+00:00
|
||||||
aliases: schluss-mit-dem-routerzwang-radiosendung-im-deutschlandfunk
|
aliases: schluss-mit-dem-routerzwang-radiosendung-im-deutschlandfunk
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- routerfreedom
|
- routerfreedom
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Freie Software – Definition in Dortmund
|
|||||||
date: 2016-10-13T17:22:16+00:00
|
date: 2016-10-13T17:22:16+00:00
|
||||||
aliases: freie-software-definition-in-dortmund
|
aliases: freie-software-definition-in-dortmund
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: Build FSFE websites locally
|
|||||||
date: 2016-11-13T23:00:44+00:00
|
date: 2016-11-13T23:00:44+00:00
|
||||||
aliases: build-fsfe-websites-locally
|
aliases: build-fsfe-websites-locally
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- bash
|
- bash
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: OpenRheinRuhr 2016 – A report of iron and freedom
|
|||||||
date: 2016-11-09T21:55:53+00:00
|
date: 2016-11-09T21:55:53+00:00
|
||||||
aliases: openrheinruhr-2016-a-report-of-iron-and-freedom
|
aliases: openrheinruhr-2016-a-report-of-iron-and-freedom
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- report
|
- report
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ type: post
|
|||||||
date: 2017-02-14T07:30:51+00:00
|
date: 2017-02-14T07:30:51+00:00
|
||||||
url: /blog/2017/i-love-astroid-ilovefs
|
url: /blog/2017/i-love-astroid-ilovefs
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- email
|
- email
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ title: 'Idee: Wiki zu gesellschaftspolitischen Positionen von Prominenten'
|
|||||||
date: 2017-05-29T10:15:45+00:00
|
date: 2017-05-29T10:15:45+00:00
|
||||||
aliases: idee-wiki-zu-gesellschaftspolitischen-positionen-von-prominenten
|
aliases: idee-wiki-zu-gesellschaftspolitischen-positionen-von-prominenten
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- deutsch
|
- deutsch
|
||||||
tags:
|
tags:
|
||||||
- policy
|
- policy
|
||||||
headerimage: /blog/maiziere-lehmann.jpg
|
headerimage:
|
||||||
headercredits: CC-BY-SA 3.0 Sandro Halank / CC-BY 2.0 Ronnie Macdonald
|
src: /blog/maiziere-lehmann.jpg
|
||||||
|
text: CC-BY-SA 3.0 Sandro Halank / CC-BY 2.0 Ronnie Macdonald
|
||||||
|
|
||||||
---
|
---
|
||||||
_Alles begann, als mein Mitbewohner Lars und ich uns eines morgens fragten: „Mit wem würden wir lieber ein Bier trinken gehen, Thomas de Maizière oder Jens Lehmann?“._
|
_Alles begann, als mein Mitbewohner Lars und ich uns eines morgens fragten: „Mit wem würden wir lieber ein Bier trinken gehen, Thomas de Maizière oder Jens Lehmann?“._
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: FSFE Planet has been refurbished
|
|||||||
date: 2019-02-11T10:33:11+00:00
|
date: 2019-02-11T10:33:11+00:00
|
||||||
aliases: fsfe-planet-has-been-refurbished
|
aliases: fsfe-planet-has-been-refurbished
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ title: 'Protect freedom on radio devices: raise your voice today!'
|
|||||||
date: 2019-03-01T15:09:56+00:00
|
date: 2019-03-01T15:09:56+00:00
|
||||||
aliases: protect-freedom-on-radio-devices-raise-your-voice-today
|
aliases: protect-freedom-on-radio-devices-raise-your-voice-today
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
title: The 3rd FSFE System Hackers hackathon
|
title: The 3rd FSFE System Hackers hackathon
|
||||||
date: 2019-10-22
|
date: 2019-10-22
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
- report
|
- report
|
||||||
- server
|
- server
|
||||||
headerimage: /blog/system-chaos.jpg
|
headerimage:
|
||||||
headercredits: Fortunately not how the FSFE's infrastructure looks like
|
src: /blog/system-chaos.jpg
|
||||||
|
text: Fortunately not how the FSFE's infrastructure looks like
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
title: I love the hidden champions
|
title: I love the hidden champions
|
||||||
date: 2020-02-14
|
date: 2020-02-14
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- ilovefs
|
- ilovefs
|
||||||
- fsfe
|
- fsfe
|
||||||
- bash
|
- bash
|
||||||
headerimage: /blog/hidden-street.jpg
|
headerimage:
|
||||||
headercredits: The unknown Free Software contributors. Photo by Kaique Rocha
|
src: /blog/hidden-street.jpg
|
||||||
|
text: The unknown Free Software contributors. Photo by Kaique Rocha
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
title: System Hackers meeting - Lyon edition
|
title: System Hackers meeting - Lyon edition
|
||||||
date: 2020-03-31
|
date: 2020-03-31
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- fsfe
|
- fsfe
|
||||||
- report
|
- report
|
||||||
- server
|
- server
|
||||||
headerimage: /blog/syshackers-group-hacking.jpg
|
headerimage:
|
||||||
headercredits: Hackers in their natural working environment. For the picture we took off the black ski masks and gloves.
|
src: /blog/syshackers-group-hacking.jpg
|
||||||
|
text: Hackers in their natural working environment. For the picture we took off the black ski masks and gloves.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
title: "The power of git-sed"
|
title: "The power of git-sed"
|
||||||
date: 2020-07-28
|
date: 2020-07-28
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- tools
|
- tools
|
||||||
- bash
|
- bash
|
||||||
- fsfe
|
- fsfe
|
||||||
headerimage: /blog/git-sed.png
|
headerimage:
|
||||||
headercredits: Replacing content in thousands of files? No problem!
|
src: /blog/git-sed.png
|
||||||
|
text: Replacing content in thousands of files? No problem!
|
||||||
---
|
---
|
||||||
|
|
||||||
In the recent weeks and months, the [FSFE Web Team](https://fsfe.org/contribute/web/) has been doing some heavy work on the [FSFE website](https://fsfe.org). We moved and replaced thousands of files and their respective links to improve the structure of a historically grown website (19+ years, 23243 files, almost 39k commits). But how to do that most efficiently in a version controlled system like Git?
|
In the recent weeks and months, the [FSFE Web Team](https://fsfe.org/contribute/web/) has been doing some heavy work on the [FSFE website](https://fsfe.org). We moved and replaced thousands of files and their respective links to improve the structure of a historically grown website (19+ years, 23243 files, almost 39k commits). But how to do that most efficiently in a version controlled system like Git?
|
||||||
|
|||||||
@@ -2,14 +2,16 @@
|
|||||||
title: "Docker2Caddy - An automatic Reverse Proxy for Docker containers"
|
title: "Docker2Caddy - An automatic Reverse Proxy for Docker containers"
|
||||||
date: 2022-04-25
|
date: 2022-04-25
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- tools
|
- tools
|
||||||
- fsfe
|
- fsfe
|
||||||
- server
|
- server
|
||||||
- python
|
- python
|
||||||
headerimage: /blog/docker.jpg
|
headerimage:
|
||||||
headercredits: Shipping a load of containers requires a reliable infrastructure
|
src: /blog/docker.jpg
|
||||||
|
text: Shipping a load of containers requires a reliable infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
So you have a number of Docker containers running web services which you would
|
So you have a number of Docker containers running web services which you would
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
title: "Seafile Mirror - Simple automatic backup of your Seafile libraries"
|
title: "Seafile Mirror - Simple automatic backup of your Seafile libraries"
|
||||||
date: 2023-09-22
|
date: 2023-09-22
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- python
|
- python
|
||||||
- server
|
- server
|
||||||
- tools
|
- tools
|
||||||
headerimage: /blog/library.jpg
|
headerimage:
|
||||||
headercredits: Wouldn't it be a shame if your library were to be destroyed?
|
src: /blog/library.jpg
|
||||||
|
text: Wouldn't it be a shame if your library were to be destroyed?
|
||||||
---
|
---
|
||||||
|
|
||||||
I have been using [Seafile](https://www.seafile.com/) for years to host and
|
I have been using [Seafile](https://www.seafile.com/) for years to host and
|
||||||
|
|||||||
20
content/blog/2023-11-sap-podcast-growing-importance-sboms.md
Normal file
20
content/blog/2023-11-sap-podcast-growing-importance-sboms.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: "The Growing Importance of Software Bills of Materials (SBOM)"
|
||||||
|
date: 2023-11-15
|
||||||
|
categories:
|
||||||
|
- english
|
||||||
|
- podcast
|
||||||
|
tags:
|
||||||
|
- SupplyChain
|
||||||
|
- OSPO
|
||||||
|
- Security
|
||||||
|
headerimage:
|
||||||
|
src: /blog/file-cabinet.jpg
|
||||||
|
text: Neatly organise your records
|
||||||
|
audio: https://podcasts.apple.com/us/podcast/the-growing-importance-of-software-bills-of-materials-sbom/id1535460646?i=1000636913792
|
||||||
|
podcast:
|
||||||
|
name: SAP's Open Source Way Podcast
|
||||||
|
href: https://podcasts.apple.com/us/podcast/the-growing-importance-of-software-bills-of-materials-sbom/id1535460646?i=1000636913792
|
||||||
|
---
|
||||||
|
|
||||||
|
I had the pleasure to moderate the OpenRail Day 2025 in Paris, organised by the [OpenRail Association](https://openrailassociation.org) to share knowledge and experiences about open source software in the railway industry. The event featured several talks and panel discussions with experts from different companies and organisations involved in open source projects related to railways.
|
||||||
@@ -2,12 +2,14 @@
|
|||||||
title: "INWX DNS Recordmaster - Manage your DNS nameserver records via files in Git"
|
title: "INWX DNS Recordmaster - Manage your DNS nameserver records via files in Git"
|
||||||
date: 2024-11-07
|
date: 2024-11-07
|
||||||
categories:
|
categories:
|
||||||
|
- blog
|
||||||
- english
|
- english
|
||||||
tags:
|
tags:
|
||||||
- python
|
- python
|
||||||
- tools
|
- tools
|
||||||
headerimage: /blog/file-cabinet.jpg
|
headerimage:
|
||||||
headercredits: Neatly organise your records
|
src: /blog/file-cabinet.jpg
|
||||||
|
text: Neatly organise your records
|
||||||
---
|
---
|
||||||
|
|
||||||
I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here.
|
I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here.
|
||||||
|
|||||||
51
content/blog/2025-03-lwn-burden-of-knowledge.md
Normal file
51
content/blog/2025-03-lwn-burden-of-knowledge.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
title: "The burden of knowledge: dealing with open-source risks"
|
||||||
|
date: 2025-03-10
|
||||||
|
categories:
|
||||||
|
- english
|
||||||
|
- article
|
||||||
|
tags:
|
||||||
|
- OSPO
|
||||||
|
- Community
|
||||||
|
- SupplyChain
|
||||||
|
- Security
|
||||||
|
headerimage:
|
||||||
|
src: /blog/file-cabinet.jpg
|
||||||
|
text: Neatly organise your records
|
||||||
|
article:
|
||||||
|
name: LWN.net
|
||||||
|
href: https://lwn.net/SubscriberLink/1013614/b3743b7875dc41ae/
|
||||||
|
---
|
||||||
|
|
||||||
|
I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here.
|
||||||
|
|
||||||
|
If you are an INWX customer, you can use this tool to manage all your DNS records in YAML files. Ideally, you will store these files in a Git repository which you can use to track changes and roll back in case of a mistake. Having one file per domain provides you a number of further advantages:
|
||||||
|
|
||||||
|
* You can easily copy/paste records from other domains, e.g. for `SPF`, `DKIM` or `NS` records
|
||||||
|
* Overall search/replace of certain values becomes much easier, e.g. of IP addresses
|
||||||
|
* You can prepare larger changes offline and can synchronise once you feel it's done
|
||||||
|
|
||||||
|
INWX DNS Recordmaster takes care of making the required changes of the live records so that it matches the local state. This is done via the INWX API, ensuring that the amount of API calls is minimal.
|
||||||
|
|
||||||
|
This even allows you to set up a pipeline that takes care of the synchronisation[^1].
|
||||||
|
|
||||||
|
## Wait, there is more
|
||||||
|
|
||||||
|
As written above, I already had a large stack of domains that I previously managed via the web interface. This is why some additional convenience features found their way into the tool.
|
||||||
|
|
||||||
|
* You can convert all records of an existing and already configured domain at INWX into the file format. This made onboarding my 30+ domains a matter of a few minutes.
|
||||||
|
* On a global or per-domain level, you can ignore certain record types. For example, if you don't want to touch any `NS` records, you can configure that. By default, `SOA` records are ignored. You may even ignore all live records that don't exist in your local configuration.
|
||||||
|
* Of course, you can make a dry run to see which effects your configuration will have in practice.
|
||||||
|
|
||||||
|
Did I miss something to make it more productive for you? Let me know!
|
||||||
|
|
||||||
|
## Install, use, contribute
|
||||||
|
|
||||||
|
You are welcome to [install this tool](https://github.com/mxmehl/inwx-dns-recordmaster?tab=readme-ov-file#install), it's Free and Open Source Software after all. All you need is Python installed.
|
||||||
|
|
||||||
|
One of the tool's users is the [OpenRail Association](https://openrailassociation.org) which manages some of its domains with this program and [published its configuration](https://github.com/OpenRailAssociation/openrail-dns). This is a prime example of how organisation can make the management of records transparent and easy to change at least internally, if not even externally.
|
||||||
|
|
||||||
|
While the tool is not perfect, it already is a huge gain for efficiency and stability of my IT operations, and it already proves its capabilities for other users. To reach the remaining 20% to perfection (that will take 80% of the time, as always), you are most welcome to add issues with enhancement proposals, and if possible, also pull requests.
|
||||||
|
|
||||||
|
|
||||||
|
[^1]: For example, see the [workflow file of the OpenRail Association](https://github.com/OpenRailAssociation/openrail-dns/blob/main/.github/workflows/sync-records.yaml).
|
||||||
20
content/blog/2025-12-openrailday-moderation/index.md
Normal file
20
content/blog/2025-12-openrailday-moderation/index.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: "OpenRail Day 2025 Moderation"
|
||||||
|
date: 2025-12-17
|
||||||
|
categories:
|
||||||
|
- english
|
||||||
|
- presentation
|
||||||
|
tags:
|
||||||
|
- OpenRail
|
||||||
|
- OSPO
|
||||||
|
- Community
|
||||||
|
headerimage:
|
||||||
|
src: openrailday-stage.jpg
|
||||||
|
text: My amazing co-moderator Kira Correll and I on stage
|
||||||
|
video: https://clip.place/w/p/gZ1HFxLxHri8mDABzqpGHC
|
||||||
|
event:
|
||||||
|
name: OpenRail Day 2025 @ Paris
|
||||||
|
href: https://day.openrailassociation.org
|
||||||
|
---
|
||||||
|
|
||||||
|
I had the pleasure to moderate the OpenRail Day 2025 in Paris, organised by the [OpenRail Association](https://openrailassociation.org) to share knowledge and experiences about open source software in the railway industry. The event featured several talks and panel discussions with experts from different companies and organisations involved in open source projects related to railways.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 445 KiB |
BIN
content/blog/2026-02-fosdem-supply-chain-strategy/firstslide.jpg
Normal file
BIN
content/blog/2026-02-fosdem-supply-chain-strategy/firstslide.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 266 KiB |
22
content/blog/2026-02-fosdem-supply-chain-strategy/index.md
Normal file
22
content/blog/2026-02-fosdem-supply-chain-strategy/index.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: "Software Supply Chain Strategy at Deutsche Bahn"
|
||||||
|
date: 2026-01-31
|
||||||
|
categories:
|
||||||
|
- english
|
||||||
|
- presentation
|
||||||
|
tags:
|
||||||
|
- OSPO
|
||||||
|
- SupplyChain
|
||||||
|
- Security
|
||||||
|
headerimage:
|
||||||
|
src: firstslide.jpg
|
||||||
|
video: https://video.fosdem.org/2026/ua2114/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy.av1.webm
|
||||||
|
slides: https://fosdem.org/2026/events/attachments/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy/slides/266949/2026-01-3_7kstxwl.pdf
|
||||||
|
event:
|
||||||
|
name: FOSDEM 2026
|
||||||
|
href: https://fosdem.org/2026/schedule/event/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy/
|
||||||
|
---
|
||||||
|
|
||||||
|
Deutsche Bahn, with its 230,000 employees and hundreds of subsidiaries, is far from an average organization. Yet it faces the same challenges under the CRA as many others. In this session, I showed how we connected the concrete requirements of CRA compliance with our broader effort to bring transparency to our software supply chains. This forms the basis for security and license compliance processes, as well as for proactively shaping the ecosystems we depend on.
|
||||||
|
|
||||||
|
In the presentation, I outlined our strategy for addressing the expectations tied to the different roles we take on -- customer, manufacturer, and indirectly even steward -- from both organizational and technical angles. Given the diversity and scale of Deutsche Bahn, we rely on modular FOSS tools that offer the flexibility to adapt to varying stakeholder needs and evolving regulation. This flexibility is a core element of our approach. This session showed how we align strategy and technology to make this work.
|
||||||
3
content/blog/_index.md
Normal file
3
content/blog/_index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
title: Blog
|
||||||
|
---
|
||||||
@@ -169,6 +169,16 @@
|
|||||||
|
|
||||||
# AUDIO/VIDEO
|
# AUDIO/VIDEO
|
||||||
|
|
||||||
|
- desc: 'Moderation of the OpenRail Day Conference'
|
||||||
|
type: av
|
||||||
|
date: 2025-12
|
||||||
|
links:
|
||||||
|
- href: https://day.openrailassociation.org
|
||||||
|
text: OpenRail Day 2025 @ Paris
|
||||||
|
video: https://clip.place/w/p/gZ1HFxLxHri8mDABzqpGHC
|
||||||
|
lang: ["EN"]
|
||||||
|
tags: ["OpenRail", "OSPO", "Community"]
|
||||||
|
|
||||||
- desc: '"Burden of Knowledge - Dealing with Risks in Open Source"'
|
- desc: '"Burden of Knowledge - Dealing with Risks in Open Source"'
|
||||||
type: av
|
type: av
|
||||||
date: 2025-03
|
date: 2025-03
|
||||||
|
|||||||
@@ -199,6 +199,8 @@ html, body {
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
|
|
||||||
.header-image {
|
.header-image {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
@@ -210,9 +212,13 @@ html, body {
|
|||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
margin-bottom: 1.5em;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blog-links {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Metadata */
|
/* Metadata */
|
||||||
@@ -336,6 +342,10 @@ pre code {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h4 span {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
h1,
|
h1,
|
||||||
h4 a {
|
h4 a {
|
||||||
color: var(--primary-color-dark);
|
color: var(--primary-color-dark);
|
||||||
|
|||||||
@@ -20,20 +20,35 @@
|
|||||||
<div class="metadata-page">
|
<div class="metadata-page">
|
||||||
<div class="row vertical-align">
|
<div class="row vertical-align">
|
||||||
<div class="col-xs-3 col-md-2 text-right">
|
<div class="col-xs-3 col-md-2 text-right">
|
||||||
<em>Languages:</em>
|
<em>Type:</em>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9 col-md-10">
|
<div class="col-xs-9 col-md-10">
|
||||||
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
|
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
|
||||||
{{ range $name, $taxonomy := .Site.Taxonomies.categories }}
|
{{- range $name, $taxonomy := .Site.Taxonomies.categories }}
|
||||||
|
{{- if in (slice "english" "deutsch") $name }}{{ continue }}{{ end }}
|
||||||
<a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}">
|
<a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}">
|
||||||
{{- humanize $name -}}
|
{{- humanize $name -}}
|
||||||
</a>
|
</a>
|
||||||
{{- end -}}
|
{{- end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row vertical-align">
|
<div class="row vertical-align">
|
||||||
<div class="col-xs-3 col-md-2 text-right">
|
<div class="col-xs-3 col-md-2 text-right">
|
||||||
<em>Tags:</em>
|
<em>Language:</em>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-9 col-md-10">
|
||||||
|
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
|
||||||
|
{{- range $name, $taxonomy := .Site.Taxonomies.categories }}
|
||||||
|
{{- if not (in (slice "english" "deutsch") $name) }}{{ continue }}{{ end }}
|
||||||
|
<a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}">
|
||||||
|
{{- humanize $name -}}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 col-md-2 text-right">
|
||||||
|
<em>Tag:</em>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9 col-md-10">
|
<div class="col-xs-9 col-md-10">
|
||||||
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
|
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
|
||||||
@@ -62,8 +77,14 @@
|
|||||||
<div class="blogpost">
|
<div class="blogpost">
|
||||||
{{ range .Paginator.Pages.ByPublishDate.Reverse }}
|
{{ range .Paginator.Pages.ByPublishDate.Reverse }}
|
||||||
<div class="blog-summary">
|
<div class="blog-summary">
|
||||||
<h4><strong><a href="{{ .RelPermalink }}">{{ .Title | markdownify }}</a></strong></h4>
|
<h4>
|
||||||
<div class="metadata-summary">Posted on {{ .Date.Format "2 January 2006" }} - Tagged with {{ range $i, $tag := .Params.tags }}{{ if $i }}, {{ end }}<a href="/tags/{{ lower $tag }}">{{ $tag }}</a>{{ end }}</div>
|
{{ partial "blog/pre-headline.html" . -}}
|
||||||
|
<strong><a href="{{ .RelPermalink }}">{{ .Title | markdownify }}</a></strong>
|
||||||
|
</h4>
|
||||||
|
<div class="metadata-summary">
|
||||||
|
{{- partial "blog/verb.html" . }}
|
||||||
|
on {{ .Date.Format "2 January 2006" }} - Tagged with {{ range $i, $tag := .Params.tags }}{{ if $i }}, {{ end }}<a href="/tags/{{ lower $tag }}">{{ $tag }}</a>{{ end }}
|
||||||
|
</div>
|
||||||
{{ .Summary }} <a class="learn-more" href="{{ .RelPermalink }}"></a>
|
{{ .Summary }} <a class="learn-more" href="{{ .RelPermalink }}"></a>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|||||||
@@ -17,14 +17,25 @@
|
|||||||
{{ .Date.Format "2 January 2006" }}
|
{{ .Date.Format "2 January 2006" }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row vertical-align">
|
||||||
|
<div class="col-xs-3 col-md-2 text-right">
|
||||||
|
<em>Type:</em>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-9 col-md-10">
|
||||||
|
{{- range .Params.categories }}
|
||||||
|
{{- if in (slice "english" "deutsch") . }}{{ continue }}{{ end }}
|
||||||
|
<a class="label label-success" href="/categories/{{ lower . }}">{{ title . }}</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row vertical-align">
|
<div class="row vertical-align">
|
||||||
<div class="col-xs-3 col-md-2 text-right">
|
<div class="col-xs-3 col-md-2 text-right">
|
||||||
<em>Tags:</em>
|
<em>Tags:</em>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-9 col-md-10">
|
<div class="col-xs-9 col-md-10">
|
||||||
{{ range .Params.tags }}
|
{{- range .Params.tags }}
|
||||||
<a class="label label-success" href="/tags/{{ lower . }}">{{ . }}</a>
|
<a class="label label-success" href="/tags/{{ lower . }}">{{ title . }}</a>
|
||||||
{{- end -}}
|
{{- end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row vertical-align">
|
<div class="row vertical-align">
|
||||||
@@ -40,12 +51,8 @@
|
|||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="blogpost">
|
<div class="blogpost">
|
||||||
{{ if isset .Params "headerimage" }}
|
{{- partial "blog/headerimage" . }}
|
||||||
<div class="header-image">
|
{{- partial "blog/links" . }}
|
||||||
<img src="/img/{{ .Params.headerImage }}" />
|
|
||||||
<p>{{ with .Params.headercredits }}{{ . | markdownify }}{{ end }}</p>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
<!-- only show related posts if param is true, or if it's not a page -->
|
<!-- only show related posts if param is true, or if it's not a page -->
|
||||||
{{ if or (eq .Params.related true) (ne .Params.page true) }}
|
{{ if or (eq .Params.related true) (ne .Params.page true) }}
|
||||||
@@ -85,6 +92,6 @@
|
|||||||
|
|
||||||
<!-- Matomo -->
|
<!-- Matomo -->
|
||||||
{{ partial "matomo" . }}
|
{{ partial "matomo" . }}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
25
themes/hugo-sustain/layouts/partials/blog/headerimage.html
Normal file
25
themes/hugo-sustain/layouts/partials/blog/headerimage.html
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{{- $page := . -}}
|
||||||
|
{{- $image := "" }}
|
||||||
|
{{- with $page.Params.headerimage }}
|
||||||
|
<div class="header-image">
|
||||||
|
{{- if eq $page.BundleType "leaf" }}
|
||||||
|
{{- with $page.Resources.GetMatch .src }}
|
||||||
|
{{- $image = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- with resources.GetMatch (printf "**/%s" .src) }}
|
||||||
|
{{- $image = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- $processes := .processes | default (slice "fill 1000x440 webp" )}}
|
||||||
|
{{- $filter := .filter }}
|
||||||
|
{{- if not $image }}
|
||||||
|
{{- warnf "Header image '%s' not found for page %s" .src $page.RelPermalink }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with $image }}
|
||||||
|
{{- $image = partial "image-processing" (dict "image" $image "processes" $processes "filter" $filter) -}}
|
||||||
|
<img src="{{ .RelPermalink }}" />
|
||||||
|
{{- end }}
|
||||||
|
{{- with .text }}<p>{{ . | markdownify }}</p>{{ end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
27
themes/hugo-sustain/layouts/partials/blog/links.html
Normal file
27
themes/hugo-sustain/layouts/partials/blog/links.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<div class="blog-links">
|
||||||
|
{{- with .Params.event }}
|
||||||
|
<a class="btn btn-default button-event" href="{{ .href }}" target="_blank" aria-label="Event Page" role="button">
|
||||||
|
<i class="fas fa-calendar-alt" aria-hidden="true"></i> {{ .name }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Params.audio }}
|
||||||
|
<a class="btn btn-default button-audio" href="{{ . }}" target="_blank" aria-label="Audio Recording" role="button">
|
||||||
|
<i class="fas fa-microphone" aria-hidden="true"></i> Listen to Recording
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Params.article }}
|
||||||
|
<a class="btn btn-default button-article" href="{{ .href }}" target="_blank" aria-label="Related Article" role="button">
|
||||||
|
<i class="fas fa-newspaper" aria-hidden="true"></i> Read {{ .name }} Article
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Params.video }}
|
||||||
|
<a class="btn btn-default button-video" href="{{ . }}" target="_blank" aria-label="Video Recording" role="button">
|
||||||
|
<i class="fas fa-video" aria-hidden="true"></i> Watch Recording
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Params.slides }}
|
||||||
|
<a class="btn btn-default button-slides" href="{{ . }}" target="_blank" aria-label="Slides" role="button">
|
||||||
|
<i class="fas fa-desktop" aria-hidden="true"></i> View Slides
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
13
themes/hugo-sustain/layouts/partials/blog/pre-headline.html
Normal file
13
themes/hugo-sustain/layouts/partials/blog/pre-headline.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{{- $cats := .Page.Params.categories }}
|
||||||
|
{{- $symbols := dict "article" "🗞️" "presentation" "🎤" "podcast" "🎧" }}
|
||||||
|
{{- $icon := "" }}
|
||||||
|
{{- $title := "" }}
|
||||||
|
{{- range $cat := $cats }}
|
||||||
|
{{- with index $symbols $cat }}
|
||||||
|
{{- $icon = . }}
|
||||||
|
{{- $title = $cat | humanize }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with $icon }}
|
||||||
|
<span title="{{ $title }}">{{ $icon }} </span>
|
||||||
|
{{- end -}}
|
||||||
12
themes/hugo-sustain/layouts/partials/blog/verb.html
Normal file
12
themes/hugo-sustain/layouts/partials/blog/verb.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{{- $cats := .Page.Params.categories }}
|
||||||
|
{{- $symbols := dict "article" "Article published" "presentation" "Presentation given" "podcast" "Podcast released" }}
|
||||||
|
{{- $selection := "" }}
|
||||||
|
{{- range $cat := $cats }}
|
||||||
|
{{- with index $symbols $cat }}
|
||||||
|
{{- $selection = . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not $selection }}
|
||||||
|
{{- $selection = "Blogged" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- return $selection }}
|
||||||
@@ -12,8 +12,6 @@
|
|||||||
{{- $title = print .Site.Title " | " .Title -}}
|
{{- $title = print .Site.Title " | " .Title -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $image := path.Join "/img" .Site.Params.avatar -}}
|
|
||||||
{{- if isset .Params "headerimage" }} {{ $image = print "img/" .Params.headerimage }} {{ end -}}
|
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
@@ -29,18 +27,32 @@
|
|||||||
<!-- CSS and JS -->
|
<!-- CSS and JS -->
|
||||||
{{- partialCached "head/css.html" . }}
|
{{- partialCached "head/css.html" . }}
|
||||||
|
|
||||||
{{ "<!-- Open Graph meta-data (e.g. Facebook) -->" | safeHTML }}
|
<!-- Get image for social media sharing -->
|
||||||
<meta property="og:title" content="{{ $title }}"/>
|
{{- $image := "" -}}
|
||||||
<meta property="og:url" content="{{ .Permalink | absURL }}"/>
|
{{- $imagesrc := (.Page.Params.headerimage.src | default .Site.Params.avatar) -}}
|
||||||
<meta property="og:image" content="{{ $image | absURL }}"/>
|
{{- if eq .Page.BundleType "leaf" }}
|
||||||
<meta property="og:description" content="{{ .Summary | truncate 200 }}"/>
|
{{- with .Page.Resources.GetMatch $imagesrc }}
|
||||||
|
{{- $image = . -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{- with resources.GetMatch (printf "**/%s" $imagesrc) }}
|
||||||
|
{{- $image = . -}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if $image }}
|
||||||
|
{{- $image = $image.Fill "1200x630 jpg" -}}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{ "<!-- Twitter meta-data -->" | safeHTML }}
|
<!-- Open Graph meta-data (e.g. Facebook) -->
|
||||||
<meta name="twitter:card" content="summary_large_image"/>
|
<meta property="og:type" content="article"/>
|
||||||
<meta name="twitter:site" content="@{{ .Site.Params.social.twitter }}"/>
|
<meta property="og:site_name" content="{{ .Site.Title }}"/>
|
||||||
<meta name="twitter:title" content="{{ $title }}"/>
|
<meta property="og:title" content="{{ $title }}"/>
|
||||||
<meta name="twitter:description" content="{{ .Summary | truncate 200 }}"/>
|
<meta property="og:url" content="{{ .Permalink }}"/>
|
||||||
<meta name="twitter:image" content="{{ $image | absURL }}"/>
|
<meta property="og:description" content="{{ (.Summary | default .Site.Params.description) | truncate 200 }}"/>
|
||||||
<meta name="twitter:url" content="{{ .Permalink | absURL }}"/>
|
{{- with $image }}
|
||||||
<meta name="twitter:creator" content="@{{ .Site.Params.social.twitter }}"/>
|
<meta property="og:image" content="{{ .Permalink }}"/>
|
||||||
|
<meta property="og:image:type" content="{{ .MediaType }}">
|
||||||
|
<meta property="og:image:width" content="{{ .Width }}">
|
||||||
|
<meta property="og:image:height" content="{{ .Height }}">
|
||||||
|
{{- end }}
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
32
themes/hugo-sustain/layouts/partials/image-processing.html
Normal file
32
themes/hugo-sustain/layouts/partials/image-processing.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{{- /* Expects .image (resolved image resource), optionally .processes and .filter */}}
|
||||||
|
{{- $image := .image }}
|
||||||
|
{{- range .processes }}
|
||||||
|
{{- $image = $image.Process . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .filter }}
|
||||||
|
{{- $filters := slice }}
|
||||||
|
{{- range . }}
|
||||||
|
{{- range $method, $args := . }}
|
||||||
|
{{/* No, this cannot be generalised, as strings cannot be converted to functions... */}}
|
||||||
|
{{- if eq $method "GaussianBlur" }}
|
||||||
|
{{- $filters = $filters | append (images.GaussianBlur $args) }}
|
||||||
|
{{- else if eq $method "Brightness" }}
|
||||||
|
{{- $filters = $filters | append (images.Brightness $args) }}
|
||||||
|
{{- else if eq $method "Opacity" }}
|
||||||
|
{{- $filters = $filters | append (images.Opacity $args) }}
|
||||||
|
{{- else if eq $method "Pixelate" }}
|
||||||
|
{{- $filters = $filters | append (images.Pixelate $args) }}
|
||||||
|
{{- else if eq $method "Saturation" }}
|
||||||
|
{{- $filters = $filters | append (images.Saturation $args) }}
|
||||||
|
{{- else if eq $method "Sepia" }}
|
||||||
|
{{- $filters = $filters | append (images.Sepia $args) }}
|
||||||
|
{{- else if eq $method "Grayscale" }}
|
||||||
|
{{- $filters = $filters | append images.Grayscale }}
|
||||||
|
{{- else }}
|
||||||
|
{{- warnf "Unsupported filter: %s" $method }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- $image = $image.Filter $filters }}
|
||||||
|
{{- end }}
|
||||||
|
{{- return $image }}
|
||||||
Reference in New Issue
Block a user