AtaraxiS 1.6 veröffentlicht

AtaraxiS ist ein kleines Tool zum Verwalten von Passwörtern und zum Verschlüsseln von Dateien. Andreas Müdespacher und ich haben AtaraxiS ursprünglich als Diplomarbeit geschrieben und seither immer weiter optimiert. So läuft AtaraxiS heute nicht nur unter Windows, sondern auch auf Mac und Linux.

 

GUI-Optimierungen für Linux

Unter Ubuntu wurde im letzten Jahr einiges bezüglich der grafischen Darstellung geändert. Dies führte bei einigen Dialogen wie dem Passwort-Generator zu nicht mehr lesbaren Knöpfen. Mit Version 1.6 haben wir alle Darstellungselemente überprüft und so modifiziert, dass diese unter Windows, Linux und Mac wieder funktionieren.

 

Aktualisierungen der Hilfsbibliotheken

Der grösste Aufwand für Version 1.6 ging in die Aktualisierung der Hilfsbibliotheken. Diese helfen AtaraxiS beim Verschlüsseln der Dateien, dem Speichern der Passwörter und bei der Erzeugung der Logmeldungen. Die Veränderungen reichten von nicht mehr unterstützten Methoden über geänderte Konzepte bis hin zu komplett neuen Funktionen zum Lesen von XML-Dateien.

Mit all diesen Arbeiten im Hintergrund steht AtaraxiS nun wieder auf einer aktuellen Basis. Mit dem Build-Server von Travis-CI werden nun bei jeder Änderung die ganzen Entwicklertests automatisch durchgeführt, was ungewollte Veränderungen am Code sehr schnell aufzeigt.

 

Download

Wer sich selber von AtaraxiS überzeugen möchte findet hier die passende Version:

Die Installation beschränkt sich aufs entpacken der Zip / Tar Datei. Dadurch kann man AtaraxiS auch problemlos auf einem USB-Stick entpacken und auf jedem Rechner mit einer JRE laufen lassen.

AtaraxiS 1.5 veröffentlicht

AtaraxiS ist ein kleines Tool zum Verwalten von Passwörtern und zum Verschlüsseln von Dateien. Andreas Müdespacher und ich haben AtaraxiS ursprünglich als Diplomarbeit geschrieben und seither immer weiter optimiert. So läuft AtaraxiS heute nicht nur unter Windows, sondern auch auf Mac und Linux.

 

Unterstützung für Java 8

Mit der Veröffentlichung von Java 8 wurde es notwendig AtaraxiS zu aktualisieren. Mit Version 1.5 können nun auch auf JRE 8 die entsprechenden Policy-Dateien installiert werden um die volle Stärke der Verschlüsselung zu aktivieren.
Die Hilfsbibliotheken Bouncy Castle und SWT wurden bei dieser Gelegenheit auch auf den neusten Stand gebracht.

Nicht mehr unterstützt werden dafür Java 5 und 6. Die beiden Versionen haben seit mehr als einem Jahr keine öffentlichen Patches mehr erhalten und sollten bei Privatanwendern nicht mehr verwendet werden.

Auf dem Entschlüsseln-Dialog wurde ein kleiner Fehler mit der Optionsauswahl behoben, bei dem je nach Reihenfolge AtaraxiS abgestürzt ist.

AtaraxiS_15

 

Download

Wer sich selber von AtaraxiS überzeugen möchte findet hier die passende Version:

Die Installation beschränkt sich aufs entpacken der Zip / Tar Datei. Dadurch kann man AtaraxiS auch problemlos auf einem USB-Stick entpacken und auf jedem Rechner mit einer JRE laufen lassen.

AtaraxiS 1.4 veröffentlicht

AtaraxiS ist ein kleines Tool zum Verwalten von Passwörtern und zum Verschlüsseln von Dateien. Andreas Müdespacher und ich haben AtaraxiS ursprünglich als Diplomarbeit geschrieben und seither immer weiter optimiert. So läuft AtaraxiS heute nicht nur unter Windows, sondern auch auf Mac und Linux.

 

