30. März 2013

Google Kalender: Mit Sunbird oder Lightning synchronisieren

Mozilla bietet mit der Standalone-Anwendung "Sunbird" und der Thunderbird-Erweiterung "Lightning" zwei Kalenderapplikationen an. Zwar wurde die letzte Version von Sunbird bereits am 30. März 2012 veröffentlicht und die Weiterentwicklung danach zu Gunsten von Lightning eingestellt, doch ist die Anwendung weiterhin zugänglich. Dieser Post soll erklären, wie diese beiden Kalenderanwendung mit Google Kalender verknüpft werden kann, um alle Termine synchron in der Cloud und auf dem Desktop zu halten. Die schrittweise Anleitung orientiert sich dabei an Sunbird, die Vorgehensweise ist jedoch für Lightning die selbe.

  • Um einen Google Kalender in Sunbird einzufügen, muss zunächst über den Menüpunkt Datei → Neuer Kalender der dafür zuständige Dialog geöffnet werden.
  • Im ersten Schritt muss nun die Option "Im Netzwerk" gewählt werden.
Der erste Schritt des Dialogs "Neuer Kalender" (Klicken zum Vergrößern)
  • Die Kalenderdaten werden von Google mittels des offenen Standards WebDAV angeboten.Diese Option ist daher auf der nächsten Seite auszuwählen. Außerdem wird die Eingabe einer Adresse verlangt. Die Adresse des Hauptkalenders hat immer folgenden Aufbau, wobei <email> durch die jeweilige E-Mail-Adresse des Google-Kontos ersetzt werden muss:
https://www.google.com/calendar/dav/<email>/events
 
Der zweite Schritt des Dialogs "Neuer Kalender" (Klicken zum Vergrößern)
  • Nun muss noch der Benutzername (die E-Mail-Adresse des Google-Kontos) und das dazugehörige Passwort eingetragen werden, um das Anlegen des Kalenders abzuschließen.
  • Um die Synchronisation der Termine beim ersten Mal anzustoßen, genügt die Tastenkombination Strg + R oder der Menüpunkt  Datei → Externe Kalender neu laden.
Importierte Kalender in Mozilla Sunbird (Klicken zum Vergrößern)
Jeder weitere Kalender der importiert werden soll, muss auf diese Weise separat angelegt werden. Die jeweiligen Adressen erfährt man unter den Kalendereinstellungen in der Webverwaltung des Google Kalenders. 
Kalendereinstellungen in der Webverwaltung von Google Kalender (Klicken zum Vergrößern)
Wenn es sich bei dem zu importierenden Kalender um einen öffentlichen Kalender handelt (z.B. eine Kalender der Feiertage enthält), kann auch das Format iCalendar benutzt werden. Die entsprechende Option muss dann nur beim Anlegen des Kalenders ausgewählt werden und die entsprechende Adresse, die in den Kalendereinstellungen angezeigt wird, eingegeben werden.

24. März 2013

Android: HTML in TextViews

Die Android-API bietet eine konfortable Möglichkeit, durch HTML-Tags formatierte, Inhalte in einer TextView darzustellen. Dies ist über die statische Methode fromHtml(String html):Spanned der Klasse android.text.Html möglich. Folgender Beispielcode soll deren Verwendung verdeutlichen:
 String exampleHtml = "<b>Some bold text</b>";  
 Spanned spanned = Html.fromHtml(exampleHtml);  
 TextView textView.setText(spanned);  
Der String enthält hierbei ein HTML-Tag um den Text fettgedruckt darzustellen. Über die bereits beschriebene Methode wird zunächst ein Spanned-Objekt erzeugt, das anschließend über die Methode setText(CharSequence text):void in einer TextView dargestellt werden kann.

Leider enhält die offizielle API-Dokumentation bisher keine Hinweise darauf, welche HTML-Tags unterstützt werden und welche eventuell nicht. Jedoch scheinen seit Android 2.1 folgende Tags auf diese Art darstellbar zu sein:
  • <a href="...">
  • <b>
  • <big>
  • <blockquote>
  • <br>
  • <cite>
  • <dfn>
  • <div align="...">
  • <em>
  • <font size="..." color="..." face="...">
  • <h1>
  • <h2>
  • <h3>
  • <h4>
  • <h5>
  • <h6>
  • <i>
  • <img src="...">
  • <p>
  • <small>
  • <strike>
  • <strong>
  • <sub>
  • <sup>
  • <tt>
  • <u>

