GitHub Package Registry für Maven Packages nutzen

Vor einigen Wochen hat GitHub die GitHub Package Registry vorgestellt. Mit dieser ist es möglich fertige Packages direkt beim Projekt auf GitHub zu hosten. Aktuell unterstützt werden, neben Maven-Packages, unter anderem die Paketsysteme von NPM, Ruby, und NuGet. GitHub selbst definiert den Zweck der Registry wie folgt:

GitHub Package Registry allows you to develop your code and host your packages in one place. You can use packages from GitHub Package Registry as a dependency in your source code on GitHub.

Nach einer Registrierung unter github.com/features/package-registry kann das erste Paket für die Package Registry erstellt werden. Dazu muss im entsprechenden Java-Projekt in der pom.xml folgender Block hinzugefügt werden:

<!-- Definition for uploading artifact to custom repository -->
<distributionManagement>
    <repository>
        <id>github</id>
        <name>GitHub OWNER Apache Maven Packages</name>
        <url>https://maven.pkg.github.com/OWNER/mediawikixml</url>
    </repository>
</distributionManagement>

Das Wort OWNER muss dabei durch den eigenen GitHub-Nutzernamen ausgetauscht werden. Anschließend müssen die Zugangsdaten für GitHub hinterlegt werden. Dazu wird die Maven settings.xml geöffnet:

nano ~/.m2/settings.xml

Zu der Einstellungsdatei wird nun folgender Block hinzugefügt:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <activeProfiles>
    <activeProfile>github</activeProfile>
  </activeProfiles>

  <profiles>
    <profile>
      <id>github</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>https://repo1.maven.org/maven2</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
          <id>github</id>
          <name>GitHub OWNER Apache Maven Packages</name>
          <url>https://maven.pkg.github.com/OWNER</url>
        </repository>
      </repositories>
    </profile>
  </profiles>

  <servers>
    <server>
      <id>github</id>
      <username>USERNAME</username>
      <password>TOKEN</password>
    </server>
  </servers>
</settings>

Auch hier muss OWNER wieder durch den eigenen Nutzernamen ersetzt werden. Bei der Konfiguration müssen daneben die Felder USERNAME und TOKEN gefüllt werden. Das Token wird in den Einstellungen von GitHub unter Settings – Developer settings – Personal access tokens erzeugt.

Ein Personal Access Token muss für die Package Registry erzeugt werden

Nachdem das Token erzeugt wurde und die Konfiguration für Maven entsprechend hinterlegt wurde, kann das Package mittels:

mvn deploy

deployed werden und erscheint somit in der Package Registry. Angesehen werden kann das Paket nun mittels der URL:

https://github.com/OWNER/REPOSITORY/packages/

Zur Einbindung des neuen Paketes in einem anderes Projekt muss der pom.xml des anderen Projektes folgender Block hinzugefügt werden:

<!-- External non standard repositories -->
<repositories>
    <repository>
        <id>github</id>
        <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
    </repository>
</repositories>

Anschließend kann das neue Paket ganz normal als Dependency hinzugefügt werden:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>libtest</artifactId>
    <version>1.0.1</version>
</dependency>

Damit können schnell Pakete über die GitHub Package Registry bereitgestellt werden.

Einfacher Passwort-Generator unter Java

Das Ausdenken von Passwörtern ist prinzipiell eine schlechte Idee; besser ist es, wenn diese automatisch generiert werden. Ein solcher Generator kann problemlos selbst geschrieben werden. In diesem Fall in Java:

public class PasswordGenerator {

    private static final SecureRandom secureRandom = new SecureRandom();

    private static final String alpha = "abcdefghijklmnopqrstuvwxyz";
    private static final String alphaCaps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String numeric = "0123456789";
    private static final String specials = "!§$%&/()=?.:,;+*#<>";

    public enum CharacterSet {
        Alpha,
        AlphaCaps,
        AlphaBoth,
        Numeric,
        AlphaNumeric,
        Special,
        All
    }