Bugfixes und kleinere Umbauten

Die Version 1.4 beseitigt einige kleinere Bugs die vor allem im Zusammenhang mit der Fehlerbehandlung auftreten konnten. Obwohl diese Bugs sich nur in sehr speziellen Fällen zeigten war es uns doch wichtig diese mit verständlichen Fehlermeldungen abzufangen und Abstürze zu verhindern.

Neben einigen kleineren Optimierungen haben wir die Package-Struktur vereinfacht. Diese internen Umbauten wird man nur bemerken wenn man eigenen Code rund um AtaraxiS geschrieben hat.

 

Neue Projektseite

Mit der neuen Version gibt es auch eine neue Projektseite. Der bisher von uns genutzte Service (Origo) wurde leider ohne Vorwarnung eingestellt. Wir nutzten diese unerwartete Situation zu einer Standortbestimmung und haben entschieden nicht nur den Hosting-Anbieter zu wechseln, sondern auch von Subversion auf Git zu migrieren. Seit August erreicht man AtaraxiS nun über unsere GitHub-Seite.

 

Download

Wer sich selber von AtaraxiS überzeugen möchte findet hier die passende Version:

Die Installation beschränkt sich aufs entpacken der Zip / Tar Datei. Dadurch kann man AtaraxiS auch problemlos auf einem USB-Stick entpacken und auf jedem Rechner mit einer JRE laufen lassen.

5 Bücher die jeder Software-Entwickler kennen sollte

Ich werde immer mal wieder nach Buchempfehlungen gefragt. Passende Tipps zu geben ist nicht einfach, da je nach Arbeitsgebiet und Vorwissen ganz unterschiedliche Themen im Blickpunkt stehen. Es gibt aber einige Bücher die ich immer wieder empfehlen kann. Die darin behandelten Themen sind nicht technologiespezifisch sondern behandeln wichtige Konzepte und Techniken. Die 5 Bücher die ich hier nenne ergänzen sich, bieten aber auch für sich alleine einen Mehrwert.

Hinweis: Seit Januar 2014 gibt es hier eine aktualisierte Liste mit noch besseren Büchern.

 

Refactoring

Trotz seines Alters ist Refactoring nach wie vor das Standardwerk zur Restrukturierung von Code. Der ausführliche Katalog mit Strategien zur Verbesserung der Codebasis ist aus meinem täglichen Entwicklerleben nicht wegzudenken.

Dies bedeutet keinesfalls dass ich alle darin vorgestellten Methoden auswendig kenne. Aber Refactorings wie das umbenennen von Variablen oder das Extrahieren von Methoden sind Dinge die jeder beherrschen sollte. Diese sind sehr einfachen und verbessern den Code doch enorm.
(ISBN: 978-0-201-48567-7 | detaillierte Rezension)

 
 

The Art of Unit Testing

The Art of Unit TestingRoy Osherove liefert das aus meiner Sicht bisher beste Buch über Unit Testing. Es gibt viele Bücher die gut sind, seine Erklärung von komplexeren Themen wie dem Mocken von Abhängigkeiten ist aber immer noch unerreicht.

Das Buch bietet viele praxisrelevante Beispiele die zeigen wie man auch komplexere Bereiche testen kann. Gerade diese Teile sind in der Praxis meist der Grund weshalb man den Vorsatz Unit Tests zu schreiben aufgibt. Wie bei allem gilt aber auch hier, dass man selber denken muss und Tipps auch kritisch hinterfragen soll.
(ISBN: 978-1-933988-27-6 | detaillierte Rezension)

 

Dependency Injection in .Net

Wendet man Unit Tests konsequent an wird der Code oft modularer. Um diese schön getrennten Teile zu einer Anwendung kombinieren zu können fallen schnell einmal die Begriffe Dependency Injection und Inversion of Control. Das Buch von Mark Seemann liefert einem eine sehr gute Einführung und auch das nötige Hintergrundwissen um eine praxistaugliche Anwendung aufzubauen.