23. März 2013

Android: Exception-Handling in AsyncTasks

Die sogenannten AsyncTasks können genutzt werden um zeitaufwändige Operationen, wie z.B. Netzwerkzugriffe, einer Android-App vom GUI-Thread zu entkoppeln. Dies ist notwendig, da ansonsten die Benutzeroberfläche der App während der Operation einfrieren und nicht mehr auf Benutzereingaben reagieren würde. Die offizielle API-Dokumentation der entsprechenden Klasse android.os.AsyncTask ist unter diesem Link zu finden.

Die eigentliche Ausführung der entsprechenden Operation, die von dem Task asynchron ausgeführt werden soll, geschieht nach diesem Pattern in der Methode doInBackground(Params... p):Result, die anschließende Synchronization mit dem GUI-Thread ist über die Methode void onPostExecute(Result r):void möglich. Die Klasse AsyncTask ist hierbei eine generische Klasse. Bei dem Objekttyp Params handelt es sich um die Klasse, deren Instanzen als Parameter verwendet werden sollen, der Objekttyp Result definiert die Klasse, als deren Instanz das Ergebnis des Threads zurückgeliefert werden soll.

Da AsyncTasks oftmals fehleranfällige Operationen wie Netzwerk- oder Speicherzugriffe ausführen, liegt es nahe über ein mögliches Exception-Handling nachzudenken, bei dem die Fehler nicht nur innerhalb des Tasks abgefangen werden können, sondern auch Exceptions nach außen geworfen werden können, um beispielsweise eine entsprechende Ausgabe auf der GUI zu ermöglichen. Eine Möglichkeit, eine solche Anforderung zu realisieren, soll im Folgenden erläutert werden:

Die Grundlage hierzu bietet eine generische Klasse, die als Rückgabewert des entsprechenden AsyncTasks genutzt wird. Sie kann entweder ein gültiges Ergebnis variablen Typs oder eine Exception-Instanz beinhalten. Eine beispielhafte Implementierung einer solchen Klasse ist im Folgenden zu sehen:
 public class TaskResult<Type> {  
   
     private Exception exception;  
   
     private Type result;  
   
     public TaskResult(final Type result) {  
         this.result = result;  
     }  
   
     public TaskResult(final Exception exception) {  
         this.exception = exception;  
     }  
   
     public final boolean isValid() {  
         return exception == null;  
     }  
   
     public final Exception getException() {  
         return exception;  
     }  
   
     public final Type getResult() {  
         return result;  
     }  
 }  
Die Klasse besitzt hierbei jeweils einen Konstruktor, um ein Task-Ergebnis mit einem gültigen Rückgabewert oder einer Exception zu erzeugen. Auf diese kann anschließend mit Hilfe von Getter-Methoden zugegriffen werden, wobei stets eine der beiden Methoden den Wert null zurückliefert. Außerdem bietet die Klasse noch eine weitere Methode isValid():boolean an, die es erlaubt, zu überprüfen ob das Task-Ergebnis einen gültigen Wert oder einen Fehlerfall repräsentiert.

Der folgende Code soll nun beispielhaft veranschaulichen, wie eine solche Klasse als Rückgabewert eines AsyncTasks genutzt werden kann:
 public class Task extends AsyncTask<Float, Integer, TaskResult<Float>> {

     private Activity activity;

     public Task(Activity activity) {
         this.activity = activity;
     }

     @Override
     protected final TaskResult<Float> doInBackground(final Float... params) {
         try {
             float a = params[0];
             float b = params[1];
             float result = a / b;
             return new TaskResult<Float>(result);
         } catch (ArithmeticException e) {
             return new TaskResult<Float>(e);
         }
     }

     @Override
     protected final void onPostExecute(final TaskResult<Float> result) {
         TextView textView = activity.findViewById(R.id.textView);

         if (result.isValid()) {
             textView.setText(Float.toString(result.getResult()));
         } else {
             textView.setText("Division by zero!");
         }
     }

 } 
