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.

Spezielle Funktionen der Pokémon Go-Suche

Im Spiel Pokémon Go existiert eine Suche, mit der innerhalb der eigenen Pokémon gesucht werden kann. Neben der normalen Suche nach dem Namen bzw. Spitzname eines Pokémons lässt sich mit der Suche wesentlich mehr erreichen. Dies fängt bei der Suche nach den Pokédex-Nummern an. Wird eine Nummer eingegeben, so werden Pokémon mit der entsprechenden Nummer angezeigt. Auch ein Nummernbereich lässt sich mit der Suche abbilden:

1-151

Diese Suche würde alle Pokémon anzeigen, welche im Pokédex die Nummern 1 – 151 haben. Daneben existieren Schlüsselwörter, um bestimmte Pokémon anzuzeigen. Wird nach schillernd gesucht, so werden alle Shiny-Pokémon angezeigt. Mit der Suchphrase entwickeln werden alle Pokémon angezeigt, welche entwickelt werden können.

Pokémon GO
Preis: Kostenlos+
Pokémon GO
Preis: Kostenlos

Von diesen Schlüsselwörtern existieren ein gutes Dutzend: alola (alle Alola Pokémon), ausgebrütet (Pokémon, welche aus einem Ei geschlüpft sind), crypto (alle Crypto-Pokémon), entwickeln (alle Pokémon welche entwickelt werden können), erlöst (alle erlösten Pokémon), getauscht (alle getauschten Pokémon), glücks (alle Glücks-Pokémon), item (alle Pokémon, welche ein Item für die Entwicklung benötigen), kostümiert (alle Pokémon mit Verkleidungen), legendär (alle legendären Pokémon), männlich (alle männlichen Pokémon), mysteriös (alle mysteriösen Pokémon), nurauseiern (alle Pokémon, welche nur aus Eiern schlüpfen können), schillernd (alle Shiny-Pokémon), verteidiger (alle Pokémon, welche aktuell Arenen verteidigen) und weiblich (alle weiblichen Pokémon).

Die Pokémon Go-Suche in Aktion

Neben diesen speziellen Schlüsselwörtern existieren weitere Möglichkeiten der Suche. Wenn nach Namen gesucht wird, kann die Suche weiter spezifiziert werden. Die Suche mit einem vorangestellten Plus:

+Glumanda

findet das entsprechende Pokémon, sowie alle dazugehörigen Vor- und Weiterentwicklungen; in diesem Fall wären dies Glumanda, Glutexo und Glurak. Neben der direkten Suche lässt sich auch nach den Pokémon-Typen suchen:

Feuer

Bei dieser Suche würde alle Pokémon vom Typ Feuer anzeigt werden. Gesucht werden kann hierbei nach allen in Pokémon Go vorkommenden Pokémon-Typen: Boden, Drache, Eis, Elektro, Fee, Feuer, Flug, Geist, Gestein, Gift, Kampf, Käfer, Normal, Pflanze, Psycho, Stahl, Unlicht und Wasser.

Wird das At-Zeichen zu Beginn der Suche genutzt, kann nach Attacken gesucht werden:

@Feuerodem

Diese Suche würde alle Pokémon finden, welche die Attacke Feuerodem besitzen. Diese Suche kann verfeinert werden, indem nur auf einem bestimmten Slot gesucht wird:

@1Feuerodem
@2Feuerodem
@3Feuerodem

Die jeweiligen Suchen würden nur die Attacke auf dem entsprechenden Slot der Pokémon finden. Die Suche:

@spezial

zeigt alle Pokémon an, welche über Legacy-Attacken verfügen. Dies sind Attacken welche bei aktuell gefangenen Pokémon nicht mehr zu finden sind. Mit der Suche:

@wetter

zeigt die Suche alle Pokémon an, welche zurzeit einen Wetterbonus besitzen. Neben Namen kann auch nach dem KP- und WP-Werten gesucht werden. Dazu muss ein KP- bzw. WP dem Wert vorangesetzt werden:

KP100

Damit würden alle Pokémon mit 100 KP gefunden werden. Auch die Suche zwischen zwei Werten ist möglich:

KP100-750

Mit dieser Suche würden alle Pokémon gefunden werden, dessen KP zwischen 100 und 750 liegen. Die Suche nach Werten beherrscht auch die von bis-Suche:

KP-750

Damit würden alle Pokémon mit einer KP bis 750 gefunden. Umgekehrt würde die Suche:

KP750-

alle Pokémon mit einer KP ab 750 anzeigen. Analog dazu funktioniert dies auch mit den WP und dem Schlüsselwort entfernung:

entfernung-7

Der Parameter Entfernung zeigt an, wie weit der Fangort entfernt ist. Um so größer die Zahl, je weiter weg der Fangort des Pokémon; wobei es sich bei der Zahl nicht um Kilometer handelt. In Pokémon Go können die Pokémon bewertet werden. Nach diesen Sternebewertungen lässt sich ebenfalls suchen:

3*

Mithilfe dieser Suche würden alle Pokémon aufgelistet, welche mit drei Sternen bewertet wurden. Die unterschiedlichen Suchen lassen sich kombinieren, indem sie mittels eines Komata getrennt werden:

151, Glumanda, KP100-150

Diese Suche würde das Pokémon Mew, alle Glumandas und alle Pokémon mit einer KP zwischen 100 und 150 anzeigen. Mit dem & kennt Pokémon Go auch logische Operatoren zur Verknüpfung von Suchparametern:

Glumanda&KP100-150

Diese Suche würde alle Glumandas anzeigen, deren KP-Wert sich zwischen 100 und 150 bewegt. Mithilfe des logischen Operators ! können Suchen negiert werden. Eine Suche nach dem Schema:

!alola

würde in diesem Fall alle Pokémon anzeigen, welche nicht der Alola-Form entsprechen. Mit diesen Möglichkeiten bietet die Pokémon Go-Suche mehr als nur eine einfache Suche und vereinfacht bestimmte Aufgaben immens, wenn z.B. nach zu entwickelnden Pokémon geschaut werden soll.

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.