Mir gefällt daran das nicht nur gezeigt wird worauf man achten muss sondern auch wie man merkt dass man auf dem falschen Weg ist.
(ISBN: 978-1-935182-50-4 | detaillierte Rezension)

 
 

Clean Code

Unit Tests, Refactorings und Dependency Injection sind Techniken die den Code sauberer machen. Wenn einem diese Richtung gefällt ist Clean Code von Robert C. Martin der nächste Schritt.

Sein Buch geht den Weg weiter und verbindet verschiedenste Erkenntnisse in der Software-Entwicklung der letzten Jahre zu einem Ganzen. Bei Clean Code ist es aus meiner Sicht aber besonders wichtig das man das Ziel bei all den Regeln nicht aus den Augen verliert. Verständlicher Code sollte immer vor einer in Stein gemeisselten maximalen Anzahl Zeilen für eine Methode gehen.
(ISBN: 978-0-13-235088-4 | detaillierte Rezension)

 
 

Debug It

Trotz Unit Tests wird man immer mal wieder vor einem Bug stehen. Wer gerne alternativen zu mehrstündigen Einsätzen des Debuggers hätte sollte sich dieses Buch anschauen. Paul Butcher liefert mit seinem Buch viele Tipps und Tricks damit man bei der Bugbeseitigung nicht nur im Dunkeln herum stochert.

Das Buch zeigt was die wesentlichen Schritte der Fehlerbehebung sind und worauf man nicht verzichten darf. Ein beherzigen dieser Vorschläge kann einem Stunden bei der Fehlersuche ersparen.
(ISBN: 978-1-9343-5628-9 | detaillierte Rezension)

 
 

Soweit meine Liste von Büchern die ich als „Must-Read“ bezeichne. Ich würde mich freuen zu erfahren was andere Entwickler als unverzichtbare Bücher auflisten.

 

SWT: GUI bei langen Aktionen nicht einfrieren lassen

Länger dauernde Aktionen sollten nie im GUI-Thread laufen. Dies gilt auch für SWT, der GUI-Bibliothek von IBM/Eclipse für Java. Allerdings gibt es bei SWT einige Punkte zu beachten, ohne die ein Umbau schnell sehr mühsam werden kann.

 

Ausgangslage

Bei den meisten Erklärungen zu SWT wird im SelectionListener eines Knopfes alle Logik eingebaut, die beim Klick darauf ausgeführt werden soll. So lange die daraus resultierenden Aktionen schnell verarbeitet werden können ist dagegen auch nichts einzuwenden.

Dauert es aber länger friert einem sehr schnell das GUI ein. Je nach PC variieren die Auswirkungen von einem flackern der Anzeige bis zu kompletten Blockieren der Anwendung. Der Code wird in so einem Fall wohl meist so aussehen:

workButtonSlow.addSelectionListener(new SelectionAdapter() {
	public void widgetSelected(SelectionEvent arg0) {
		progress.setSelection(0);
		workButtonSlow.setEnabled(false);
		
		// simuliert lange dauernde Aktion
		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				System.out.println(e.getMessage());
			}
			progress.setSelection(progress.getSelection() + 1);
		}

		workButtonSlow.setText("Thread beendet");
		workButtonSlow.setEnabled(true);
	}
});

 

Lösung: Threads und asyncExec

Nach einigen Anläufen bin ich bei Threads und einer Synchronisierung des GUI über asyncExec gelandet. Die lange dauernden Aktionen werden in einen eigenen Thread ausgelagert und im SelectionListener nur noch gestartet. Die Verarbeitung erfolgt so losgelöst vom GUI-Thread und behindert das Neuzeichnen der Oberfläche nicht – dies genügt damit die Anwendung viel reaktiver erscheint.

