Since I spend more than 8 hours here most days I created a nice setup for myself.
Thankfully I have a whole room just for my home office, so I take full advantage of that.
Besides my main desk I have a secondary desk,
a couch, a couple of sideboards, a wall mounted whiteboard and a couple of shelves to display all the techy and nerdy things.
Notes
| 2023-04-01
(updated 2025-10-25)
| 3 min read
#hiking#personal
These days I enjoy hiking quite a lot.
To make it easier to just “pick up the pack and go” I created two basic packs that are optimized for my needs
and the environment I’m usually hiking in, the Swabian Alps.
Basics
I have some basics I duplicated and carry in both my packs, these are:
Pen & paper
Multitool
Mini first aid kit in a ziploc bag
Paracetamol
Band aids
Gel sanitizer
Foam pad
Waterproof poncho
A bit of cash, usually around 20-30€ these days
A piece of paper with my and my emergency contacts information
Fisherman’s Friend for a fresh feeling and honestly because my parents had them when we were hiking
Prepared packs
Small pack
I’m currently using a Terra Peak Flex 20l in red for my smaller backpack.
It’s a nice size for shorter hikes and fits me well.
The 1Password CLI op works either in connection with a client app, like on the Mac,
or standalone, useful on a server.
# Logineval$(op signin)# Get favoritesop item list --vault "Private" --favorite
# Get a specific itemop item get <ID>
# !! Important: Sign out at the endop signout
Some helper functions
Helpers to more easily work with the op cli.
1login(){eval$(op signin)}alias1signout="op signout"1search(){term=$1if[ -n "$2"]thenvault="$2"elsevault="Private"fiecho"Searching for '$term' in vaut '$vault'" op item list --vault "$vault" --long | grep "$term" --ignore-case
}1get(){ op item get $*}
This however did not work with the above mentioned error message.
After a lot of debugging I found that they released a new version recently which introduced this feature.
My solution was to update my locally build container image to the latest version, as of writing 1.29.0, in which this feature is introduced.
This is somewhere between a rant about the app and backing services no longer working, a collection of information I could find out about it
and a possible search-result for others facing the same issues and not really finding anything online just like me.
Update: March 2023
The company seems to no longer exist.
I have switched to the eufy smart scales, which are made by Anker, a reputable manufacturer.
Notes
| 2022-09-29
(updated 2025-10-25)
| 1 min read
#git
Sometimes you may want to commit only the files you have changed and not any newly created files,
this can easily be achieved by this command: git commit -a
Notes
| 2022-09-29
(updated 2025-10-25)
| 2 min read
#personal
This is a list of interesting blog posts, talks and such things that I found over the years.
Some of them may teach you something relevant, some may just further your general understanding of tech.
From personal experience they can lead you down the rabbit hole really fast, enjoy with care!
Notes
| 2022-07-08
(updated 2025-10-25)
| 1 min read
#git#productivity
A simple changelog system on top of git commit messages.
The main idea is to generate “release notes” from a diff in commits before a release.
It can easily be run manually or as part of a merge/pull CI pipeline.
In this case it looks for commit messages starting with one of these [ADD], [REMOVE], [INFO]
and just outputs those, but those patters can be adjusted to fit any existing commit schema.
When adding yamllint to an existing project it can be hard to fix all the errors at once.
I wrote a simple script to create a rules block that simply ignores all rules that currently trigger for a file.
This works by generating a rules block ignoring paths.
In production I would consider it best practice to use a S3 solution for serving assets. Namely static files and user-generated media.
This describes my setup on how to do this locally too.
The main benefit for me is that there is less of a difference between environments and I can test S3 specific features in my app.
Setup
I will assume a already working Django project and MacOS with [[brew]] installed,
but brew specific parts are easilly replicated on different systems using their native package managers.
The path you are in when opening a new WSL tab is determined by startingDirectory.
This parameter needs to be a valid Windows path, which isn’t great if we want to end up in /home/kamner inside WSL.
The nice thing about WSL is that it will resolve windows paths into their equivalent WSL/linux path if possible.
For example, C:\Scripts would resolve to /mnt/c/Scripts.
Using this and the neat trick that the WSL filesystem is exposed as a a hidden fileshare ([[technology/windows/wsl-hidden-fileshare]])
we can get to where we want.
Afterwards, we can create a logroatet configuration going in /etc/logrotate.d/mongodb.
/var/log/mongodb/mongod.log
{
rotate 5 # Keep the last 5 rotated logs, so 6 files including the currently active
size 10M # Rotate once the log reaches 10MB in size, depending on your envrionment you could instead use daily, weekly, monthly, etc
missingok # It's ok if the log file does not exist
create 0600 mongodb mongodb # Permissions and ownership for the roatetd logs
delaycompress # Don't compress on first rotation, so we have the current log and log.1 uncompressed
compress # Compress everything else
sharedscripts # Run this script only once and not for every matching file
postrotate # Script to run after rotating
/bin/kill -SIGUSR1 $(systemctl show --property MainPID --value mongod.service)
endscript # End of script
}
The postrotate script simply finds the PID of mongod.service: systemctl show --property MainPID --value mongod.service
and sends it a SIGUSR1 which is the signal MongoDB expects if you wish to rotate the log.
Notes
| 2021-08-10
(updated 2025-10-25)
| 2 min read
#freshservice
It is possible to customize almost all of the user portal but you better know what you are doing.
Otherwise you may end up like me, spending way more time than you ever should on customizing this damn portal.
Let’s hope this one helps you, otherwise feel free to reach out to me on Twitter.
Page Header
Place a variation of the below at
Admin > General Settings > Helpdesk Rebranding > Requester Portal Branding > Customize Portal > Layout And Pages > Portal Pages > General Pages > Portal Home
The idea at the start was simple.
Do something like Obsidian Publish , so read frontmatter and if it contains published: True put it up on a website to view.
I have since rewritten and updated this tool: New version
The Basics
I started with taking a look at different static site generators but after a bit of testing I ended up back at Hugo, which I already use for ps1.guru and a few other projects.
SELinux by default prohibits certain things from working through VMware tools (Ansible connection or plain API).
This can be solved two ways:
Disabling SELinux: BAD, but easy
Writing a custom SELinux policy: complicated but more secure
Note: Adding/Changing this policy through a VMware tools connection is thankfully possible
Example policy
This policy is the base for a VMware tools policy and allows entering the rpm context (yum).
module custom-vmtools 1.0;
require {
type rpm_script_t;
type vmtools_unconfined_t;
class process transition;
}
#============= vmtools_unconfined_t ==============
allow vmtools_unconfined_t rpm_script_t:process transition
You can intercept normal name resolution in curl with the --resolve parameter allowing you to do things like talk to a specific site of a DNS load-balanced setup
or talk to a new deployment not yet made productive.
You can specify the resolve option multiple times so you can even catch redirects and move them to where you want as well.
It’s important to note that this intercept does only work on the ports you specify in the entries.
As I found out long after writing the above you can simply brew install coreutils and get a date command with the --date option.
The only thing to note there is this: Commands also provided by macOS have been installed with the prefix "g".