#PrismBreak – Windows nach Linux

Hier hatte ich ja angekündigt, was ich alles ändern möchte. Mittlerweile sind einige Wochen vergangen, den aktuellen Stand habe ich auf dem Webmontag Frankfurt bereits präsentiert. Jetzt heisst es weitere Informationen zu liefern. Den Anfang macht mein Umstieg von Windows 8 auf Linux.

Ubuntu vs. Linux Mint

Wenn es um den Einsatz von Linux geht, wird meistens Ubuntu als Distribution der Wahl empfohlen. Leider wurde in die Ubuntu-Suche Amazon-Suchergebnisse mit eingebunden. Man kann diese Funktion zwar deaktivieren, das ganze hinterlässt allerdings einen gewissen Nachgeschmack. Daher hatte ich mich nach einer Alternative umgeschaut. Ich entschied mich schliesslich dafür, Linux Mint auszuprobieren. Linux Mint wird als sehr anwenderfreundlich empfohlen, ähnlich Ubuntu. Zum Zeitpunkt meiner #PrismBreak Aktion war Linux Mint 15 (Olivia) aktuell und wurde von mir eingesetzt.

Asus Zenbook

Begonnen habe ich mit meinem Asus Zenbook UX51VZ. Das hat sich auch gleich als knifflig herausgestellt. Es war mit Win 8 installiert, das BIOS ist ein modernes UEFI. Besonderheit bei diesen Notebook ist, dass es zwei SSD eingebaut hat, welche als RAID konfiguriert sind. Und diese RAID-Konfiguration war zu Beginn ein Problem.

Recht früh bei der Installation wird man nach der Partitionierung der Festplatte gefragt. Mit aktivierter RAID-Einstellung im UEFI bekam ich ziemlich viele einzelne Partitionen zur Auswahl angeboten. Manche Partition kleiner, andere wieder etwas grösser. Irgendwie nichts brauchbares dabei.

Um es kurz zu machen, ich habe mir eine Live CD von Gparted auf einen USB-Stick installiert und damit nach mehreren Versuchen die Partitionen löschen können.

Anschliessend konnte die Installation von Linux Mint „fast“ normal durchgeführt werden. Ich habe die beiden SSDs getrennt nach root (/) und home (/home). Nach der Installation wurde ein Neustart durchgeführt, Linux wurde aber nicht gestartet, da es Probleme mit der Grub-Konfiguration gab. Zum Glück gibt es dafür aber ein Tool, welches sich erfolgreich darum gekümmert hat: Boot-Repair. Wenn ich mich richtig erinnere, habe ich dazu Linux Mint vom USB-Stick als Live-System gestartet, Boot-Repair nachinstalliert und dann gestartet. Die Funktion „Recommended repair“ hatte ausgereicht. Anschliessend konnte Linux Mint sauber starten.

Nach einigen Tagen stellte sich heraus, das es noch ein Problem mit der Installation gab. Das System „fror“ immer wieder kurz ein, es wollte keinerlei Eingaben von der Tastatur entgegen nehmen und Anwendungen reagierten nicht mehr auf Mausklicks. Nach ein paar Sekunden war alles wieder ok, nur um nach kurzer Zeit wieder einzufrieren. Linux Mint wird mit zwei unterschiedlichen Fenstermanagern angeboten, Cinnamon und MATE. Ich hatte zuerst Cinnamon ausprobiert gehabt. Nachdem ich im Netz keine ähnlichen Berichte und entsprechend auch keine Lösungen finden konnte, entschied ich mich die MATE-Variante auszuprobieren. Damit traten dann keine Probleme mehr auf.

Was hier kurz beschrieben ist, hat einige Abende/Nächte Zeit gekostet. Hier hat sich noch jemand die Mühe gemacht, seine Probleme und Lösungen zu einzelnen Punkten mit der Linux-Installation auf dem Zenbook zu dokumentieren.

Womit wir zum kompletten Gegenteil kommen:

Dell XPS 17

Das Dell XPS 17 ist mein Arbeitstier und entsprechend ausgestattet, hat aber keine so ausgefallene Konfiguration wie das Zenbook mit seinen in RAID geschalteten SSDs. In dem Dell befindet sich eine SSD für das Betriebssystem und eine normale Festplatte für Daten. Ausserdem besitzt es kein UEFI sondern noch ein BIOS. Die Installation von Linux Mint per USB Stick funktionierte hier dann auch absolut ohne Probleme. Partitioniert habe ich es analog dem Zenbook, root (/) liegt auf der SSD, home (/home) auf der Festplatte.