Da man nun während der Ausführung der Aktion weiterarbeiten kann, steht man unter Umständen vor neuen Problemen. Falls die gleiche Aktion nicht noch einmal parallel dazu gestartet werden darf, muss man dies nun explizit verhindern. Je nach Anwendung genügt es den entsprechenden Knopf beim Start des Arbeitsthreads zu deaktivieren und erst beim beenden wieder zu aktivieren.

Eine Implementierung mit einer eigenen Thread-Klasse kann so aussehen:

class LongRunningOperation extends Thread {
		private Display display;
		private ProgressBar progressBar;
		private Button workButton;

		/**
		 * Alles übergeben was aus diesem Thread erreichbar sein soll
		 */
		public LongRunningOperation(Display display, ProgressBar progressBar,
				Button workButton) {
			this.display = display;
			this.progressBar = progressBar;
			this.workButton = workButton;
		}

		/**
		 * Länger laufende Methode um eine Verarbeitung zu simulieren
		 */
		public void run() {
			for (int i = 0; i < 100; i++) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					System.out.println(e.getMessage());
				}
				progressBar.setSelection(progressBar.getSelection() + 1);
				// ProgressBar kann nur via asyncExec aktualisiert werden!
				display.asyncExec(new Runnable() {
					public void run() {
						if (progressBar.isDisposed())
							return;

						progressBar.setSelection(progressBar.getSelection() + 1);
					}
				});
			}

			// Gleiches gilt für alle GUI-Elemente
			display.asyncExec(new Runnable() {
				public void run() {
					if (workButton.isDisposed())
						return;
					workButton.setText("Thread beendet");
					workButton.setEnabled(true);
				}
			});
		}
	}

Der Knopf über den die zeitintensive Aktion gestartet wird ist wie alle anderen GUI-Elemente in SWT aber nicht direkt aus einem anderen Thread heraus veränderbar. Damit der Ausführungskontext stimmt müssen alle Veränderungen dieser Elemente als Runnable der Methode asyncExec übergeben werden. Wichtig ist das man das Display-Objekt nutzt mit dem man die Shell der Anwendung initialisiert hat.

Versucht man asyncExec zu umgehen wird SWT mit dieser Exception antworten:

Exception in thread „Thread-0“ org.eclipse.swt.SWTException: Invalid thread access

Sind alle Zugriffe entsprechend umgeformt, kann man im SelectionListener des Knopfes die Thread-Klasse starten:

		workButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				progress.setSelection(0);
				workButton.setEnabled(false);
				new LongRunningOperation(s_display, progress, workButton)
						.start();
				workButton.setText("SelectionListener beendet!");
			}
		});

 

Fazit

Mit dieser Umbauarbeit kann man auch lange laufende Aktionen ausführen ohne dass einem das GUI einfriert oder an Reaktionsfähigkeit einbüsst. Dieser Ansatz ist ein wenig aufwändig, erfüllt aber seinen Zweck. (Das ganze Beispiel ist auf Github verfügbar)

Falls es einfachere Wege gibt würde ich mich über einen Kommentar freuen.

Buch-Rezension zu „Jenkins – The Definitive Guide“

Jenkins – The Definitive Guide” von John Ferguson Smart erschien im Juli 2011 bei O’Reilly. Jenkins ist ein in Java geschriebener Build-Server der von Nightly Builds bis zu Continuous Deployment alles abdecken kann.

[Hinweis: Ich habe dieses Buch über die .Net User Group Bern erhalten, die am User Group Programm von O’Reilly teilnimmt. Wie immer wenn ich über Bücher blogge schreibe ich was mir daran gefällt und was nicht. Dies mache ich unabhängig davon ob ich ein Rezensionsexemplar bekomme oder das Buch selber kaufe.]

 

 

Hudson oder Jenkins?

Ursprünglich war der Build-Server unter dem Namen Hudson bekannt. Nachdem die Spannungen zwischen Oracle (dem Inhaber der Namensrechte) und den Entwicklern immer grösser wurden gab es Anfang 2011 einen Fork. Die meisten Entwickler entschlossen sich das Projekt unter dem Namen Jenkins fortzuführen.