Der AsyncTask wurde hierbei so typisiert, dass er Parameter vom Typ Float entgegennimmt, der aktuelle Fortschritt des Tasks von einem Integer-Wert repräsentiert wird, was in diesem Beispiel jedoch nicht genutzt wird, und das Ergebnis ein Objekt der zuvor vorgestellten TaskResult-Klasse ist, das ebenfalls mit dem Datentyp Float typisiert wird.

In der doInBackground-Methode wird als Beispiel eine Division von zwei Float-Werten durchgeführt, die als Parameter erwartet werden. Die try-catch-Schleife fängt dabei mögliche Divisionen durch null ab. Erfolgt die Division erfolgreich, wird ein TaskResult-Objekt zurückgegeben, dass mit dem entsprechenden Ergebniswert initialisiert wird, wird dagegen eine Exception geworfen, wird ein TaskResult-Objekt zurückgegeben, das die entsprechende ArithmeticException enthält.

Nach Abarbeitung der doInBackground-Methode wird impizit die onPostExecute-Methode aufgerufen, die dazu dient, das Ergebnis auf der Benutzeroberfläche auszugeben. Hierzu wird in diesem Beispiel eine TextView referenziert um das Ergebnis der oben beschriebenen Berechnung als Text auszugeben. Um die, in einem XML Layout File definierte View zu referenzieren, ist eine Referenz auf die zugehörige Activity nötig, die dem AsyncTask über den Konstruktor übergeben wurde. Falls das TaskResult-Objekt ein gültiges Ergebnis beinhaltet, wird der entsprechende Wert in der TextView ausgegeben, anderenfalls wird ein Text ausgegeben, der auf eine Division durch null hinweist.

22. März 2013

Ubuntu: Zu große Dashboard-Icons *Workaround*

Unter Ubuntu 12.10 gibt es offenbar einen Bug, der dazu führt, dass über *.desktop-Files manuell definierte Anwendungs-Icons im Unity-Dashboard unskaliert und damit eventuell viel zu groß dargestellt werden. Die Erstellung solcher Icons wurde bereits in diesem Post, der sich um die Installation der Eclipse-IDE drehte, erläutert. Allgemeine Information über solche Icons sind unter diesem Link zu finden.

Zu großes Icon im Unity-Dashboard (Klicken zum Vergrößern)

Im Folgenden soll ein einfacher Workaround vorgestellt werden, der es ermöglicht dass auch die Icons manuell definierter *.dektop-Files in der korrekten Größe angezeigt werden.

  • Zunächst muss die *.xpm-Datei, die als Icon definiert wurde in das Verzeichnis ~/.local/share/icons kopiert werden.
  • Anschließend muss die *.desktop-Datei in der das Anwendungs-Icon definiert wurde editiert werden. Diese Dateien befinden sich in dem Verzeichnis /usr/share/applications. In der Zeile, die mit "Icon=" beginnt, muss hinter dem "=" der Dateinamen der *.xml-Datei ohne Dateiendung eingetragen werden.

Das Icon im Unity-Dashboard nach Anwendung des Workarounds (Klicken zum Vergrößern)

Ubuntu: Eclipse installieren

Um die IDE Eclipse unter Ubuntu zu installieren gibt es prinzipiell zwei Möglichkeiten: Entweder über das "Ubuntu-Software Center" oder durch manuelles Herunterladen und Installieren.

Der Weg über das Software Center wäre der bequemere, jedoch ist die angebotene Version stark veraltet und es werden keine Updates durch die Aktualisierungsverwaltung angeboten. Der Grund hierfür ist, dass Eclipse nicht in den Repositories angeboten wird, was sich vermutlich auch auf absehbare Zeit nicht ändern wird, da es sich bei Eclipse faktisch um eine Standalone-Anwendung handelt, die keine klassische Installation von Paketen benötigt.

Veraltete Version von Eclipse im Ubuntu-Software Center (Klicken zum Vergrößern)