Software

Die Installationen von zusätzlicher Software auf beiden Geräten ist identisch. Aktuell benötige ich folgende Programme auf beiden Rechnern:

  • Firefox
    bereits installiert nach Installation von Linux Mint.
  • Libre Office
    bereits installiert nach Installation von Linux Mint.
  • Eclipse
    von eclipse.org geladen, findet es sich jetzt unter /opt.
  • Sublime Text 2
    von www.sublimetext.com geladen, findet sich ebenfalls unter /opt.
  • Pidgin
    Per Paketmanager installiert, zusätzlich noch das OTR-Plugin.
  • Spotify
    ich war bisher Spotify Kunde. Leider bieten sie keinen Linux-Client an. Spotify hat eine Linux Preview, welche man bereits nutzen kann. Die Installation liegt ebenfalls unter /opt.
  • 1Password
    Ein kommerzieller Passwortmanager. Eine Windowssoftware, welche es nicht für Linux gibt. Danke Wine funktioniert die Anwendung aber auch unter Linux. Allerdings gibt es unter Linux keine Integration mit den Browsern.

 Was fehlt?

Sicherlich viele Kleinigkeiten. Das Powermanagement der Rechner kann bestimmt noch optimiert werden.

Beide Rechner sind mit beleuchteten Tastaturen ausgestatet. Soweit ich das bisher erkennen kann, funktioniert ein automatisches ein- und ausschalten der Tastaturbeleuchtung nicht, man kann es nur manuell steuern.

Ich habe noch nicht meinen Musikplayer gefunden, mit dem ich voll und ganz zufrieden bin. Aktuell teste ich Rhythmbox und Banshee.

Eine Sache die mir positiv aufgefallen ist: Drucker, Scanner und meine ganzen Android-Devices wurden ohne grossen Aufwand erkannt. Beide Drucker sind Netzwerkdrucker und wurden nach einem Suchlauf im internen Netz erkannt. Beim Tintenstrahldrucker musste ich noch einen passenden Treiber beim Hersteller herunterladen. Aber danach funktionierte dieser auch.

Fazit bisher: ich vermisse nichts. An spezieller Windows-Software hatte ich nur MS Office 2010 im Einsatz. Und 1Password.

PrismBreak oder wieso und wie ich mein elektronisches Leben umkrempel

Ich führe ein recht unprivates Leben, checke gerne und überall mit Foursquare ein, poste privates auf Twitter, Facebook, Google+ oder sonst wo, meine mit dem Smartphone gemachten Fotos werden automatisch bei Google+ hochgeladen (privat, liegen aber damit schon bei Google), manche finden ihren Weg über Instagram nach Tumblr, Twitter und Facebook.

Bis heute….genauer gesagt, gestern…da hatten wir vom Webmontag Frankfurt Team ein Treffen und kamen auf das Thema PRISM und co zu sprechen. Nach den doch recht heftigen Diskussionen zu dem Themenkomplex an dem Abend kam ich auf dem Nachhauseweg zur Erkenntnis, dass es bei mir so nicht weitergehen kann. Ich habe die ganzen Dienste gerne genutzt…und reichlich. Wenn es einen neuen Dienst gibt, der interessant aussieht melde ich mich an….bin halt ein Spielkind. Aber dieses Spielkind wird gerade motzig. Man macht mir meine Spielwiese madig. Madig in der Form, dass ich nicht mehr entscheiden kann und darf, welche Infos wirklich aus meiner Hand an andere weitergegeben werden. Schicke ich Mails, weiss ich nicht wirklich, wer noch alles mit ließt. Lade ich Bilder privat bei Facebook oder Google+ hoch, wer schaut sie sich noch an außer den Algorithmen? Ist ja nicht nur PRISM, vor unserer eigenen Haustür müssen unsere Rechte auch ordentlich Federn lassen, Thema Bestandsdatenauskunft. Ich hoffe, ich gehe das Thema mit genügend normalen Menschenverstand an. Ich werde mich nicht von Diensten wie Twitter, Facebook, G+ oder App.net verkrümeln. Dort sind einfach zu viele Leute unterwegs, die ich nicht missen möchte. Und ich bekomme darüber zu viele Hinweis auf interessante Themen. Ich werde mir aber in Zukunft überlegen, was ich dort poste. Und ich werde in Zukunft überlegen, welche Dienste ich wirklich nutze. Genug zu den Gründen, jetzt mal zu den Punkten, die ich ändern will. Vollständig wird die Liste nicht sein, im Laufe der Zeit wird sicherlich das ein oder andere ergänzt werden.

