Nyan-Katze in IntelliJ IDEA

Eine Entwicklungsumgebung ist ein trister Ort. Aber manchmal hilft schon etwas Farbe, um aus einem tristen Ort etwas Schönes zu machen. So kann die IDE IntelliJ IDEA mit unterschiedlichsten Plugins erweitert und verändert werden.

Der Fortschrittsbalken in Aktion

Eines dieser Plugins ist die Nyan Progress Bar. Das Plugin ersetzt den Fortschrittsbalken durch einen Regenbogen auf dem die Nyan-Katze sich bewegt. Installiert werden kann das Plugin über den in IntelliJ IDEA integrierten Plugin-Manager. Der Quelltext des Plugins ist auf GitHub zu finden. Es ist unter der Zero-Clause BSD-Lizenz lizenziert und damit freie Software.

Erlaubte Dateitypen für den Upload unter WordPress

Wer Medien in einer WordPress-Installation hochladen möchte, kann dies im Normalfall ohne Probleme bewerkstelligen. Werden allerdings Dateitypen abseits der gewöhnlichen Dateitypen versucht hochzuladen, so erscheint eine entsprechende Meldung:

Dieser Dateityp ist aus Sicherheitsgründen leider nicht erlaubt

Hintergrund ist, das WordPress nur einige definierte Dateitypen im Upload zulässt. Plugins können diese Liste erweitern, daneben gibt es entsprechende Plugins, mit welchen die erlaubten Dateitypen verwaltet werden können.

File Upload Types by WPForms
Preis: Kostenlos

Eine andere Möglichkeit besteht darin die Konfiguration, welche in der Datei wp-config.php zu finden ist, um eine Zeile zu erweitern:

define( 'ALLOW_UNFILTERED_UPLOADS', true );

Damit wird der entsprechende Upload-Filter abgeschaltet und alle Dateitypen können hochgeladen werden. Allerdings sollte diese Lösung mit Bedacht gewählt werden, da nun jegliche Dateitypen hochgeladen werden können.

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.

Medien unter WordPress bei Größenänderung neu berechnen

Wenn die Einstellungen für Medien unter WordPress geändert werden, so werden bestehende Bilder nicht angefasst. In bestimmten Konstellationen kann dies allerdings zu Problemen führen, z.B. bei Vorschaubildern. Deshalb ist es empfehlenswert die Bilder nach einer Änderung der Standardbildgrößen in den Einstellungen von WordPress neu zu berechnen. Hierfür existiert das Plugin Regenerate Thumbnails.

Regenerate Thumbnails
Preis: Kostenlos

Mithilfe des Plugins ist es mögliche alle Bilder in den entsprechend eingestellten Größen neu zu berechnen. Je nach Größe der Medienbibliothek kann dieser Vorgang einige Minuten bis Stunden einnehmen.

Das Plugin Regenerate Thumbnails

Der Quelltext des Plugins ist auf GitHub zu finden. Er ist unter der GPL in Version 2 lizenziert und damit freie Software.

Videos unter WordPress DSGVO konform einbinden

Um Videos unter WordPress DSGVO konform einzubinden, existieren eine Reihe von Plugins, welche diese Aufgabe übernehmen. Meist funktionieren diese Plugins nur für YouTube oder Vimeo und nicht für beide oder andere Videodienste. Das Plugin Video-Privatsphäre händelt dies anders.

Im Beispiel würde die Einbindung eines Videos mit dem Plugin wie folgt aussehen:

Aktivieren Sie JavaScript um das Video zu sehen.
Video-Link: https://www.youtube.com/watch?v=-9xNrBQpFt4

Neben den Diensten YouTube und Vimeo werden auch andere Dienste vom Plugin unterstützt. Allerdings hat das Plugin ein Problem mit größeren Videos, welche in einem beschränkten Content-Bereich abgespielt werden. Diese werden abgeschnitten, sodass das Video und der Player nicht richtig zu sehen sind. Auf GitHub habe ich eine Version des Plugins bereitgestellt, welche dieses Problem löst. Der originäre Quelltext des Plugins findet sich ebenfalls auf GitHub. Lizenziert ist das Plugin unter der GPL2 (und später) und damit freie Software.