Probleme beim Nextcloud-Update nach einer Unterbrechung

Beim Update einer Nextcloud-Instanz wurde der Prozess des Updates beim Download der neuen Version unterbrochen. Anschließend tauchte die Meldung:

Step 4 is currently in process. Please reload this page later.

beim erneuten Aufruf des Updaters auf. Um diese Meldung zu beheben, sollte in das Datenverzeichnis der Nextcloud-Instanz gewechselt werden (meist trägt dieses den Namen data) und dort der Ordner beginnend mit der Zeichenkette updater- aufgerufen werden. In diesem Ordner befinden sich eine Datei mit dem Namen .step. Nachdem diese Datei gelöscht wurde, kann der Updater wieder geöffnet und der Vorgang erneut gestartet werden.

Erste Schritte mit Rust

Vor ein paar Tagen wollte ich die Programmiersprache Rust ausprobieren. Bei Rust handelt es sich um eine Sprache, welche syntaktisch stark an C angelehnt ist und besonderes Augenmerk auf Sicherheit legt. Die erste Frage, die sich mir stellte, ist, ob es für Rust, eine vernünftige IDE-Unterstützung existiert. Fündig geworden bin ich bei IntelliJ IDEA, welches nach Installation des Rust-Plugins zur Programmierung in der Sprache genutzt werden kann. Debugging von Rust-Programmen wird aus technischen Gründen nur in der JetBrains IDE CLion unterstützt, sodass hier einige Abstriche gemacht werden müssen. Neben der Rust-Integration für IntelliJ IDEA gibt es ebenfalls ein Plugin für Visual Studio Code, welches hier allerdings nicht weiter behandelt werden soll.

Mit dem passenden Plugin beherrscht IntelliJ IDEA Rust.

Neben der eigentlichen IDE wird Rust benötigt. Dieses kann über die offizielle Seite der Sprache bezogen werden. Nach der Installation kann in der IDE ein erstes Projekt angelegt werden. Anschließend findet sich in einem Ordner mit dem Namen src eine Datei mit dem Namen main.rs:

fn main() {
    println!("Hello, world!");
}

In dieser Datei findet sich ein minimales Hello world-Programm. Das Ausrufezeichen hinter dem println zeigt unter Rust an, das es sich um ein Makro handelt. Damit können Methoden und Makros einfach auseinander gehalten werden. Da ich Hello world-Programme immer etwas sinnfrei finde was das Lernen einer neuen Programmiersprache angeht, wollte ich für den ersten Versuch das Spiel Zahlenraten programmieren. Ziel des Spieles ist es eine Zahl zwischen 0 und 1000 zu erraten, welche der Rechner sich ausgedacht hat. Dazu muss im ersten Schritt eine Variable definiert werden, in welcher die zufällige Zahl gespeichert wird. Grundsätzlich sieht eine Variablendefinition und Deklaration unter Rust wie folgt aus:

let name: Typ = Wert;

Variablen in Rust sind immer Konstanten, wenn sie nicht explizit als veränderlich angegeben werden. Möglich ist dies mit dem Schlüsselwort mut:

let mut name: Typ = Wert;

Die Benennung von Variablen und anderen Elementen folgt in Rust einem bestimmten Schema. So werden Variablen snake_case benannt. Neben der Definition der Variable muss eine zufällige Zahl zwischen 0 und 1000 generiert werden. Dazu dient ein Zufallsgenerator, welcher über ein use eingebunden werden muss:

use rand::Rng;

Anschließend kann die Variable definiert und deklariert werden:

let number: u32 = rand::thread_rng().gen_range(0, 1000);

In diesem Fall wird ein vorzeichenloser Integer mit 32 Bit Breite als Datentyp definiert. Wird nun versucht das Rust-Programm zu kompilieren, so wird die Fehlermeldung:

error[E0432]: unresolved import `rand`
 --> src\main.rs:1:5
  |
1 | use rand::Rng;
  |     ^^^^ use of undeclared type or module `rand`

error[E0433]: failed to resolve: use of undeclared type or module `rand`
 --> src\main.rs:4:23
  |
4 |     let number: u32 = rand::thread_rng().gen_range(0, 1000);
  |                       ^^^^ use of undeclared type or module `rand`

error: aborting due to 2 previous errors

auftauchen. Grund hierfür ist, dass das genutzte Paket über den Paketmanager von Rust bezogen werden muss. Pakete werden über den Paketmanager Cargo bezogen. Die entsprechenden Pakete des offiziellen Repositorys sind unter crates.io zu finden. In der Datei Cargo.toml müssen die entsprechenden Abhängigkeiten eingebunden werden:

[dependencies]
rand = "0.7.3"
text_io = "0.1.8"