Auf der Seite http://prism-break.org/ kann man sich übrigens nach Alternativen zu Diensten und Software umschauen.

Software

Windows durch Linux ersetzen

Warum das? Auf der Präsentation bezüglich PRISM fand sich Microsoft. Könnte sein, dass damit „nur“ die angebotenen Onlinedienste gemeint sind, sicher kann man allerdings nicht sein. Daher werde ich die meine beiden Notebooks versuchen auf Linux umzustellen. Zuerst dachte ich an Ubuntu, allerdings leiten sie in Ubuntu Suchanfragen an Amazon weiter…daher werde ich Linux Mint testen.

Da ich aber noch einiges an Windows-Spielen habe, werde ich schon noch einen Windows-Rechner benötigen (ab und an benötige ich das als „Ausgleich“). Allerdings wird er rein für die Spiele zur Verfügung stehen und keinerlei andere Daten dort drauf liegen. Daher liebäugele ich mit der c’t Steambox.

Chrome durch Firefox

Eigentlich vertraue ich ja Google…eigentlich. Aber was passiert mit den Daten, die sie von mir auch dank der Nutzung von Chrome, sammeln? Dabei denke ich noch nicht mal an die kommerzielle Nutzung, sondern wieder daran, was NSA und co sich davon abgreifen. Daher wechsel von Chrome nach Firefox.

1Password

Jahrelang hat mir 1Password treu gedient. Bei meinem Wechsel von Mac auf Windows letztes Jahr konnte ich eine neue Lizenz für Windows erwerben und alles war gut. Mit dem Wechsel auf Linux muss ich mich leider nach einer Alternative umschauen. Die Alternative muss sowohl für Linux wie auch für Android verfügbar sein.

Stock-Android durch CyanogenMod ersetzen (Privacy Guard)

Auch hier wieder das Problem, dass man nicht wirklich weiss, wer oder was „nach Hause“ telefoniert. Heute musste ich lesen, dass ein Motorola Droid X2 gerne nach Hause telefoniert. Bei CyanogenMod, einem sogenannten Custom ROM, wurde die Funktion Privacy Guard eingefügt. Damit kann man den Zugriff von Apps auf sensitive Daten (z.B. Kalender, Kontakte oder GPS-Position) sperren.

Da ich CyanogenMod bereits auf meinem Samsung S3 ausprobiert habe, werde ich es wohl auch auf meinen anderen Android-Geräten installieren, falls sie entsprechend unterstützt werden.

Dienste

Google Dienste: GMail, Calendar, Drive, Contacts

Meine täglichen Arbeitstiere! Die Umstellung wird sicherlich nicht so einfach werden. Calendar und Contacts wird hoffentlich durch OwnCloud abgedeckt werden können. Bei Drive werde ich insbesondere die Spreadsheet vermissen, da ich damit meine Zeiterfassung für Kundenprojekte durchgeführt habe. Aktuell kann ich nur Calendar und Contacts direkt ablösen. Für GMail und Drive habe ich noch keine direkte Lösung. Bei GMail bin ich mir auch noch nicht sicher, ob ich die Mailserver meines Domainhosters nutzen soll oder versuchen soll, einen eigenen Mailserver aufzusetzen (ich sag nur SINA). Auch ist noch nicht klar, ob es wieder eine Webmailer-Lösung wird, oder ob ein Fat-Client (z.B. Thunderbird) die Arbeit übernimmt.

Dropbox

Ist aktuell mehr oder weniger schon durch die Software Cloud Station des Herstellers meiner NAS-Box, Synology, abgelöst. Allerdings bietet er keinen Linux-Client an. Hier könnte OwnCloud die Alternative sein.

Mail verschlüsseln

Wenn ich auf GMail geblieben wäre, hätte vielleicht Mailvelope eine Lösung sein können. So muss ich es davon abhängig machen, wie der Ersatz für GMail aussehen wird. Bei Nutzung von Thunderbird wäre Enigmail wohl eine Möglichkeit.