    private static String getCharacters(CharacterSet characterSet) {

        switch (characterSet) {
            case Alpha:
                return alpha;
            case AlphaCaps:
                return alphaCaps;
            case AlphaBoth:
                return alpha + alphaCaps;
            case Numeric:
                return numeric;
            case AlphaNumeric:
                return alpha + alphaCaps + numeric;
            case Special:
                return specials;
            case All:
                return alpha + alphaCaps + numeric + specials;
        }

        return alpha;
    }

    public static String generatePassword(int length, CharacterSet characterSet) {

        String characters = getCharacters(characterSet);
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < length; i++) {
            stringBuilder.append(characters.charAt(secureRandom.nextInt(characters.length())));
        }

        return stringBuilder.toString();
    }
}

Der Generator funktioniert im Groben so, das aus einem bestimmten Zeichenvorrat zufällig Zeichen gewählt und aus diesen das Passwort erzeugt wird. Als Zufallsquelle kommt nicht die gebräuchliche Klasse Random zum Einsatz, sondern die Klasse SecureRandom. Diese von Random abgeleitete Klasse erzeugt aus kryptografischer Sicht starke Zufallszahlen, was die Sicherheit des Generators erhöht. Als kleines Gimmick lässt sich der gewünschte Zeichensatz, aus welchem das Passwort generiert werden soll, über einen Enum auswählen:

String s = PasswordGenerator.generatePassword(64, PasswordGenerator.CharacterSet.All);
System.out.println(s);

Damit würde auf der Konsole ein Passwort mit 64 Zeichen ausgegeben werden, welches den kompletten Zeichenvorrat der Generator-Klasse nutzt.

Dump einer MediaWiki-Installation erstellen

Wer eine Wiki mit der freien Software MediaWiki betreibt und einen Dump derselben erstellen möchte, kann hierfür eines der Werkzeuge nutzen, welches bereits mit der MediaWiki-Installation mitgeliefert wird. Im Ordner maintenance findet sich für diese Zwecke das PHP-Skript dumpBackup.php:

php dumpBackup.php --full > dump.xml

Mit dem Befehl wird die komplette Wiki, inklusive der Historie jeder Seite, gesichert und in den Dump geschrieben. Soll nur der aktuelle Stand der Wiki gesichert werden, so kann hierfür der Parameter current genutzt werden:

php dumpBackup.php --current > dump.xml

Für eine komplette Sicherung der Wiki sollte nicht nur der Dump, sondern auch der Ordner images gesichert werden.

Nginx-Konfiguration per GUI

Bei der Nutzung des freien Webservers Nginx müssen für die einzelnen Domains Konfigurationen erstellt werden. Im Normalfall werden diese von Hand erstellt, allerdings existieren mittlerweile Werkzeuge, um diese auf anderem Wege zu erzeugen.

Über die Oberfläche kann eine Nginx-Konfiguration erzeugt werden

Eines dieser Werkzeuge ist nginxconfig.io. Über die Webseite kann eine Konfiguration erstellt werden, indem die gewünschten Optionen ausgewählt werden. Auch kann mit vorgefertigten Presets gearbeitet werden. Für den Einsteiger ist sicherlich interessant, dass er so ein Gefühl für Möglichkeiten von Nginx bekommt. Der Quelltext des Dienstes kann über GitHub bezogen werden. Er ist unter der MIT-Lizenz lizenziert und damit freie Software.

A.I. DUET

Google veröffentlicht von Zeit zu Zeit ein paar seiner Experimente im Zusammenhang mit künstlicher Intelligenz. Eines dieser Experimente ist A.I. DUET. In der Webapp wird dem Nutzer ein virtuelles Klavier angeboten, auf welchem dieser ein paar Noten spielen kann. Alternativ kann ein Keyboard mittels MIDI-Interface angeschlossen werden. Nachdem der Nutzer einige Noten gespielt hat, antworte das trainierte neuronale Netz mit eigenen Noten; so kann der Nutzer in einer Art Duett mit dem neuronalen Netzwerk interagieren.

A.I. DUET in Aktion

Zu finden ist das Experiment unter experiments.withgoogle.com. Der Quelltext kann über GitHub bezogen werden. Lizenziert ist A.I. DUET unter der Apache License in Version 2 und damit freie Software.