Die meisten Punkte die im Buch erklärt werden gelten sowohl für Jenkins wie auch für Hudson. Da Jenkins aber immer noch jede Woche eine neue Version heraus gibt und Hudson nur alle 1 bis 2 Monate, werden die Projekte langsam aber sicher auseinander laufen. Wer über eine Migration von Hudson nach Jenkins nachdenkt sollte diese möglichst zügig angehen. Wer neu startet und den Support von Oracle nicht benötigt kann gleich mit Jenkins anfangen.

 

Von Nightly Builds zu Continuous Delivery

Continuous Integration (CI) ist mittlerweile ein Begriff mit vielen Definitionen. Für die einen ist CI erreicht wenn man einen Nightly Build hat, für die anderen erst wenn damit auch bei jedem Check-in alle Tests ausgeführt werden. Smart zeigt zu Beginn des Buches dass dies kein Wiederspruch ist. Vielmehr sind es einzelne Phasen in der Verwendung von CI. Er gliedert diese so:

  1. Kein Build Server – Entwickler bauen alles auf ihren eigenen Geräten
  2. Nightly Builds – 1x pro Nacht wird alles auf einem zentralen Server gebaut
  3. Nightly Builds und erste automatisierte Tests nach jedem commit
  4. Erste Schritte mit Code Metriken (wie Testabdeckung und Qualitätskontrolle)
  5. Test-Driven Development und automatisches deployment auf Testsystem
  6. Automatisierte Akzeptanztests und Möglichkeit fürs deployment auf Produktion
  7. Continuous Deployment – wenn alle Tests bestanden sind wird automatisch auf die Produktion deployt

Man muss weder alle Phasen durchlaufen noch diese Reihenfolge einhalten. Hat man das fürs Projekt notwendige umgesetzt kann man jederzeit aufhören – ein automatisches Deployment ist keine Pflicht.

 

Erste Schritte, Installation und Konfiguration

Das Buch führt einem durch alle Schritte die nötig sind um Jenkins zu installieren und in Betrieb zu nehmen. Neben den verschiedenen und plattformspezifischen Installationsmöglichkeiten wird erklärt wie man Jenkins dazu bekommt mit den gängigsten Versionsverwaltungssystemen (wie Subversion, Mercurial, Git und CVS) zu kommunizieren und E-Mails zu verschicken. Letzteres ist besonders dann wichtig, wenn der Build fehlschlägt – sonst bleibt dies bis zum Release unbemerkt…

 

Build Jobs und automatisches Testen einrichten

Das Kapitel zum aufsetzen der Build Jobs lässt keine Fragen offen. Hat man die Arbeitsschritte mit einem Build-Tool wie Ant oder Maven bereits automatisiert kann man die entsprechenden Projektvorlagen nutzen und braucht nur die jeweiligen Kommandos einzutragen. Es wird aber auch erklärt wie man all die Schritte selber konfigurieren kann, was gerade für Projekte in .Net oder Ruby sehr hilfreich ist.

Die Jobs können zu bestimmten Zeiten, manuell oder nach jeder Änderung in der Versionsverwaltung starten – für alles gibt es wiederum eine detaillierte Anleitung um Jenkins entsprechend einzurichten.

Bei den automatischen Tests will man in der Regel eine Antwort auf 2 Fragen:

  1. Sind alle Tests erfolgreich?
  2. Wie viel Code wird von meinen Tests abgedeckt?

Jenkins führt die Tests aus und gibt die Resultate an Plugins weiter die sich um die Analyse und die grafische Aufbereitung der Resultate kümmern. Auch deren Konfiguration und Einbindung in die Jobs wird wiederum ausführlich erklärt.

 

Jenkins absichern und verteilte Builds