Aus diesem Grund soll im Folgenden die manuelle Installation der IDE erläutert werden. Diese lässt sich anschließend übrigens über den internen Update-Mechanismus unter dem Menüpunkt Help → Check for Updates auf dem aktuellen Stand halten.
  • Die Vorraussetzung für die Installation von Eclipse ist eine lauffähige Installation des Java JDKs. Dessen Vorhandensein kann über folgenden Konsolenbefehl getestet werden:
     java -version 
  • Falls die Eclipse-Installation für die C++-Programmierung verwendet werden soll, muss außerdem der C++-Compiler "g++" installiert sein. Das kann über den folgenden Befehl überprüft werden:
     g++ --version  
  • Nun muss die gewünschte Eclipse-Version unter http://www.eclipse.org/downloads/ heruntergeladen werden.
  • Das heruntergeladene Archiv kann nun über unten stehenden Befehl extrahiert werden (wobei der Dateinamen natürlich angepasst werden muss):
     tar xzf eclipse-SDK-4.2.2-linux-gtk-x86_64.tar.gz
  • Die auf diese Weise entpackten Dateien müssen nun in das Verzeichnis /opt verschoben werden. Dies ist über folgenden Befehl möglich:
     sudo mv eclipse /opt
  • Um die Anwendung zu starten kann nun folgender Befehl in der Konsole ausgefürt werden:
Symbolischen Link erstellen:
Um einen symbolischen Link auf die Anwendung im Verzeichnis /usr/local/bin zu erstellen, müssen außerdem noch die folgenden zwei Befehle ausgeführt werden. Dies hat den Vorteil, dass sich die Anwendung dadurch ohne Pfadangabe durch die Angabe ihres Namens starten lässt und dass ihr Vorhandensein dem Betriebssystem bekannt wird
 cd /usr/local/bin  
 sudo ln -s /opt/eclipse/eclipse  
Anwendungs-Icon erstellen:
Um ein Anwendungs-Icon, dass mit der Eclipse-IDE verknüpft werden soll und beispielsweise bei einer Suche im Dashboard angezeigt wird, zu erzeugen, muss zunächst folgender Befehl ausgeführt werden:
 sudo gedit /usr/share/applications/eclipse.desktop  
In das, sich daraufhin öffnende, Editor-Fenster muss dann der folgende Inhalt kopiert werden:
 [Desktop Entry]  
 Name=Eclipse   
 Type=Application  
 Exec=/opt/eclipse/eclipse  
 Terminal=false  
 Icon=/opt/eclipse/icon.xpm  
 Comment=Integrated Development Environment  
 NoDisplay=false  
 Categories=Development;IDE  
 Name[en]=eclipse.desktop  
Das Prinzip solcher *.desktop-Files unter Ubuntu wird unter diesem Link näher erläutert.

Anmerkung: Unter Ubuntu 12.10 kann es bei der Verwendung des Anwendungs-Icons nach dem oben beschriebenen Vorgehen zu einem Bug kommen, der dazu führt, dass das Eclipse-Icon im Dashboard viel zu groß dargestellt wird. In diesem Post ist von nun an ein Workaround beschrieben, der dem entgegenwirkt.

21. März 2013

Ubuntu: Amazon-Suche aus Dashboard entfernen

Ein wichtiger Bestandteil von Ubuntu ist das Dashboard, bzw. die damit verbundene Suche. Durch sogenannte "Lenses" werden Suchergebnisse einer bestimmten Kategorie angeboten. Neben lokalen Ergebnissen können dies auch Online-Suchergebnisse sein. So wurde seit Ubuntu 12.10 eine Amazon-Suche integriert, welche aufgrund von Datenschutzaspekten und dem entstehenden Traffic jedoch bei manchem User auf wenig Gegenliebe stößt. Im Folgenden soll kurz erklärt werden, wie man diese Amazon-Suche aus dem Dashboard entfernt.
Online-Suchergebnisse im Ubuntu-Dashboard (Klicken zum Vergrößern)
Die einfachste Möglichkeit ist es, das Packet, das für die Amazon-Suche verantwortlich ist, zu entfernen. Die ist über folgenden Konsolenbefehl möglich:
 sudo apt-get remove unity-lens-shopping  
Alternativ kann auch auf ein Tool, wie z.B. "Unity Tweak Tool" zurückgegriffen werden, das die Möglichkeit bietet, zu konfigurieren welche Lenses in die Dashboard-Suche miteinbezogen werden sollen.

