Compare commits

...

5 Commits

58 changed files with 493 additions and 219 deletions

View File

@@ -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:

View File

@@ -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/"

View File

@@ -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, its a small thing. The title of this post sounds very significant but to be honest, its 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 somethings important, I open a new task in my taskmanager or simply write it down. In the office I also read lots 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 somethings important, I open a new task in my taskmanager or simply write it down. In the office I also read lots 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 Im 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 Im 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 Im 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 Im 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, heres my odyssey of finding the perfect method for me: Dear ladies and gentlemen, heres my odyssey of finding the perfect method for me:
@@ -37,7 +38,7 @@ Dear ladies and gentlemen, heres 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 Im able to save some mails for later work when Im 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 Im able to save some mails for later work when Im sitting in the train for example.
No matter how you decide (Im not quite sure as well whats the best for me), its 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 (Im not quite sure as well whats the best for me), its 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 >}}

View File

@@ -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 @@ Lets 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 dont want to use your shell every time or dont want to remember the HOSTs you used in your .ssh/config, youre 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 dont want to use your shell every time or dont want to remember the HOSTs you used in your .ssh/config, youre 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
``` ```

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -3,6 +3,7 @@ title: Setting Openstreetmap as default in Thunderbirds 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

View File

@@ -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

View File

@@ -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

View File

@@ -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 Im (a bit) proud of: Some noteworthy projects Im (a bit) proud of:
@@ -27,7 +28,7 @@ Some noteworthy projects Im (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. Heres [why and how][6]. Links to the project may have changed because of that (and Im too lazy to change them here). I washed away the quite basic gitweb instance and moved to Gogs. Heres [why and how][6]. Links to the project may have changed because of that (and Im too lazy to change them here).
[1]: https://src.mehl.mx [1]: https://src.mehl.mx

View File

@@ -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

View File

@@ -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*.

View File

@@ -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

View File

@@ -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**. Its 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

View File

@@ -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

View File

@@ -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
--- ---

View File

@@ -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
Ive 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 dont understand it will rather be left behind. Ive 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 dont understand it will rather be left behind.
I thought in Tanzania its 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 its 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 its 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 its 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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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?“._

View File

@@ -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

View File

@@ -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

View File

@@ -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
--- ---

View File

@@ -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
--- ---

View File

@@ -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.
--- ---

View File

@@ -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?

View File

@@ -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

View File

@@ -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

View 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://podcast.opensap.info/open-source-way/2023/11/29/the-growing-importance-of-software-bills-of-materials-sbom/
podcast:
name: SAP's Open Source Way Podcast
href: https://podcast.opensap.info/open-source-way/2023/11/29/the-growing-importance-of-software-bills-of-materials-sbom/
---
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.

View File

@@ -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.

View 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).

View 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: 2.5 MiB

3
content/blog/_index.md Normal file
View File

@@ -0,0 +1,3 @@
---
title: Blog
---

View File

@@ -336,6 +336,10 @@ pre code {
} }
} }
h4 span {
cursor: default;
}
h1, h1,
h4 a { h4 a {
color: var(--primary-color-dark); color: var(--primary-color-dark);

View File

@@ -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 }}

View File

@@ -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,7 @@
<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">
<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 +91,6 @@
<!-- Matomo --> <!-- Matomo -->
{{ partial "matomo" . }} {{ partial "matomo" . }}
</body> </body>
</html> </html>

View File

@@ -0,0 +1,21 @@
{{- $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" )}}
{{- $image = partial "image-processing" (dict "image" $image "processes" $processes "filter" .filter) -}}
{{- with $image }}
<img src="{{ .RelPermalink }}" />
{{- end }}
{{- with .text }}<p>{{ . | markdownify }}</p>{{ end }}
</div>
{{- end }}

View 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 }}&nbsp;&nbsp;</span>
{{- end -}}

View 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 }}

View File

@@ -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>

View 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 }}