Hangouts gegen verschlüsselte Alternative

Nicht nur Google Hangout, auch für Skype sollte eine Alternative her. Das Ganze muss über Plattformgrenzen hinweg funktionieren, am Besten mit einer End-zu-End-Verschlüsselung. Bin gespannt, ob man hier was finden kann.

Evernote

Evernote „missbrauche“ ich aktuell als Bookmarksammlung. Von daher suche ich nicht wirklich nach einer Alternative.

Picasaweb

Picasaweb, oder jetzt eher Google+ Photos. Das automatische Hochladen von gemachten Fotos aufm Smartphone habe ich bereits deaktiviert. Könnte auch durch OwnCloud abgelöst werden.

Play Music (Android)

Da werde ich verschiedene Player ausprobieren müssen. Als erster wird wohl DoubleTwist getestet. Zusammen mit AirSync könnte das eine Lösung sein.

Websuche

Google ist im Moment einfach der Standard, das zu ändern…puh… Ich werde mir DuckDuckGo anschauen.

 

Und jetzt?

Wie geht es jetzt weiter? Während ich viel zu lange an diesem Blogpost gesessen habe, sichere ich die Daten von einem Notebook, welches ich jeden Tag mit zu meinen Kunden nehme. Das heisst, der Wechsel von Windows auf Linux werde ich wohl als Erstes angehen.

Da ich OwnCloud schon vor ein paar Wochen auf meinem NAS installiert und eingerichtet habe, werde ich die Funktionen, die ich dort nutzen kann, parallel weiter einrichten und testen.

Ich bin gespannt, was ich alles vergessen habe und was mir im Laufe der Zeit alles noch auffällt…

Update 03.07.2013

Mittlerweile wurde ich dazu verdonnert, meinen aktuellen Stand mal zu präsentieren. Das Ergbnis findet man hier.

[OwnCloud] Einrichten auf Synology NAS

Wer seine Daten (Kalender, Kontaktdaten, Dateien) nicht mehr in die Hand von Firmen geben will, kann versuchen mit OwnCloud seine Bedürfnisse zu befriedigen. Irgendwo muss die OwnCloud-Installation laufen. Bei mir hat sich mein Synology-NAS angeboten. Dort kann man verschiedene Anwendungen nachinstallieren, um das NAS entsprechend an die eigenen Bedürfnisse anpassen zu können. OwnCloud wird leider nicht standardmässig zur Installation angeboten. Kurzes googeln und es fand sich eine Anleitung, die auch funktioniert hat.

Unter http://www.eg-blog.de/?page_id=639 fand sich eine einfache Anleitung. Wenn man OwnCloud einfach nur mal kurz antesten will, reicht diese Anleitung aus. Will man OwnCloud „richtig“ nutzen, sollte man sich noch die erweiterte Anleitung durchlesen: http://www.eg-blog.de/?page_id=639.

Neben dem in der Anleitung aufgeführten Anwendungsrepository http://www.cphub.net haben ich noch das von http://www.synocommunity.com/ eingebunden. Die Anleitung, wie es einzurichten ist, findet sich unter http://www.synocommunity.com/faq.

Unter http://doc.owncloud.org/server/5.0/user_manual/calendars.html#synchronising-calendars-with-caldav findet sich eine Anleitung, wie man an die Kalenderdaten kommt und mit welcher Adresse man es in entsprechenden mobilen Apps einbinden kann. Für das Syncen der Kalenderdaten nehme ich https://play.google.com/store/apps/details?id=org.dmfs.caldav.lib.

Unter http://doc.owncloud.org/server/5.0/user_manual/contacts.html gibt es eine Anleitung, wie man an die Kontaktdaten kommt. Fürs syncen der Daten habe ich https://play.google.com/store/apps/details?id=org.dmfs.carddav.Sync genutzt.

[Mac] Mac wechselt nicht mehr in den Ruhezustand

Ein Freund von mir hatte das Problem, dass sich sein Mac nicht mehr in den Ruhezustand versetzen lies. Er ist immer wieder aus dem Ruhezustand von selbst aufgewacht, obwohl er das nicht machen sollte. Wie sich rausstellte, war das Problem sein Drucker.

Mittels „pmset -g assertions“ im Terminal gab es folgende Informationen:

18.03.12 16:12:36 MEZ   
Assertion status system-wide:
   ChargeInhibit                           0
   PreventUserIdleDisplaySleep             0
   PreventUserIdleSystemSleep              0
   NoRealPowerSources_debug                0
   CPUBoundAssertion                       0
   EnableIdleSleep                         1
   PreventSystemSleep                      1
   DisableInflow                           0
   DisableLowPowerBatteryWarnings          0
   ExternalMedia                           1

Listed by owning process:
  pid 30: [0x0000012c0000001e] ExternalMedia named: "com.apple.powermanagement.externalmediamounted" 
  pid 514: [0x0000012c00000202] PreventSystemSleep named: "org.cups.cupsd"

PreventSystemSleep zeigt an das es knarzt, sollte auf 0 sein. Unten in der Prozessliste sieht man dann, dass cupsd das problem verursacht. Er hat dann bei den Druckeinestellungen nachgeschaut, und irgendwie stand da was das der Drucker online oder schlafend wäre, was er aber nicht war. Das hatte sich dort restartresistent festgesetzt. Er hat es dann gelöscht. Anschliessend wurde der Drucker offline gezeigt und der Ruhezustand ging wieder.

[Android] RESTEasy und Android

Wurde eine REST-Schnittstelle auf Server-Seite mit RESTEasy implementiert, gab es bisher keine wirkliche Möglichkeit, mit RESTEasy den vorhandenen Code auch auf Android-Seite zu nutzen. RESTEasy funktionierte bisher nicht unter Android. Thomas Diesler hat glücklicherweise ein Projekt auf github (https://github.com/tdiesler/resteasy-mobile) gestartet, welches diesen Teil nachimplementiert. Er hat hierzu auch einen Blogpost verfasst.

Nachfolgende die Kurzform der notwendigen Schritte. Ich habe den Code in drei Projekte aufgeteilt:

  • REST-Interface und Transferobjekte
    In diesem Projekt werden die Transferobjekte und das REST-Interface implementiert. Transferobjekte sind die Klassen, die die Daten zwischen Server und Client kapseln. Wie der Name REST-Interface schon vermuten lässt, wird damit die Schnittstelle zwischen Client und Server definiert (aber noch nicht implementiert). Nutzt Maven.
  • REST-Server-Implementierung
    Die Implementierung der Backend-Logik. Benutzt das REST-Interface und die Transferobjekte. Nutzt Maven.
  • REST für Android
    Die Implementierung der Android-Client-Seite. Benutzt das REST-Interface und die Transferobjekte.

Für das REST-Interface und Transferobjekte wird folgende Dependency in der pom.xml eingetragen:

<dependency>
 <groupId>org.jboss.resteasy</groupId>
 <artifactId>resteasy-jaxrs</artifactId>
 <version>1.2.1.GA</version>
</dependency>

Für die REST-Server-Implementierung werden folgende Dependencies in der pom.xml eingetragen:

<dependency>
 <groupId>org.jboss.resteasy</groupId>
 <artifactId>resteasy-jaxrs</artifactId>
 <version>1.2.1.GA</version>
</dependency>

<dependency>
 <groupId>org.jboss.resteasy</groupId>
 <artifactId>resteasy-jaxb-provider</artifactId>
 <version>1.2.1.GA</version>
 </dependency>

<dependency>
 <groupId>org.jboss.resteasy</groupId>
 <artifactId>jaxrs-api</artifactId>
 <version>1.2.1.GA</version>
</dependency>

<dependency>
 <groupId>net.sf.scannotation</groupId>
 <artifactId>scannotation</artifactId>
 <version>1.0.2</version>
</dependency>

<dependency>
 <groupId>org.jboss.resteasy</groupId>
 <artifactId>resteasy-jackson-provider</artifactId>
 <version>2.3.1.GA</version>
</dependency>

<!-- Reference to REST-Interface-Project -->
<dependency>
 <groupId>de.yellowshoes.rest</groupId>
 <artifactId>restinterface</artifactId>
 <version>0.0.1-SNAPSHOT</version>
</dependency>

Auf Android-Seite ist kein Maven im Einsatz. Folgende Libraries werden im Buildpath mit aufgenommen:

  • Jackson Core ASL 1.6.3
  • Jackson JAXRS 1.6.3
  • Jackson Mapper ASL 1.6.3
  • Jackson XC 1.6.3
  • JAXRS API 2.2.1 GA von RESTEasy
  • RESTEasy Mobile 1.0.0

Nachfolgend ein einfaches Beispiel, wie eine konkrete Implementierungen aussehen kann:

REST-Interface

Zuerst die Transferklasse. Hier ein Objekt Book. Ein simples POJO, mehr nicht.

public class Book
 {
 private String titel;
 private String author;

 public String getTitel()
 {
 return titel;
 }

public void setTitel( String titel )
 {
 this.titel = titel;
 }

public String getAuthor()
 {
 return author;
 }

public void setAuthor( String author )
 {
 this.author = author;
 }
}

Nun das REST-Interface. Die @Path-Annotation definiert jeweils, an welche Url die Klasse/die Methode gebunden wird. Hier wird das komplette Interface an /api gebunden, die Methode (durch die Vererbung) an /api/book. Mit den Annotations @Consumes und @Produces wird festgelegt, was für MediaTypes verarbeitet werden können und was zurückgeschickt werden kann. Hier wird jeweils JSON definiert.

@Path( "/api" )
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
public interface RestResourceInterface
 {
 @GET
 @Path( "/book" )
 public Book getBook();
 }

REST-Implementierung

Auf Server-Seite wird nur eine Klasse benötigt.

public class RestResource implements RestResourceInterface
 {
 public Book getBook()
  {
  Book book = new Book();
  book.setAuthor( "Hans Müller" );
  book.setTitel( "REST gut" );
  return book;
  }
}

REST-Android

Auch auf Android-Seite muss nicht mehr viel gemacht werden. Hier eine einfache Client-Implementierung. Das wichtigste ist die Methode getClient(), die über die ProxyFactory die Schnittstellen-Implementierung initialisiert. Der Code sollte ansonsten selbsterklärend sein.

public class ResteasyClient implements RestResourceInterface
 {
 RestResourceInterface client = null;

 @Override
 public Book getBook()
  {
  RestResourceInterface client = getClient();
  Book book = client.getBook();
  return book;
  }

 private RestResourceInterface getClient()
  {
  String requestURI = "http://192.168.11.86:8080/restest/";

  if( client == null )
   {
   BasicHttpParams params = new BasicHttpParams();
   HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1 );
   HttpProtocolParams.setContentCharset( params, HTTP.DEFAULT_CONTENT_CHARSET );
   HttpProtocolParams.setUseExpectContinue( params, false );
   client = ProxyFactory.create( RestResourceInterface.class, requestURI, new ApacheHttpClient4Executor( params ) );
   }
  return client;
  }
 }

 

