Archiv

Archive for November 2011

Github Gist: Code-Schnipsel einfach veröffentlichen

29. November 2011 1 Kommentar

Mir fehlte es für lange Zeit an einer guten und einfachen Möglichkeit um Code-Schnipsel öffentlich zu machen. Für ganze Projekte finde ich die Kombination von Mercurial und Bitbucket sehr gut. Aber um eine einzelne Datei oder gar nur eine Methode publizieren zu können ist diese Lösung zu aufwändig.

Vor kurzem bin ich beim durchstöbern von Github auf Gist gestossen. Über eine sehr einfache Weboberfläche kann man die Schnipsel mit einem Namen versehen und veröffentlichen. Wenn man will kann man noch die Sprache wählen, womit dann auch die Syntaxhervorhebung stimmt.

Um Gist zu nutzen braucht man nur einen Account bei Github. Man muss weder Git installiert haben noch gross darüber Bescheid wissen. Wenn man später einmal ein „richtiges“ Projekt daraus machen möchte steht dem nichts im Weg: Ein Gist ist ein vollwertiges Git-Repository und verfügt damit von Anfang an über eine Historisierung.

Ich finde Gist eine sehr gute Idee und bin gespannt was sich dadurch alles für Möglichkeiten eröffnen.

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: ,

Amazon Kindle: Digitale Bücher angenehm lesen

14. November 2011 5 Kommentare

Seit rund 3 Monaten besitze ich nun einen Amazon Kindle (Keyboard 3G). Ich war lange skeptisch ob sich so ein Gerät lohnt, da ich bereits mein IPad zum lesen von E-Books nutzen konnte. Nachdem ich in den USA aber immer wieder an den aktuellsten E-Reader vorbei gelaufen bin wollte ich doch mal testen was die so tolles können.

Der Kindle war dabei von der Form, der Funktionalität und der Darstellung her Top. Einzig der Preis schien mir zu hoch. Auf amazon.com gab es aber ein Spezialangebot: Wer bereit ist in der Zeit wo man den Kindle nicht verwendet Werbung einblenden zu lassen bekommt ihn 50$ günstiger. Zusammen mit dem tiefen Dollarkurs war der Kindle damit günstig genug das Experiment E-Reader zu wagen. Dies habe ich bis heute nicht bereut.

 

E-Ink – das digitale Papier

Zur Darstellung von Text nutzt der Kindle keinen LCD-Monitor, sondern E-Ink. Diese Oberfläche braucht nicht nur viel weniger Strom sondern kommt von der Auflösung und dem Kontrast sehr dicht an Papier heran. Ich finde diese Oberfläche zum Lesen sehr angenehm. Da ich zudem die Schrift und den Kontrast noch selber einstellen kann ist das Schriftbild besser als bei manchem gedruckten Buch. Und es hat definitiv nichts mit dem Lesen von einem Bildschirm gemeinsam.

 

Einfacher Bücherkauf

Wenn man auf der Webseite von Amazon ein interessantes E-Book findet, kann man dies wie die gedruckten Bücher kaufen. Hat man einen Kindle wird das Buch danach gleich direkt aufs Gerät geliefert (über das sogenannte Whispernet).

Man kann aber auch über den Kindle direkt Bücher kaufen. Dazu genügt es auf dem Kindle im Menü den Kindle-Store aufzurufen. Dieser extra für die E-Reader optimierte Webshop bietet einem das ganze Angebot für E-Books von Amazon. Wie von der Webseite gewohnt kann man nach dem gewünschten Titel suchen und diesen mit einem Klick kaufen. (Sollte man sich vertippt haben gibt’s auch gleich einen Link um den Einkauf zu stornieren.)
Der Ein-Klick Kauf funktioniert da der Kindle voll mit dem eigenen Amazon-Konto integriert ist und so die hinterlegten Kreditkardendaten mitbenutzen kann.

 

Eigene Dokumente lesen

Wenn man Dokumente hat die im Kindle-Format (*.mobi) vorliegen kann man diese auch auf den Kindle bringen. Der einfachste Weg ist den Kindle an den PC anzuschliessen und mit dem Explorer die Dokumente auf den Kindle zu kopieren.

Als Alternative kann man sich die Dokumente auch an die E-Mail Adresse des Kindle schicken. Sobald man sich mit einem Wireless-Netzwerk verbindet werden die Dokumente aufs Gerät geladen.

