Unix slide

oldschool
webmaster

make email

Sat Feb 21 14:57:33 CET 2026

 doveadm pw -s SHA512-CRYPT

 mkdir -p /var/mail/vhosts/theendofthe.universe/shack

 maildirmake.dovecot /var/mail/vhosts/theendofthe.universe/shack

 chown -R 5000:110 /var/mail/vhosts/theendofthe.universe/shack

 sqlite3 /etc/mail/mail.sqlite 'insert into users (username, password) values ("shack@theendofthe.universe", "SHA512... ");'

 doveadm pw -t "$(sudo sqlite3 /etc/mail/mail.sqlite 'select password from users where username="shack@theendofthe.universe";')"

 echo testmail | mail shack@theendofthe.universe

 DONE
    

CIA one-liner git

Fri Feb 20 19:08:24 CET 2026

The original command

git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
How it works:

git branch --merged — lists all local branches that have already been merged into the current branch
grep -v "\*\|master" — filters out the current branch (*) and master so you don’t delete either
xargs -n 1 git branch -d — deletes each remaining branch one at a time, safely (lowercase -d won’t touch unmerged branches)
The updated command

Since most projects now use main instead of master, you can update the command and exclude any other branches you frequently use:

git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d
Run this from main after a deployment and your branch list goes from 40 entries back down to a handful.

I keep this as a git alias so I don’t have to remember the syntax:

alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'
Then in your repo just run:

ciaclean

    

Postkarten und Briefumschläge

Sun Feb 8 19:13:36 CET 2026

defaults
auth           on
tls            on
tls_starttls   on
tls_trust_file /opt/local/etc/openssl/cert.pem
logfile        ~/.msmtp.log
from %F
allow_from_override off

... funktioniert nicht. musste ein wrapper script bauen

    

sort a trillion lines

Sat Jan 17 17:37:38 CET 2026

There is a use case for sort that might be worth mentioning. If
someone needs to sort billions or trillion of lines of data, it can be
done with coreutils sort. The trick is to use —-temporary-dir and
potentially use ulimit to restrict the process memory. Might be worth
mentioning under sort as it’s a neat trick.
    

emacs diary

Sat Jan 17 17:25:05 CET 2026

      You're probably missing the key point that when you write %%(...),
      the part after the %% is an arbitrary lisp form, rather than one of a
      limited set of options. Hence the answer is simply:

      Copy
      %%(and (diary-block ...) (diary-cyclic ...))
      Some other examples of combining things:

      Copy
      %%(or (diary-float t 3 2) (diary-float t 3 4))
      The 2nd and 4th Wednesday of each month.  (Not a 14-day cycle)

      %%(or (diary-float '(1 3 5 7 9 11) 4 3) (diary-float '(2 4 6 8 10 12) 2 3))
      Monthly dates alternating between the 3rd Tuesday and the 3rd Thursday
      of each month.

      %%(my-diary-foo)
      Completely custom...
    

grep for word, linenumber and 3 around

Wed Jan 7 13:48:05 CET 2026

grep -rnoP "(\b\w+\b\s+){0,3}subset(\s+\b\w+\b){0,3}" .

subset variable width font

Wed Jan 7 15:10:11 CET 2026

get the ttf files
woff2_compress Roboto-VariableFont_wdth,wght.ttf

create chars.txt

abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789

.,:;!?…()[]{}"'«»„“”‚‘’–—-
@#$%&*/+=<>|^~_\-

        äöüÄÖÜß
        àâæçéèêëîïôœùûÿ
        ÀÂÆÇÉÈÊËÎÏÔŒÙÛŸ

        áéíóúñü
        ÁÉÍÓÚÑÜ
        ¡¿

        åäöÅÄÖ
        øæØÆ

        pyftsubset-3.13 roboto-italic-vf.woff2 --text-file=chars.txt
        --flavor=woff2 --output-file=roboto-italic-vf-subset.woff2

        pyftsubset-3.13 roboto-vf.woff2 --text-file=chars.txt
        --flavor=woff2 --output-file=roboto-vf-subset.woff2

        done
      

svg logo ratio and size

Wed Jan 6 08:48:52 CET 2026

read the svg and put the viewbox values in the html (width height) and the css:
    aspect-ratio: width / height;
    

emacs kbd macro

Sun Mar 17 21:46:55 CET 2024

to use C-g inside a kbd recording without quitting the recording, use
M-x keyboard-escape-quit
    

let it flow

Wed Jul 12 19:00:16 CEST 2023

so to fliesstext a region in emacs - select it and do M-^ and done.
    

check with curl

Wed Dec 20 19:34:49 CET 2023

For a problem like that, I suggest using “curl -i https://your-url” to
investigate why the response isn’t what you expect. There should be a
redirection HTTP code in the response and a Location: header to say
where to go to.
    

rails german case

Wed Dec 20 19:32:18 CET 2023

to disable rails downcasing perfectly good german translations from
your de.yml file: put this into
/config/initializers/active_record_overrides.rb :

module ActiveRecord class Base def
  self.human_attribute_name(attribute, options = {})
  I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{attribute}",
  **options, default: attribute.to_s) end end end
    

local iphone check

Fri Aug 08 14:51:59 CET 2020

By default jekyll serve doesn’t expose the site on the local network
(for security reasons), but you can open it to the local network using
the -H or --host flag. Use 0.0.0.0 to bind to the host’s local IP
address:

bundle exec jekyll serve --host 0.0.0.0 Now you can visit the site
from any machine on the local network at: http://192.168.x.x:4000/

If you’re developing on a Mac, then you can take advantage of
Bonjour/ZeroConf and use the Mac’s name rather then the ever-changing
local IP address. The Mac’s name is defined in System-Preferences >
Sharing > Computer-Name.

For example, if you’ve named your Mac “Eddy”, then you can access your
Jekyll site at http://Eddy.local:4000/