Nach den grundlegenden Themen die jeder Jenkins Benutzer benötigt geht das Buch auch auf weiterführende Themen ein. Hat man nur eine kleine Gruppe die mit Jenkins arbeitet wird man oft nicht gross über Zugangsbeschränkungen nachdenken. Wird dies ein Thema bietet Jenkins dazu verschiedenste Möglichkeiten an, sogar eine Anbindung an Active Directory ist machbar und wird von Smart beschrieben.

Ob man verteilte Builds nutzen will hängt ebenfalls vom Anwendungszweck ab. Dabei ist nicht alleine die nötige Geschwindigkeit eines Servers ausschlaggebend. Der Bedarf nach unterschiedlichen Konfigurationen kann ebenfalls dafür sprechen. Im Buch wird als Beispiel die Durchführung von Integrationstests mit verschiedenen Datenbanken auf verschiedenen Applikationsservern durchgespielt.

 

Build-Tool zur Vereinfachung

Über das ganze Buch hinweg sieht man immer wieder wie kompakt die Konfiguration von Jenkins ist wenn man auf ein Build-Tool wie Maven zurückgreifen kann. Die zusätzliche Konfiguration in Maven ist sehr oft kleiner als was man bei Jenkins einstellen muss um das gleiche Resultat zu erzielen.
Da jeder Entwickler mit dem Build-Tool die gleichen Befehle lokal ausführen kann gibt es nach dem commit auch keine Überraschungen.

Daher sollte man vor man Aufbau eines Build-Servers fragen ob man nicht zuerst die Konfiguration für ein Build-Tool erstellen will. Dieser zusätzliche Aufwand kann sich schnell auszahlen.

 

Braucht es für Jenkins wirklich ein Buch?

Das GUI von Jenkins ist sehr übersichtlich und mit der Online-Hilfe kommt man sehr weit. Wenn man ein Java-Projekt hat das bereits Ant oder Maven nutzt kann man sehr schnell und einfach zu ersten Erfolgen kommen – auch ohne Buch.

Ich nutze Jenkins/Hudson seit mehreren Jahren sowohl für kleine Java-Projekte wie auch für ein grosses Kundenprojekt in .Net. Das Buch lieferte mir etliche Anregungen um die alltäglichen Arbeiten einfacher zu erledigen. Ein klein wenig mehr Aufwand und die Konfiguration ist deutlich flexibler als das was ich in den Jahren des Anwendens selber heraus getüftelt hatte. Für komplexe Aufgaben (wie die verteilten Builds oder eine AD-Anbindung) konnte ich etliche Anregungen holen.

Das Buch ist meiner Meinung nach sehr gut um sich schnell in Jenkins einzuarbeiten. Man kann vom grossen Wissen des Autors profitieren und hat ein kompaktes Nachschlagewerk zu allen Belangen von Jenkins.

 

Was fehlt

Ich hätte gerne noch mehr Informationen zur Konfiguration für Nicht-Java Projekte gehabt. Das Buch hilft einem bei den ersten Schritten, doch weiterführende Teile fehlen danach leider. Nicht jeder will (oder kann) Maven und Ant nutzen. Mehr Informationen und Beispiele zu anderen Build-Tools hätte ich ebenfalls sehr begrüsst.

Leider sind die Konfigurationsbeispiele nicht einzeln herunterladbar. Auf der Webseite des Autors gibt es dafür das ganze Buch als PDF (Open Book mit Creative Commons Lizenz). Über diesen Umweg kommt man dann doch noch an die Beispiele.

 

Fazit

Das Buch bietet sowohl für Neulinge wie auch für fortgeschrittene Nutzer von Jenkins viele Tipps und Praxiswissen um einen Build-Server aufzubauen und ins Entwicklungsprojekt zu integrieren. Wer sich mit Jenkins beschäftigen will sollte unbedingt einen Blick ins Buch werfen.

 

Zum Buch

Jenkins – The Definitive Guide“ von John Ferguson Smart, 2011 O’Reilly, ISBN 978-1-449-30535-2, 406 Seiten, Englisch