Audiodatei unter macOS trimmen

Wer Stille am Anfang oder Ende einer Audiodatei trimmen möchte, kann hierfür natürlich den Audioeditor seiner Wahl nutzen. Doch manchmal gerät dieser an seine Grenzen, z. B. bei zu großen Dateien. In einem solchen Fall können Werkzeuge wie FFmpeg genutzt werden. Unter macOS muss dieses Werkzeug über Homebrew installiert werden:

brew install

Anschließend kann mit der Bearbeitung der Audiodatei begonnen werden:

ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB -b:a 192k output.mp3

Neben der Eingabe- und Ausgabedatei wird mittels der dB-Angabe eingestellt, ab wann das Audiosignal als Stille erkannt wird. Über einen zusätzlichen Parameter wird daneben die Bitrate der Ausgabedatei auf 192 Kbps eingestellt.

JetBrains-IDE ohne Projekte öffnen

Standardmäßig sind die JetBrains-IDEs so eingestellt das sie die letzten geöffneten Projekte wieder öffnen. Über die Einstellungen kann dies unter Appearance & Behaviour -> System Settings -> Reopen last project on startup eingestellt werden.

Die Einstellungen unter RustRover von JetBrains

Problematisch wird dies allerdings, wenn die Entwicklungsumgebung nicht mehr richtig startet. In einem solchen Fall kann die Konfiguration direkt bearbeitet werden:

nano ~/Library/Application\ Support/JetBrains/RustRover2024.1/options/ide.general.xml

Die Konfigurationsordner für die einzelnen Systeme sind öffentlich dokumentiert. In der Datei ide.general.xml, welche in etwa so aussieht:

<application>
  <component name="GeneralSettings">
    <option name="showTipsOnStartup" value="false" />
    <option name="confirmExit" value="false" />
    <option name="confirmOpenNewProject2" value="0" />
  </component>
  <component name="Registry">
    <entry key="ide.mac.transparentTitleBarAppearance" value="true" />
    <entry key="ide.experimental.ui" value="true" />
    <entry key="org.toml.json.schema" value="false" />
    <entry key="terminal.new.ui.show.promotion" value="false" />
    <entry key="debugger.attach.dialog.enabled" value="true" />
  </component>
</application>

muss nun die Einstellung:

<option name="reopenLastProject" value="false" />

im Block GeneralSettings hinzugefügt werden. Anschließend kann die IDE gestartet werden ohne das die letzten Projekte geöffnet werden.

Maximale Dokumentlänge in HedgeDoc erhöhen

Webapplikationen für kollaboratives Schreiben gibt es einige am Markt, wie z.B. Etherpad. Mein persönlicher Favorit ist HedgeDoc, unter anderem wegen seiner Unterstützung für Markdown. Standardmäßig unterstützt HedgeDoc eine Dokumentenlänge von knapp einhundert Kilobyte.

HedgeDoc kann unter anderem für kollaboratives Schreiben genutzt werden

Allerdings ist es problemlos möglich die maximale Länge zu erhöhen. Dazu dient der Parameter documentMaxLength. Auch in der Dokumentation findet sich dieser Parameter, allerdings ist es dort unglücklich umgebrochen, sodass der Name fälschlicherweise als documentMax interpretiert werden könnte. Mit der neuen maximalen Dokumentenlänge könnte eine minimale Konfiguration wie folgt aussehen:

{
  "production": {
    "urlAddPort": false,
    "domain": "hedgedoc.example.org",
    "protocolUseSSL": true,
    "documentMaxLength": 1048576,
    "db": {
      "dialect": "sqlite",
      "storage": "./db.hedgedoc.sqlite"
   }
  }
}

Nach einem Neustart von HedgeDoc können nun Dokumente bis zu einer Größe von einem Megabyte angelegt werden. Die offizielle Seite des Projektes ist unter hedgedoc.org zu finden. Lizenziert ist HedgeDoc unter der GNU Affero General Public License und damit freie Software.

Themes für Visual Studio Code an Systemvorgabe anpassen

Mittlerweile unterstützen viele Betriebssysteme einen Dark-Modus, in welchem das System ein dunkles Theme wählt, mit welchem der Nutzer in den dunklen Stunden nicht geblendet werden soll. Auch die automatische Umstellung, je nach Tageszeit, ist in den meisten Betriebssystemen, wie z.B. macOS einstellbar. Die entsprechenden Apps können dann auf diese Systemvorgabe reagieren. Der freie Codeeditor Visual Studio Code, ist standardmäßig mit einem dunklen Theme konfiguriert.

