Was ist der Java Klassenpfad?

09.03.2017

Programmiert man in Java, gibt man am Anfang jeder Klasse an, zu welchem Paket eine Klasse gehört.

import ch.studiprojekt.SuperAlgorithmus;

oder für alle Klassen in einem Paket:

import ch.studiprojekt.*;

Verwendet man die Klasse nun im Programm, weiss die Java Virtual Machine (JVM), wo sie diese Klasse bzw. die kompilierte Klasse (die .class Datei) suchen muss.

SuperAlgorithmus besterVariablenNameEver = new SuperAlgorithmus();

Es wäre nun nicht sehr praktisch für die JVM, wenn der gesamte Computer nach der Klasse durchsucht werden muss. Daher gibt man an, an welchen Orten sie suchen muss. Dazu gibt man dem Java Klassenpfad / Classpath eine Liste von Ordnern und .jar Dateien an.

Es braucht nur den obersten Ordner

Will man jetzt die Klasse „ch.studiprojekt.SuperAlgorithmus“ der JVM angeben, wäre es mühsam, wenn man das für jede Klasse machen muss. Daher gibt man einfach den Oberordner an, wo die JVM alle Klassen finden kann.

Obwohl die .class Datei im Ordner „Klassen/ch/studiprojekt/SuperAlgorithmus“ liegt, muss man im im Klassenpfad nur den Ordner „Klassen“ hinzufügen.

Hat man eine Applikation als .jar Datei gebündelt, stellt man diese in den lib Ordner des Projekts. Im Klassenpfad fügt man nun die Datei „libs/MeineApp.jar“ hinzu. So weiss die JVM, dass diese .jar Datei existiert und man dort nach Code nachschauen kann.

Der Klassenpfad beinhaltet also .jar Dateien plus Pfade zu 
den obersten Stufen der Ordnerhierarchie.

Anpassen des Klassenpfads in Windows und Unix

Um in Windows den Klassenpfad zu ändern, geht man auf Systemsteuerung -> Benutzerkonten -> Eigene Umgebungsvariablen ändern.

In Unix macht man folgendes:

export CLASSPATH=/home/myaccount/myproject/lib/MeineApp.jar:
/home/myaccount/myproject/klassen/

Denken Sie aber daran, dass diese Einstellungen global sind, was nicht immer Sinn macht. Oftmals macht es darum mehr Sinn, wenn man den Build Pfad des Projekts anpasst, um Libraries und Ordner hinzuzufügen (direkt in Eclipse oder IntelliJ).

Was ist statistische Standardisierung?

17.02.2017

Stellen Sie sich vor, Sie haben eine Menge statistische Daten und stellen diese grafisch dar. Es gibt jeweils beidesmal einen hübschen Hügel, welcher wie die Gauss’sche Glockenkurve aussieht. Sie möchten nun die beiden Hügel miteinander vergleichen – Dies geht aber nicht, den beide Hügel haben eine ganz andere Lage. Der eine ist irgendwo um die 0 und der andere liegt irgendwo bei 200.

Eine Standardisierung der beiden Daten kann Ihnen hierbei behilflich sein.

PS: Die Gauss’sche Glockenkurve heisst übrigens auch Normalverteilung und dieses Verfahren findet man auch unter dem Namen z-Transformation.

Wie sehen die Hügel nach der Standardisierung aus?

Wenn die Daten standardisiert wurden, liegt ihr Erwartungswert bei 0 und die Standardabweichung bei 1.

standardisierung

Quelle dieses genialen Bildes: http://www.statistics4u.info/fundstat_germ/ee_ztransform.html

Dabei gelten folgende Regeln:

  • Geht man vom Erwartungswert nach links und rechts „eine“ Standardabweichung findet man ca. 70% der Werte
  • Geht man vom Erwartungswert nach links und rechts „zwei“ Standardabweichungen findet man ca. 95% der Werte
  • Geht man vom Erwartungswert nach links und rechts „drei“ Standardabweichungen findet man ca. 99% der Werte

Und wie mache ich diese Standardisierung?

Die Formel, um Ihre Daten zu standardisieren, ist ganz simpel:

standardisierung2

In Python kann man dies mit Numpy Methoden folgendermassen erreichen:

X = (X - X.mean()) / X.std()

Mü oder X.mean() steht dabei für den Erwartungswert und sigma oder X.std() für die Standardabweichung.

Was ist der Erwartungswert?

Erwartungswert ist einfach gesagt einfach der Durchschnitt der Werte. Andere Namen dafür sind Mittelwert oder arithmetisches Mittel.

mittelwert

Was ist die Standardabweichung?

Die Standardabweichung ist der Wert, den die meisten Daten im Durchschnitt vom Erwartungswert abweichen. Es ist ein Mass für die Streubreite der Daten.

standardabweichung

Warum funktioniert das?

Nun, die Schritte, die in der Formel gemacht werden, kann man sich so vorstellen.

1. Zuerst rechnet man jeden Wert der Daten minus den Mittelwert. Der Mittelwert selber geht also nach 0, alle kleineren Werte sind dann links und alle grösseren Werte rechts davon. Der Hügel wird also quasi um den Mittelwert nach links verschoben, damit er genau über der 0 steht.

