Archiv

Posts Tagged ‘Java’

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.

Schlagworte: ,

5 Bücher die jeder Software-Entwickler kennen sollte (Ausgabe 2014)

7. Januar 2014 2 Kommentare

Vor gut 1.5 Jahren habe ich bereits einmal eine Top 5 Liste mit Büchern veröffentlicht. Seither habe ich viel gelesen und es ist daher höchste Zeit die Leseempfehlungen zu aktualisieren.

Ich versuchte wiederum eine möglichst technologieneutrale Liste zusammenzustellen. Frameworks kommen und gehen und sind stellenweise in erschreckend kurzer Zeit wieder obsolet. Die hier vorgestellten Bücher behandeln Themen die schon länger aktuell sind und es allem Anschein nach noch einige Jahre bleiben werden.

 

Practical Object-Oriented Design in Ruby

POODR Obwohl sehr viel über OO-Design geschrieben wird ist es sehr schwer ein gutes Buch für den Einstieg zu finden. Sandi Metz hat einen guten Mittelweg zwischen Theorie und Praxis gefunden und es gelingt ihr dieses Thema in verständlichen Schritten zu erklären. Auch wer sich mit Ruby nicht auskennt kann hier viel über OO-Design lernen.

Da die Beispiele recht kurz sind kann man sich auf genau den behandelten Teilaspekt konzentrieren. Dies hilft nicht nur Einsteigern sondern ist auch sehr gut als Auffrischung für erfahrene Programmierer geeignet.
(ISBN: 978-0-3217-2133-4 | detaillierte Rezension)

 

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 (Second Edition)

The Art of UnitTesting 2nd editionRoy 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. Und mit der 2. Ausgabe wurden die Praxisbeispiele und Tipps nochmals besser.

Gerade diese Praxisbeispiele helfen einem dabei auch die komplexeren Bereiche mittels Unit Tests abzudecken. Nur wenn man diese Herausforderungen meistern kann wird man Unit Tests in die eigenen Projekte integrieren.
(ISBN: 978-1-6172-9089-3 | detaillierte Rezension)

 
 

Clean Code

Unit Tests und Refactoring 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)

 
 

Patterns of Enterprise Application Architecture

Patterns of Enterprise Application ArchitectureDas 2. Buch von Martin Fowler in meiner Liste behandelt die Patterns rund um Geschäftsanwendungen. Die Problemstellungen in diesem Bereich sind so grundlegend dass die meisten Entwickler in ihren Projekten damit zu tun haben – ganz egal ob ihre Projekte den Stempel „Enterprise“ tragen oder nicht.

Fowler beschränkt sich nicht nur darauf die einzelnen Patterns aufzulisten, sondern erklärt auch die jeweiligen Vor- und Nachteile. Diese Gegenüberstellung macht für mich den Wert dieses Buches aus, da man nur so eine fundierte Entscheidung treffen kann.
(ISBN: 978-0-3211-2742-6 | detaillierte Rezension)

 
 

Soweit meine aktualisierte 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.

 

Schlagworte: , , ,

AtaraxiS 1.4 veröffentlicht

5. September 2012 Kommentare aus

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.

Schlagworte: ,

SWT: GUI bei langen Aktionen nicht einfrieren lassen

26. November 2011 4 Kommentare

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.

Schlagworte: ,

Java 7 – was lange dauerte ist endlich da

31. Juli 2011 Kommentare aus

Man hätte schon fast meinen können Java 7 würde nicht mehr erscheinen. Java 6 erschien Mitte Dezember 2006 und erlaubte uns damals noch einige letzte Tests bevor unsere Diplomarbeit AtaraxiS abgegeben werden musste. Diese Woche war es nun so weit: nach 4 Jahren und fast 7 Monaten hat Oracle das JDK 7 freigegeben.

 
Wenig Neues…
Über die vielen Jahre wechselte Java nicht nur von Sun zu Oracle, auch die Feature-Liste schmolz wie Schnee im Sommer. Von den 70 Verbesserungen die Project Coin vorgeschlagen hat sind so nur 6 in Java 7 angekommen. Und Coin war nur eines von vielen Themen.

 
…aber einige praktische Verbesserungen
Von den wenigen Verbesserungen gibt es aber 2 die einem sofort ins Auge stechen:

  • Strings in Switch-Statements
  • Mehrere Exceptions mit einem Catch-Block fangen

Dazu hat Heise einige Beispiele zusammen getragen. Auch wenn das nichts Revolutionäres ist, so kann man damit doch einige recht mühsame Umgehungslösungen vermeiden.

 
Dateisystem: Da war doch was?
Bisher war die Arbeit mit dem Dateisystem in Java jeweils mühsam. Man musste für jede Kleinigkeit (wie copy) selber seine Methoden schreiben oder auf Bibliotheken wie Apache Commons IO ausweichen. Java 7 bringt nun auch dafür etliche Verbesserungen. Neue Klassen und Interfaces wie Path, Files oder WatchService geben dem Entwickler viele neue Möglichkeiten. Wie bei den Strings und switch kann man den nötigen Code für die gleiche Funktionalität massiv reduzieren.

 
Ausblick Java 8
All die Features die nicht in Java 7 drin sind sollen es in Java 8 schaffen. Geplant ist Java 8 für Ende 2012. Schaut man aber wie gut der Plan für Java 7 stimmte dürfte es niemanden erstaunen wenn es da noch etliche Verschiebungen geben wird.

 
Fazit
Java 7 bietet etliche Detailverbesserungen, alle grossen Neuerungen dürften aber frühestens mit Java 8 kommen. Bis dahin werden wohl andere Sprachen die auf der JRE aufsetzen (wie zum Beispiel Groovy) als Trendsetter dienen müssen.

Schlagworte:
Follow

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 254 Followern an