Die entsprechende Einstellung im Editor

Allerdings unterstützt Visual Studio Code auch die automatische Auswahl des Themes auf Basis der Systemvorgabe. Dazu muss in den Einstellungen nach dem Wert:

window.autoDetectColorScheme

gesucht werden und dieser gesetzt werden. Anschließend wählt Visual Studio Code das passende helle oder dunkle Theme anhand der Systemvorgabe. Wem die Standardthemes nicht zusagen, der kann über die Parameter workbench.preferredLightColorTheme und workbench.preferredDarkColorTheme in den Einstellungen die entsprechenden Themes setzen.

Etherpad unter Ubuntu installieren

Bei Etherpad handelt es sich um einen Editor für kollaboratives Schreiben, welcher selbst gehostet werden kann. Soll Etherpad unter Ubuntu gehostet werden, muss im ersten Schritt Node.js installiert werden:

apt install -y libssl-dev
curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt install -y nodejs

Anschließend wird ein Nutzer für Etherpad angelegt und in diesen gewechselt werden und dort der Quellcode für Etherpad heruntergeladen und initial einmal gestartet und dann mittels Strg + C wieder beendet:

adduser --disabled-login --gecos "" etherpad
su - etherpad
git clone --branch master https://github.com/ether/etherpad-lite.git
cd etherpad-lite
npm install sqlite3
src/bin/run.sh

Nun werden einige Konfigurationen vorgenommen. Im Groben werden die Datenbank, die Authentifikation, Vorbereitungen für den Reverse Proxy, die Nutzer und die maximale Länge von einzufügendem Inhalt und das Log konfiguriert:

nano etherpad-lite/settings.json

Die Änderungen sind in ihrer Reihenfolge in der Konfigurationsdatei angegeben:

...

"dbType": "sqlite",
"dbSettings": {
  "filename": "var/sqlite.db"
},

...

"requireAuthentication": true,

...

"trustProxy": true,

...

"users": {
"admin": {
  // 1) "password" can be replaced with "hash" if you install ep_hash_auth
  // 2) please note that if password is null, the user will not be created
  "password": "example",
  "is_admin": true
},
"user": {
  // 1) "password" can be replaced with "hash" if you install ep_hash_auth
  // 2) please note that if password is null, the user will not be created
  "password": "example",
  "is_admin": false
}
},

...

"socketIo": {
/*
 * Maximum permitted client message size (in bytes). All messages from
 * clients that are larger than this will be rejected. Large values make it
 * possible to paste large amounts of text, and plugins may require a larger
 * value to work properly, but increasing the value increases susceptibility
 * to denial of service attacks (malicious clients can exhaust memory).
 */
"maxHttpBufferSize": 1048576
},

...

"logconfig" :
{ "appenders": [
    { "type": "console"
    //, "category": "access"// only logs pad access
    }

  , { "type": "file"
  , "filename": "etherpad.log"
  , "maxLogSize": 1024000
  , "backups": 3 // how many log files there're gonna be at max
    }

...

Anschließend wird der Kontext des Nutzers etherpad verlassen und eine neue Service-Unit für systemd angelegt:

exit
nano /etc/systemd/system/etherpad.service

Diese wird mit folgendem Inhalt befüllt:

[Unit]
Description=Etherpad
After=syslog.target
After=network.target

[Service]
Type=simple
User=etherpad
Group=etherpad
Environment="NODE_ENV=production"
ExecStart=/home/etherpad/etherpad-lite/src/bin/run.sh
Restart=always

[Install]
WantedBy=multi-user.target

Nachdem die Datei angelegt wurde, kann der Service aktiviert und gestartet werden:

systemctl enable etherpad
systemctl start etherpad

Lokal ist der Service nun per HTTP unter dem Port 9001 erreichbar. Damit der Service auch von außen erreichbar ist, kann Nginx als Reverse Proxy konfiguriert werden. Dazu muss die entsprechende Konfiguration hinterlegt werden:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate        /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/example.org/privkey.pem;

    server_name example.org;

    client_max_body_size 512m;

    location / {

        # Set proxy headers
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # These are important to support WebSockets
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        # Make sure to set your Etherpad port number
        proxy_pass http://localhost:9001;
    }
}

Damit steht Etherpad auch von außen unter der entsprechenden Domain zur Verfügung und kann benutzt werden.