2. Dann steht der Hügel zwar am richtigen Ort, ist aber noch zu breit. Darum quetscht man den Hügel um den Faktor der Standardabweichung. An der Formel sieht man, dass das ganze nur in X-Richtung passiert, der Hügel ist also noch gleich gross wie vorher.

Was ist OAuth2?

17.02.2017

OAuth2 ist ein Sicherheitsprotokoll, um eine Webapplikation sicher zu machen und Benutzer zu authentifizieren und authorisieren. OAuth2 wird etwa bei Facebook oder Github verwendet.

Warum OAuth2?

Eine typische Webapplikation wird vom Benutzer am Client verwendet, welcher sich beim Server anmelden muss, zum Beispiel über REST Services. Normalerweise verwendet der Benutzer dafür seinen Benutzernamen und ein Passwort. Diese könnte man nun mit jeder REST Anfrage mitsenden. Dies hat aber einen Nachteil: Benutzername und Passwort müssten bei jeder Anfrage vom Server überprüft werden.

Häufig sind Services mit BasicAuth geschützt. Dort wird bei jeder Anfrage der Benutzername und das Passwort im Header mitgeschickt, codiert mit Base64.

Der Vorteil von OAuth2 ist, dass das Passwort nur einmal beim Login verschickt werden muss. Zurück kommen dann zwei Tokens, das Access Token und das Refresh Token. Das Access Token hat dabei eine beschränkte Gültigkeit. Falls dieses abgelaufen ist, kann der Client ein neues mit Hilfe des Refresh Token bestellen.

Die Tokens werden üblicherweise persistiert, weil in einer modernen Infrastruktur verschiedene Instanzen von Applikationsserver die Benutzerrequests bearbeiten können und dafür Zugriff auf die Tokens benötigen.

Wie funktioniert die Anmeldung?

OAuth2 verwendet also Zugriffstokens / Access Tokens für Anfragen und verzichtet vollständig auf digitale Signaturen, was den Umgang viel einfacher macht. Zum Glück setzt OAuth2 auch vollständig auf HTTPS.

Folgende Schritte werden in OAuth2 gemacht:

1. Der Benutzer wird nach seinem Benutzernamen und Passwort gefragt. Diese werden dem Server, etwa eine Buchhaltungswebpage, übergeben. Der Benutzer erhält dann einen sogenannten Access Grant, also die Erlaubnis, weiterzumachen.
2. Die Anfrage wird zum Authorisierungsserver weitergeleitet, der die Daten prüft.
3. Sind die Daten gültig, erstellt der Server ein Access Token und ein Refresh Token
4. Mit dem Access Token kann der Benutzer nun auf die Dienste des Anbieters zugreifen

Im OAuth2 Jargon redet man dabei vom Serviceanbieter von einem Ressource Owner, das sich das Protokoll als ressourcenbasiert sieht.

Was für eine Antwort erhält man von der Authentifizierung?

Wenn die Anmeldung beim Authorisierungsserver geklappt hat, erhält man eine Antwort im JSON Format mit den relevanten Informationen:

{
"access_token": "asdfwerpoiupou",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "opiulfgasdfwer"
}

Darin steht auch gleich, wie lange das Token gültig ist.

Was ist der Token Type Bearer?

Das Token, dass man erhält, ist ein sogenanntes Bearer Token. Mit diesem kann man auf die gewünschten Ressourcen zugreifen. Damit das Token geschützt bleibt, sollte es über eine mit TLS gesichterte Verbindung gehen – weshalb TLS auch Voraussetzung ist für die Verwendung des Tokens.

Das Access Token muss dann in der nächsten Anfrage im Authorization Header mitgeschickt werden.

In Java kann man den Authorization Header folgendermassen befüllen:

HttpPost request = new HttpPost("http://example.com/auth");
request.addHeader("Authorization", "Basic asdfwerpoiupou ");

JWT bei Architektur mit vielen Applikationsinstanzen

Wie gesagt muss das Token auf die eine oder andere Art persistiert werden. Dies kann zum Beispiel über eine In Memory Datenbank geschehen. Diese Datenbank hätte dann den Zugriff auf alle Applikationsinstanzen geben müssen, welche die Token benötigen. Hat man etwa einen REST Service, der OAuth2 verwendet, zwanzig Mal instanziert, müssen diese Instanzen das Token lesen können.

Eine weitere Option wäre der Einsatz von JSON Web Tokens = JWT. Die Authentifizierung erfolgt dabei mit einem Schlüssel, der sich aus verschiedenen Metainformationen des Benutzers zusammensetzt. So kann jede Instanz des Services prüfen, ob das aktuelle Token gültig ist.

Um zu prüfen, ob ein Token für den Benutzer existiert, wird ein JWT Repository angefragt. Es entschlüsselt das Token und gibt die benötigten Informationen zurück.

Besuchen Sie doch einmal https://jwt.io/ um ein Beispiel eines Tokens zu sehen. Im Header wird der Verschlüsselungsalgorithmus genannt. Im Payload sieht man schön die Daten wie etwa der Name des Benutzers.