G+ API in Java nutzen

Mit diesem Blogpost soll Beschrieben werden, wie man auf der Google+ API mittels Java zugreifen kann. Da die Dokumentation von Google leider nicht so berauschend ist und auch ein wenig verstreut, trage ich hier einfach mal alles zusammen, was ich auf dem Weg zur Benutzung gefunden habe. Grund ist unter anderem, dass wir bei der GTUG RM einen kleinen Hackathon zur G+ API veranstalten.

Vorbereitung

Um mit der Google+ API arbeiten zu können benötigt man folgende Dinge:

API-Key

Zuerst registriert man sich einen API-Key. Das macht man über die Google API-Console. Bei mir sieht es nach der Registrierung dann so aus. Wichtig ist noch, das man sich eine oder mehrere Redirect URIs einträgt, die man später auch nutzt.

 

Libs

Um auf die API zugreifen zu können, benötigt man zwei Libs-Pakete von Google. Zum einen die Google APIs Client Library for Java (Stand 1.5.1 Beta) und die Google+ API (Stand 1.2.5 Beta).

Da ich kein Maven genutzt habe, musste ich die benötigten Libs manuell zusammensuchen.

Unter der Setup-Seite für die Google APIs Client Library for Java finden sich die Informationen, welche Libs grundsätzlich benötigt werden. Die abhängigen Libs (Dependencies) werde ebenfalls aufgeführt. Netterweise liefert Google alle benötigten Libs gleich mit dazu (zu finden im Unterverzeichnis dependencies der Zip-Datei).

Folgende Libs werden benötigt:

Umsetzung

OAuth