Über diesen Weg können einem auch andere Buchhändler die gekauften E-Books zustellen. The Pragmatic Programmers haben dies sehr schön in ihren Webshop integriert und nutzen dies auch um einem Updates der Bücher direkt zuzustellen.

 

Lange Akkulaufzeit

Der Kindle kommt mit einer Akkuladung sehr weit. Da ich ab und zu das Leselicht der Schutzhülle benutze muss ich im Schnitt alle 3 Wochen den Kindle an die Steckdose anschliessen. Dies bedingt aber das ich die Wireless-Verbindung abschalte und nur aktiviere wenn ich ein Buch herunterladen will.

Damit erreiche ich zwar nicht die oft erwähnten 4 Wochen Akkulaufzeit, allerdings sind 3 Wochen doch massiv länger als was ich von meinem IPad gewohnt bin.

 

Geringes Gewicht

Der Kindle ist mit weniger als 250 Gramm sehr leicht. Zusammen mit der geringen Grösse (190 mm x 123 mm x 8.5 mm) ist er ideal geeignet um ihn überall hin mitzunehmen. Da die aktuelle Seite abgespeichert wird muss man sich auch keine Gedanken machen bis wo man schon gelesen hat – ein Buchzeichen wird dadurch überflüssig.

 

Wo es Probleme gibt

Auch wenn der Kindle ein sehr gutes Gerät ist, so gibt es doch auch Stellen wo es Optimierungspotential gibt. Sourcecode und Tabellen sind 2 Punkte die je nach dem äusserst mühsam sein können. Dies vor allem wenn als Ausgangsmaterial ein PDF diente und es für den Kindle keine explizite Optimierung gab. Das Umschalten aufs Querformat hilft da ein wenig, ist aber nicht wirklich angenehm.

Ein Problem können auch Grafiken sein. Besonders wenn man einzelne Farben erkennen muss ist der Kindle 3G das falsche Gerät. Wer sich vor allem für Grafiken interessiert und doch einen E-Reader will sollte sich den Kindle Fire anschauen.

 

Was es sonst noch alles gibt

Eine von mir nicht benutzte Funktion ist das Vorlesen der Bücher. Sofern der Rechteinhaber dies nicht verboten hat kann man sich das E-Book vorlesen lassen. Dies ist für Romane wohl durchaus hilfreich, für technische Bücher aber nicht wirklich nützlich.

Ganz praktisch ist dagegen das markieren von Textstellen und das Hinzufügen von Notizen. Findet man eine Stelle auf die man später zurückkommen will ist so eine Markierung sehr hilfreich. Alle markierten Stellen werden in ein Dokument ausgelagert, aus dem man mit wenig Aufwand eine Zusammenfassung der wichtigsten Punkte des Buches machen kann.

Hilfreiche oder diskussionswürdige Textstellen kann man samt eigenem Kommentar direkt auf Twitter posten. Mittels automatisch eingefügtem Link zur Textstelle (die in der Cloud von Amazon abgelegt wird) wird so auch gleich der nötige Kontext mitgeliefert. Hat man das Buch gelesen kann man nach dem gleichen Muster auch gleich eine Bewertung veröffentlichen.

Mit dem Kindle wird auch ein Wörterbuch mitgeliefert. Möchte man die Bedeutung eines Wortes wissen geht man wie beim markieren vor. Das Wort hinter dem Cursor wird dann automatisch gegen die installierten Verzeichnisse geprüft und deren Definition unten an der Seite angezeigt. So kann man seinen Wortschatz ausbauen ohne erst in einem anderen Medium nachzuschlagen.

 

Mein Fazit

Der Kindle ist ein tolles Gerät zum Lesen von Büchern. Und man kann damit auch nur lesen (vom sehr gewöhnungsbedürftigen Webbrowser einmal abgesehen). Diese Fokussierung ist aber etwas sehr gutes, da man so nicht dauernd abgelenkt wird. Da der ganze Kindle genau für diese eine Aufgabe optimiert ist gab es auch keine Kompromisse.

Nachdem ich etliche Bücher darauf gelesen habe vermisse ich Funktionen wie das Wörterbuch und die Textmarkierungen wenn ich mal wieder ein gedrucktes Buch in der Hand habe. Der Kindle ist ein Gerät das ich mit voller Überzeugung weiterempfehlen kann.

Man muss sich aber bewusst sein das man mit dem Kindle mehr Bücher lesen wird…

Schlagworte: ,
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 296 Followern an