Manchmal braucht man eine Pause

Ich sitze manchmal viel zu lange am Rechner, ohne zwischendurch eine Pause zu machen. Gerade im Büro bin ich manchmal so vertieft in meine Arbeit, dass ich komplett vergesse auch mal aufzustehen.

Das ist nicht nur ungesund, es hält mich auch vom Kaffee holen ab. ☕️

Um das Problem zu lösen, gibt es diverse Apps (im Mac App Store) die einen daran erinnern sollen, auch mal eine Pause zu machen. Sluggard, Time Out, Recess und Co. Doch die meisten sind für meinen Anspruch viel zu umfangreich. Ich war eigentlich auf der Suche nach einem Tool das mir eine kurze Erinnerung anzeigt.

Anstatt lange zu suchen, habe ich mir dann einfach einen Eintrag in ~/Library/LaunchAgents/ angelegt, der alle 60 Minuten eine kleine Notification mit Hilfe von terminal-notifier anzeigt.


Was man braucht

terminal-notifier

terminal-notifier kann per Homebrew installiert werden:

brew install terminal-notifier

launchctl .plist-File für den “cronjob”

.plist-File in ~/Library/LaunchAgents/ anlegen, zum Beispiel mit Vim:

vim ~/Library/LaunchAgents/com.need.computer.break.plist

Folgenden Inhalt einfügen:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.need.computer.break</string>

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/terminal-notifier</string>
    <string>-title</string>
    <string>Jetzt ist auch mal gut...</string>
    <string>-message</string>
    <string>Zeit für eine Pause!</string>
    <string>-sound</string>
    <string>hero</string>
    <string>-group</string>
    <string>1</string>
    <string>-remove</string>
    <string>1</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>3600</integer>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Hier können gerne noch die Parameter angepasst werden. In der vorhandenen Config läuft es alle 60 Minuten. Soll es in einem anderen Intervall laufen, einfach die 3600 durch die gewünschte Zeit in Sekunden ersetzen.

Danach muss noch das .plist-File mit launchctl geladen werden:

launchctl load com.need.computer.break.plist

Fertig! :)

Wieder entfernen?

Einfach einen unload machen:

launchctl unload com.need.computer.break.plist

und das .plist-File löschen:

rm ~/Library/LaunchAgents/com.need.computer.break.plist

Ruby on Rails in Docker mit Host-Datenbank nutzen

Ich hatte heute das Problem, dass ich eine ältere Ruby on Rails App debuggen musste, die partout nicht auf meinem aktuellen Setup (macOS 10.13.4) starten wollte. Diverse Versionskonflikte usw.

Docker all the things!

Eigentlich will ich schon länger mal unsere ganzen Apps in Docker Container verpacken, um solchen Problemen aus dem Weg zu gehen. Aber wie das dann manchmal so ist, hat man andere Sachen im Kopf, bis es dann mal wirklich knallt.

Also den ganzen Mist in Docker verpacken.

Dockerfile

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential nodejs mysql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# COPY id_rsa /root/.ssh/id_rsa # Update: wird nicht gebraucht
RUN bundle install
COPY . /myapp

Sieht erstmal relativ normal aus. ABER: Wie hier zu sehen ist, kopiere ich einen Key (id_rsa) mit in den Container. Hier ist höchste Vorsicht geboten. Die id_rsa ist per .gitignore blockiert und der Container wird nicht als Image in eine Registry geladen, sondern nur lokal gestartet.
Ich bin gezwungen hier das Keyfile mit in den Container zu kopieren, weil es für mich sonst nicht möglich wäre, mit Capistrano aus dem Container heraus den Code zu deployen. Ein ganz schlimmer Hack.

docker-compose.yml

Update: Stellt sich heraus, dass ich mein lokales ~/.ssh/ Directory auch einfach als Volumen in den Container mounten kann. Siehe - /Users/<USERNAME>/.ssh:/root/.ssh

Das docker-compose File sieht relativ schlicht aus:

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
      - /Users/<USERNAME>/.ssh:/root/.ssh
    ports:
      - "3000:3000"

database.yml

Ich habe einen lokalen MySQL Server installiert, auf welchen die Rails App zugreifen soll. Theoretisch könnte ich einen Datenbankservice in meine docker-compose.yml eintragen, darauf wollte ich aber verzichten, um es so einfach wie möglich zu halten.

In der Rails app muss nun noch die config/database.yml angepasst werden:

development:
  adapter: mysql2
  encoding: utf8
  database: <databasename>
  username: <user>
  password: <password>
  host: host.docker.internal
  socket: /tmp/mysql.sock
  pool: 40

Hier ist eigentlich nur besonders, dass als Host host.docker.internal angegeben ist. Das ist die Adresse, mit der man aus einem Container heraus den Docker Host ansprechen kann (im Fall von Docker for Mac).

Danach kann der Container mit docker-compose up gestartet werden.

Arbeiten im Container

Ich kann nun einfach lokal an der App arbeiten, und der Container kümmert sich darum das die App läuft. Wenn alles fertig ist, einfach den Code per git einchecken und dann Capistrano im Container aufrufen:

docker-compose exec web bundle exec cap deploy

Zusammenfassung

Das ist eine furchtbare Lösung für ein noch furchtbareres Problem. Ich weiß nun aber, dass ich alle unsere Rails Apps in richtige Docker Container verpacken werde.


macOS: Tastaturtyp ändern...

Ich bin gerade mal wieder dabei einen neuen Mac einzurichten. Dabei wurde auf meinem Microsoft Sculpt Keyboard zwei Tasten vertauscht: “<” und “^”. Weil ich das Problem immer mal wieder habe, muss ich das jetzt hier notieren um nicht ständig googeln zu müssen…

Wenn macOS den Keyboardtyp festgelegt hat, wird - warum auch immer - der “Tastaturtyp ändern…“-Button in den Einstellungen entfernt:

Tastaturtyp aendern

Um diesen Button wieder sichtbar zu machen, oder um dafür zu sorgen, dass macOS nach einem Reboot nach dem Tastaturtyp fragt, muss lediglich eine Datei entfernt werden:

sudo rm /Library/Preferences/com.apple.keyboardtype.plist

Rebooten, Keyboard Setup Assistant poppt auf und man kann den Typ festlegen.