Um die G+ API nutzen zu können, braucht man zum Teil eine OAuth-basierte Autorisierung (man bekommt einen sogenannten Access-Token für die weiteren Zugriff auf die APIs) und/oder einen API-Key. Infos dazu finden sich auf der G+ API OAuth-Seite.

Für die Nutzung von OAuth stellt Google Beispielcode bereit.

Mein Beispiel ist als Web-App (für die Google Appengine) ausgelegt.

Code

Autorisierung anfordern

Um die Autorisierung und damit den Access-Token anzufordern benötigt man folgenden Code:

private void doAuthRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {
   String redirectUrl = getRedirectUrl(req);
   String authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, redirectUrl, SCOPE_GOOGLE_PLUS ).build();
   resp.sendRedirect(authorizeUrl);
}

private String getRedirectUrl( HttpServletRequest req ){
   return "http://" + req.getServerName() + ":" + req.getLocalPort() + "/start";
}

Die CLIENT_ID ist die ID als String, die man in der API-Console zugeordnet bekommen hat. SCOPE_GOOGLE_PLUS erhält den sogenannten Scope der verwendeten API als String, in diesem Fall also für die Google+ API. Der passende Scope-Wert findet sich auf der G+ OAuth-Seite und hat den Wert https://www.googleapis.com/auth/plus.me.

Autorisierungscode auslesen

Nach erfolgter Autorisierung springt die OAuth-API zurück zur angegebenen Redirect-URL. Im Erfolgsfall wird ein Code als Parameter in der URL mitgeschickt, den man ausliest und zum Abfragen eines Access-Tokens verwenden muss.

private void doAuthExtract(HttpServletRequest req, HttpServletResponse resp) throws IOException {
   String code = req.getParameter( "code" );
   HttpTransport TRANSPORT = new NetHttpTransport();
   JsonFactory JSON_FACTORY = new JacksonFactory();
   GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, code, getRedirectUrl(req));
   authRequest.useBasicAuthorization = false;
   AccessTokenResponse authResponse = authRequest.execute();
   String accessToken = authResponse.accessToken;

   if( session != null ){
      session.setAttribute( SESSION_PARM_ACCESS_TOKEN, accessToken);
      session.setAttribute(SESSION_PARM_REFRESH_TOKEN, authResponse.refreshToken);
      this.accessToken = accessToken;
      this.refreshToken = authResponse.refreshToken;
   }

   resp.sendRedirect( getRedirectUrl(req));
}

Somit haben wir jetzt den Access-Token und können damit auf die G+ API zugreifen.

Zugriff auf G+ API

Ein einfaches Beispiel, ohne den Bezug zur Webanwendung, der Zugriff auf die Personensuche.

Plus plus = new Plus( new NetHttpTransport(), new JacksonFactory() );
plus.setKey( API_KEY );
plus.setOauthToken( accessToken );

Search search = plus.people.search();
search.setQuery(query);
PeopleFeed peopleFeed = search.execute();

if( peopleFeed.isEmpty() == false ){
   List<Person> peopleList = peopleFeed.getItems();

   if( peopleList != null ){
      for (Person person : peopleList) {
         System.out.println( person.getDisplayName() );
      }
   }
}

API_KEY ist der API-Key, der über die Google API-Console erstellt wurde. accessToken ist der über OAuth zugewiesene Access-Token und query ist schliesslich der Suchtext.

Die Plus-Klasse (JavaDoc) ist generell der Ausgangspunkt. Über sie greift man auf die G+ API zu.

Von Seiten Google wird noch ein Starter Projekt bereitgestellt, in dem man sich den Sourcecode als Ausgangspunkt für eigene ENtwicklungen vornehmen kann.

Mein Beispielprojekt findet sich bei Google Code.

[Mac] Maus und Tastatur sharen

Um über eine Tastatur und Maus mehrere Rechner zu steuern, gibt es mittlerweile diverse Softwarelösungen.

Teleport (Mac only)

Einfache und kostenlos zu installierende Lösung. Funktioniert einfach und ist bei mir jetzt im Einsatz.
http://abyssoft.com/software/teleport/

Synergy (Win, Mac, Linux)

Kostenlose Lösung, bei der unter Mac noch eine Konfigurationsdatei editiert werden muss.
http://synergy-foss.org/

ScreenRecyler (Mac, Clients auch Win)

Kommerzielle Lösung.
http://www.screenrecycler.com/