Wer nicht nur die Amazon-Suche, sondern alle entsprechenden Lenses, die Online-Suchergebnisse liefern, abschalten will, findet eine entsprechende Option in den Ubuntu-Systemeinstellungen unter Systemeinstellungen → Privatsphäre → Suchergebnisse.
Option zur Deaktivierung von Online-Suchergebnissen in den Ubuntu-Systemeinstellungen (Klicken zum Vergrößern)

20. März 2013

Ubuntu: Icon-Packs installieren

In diesem Post wurde bereits erklärt, wie unter der Linux-Distribution "Ubuntu" sogenannte Themes installiert und verwendet werden können, um so das Erscheinungsbild des Betriebssystems nach Belieben anzupassen. Analog zu dieser Anleitung können auch die vom System verwendeten Icons durch die Installation von sogenannten Icon-Packs konfiguriert werden.

Hierfür ist es nötig, die heruntergeladenen Icons in das Verzeichnis /usr/share/icons  zu kopieren. Anschließend können diese für die Verwendung durch den Unity-Desktop konfiguriert werden. Dazu ist ein Tool wie z.B. "GNOME Tweak Tool", "Unsettings" oder "Unity Tweak Tool" nötig. Die Installation des letzteren Tools wurde bereits in dem oben genannten Post behandelt. Um das Icon-Pack zu verwenden muss lediglich der Menüpunk "Icons" verwendet werden um das entsprechende Icon-Pack auszuwählen.
Der Menüpunkt von "Unity Tweak Tool" zur Auswahl eines Icon-Packs (Klicken zum Vergrößern)
Zur Verwendung des Themes "Numix", das beispielhaft von dem eingangs erwähnten Post über die Installation von Themes, verwendet wird, kann das Icon-Pack "Humanity-Colors" empfohlen werden. Es besteht aus Icons, die in 8 verschiedenen Farbvarianten vorliegen und lässt sich über folgende Konsolenbefehle installieren:
 sudo add-apt-repository ppa:ravefinity-project/ppa  
 sudo apt-get update  
 sudo apt-get install humanity-colors  

Ubuntu: Themes installieren

Dieser Post soll in den folgenden Schritten beispielhaft zeigen, wie es möglich ist unter Ubuntu, bzw. dessen Unity-Oberfläche, Themes zu installieren um das Erscheinungsbild des Betriebsystems anzupassen. Als Beispiel soll die Installation des GTK3-Themes "Numix" dienen, das unter diesem Link frei verfügbar ist.
  • Zunächst muss das Theme heruntergeladen und das entsprechende Archiv anschließen entpackt werden. Dies ist über folgenden Konsolenbefehl möglich:
     unzip numix___gtk3_theme_by_satya164-d5ygul6.zip   
  • Anschließend müssen die entpackten Dateien in das Verzeichnis /usr/share/themes kopiert werden, was über folgenden Befehl bewerkstelligt werden kann:
     sudo mv Numix /usr/share/themes/  
  • Für GTK2-Anwendungen wird außerdem, falls nicht bereits vorhanden, die "Murrine"-Engine benötigt. Diese lässt sich einfach über folgenden Befehl installieren:
     sudo apt-get install gtk2-engines-murrine  
  • Um das, auf diese Weise installierte, Theme anzuwenden bedarf eines Tools, wie z.B. "GNOME Tweak Tool", "Unsettings" oder "Unity Tweak Tool". Im Folgenden soll die Anwendung des Themes mit Hilfe des letzteren Tools erklärt werden. Dieses muss zunächst über folgende Konsolenbefehle installiert werden:
     sudo add-apt-repository ppa:freyja-dev/unity-tweak-tool-daily  
     sudo apt-get update && sudo apt-get install unity-tweak-tool  
  • Anschließend kann dieses Tool dazu verwendet werden, das Theme anzuwenden. Dazu muss unter dem Menü-Punkt "Theme" das entsprechende Theme ausgewählt werden.
    Der Menüpunkt "Theme" in Unity Tweak Tool (Klicken zum Vergrößern)

Als Resultat einer solchen Theme-Änderung könnte der Ubuntu-Desktop wie in folgendem beispielhaften Screenshot des Numix-Themes, erscheinen:
Der Ubuntu-Desktop unter Verwendung des Themes "Numix" (Klicken zum Vergrößern)
Anmerkung: Zu einem gut aussehenden Theme gehören stets auch passende Icons. Die Installation von Icon-Packs wird in diesem Post behandelt. Auch wird dort ein Icon-Pack beschrieben, das zu dem, in diesem Post beispielhaft verwendeten, Theme "Numix" passt.