Neben dem Pseudozufallszahlengenerator, wurde gleich noch das Paket text_io eingebunden, welches später für die Eingabe von Text benötigt wird. Dieses Paket stellt hierbei das Makro read zur Verfügung, mit dessen Hilfe eine Eingabe realisiert werden kann:

let user_number: u32 = read!();

Damit sind die Grundlagen für das Spiel Zahlenraten gelegt und der Rest des Quellcodes ergibt praktisch sich von selbst:

use rand::Rng;
use text_io::read;

fn main() {

    let number: u32 = rand::thread_rng().gen_range(0, 1000);

    let mut running = true;

    println!("Ich habe mir eine Zahl zwischen 0 und 1000 ausgedacht.");

    while running {

        println!("Dein Vorschlag: ");
        let user_number: u32 = read!();

        if number > user_number {
            println!("Meine Zahl ist größer.");
        } else if number < user_number {
            println!("Meine Zahl ist kleiner.");
        } else {
            running = false;
        }
    }

    println!("Du hast die Zahl erraten. Es war die {}.", number);
}

Hervorzuheben ist, das unter Rust in if-Statements und Schleifen keine Klammern benötigt werden. Werden diese trotzdem genutzt, so warnt der Compiler entsprechend und bittet die überflüssigen Klammern zu entfernen.

Neben der entsprechenden Dokumentation auf der offiziellen Seite empfiehlt sich das Rust Cookbook als Quelle für die ersten Schritte unter Rust. Wer Rust einfach mal im Browser ausprobieren möchte, kann hierfür den Rust Playground nutzen.

Thunderbird-Log unter macOS erzeugen

Für die Suche nach einem Problem mit einem IMAP-Server wollte ich unter anderem das Log des Mail-Clienten sehen. In meinem Fall ist dies Thunderbird. Thunderbird ist in der Lage Log-Dateien zu schreiben. Allerdings müssen dafür im Terminal unter macOS einige Umgebungsvariablen gesetzt werden:

export MOZ_LOG=POP3:4,IMAP:4,SMTP:4
export MOZ_LOG_FILE=~/thunderbird.log

Anschließend kann Thunderbird über das Terminal gestartet werden:

/Applications/Thunderbird.app/Contents/MacOS/thunderbird-bin

Während der Ausführung schreibt Thunderbird die entsprechenden Ereignisse in die konfigurierte Log-Datei.

Netzwerkverkehr eines Firefox-Add-On überwachen

Vor ein paar Tagen hatte ich ein Problem mit dem Firefox-Add-On LanguageTool. Dabei handelt es sich um eine Integration der Software LanguageTool, bei welchem es sich um eine freie Lösung zur Prüfung von Rechtschreibung und Grammatik handelt.

Da ich das LanguageTool auf einem eigenen Server betreibe und dort einige Änderungen vornahm, funktionierte das Add-On nicht mehr wie gewünscht. Deshalb stellte sich die Frage wie der Netzwerkverkehr des Add-Ons überwacht werden kann. Im Firefox gibt es hierfür die Spezialseite:

about:debugging

Über diese Seite kann unter anderem in den Netzwerkverkehr der installierten Add-Ons geschaut werden.

Unter anderem kann der Netzwerkverkehr des Add-Ons überwacht werden

Dazu muss der Menüpunkt Dieser Firefox ausgewählt und anschließend das gewünschte Add-On ausgewählt und auf den Button Untersuchen geklickt werden. In dem sich öffnenden Fenster kann nun das Add-On untersucht werden.

Playlists von Spotify zu Apple Music unter iOS übertragen

Mittlerweile gibt es etliche Streamingdienste, welche sich auf Musik spezialisiert haben. Problematisch wird es wenn von einem Streamingdienst zu einem anderen Streamingdienst umgezogen werden soll. Unter iOS kann dieses Problem mit der App SongShift gelöst werden.

‎SongShift
Preis: Kostenlos+

Mithilfe der App können, nach der Autorisierung der entsprechende Dienste, Playlisten von Dienst A zu Dienst B (z.B. von Spotify zu Apple Music) übertragen werden. Anschließend können die Playlisten übertragen werden. Nachdem die App eine Playlist beim anderen Dienst zusammengesucht hat, kann diese überprüft werden und wird nach einer Bestätigung anschließend bei dem anderen Dienst angelegt.

Über SongShift können Playlisten von Dienst A zu Dienst B übertragen werden

In der freien Version von SongShift, können einzelne Playlists übertragen werden. Sollen mehrere Playlisten auf einmal übertragen werden, so wird ein kostenpflichtiges Abonnement der App benötigt. Die offizielle Webseite von SongShift ist unter songshift.com zu finden.