Ubuntu: Update von LTS-Releases

Die Versionen der beliebten Linux-Distribution "Ubuntu" lassen sich in zwei Kategorien aufteilen: Sogenannte "Long-Term-Releases" und Zwischenreleases. Die LTS-Releases sind hierbei für einen längerfristigen, stabilen Einsatz ausgelegt, weshalb ihr Support-Zeitraum ganze 5 Jahre beträgt, während die Releases, die zwischen zwei LTS-Versionen veröffentlicht werden, lediglich für 9 Monate (früher 18 Monate) supportet werden.

Wer eine LTS-Version von Ubuntu im Betrieb hat, jedoch in den Genuss der neuen Funktionen, der darauf folgenden Releases kommen will, muss feststellen, dass die Aktualisierungsverwaltung keine Updates auf diese neueren Versionen anbietet, falls eine LTS-Version installiert ist. In den folgenden Schritten soll erklärt werden, wie trotzdem von einem Long-Term-Release auf nachfolgende Zwischenversionen geupdatet werden kann. Die Anleitung bezieht sich dabei auf die Aktualisierung von der LTS-Version 12.04 "Precise Pangolin" auf die Version 12.10 "Quantal Quetzal".
  • Zunächst muss der Update-Manager gestartet werden. Dies ist beispielsweise über das Dashboard möglich.
Starten des Update-Managers über das Ubuntu-Dashboard
  • Über einen Button im linken, unteren Eck des Update-Managers lassen sich dessen Einstellungen anpassen.
Der Button zu den Einstellungen des Update-Managers
  • Unter dem Register "Aktualisierungen" des Einstellungs-Dialogs befindet sich ganz unten eine Option "Über neue Ubuntu-Versionen benachrichtigen". Standardmäßig ist der Wert "Für Langzeitunterstützungsversionen" ausgewählt. Um auch Benachrichtigungen über Zwischenversionen zu erhalten, muss der Wert "Für jede neue Version" eingestellt werden. Eine Änderung dieser Option erfordert die Eingabe des User-Passwortes.
    Auswahl zur Benachrichtigung über jedes Release (Klicken zum Vergrößern)
  • Anschließend muss der Update-Manager geschlossen und neu gestartet werden. Danach sollte auf die Verfügbarkeit einer neuen Ubuntu-Version hingewiesen werden, die über einen Klick auf "Aktualisieren" sofort installiert werden kann.
Benachrichtigung über die Verfügbarkeit einer neuen Ubuntu-Version (Klicken zum Vergrößern)

Falls benutzerdefinierte PPAs hinzugefügt wurden, werden diese bei einem solchen Update entfernt und müssen anschließen wieder manuell hinzugefügt werden. Dabei ist zu überprüfen, ob die jeweiligen PPAs die neue Version überhaupt unterstützen. 

Eine Übersicht über die aktuellen und zukünftigen Ubuntu-Versionen findet man unter diesem Link.

Ubuntu: Versionsinformationen auslesen

Um unter der Linux-Distribution "Ubuntu" Informationen über die aktuell installierte Version auszulesen, kann folgender Konsolenbefehl genutzt werden:
 lsb_release -a 
Eine beispielhafte Ausgabe der Befehls ist unten zu sehen. Sie enthält neben der Versionsnummer auch den Codenamen des Releases. In diesem Beispiel handelt es sich um ein Ubuntu in der Version 12.04 mit dem Codenamen "Precise Pangolin".
 No LSB modules are available.
 Distributor ID:  Ubuntu
 Description:     Ubuntu 12.04.2 LTS
 Release:         12.04
 Codename:        precise 
Die Informationen, die anhand dieses Befehls ausgelesen werden, sind in der Datei /etc/lsb-release hinterlegt.

Um dagegen die Version des Linux-Kernels auszugeben, der von der Distribution aktuell genutzt wird, kann folgender Konsolenbefehl genutzt werden:
 uname -r
Die entsprechende Ausgabe unter der oben aufgeführten Ubuntu-Installation lautet hierbei z.B. folgendermaßen:
 3.2.0-38-generic