IOException.de

Icon

Ausgewählter Nerdkram von Informatikstudenten der Uni Ulm

Anwendungsfachprojekte Ubiquitous Computing

Als Student im Diplomstudiengang Medieninformatik an der Uni Ulm ist es Bestandteil des Hauptstudiums, ein Anwendungsfach aus den Teilgebieten der Medien-Informatik zu belegen. Hierbei stehen unter anderem Vertiefungsrichtungen wie Computergrafik, Computer Vision, Ubiquitous Computing, Medienpädagogik, Interaktive Systeme, Interaktives Video oder Mensch-Maschine Dialogsysteme zur Auswahl.

Ubiquitous Computing steht für den Trend hin zum allgegenwärtigen Computer oder dem „Internet der Dinge“. Ob als intelligenter Kühlschrank, im vernetzten Auto oder in Form von intelligenten Smartphones, der Computer und mit ihm oft auch das Internet werden immer allgegenwärtiger und verschmelzen mit der Umgebung. Das Anwendungsfach besteht einerseits aus den Vorlesungen Multimediasysteme und Mobile & Ubiquitous Computing, und andererseits aus einer wissenschaftlichen Projektarbeit über zwei Semester in Gruppen.

Verschiedene Autoren des Blogs arbeiten derzeit gemeinsam an solchen Projekten und werden diese hier genauer vorstellen.

LRU-Cache in Java

Caches dienen in der Informatik als Methode, Zugriffe auf bestimmte Daten zu beschleunigen, in dem diese vorgelagert/gepuffert werden. Sie sind in verschiedensten Bereichen zu finden, unter anderem auf Prozessoren, in Festplatten, aber auch in Technologien wie dem Web. Verschiedene Verdrängungsstrategien ermöglichen es, die beschränkte Kapazität eines Caches zu berücksichtigen, so dass nur wichtige Werte im Cache gelagert werden. Least Recently Used (LRU), ist eine solche Strategie, die häufig angewandt wird. Sie sortiert die Werte im Cache nach der letzten Nutzung. Wird auf ein Element über einen längeren Zeitraum nicht mehr zugegriffen, so wird es aus dem Cache verdrängt.

In Java lässt sich ein solcher LRU-Cache besonders einfach implementieren, da die Klasse java.util.LinkedHashMap bereits die wesentlichen Mechanismen unterstützt. Eine HashMap ist eine Hash-Tabelle, die Zugriffe auf Werte über ihre Schlüssel regelt. Zusätzlich verkettet die LinkedHashMap aber die Werte noch in einer Liste, womit auch eine Traversierung in Einfügereihenfolge ermöglicht wird. Mithilfe eines Flags in einem der Konstruktoren kann dieses Verhalten geändert werden, so dass bei jedem Zugriff das angesprochene Element neu in diese Liste eingereiht wird. Damit verwaltet die Liste die Zugriffe und ist Basis für die LRU-Strategie.

Die Methode removeEldestEntry() der LinkedHashMap wird bei jedem Schreibezugriff auf die Map, also nach Einfügeoperationen über put() oder putAll() automatisch aufgerufen und bietet die Möglichkeit, durch Überschreiben der Methode die Verdrängungsstrategie zu implementieren. Diese Methode gibt ein boolean zurück, ob der älteste Eintrag gelöscht werden soll. Es ist auch möglich, innerhalb der Methode selbst die Liste zu manipulieren, dann sollte allerdings die Methode immer false zurückgeben. Für den LRU-Cache reicht es aus, die Größe der Map mit dem gewünschten Maximum zu vergleichen. Ist der Inhalt der Map zu groß, so soll das letzte Element gelöscht werden.

Im Folgenden nun der Code dazu. Zu beachten ist noch, dass es sich um eine threadsichere Klasse handelt, da die Map explizit synchronisiert wird.

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * A thread-safe LRU cache implementation based on internal LinkedHashMap.
 *
 * @author Benjamin Erb
 *
 * @param <K> Entry Key Type
 * @param <V> Entry Value Type
 */
public class LRUCache<K, V>
{
	public static final int DEFAULT_MAX_SIZE = 1000;

	private final Map<K, V> internalMap;

	public LRUCache()
	{
		this(DEFAULT_MAX_SIZE);
	}

	public LRUCache(final int maxSize)
	{
		this.internalMap = (Map<K, V>) Collections.synchronizedMap(new LinkedHashMap<K, V>(maxSize + 1, .75F, true)
		{
			private static final long serialVersionUID = 5369285290965670135L;

			@Override
			protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
			{
				return size() > maxSize;
			}
		});
	}

	public V put(K key, V value)
	{
		return internalMap.put(key, value);
	}

	public V get(K key)
	{
		return internalMap.get(key);
	}

}

eBay Suchergebnisse in Yahoo Pipes bündeln

Bei der Möbelsuche auf eBay stößt man oft auf den Umstand dass nur selten die gesuchten Artikel vorhanden sind und wenn nicht in abholbarer Reichweite. Da eBay inzwischen die Möglichkeit bietet jedes Suchergebnis als RSS Feed abzurufen schreit das förmlich nach einer Verarbeitung mit Yahoo Pipes.

Der grundsätzliche Aufbau ist trivial:

  • Einbau von PLZ und Umkreis in die Suchergebnis URI
  • Fetchen der Suchergebnis URI
  • Ergebnisse zusammenfassen
  • Ergebnisse sortieren

In Yahoo Pipes sieht das dann wie folgt aus:

Yahoo Pipes

Nun hat man alle Suchergebnisse zusammengefasst als praktischen RSS Feed. Meine bisherige Version hat nur die Suche nach “Ikea”, die Büromöbel Kategorie und einige andere Suchen eingebunden. Erweiterungen sind gerne gesehen!

OpenStreetMap-Rendering mit Mapnik

Mit Hilfe des Kartenmaterials von www.openstreetmap.org (OSM) wird einem die Möglichkeit gegeben, zum Teil qualitativ sehr hochwertiges und offenes Kartenmaterial für eigene Anwendungen zu verwenden. Die Vielzahl der Verwendungsmöglichkeiten muss hier nicht weiter erläutert werden.
Allerdings ist die Verwendung der Daten selbst nicht unbedingt trivial. Mittlerweile gibt es zwar in der weiten Welt des Netzes auch ein paar Blogs und Wikis, die einem helfen, dennoch möchte ich an dieser Stelle für eine voraussichtlich mehrteilige Serie den Grundstein legen. Der besteht daraus, aus dem frei verfügbarem Material einen kleinen einzelnen Ausschnitt zu rendern. Zu späteren Zeitpunkten werde ich hoffentlich noch zeigen können, inwiefern das durchaus umfangreiche Material auf die eigenen Bedürfnisse angepasst werden kann. Natürlich ist das ganze kein Hexenwerk und ich möchte auch nicht so tun als ob es eins wäre, weswegen wir am besten mal loslegen.

Da ich selbst in erster Linie Ubuntu benutze und an manchen Stellen der Einsatz von Windows die Angelegenheit nicht unbedingt erleichtert, ist die nachfolgende Anleitung für Ubuntu 9.10 geschrieben. Grundsätzlich sollte sie aber auch für ältere Ubuntu Versionen funktionieren. Unter http://wiki.openstreetmap.org/index.php/Mapnik gibt es weitere Infos, auch für andere Betriebssysteme.

# Subversion-Installation
sudo apt-get install subversion

# der Einfachheit halber arbeitet man am besten direkt im Homeverzeichnis
cd ~

# Mapnik-Installation (Renderer):
sudo apt-get install python-mapnik

# Postgres-Installation (Datenbank)
sudo apt-get install postgresql-8.3-postgis

# Datenbank-Konfiguration
sudo -u postgres -i
createuser username # ja für superuser, username sollte normaler username sein
createdb -E UTF8 -O username gis
createlang plpgsql gis
exit

psql -d gis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql

echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis

# Mapnik-Dateien-Checkout für das Rendern:
svn checkout http://svn.openstreetmap.org/applications/rendering/mapnik mapnik/

cd mapnik
mv archive/* ~/mapnik

svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/

cd osm2pgsql
make

psql -f 900913.sql -d gis

cd ..

# Herunterladen und Entpacken des Kartenmaterials
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz # ca 50MB

cd world_boundaries
wget http://tile.openstreetmap.org/processed_p.tar.bz2 # ca 227MB
tar xvf processed_p.tar.bz2
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2 # ca 46MB
tar xvjf shoreline_300.tar.bz2

# Weitere Datenbankspeisung und Konfiguration:
shp2pgsql -s 900913 -I -g way processed_p shoreline_a | psql -q gis

# Mapnik-Einrichtung
cd ..
vi set-mapnik-env
# Ändern der unteren beiden Werte
export MAPNIK_DBNAME='gis'
export MAPNIK_DBUSER='username' # username von oben und achtet auf die richtigen Anfuehrungszeichen

# osm.xml-Generierung:
source ./set-mapnik-env
./customize-mapnik-map -> $MAPNIK_MAP_FILE

# erstes Rendering
python generate_image.py

Ubuntu: Ohne Cisco Client ins VPN der Uni Ulm

Mit dem VPN verbunden

Mit dem VPN verbunden

Entgegen der Aussage von verantwortlichen Personen am Rechenzentrum der Universität Ulm ist es auch ohne Cisco-VPN Client möglich ins Universitäts-VPN zu gelangen – und das mit etwas Vorarbeit  recht komfortabel. In der folgenden Anleitung zeigen wir Dir Schritt für Schritt, wie Du das mit der aktuellen Ubuntu Version 9.10 komfortabel einrichtest.

Einleitung

Ziel dieses Projekts ist es, dass wir nutzerfreundlich und GUI-orientiert über den Gnome-Networkmanager ins Netz der Universität Ulm kommen, egal ob wir schon im WLAN vor Ort sind oder gerade Zuhause sitzen und mal wieder nicht an Dateien kommen, die nur über das Uninetz erreichbar sind.
Befinden wir uns gerade schon in der Universität, haben wir hiermit den Vorteil, auf die KIZ-Anmeldemaske beim Verbinden verzichten zu können. Zudem ist unser gesamter WLAN-Traffic auch gleich noch verschlüsselt.

Installation

Wir befinden uns in unserem Homeverzeichnis und erstellen uns ein temporäres Verzeichnis vpnc. Da die Anmeldung am VPN der Uni Ulm mittels hybrider Authentifizierung funktioniert, müssen wir selbst etwas am Quellcode modifizieren. Zuerst holen wir uns also den Quellcode und lösen eventuelle Abhängigkeiten auf.

cd vpnc
apt-get source vpnc
sudo apt-get build-dep vpnc

Möglicherweise werden wir darauf hingewiesen das Paket dpkg-dev zu installieren. Zusätzlich benötigen wir noch dieses Paket:

sudo apt-get install libssl-dev

Wir wechseln nun in das Verzeichnis ~/vpnc/vpnc-0.5.3 und öffnen die Makefile mit einem Editor unserer Wahl und entfernen die Raute vor diesen Zeilen und speichern die Datei.

#OPENSSL_GPL_VIOLATION = -DOPENSSL_GPL_VIOLATION
#OPENSSLLIBS = -lcrypto

VPN konfigurieren im Network-Manager-Applet

VPN konfigurieren im Network-Manager-Applet

Jetzt noch ins Unterverzeichnis debian wechseln um die Datei changelog zu modifizieren. Damit wir unser frisch modifiziertes Werk bequem über den Paketmanager verwalten können müssen wir einen neuen Eintrag in diese Datei oben einfügen, am besten mit einer hohen Nummer. In unserem Fall sieht das so aus:
vpnc (ioexeption-ssl-2010.0.5.3-1-2010) unstable; urgency=low

* added ssl support for hybrid authentication on private network
-- Achim Strauss Mon, 15 Dec 2010 17:52:20 -0800


und dann das ganze Speichern.

Ein jungfräuliches Ubuntu hat vor dem nächsten Schritt gerne noch diese Pakete installiert

sudo apt-get install debhelper libgcrypt11-dev dpatch

Jetzt sind wir bereit das ganze aus dem Verzeichnis vpnc-0.5.3 heraus mit folgendem Befehl zu kompilieren:

fakeroot dpkg-buildpackage -b -uc

Am Ende des Prozesses sollte in ~/vpnc ein komfortabel zu installierendes Debian-Package mit Namen ioexeption-ssl-2010.0.5.3-1-2010_i386.deb stehen. Installiere dieses Paket und teste die erfolgreiche Installation mittels

vpnc --version

Die korrekte Installation erkennst du an der Ausgabe von

Built with openssl (certificate) support. Be aware of the license implications.

Prinzipiell sind wir nun bereit uns mit einem VPN zu verbinden, es fehlt aber noch an einem Plugin für den Networkmanager. Dieses bekommen wir, indem wir das folgende Repository zu unserer /etc/apt/sources.list hinzufügen.

deb http://ppa.launchpad.net/sroecker/ppa/ubuntu karmic main

Danach einfach noch diese Schritte ausführen:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 588AC16B
sudo apt-get update
sudo apt-get install network-manager-vpnc

Der erste Befehl sagt aus, dass wir dem oben genannten Repository in Zukunft vertrauen wollen. Dieser Schritt ist nicht zwingend notwendig, schützt uns aber vor zukünftigen Warnmeldungen. Die beiden anderen Schritte sind jedoch essentiell für die Installation des Plugins.

Eingabemaske für Einstellungen des VPN

Eingabemaske für Einstellungen des VPN

Konfiguration

Nun richten wir uns noch ein verstecktes Verzeichnis in unserem Homeverzeichnis ein ~/.vpnc . Hierein speichern wir das KIZ Zertifikat, sowie dieses Verbindungsprofil (aus dem Uninetz).

Über das Network-Manager-Applet können wir nun über VPN-Verbindung ->VPN-konfigurieren -> importieren im Verzeichnis ~/.vpnc das heruntergeladene Verbindungsprofil wählen. Die meisten Felder sind durch diese Vorgabe bereits ausgefüllt, der Rest ist wie auf diesem Screenshot mit den eigenen KIZ-Userdaten zu befüllen. Außerdem unter CA-File  die Zertifikatsdatei (KIZ-CA.crt) ebenfalls aus ~/.vpnc wählen.

Nutzung

Ab sofort kannst du dich mit wenigen Klicks über das Network-Manager-Applet → VPN-Verbindungen → <VPN-Name> in das VPN einwählen. Deine Passwörter werden nun auch bequem über den Gnome-Schlüsselbund verwaltet.

Eingerichtetes VPN auswählen

Eingerichtetes VPN auswählen

Streiflicht 2010

Am Mittwoch, den 10. Februar, stellen Studierende des Studiengangs Medieninformatik die Highlights ihrer Anwendungsfächer um 16 Uhr im H20 vor.

Vorgestellte Projekte:

  • Echtzeitgrafik (Praktikum Computergrafik)
  • Visuelle Wahrnehmung (Praktikum Computer Vision)
  • awarenia, iNet, w3i (Anwendungsfach Interaktive Systeme)
  • pocketU (Anwendungsfach Medienpädagogik)
  • newsmachine (Anwendungsfach Interaktives Video)
  • TTable (Anwendungsfach Ubiquitous Computing)
  • Anwendungsfach Dialogsysteme

Weitere Informationen gibt es unter: http://www.uni-ulm.de/in/mi/streiflicht.html

Von uns ist dieses Mal noch niemand dabei, allerdings werden wir in Kürze über unsere eigenen Anwendungsfachprojekte berichten, an denen wir derzeit arbeiten.

Beamer im Eigenbau – Teil 2

Nachdem nun alle Teile vorhanden sind, kann man mit der Extraction des LCD-Panels beginnen. Nachdem man sämtliche Schrauben und Halterungen entfernt hat, liegt das Panel mit dem Backlight-Element frei. Nun muss man nur noch diverse Klebefolien entfernen und man hält das LCD-Panel in Natura in der Hand. Dies alles aber unbedingt sehr vorsichtig machen,evtl. mit Handschuhen, damit es nicht beschädigt wird.

Der Körper des Laptops fungiert als MultimediaCenter. Dies muss vorerst leider sein, da noch keine passende Lösung gefunden wurde, das LVDS LCD-Panel anders anzusteuern als über den Laptop, wie bisher. Falls jemand eine Idee hat, einfach kommentieren.  Bisher läuft auf dem Laptop Ubuntu mit XBMC.

Bei dem OHP habe ich nichts verändert, da ich diesen vorerst als Gerüst beibehalte. Bei Gelegenheit und viel Zeit werden alle Teile entnommen und unter Berücksichtigung der optischen Gesetze, in einen Kasten gebaut. Lediglich zwei Löcher werden für die Lüfterhalterung gesetzt.

Damit der Lüfter nicht ständig mit 12V fährt, habe ich mich für eine temperaturabhängige Steuerung entschlossen. Dabei wird die Temperatur zwischen OHP-Glas und LCD-Panel via eines NTC`s (Heißleiter) gemessen.  Somit wird der Stromfluss durch Veränderung des NTC-Wiederstandes geregelt.

SSH-Tunnel und SOCKS Proxy Forwarding als Alternative zum Surfen über (Web)VPN

An meiner Uni sind einige Webressourcen nur aus dem Intranet zugreifbar, das heißt man braucht als Client eine IP aus dem Uni-Netz. Um von extern darauf zuzugreifen, ist die Einwahl über ein VPN notwendig. Neben der klassischen “schwergewichtigen” Einwahl über einen VPN-Client gibt es noch die Möglichkeit, einen Web-VPN zu nutzen. Hier werden nach der Authentifizierung alle HTTP-Anfragen über eine spezielle Seite der Rechenzentrums getunnelt. Leider lässt nicht nur die Verfügbarkeit des Dienstes manchmal zu wünschen übrig, sondern auch die verfügbaren Bandbreiten machen es uninteressant für den Download größerer Paper.

Als Alternative hierzu ist mir die Möglichkeit begegnet, mithilfe des Application Level Port Forwardings von SSH Zugriffe zu tunneln. Durch den Flag “-D portnummer” erzeugt der SSH-Client beim Verbinden einen lokalen SOCKS-Proxy auf diesem Port, der über den SSH-Tunnel Requests weiterleitet. Endpunkt stellt der SSH-Server da. Mithilfe zusätzlicher Flags lässt sich außerdem ein Timeout unterdrücken.

Im Falle der Uni Ulm und einer Einwahl auf den Server des Rechenzentrums (KIZ) sieht der Aufruf so aus:

ssh -D 8800 -o ServerAliveInterval=60 s_login@login.rz.uni-ulm.de

Nach erfolgreichem Verbindungsaufbau steht dann lokal unter dem Port 8800 der SOCKS-Proxy zur Verfügung und kann im Browser eingetragen werden. Für eine dynamische Nutzung bieten sich unter Firefox Plugins wie FoxyProxy an. Hier lassen sich Regelsätze definieren, wann dieser Proxy benutzt werden soll, zum Beispiel für alle Uni-Seiten.

Mehrere Werte in Java-Methoden typsicher zurückgeben

Anders als manch andere imperative Programmiersprachen, unterstützt Java nur die Rückgabe eines Wertes bei einem Methodenaufruf. Jedoch ist es häufig interessant, mehrere Werte zurückzugeben. Grundsätzlich lassen sich hier zwei Szenarien unterscheiden. Bei der Rückgabe von mehreren gleichartigen Typen wird meist eine Klasse des Collections-Frameworks verwendet, wie zum Beispiel List oder ein Array. Manchmal will man aber auch völlig verschiedene Typen gemeinsam zurückgeben. Gängige Praxis ist es hier, ein Object-Array zurückzugeben und dann quasi beim Implementieren festzulegen, von welchem Typ die einzelnen Werte sind und entsprechen zurückzucasten. Dies ist leider weder typsicher, noch lässt sich die vorherige Festlegung im Code erzwingen. Abhilfe schafft hier eine generische Holder-Klasse, die einzelnen Werte typsicher kapselt und als einziger Rückgabewert verwendet werden kann.

Hier ein Beispiel für die Rückgabe über ein Object-Array:

private Object[] doItUnchecked()
{
	String s = "foo";
	Date d = new Date();

	return new Object[] { s, d };
}

Aufruf:

// unchecked variant: dangerous!
Object[] returnValues = t.doItUnchecked();
String s = (String) returnValues[0];
Date d = (Date) returnValues[1];

Eine generische Holderklasse (hier: immutable):

/**
 * Immutable holder type for two values.
 *
 * @author Benjamin Erb
 *
 * @param <F> type of first value
 * @param <S> type of second value
 */
public class PairHolder<F, S>
{
	private final F first;
	private final S second;

	public PairHolder(F first, S second)
	{
		this.first = first;
		this.second = second;
	}

	public F getFirst()
	{
		return first;
	}

	public S getSecond()
	{
		return second;
	}
}

Verwendung in Methode:

private PairHolder<String, Date> doItChecked()
{
	String s = "foo";
	Date d = new Date();

	return new PairHolder<String, Date>(s, d);
}

Aufruf:

// check variant: safe already at compile-time
PairHolder<String, Date> h = t.doItChecked();
String s = h.getFirst();
Date d = h.getSecond();

Die Holderklasse lässt sich auch noch beliebig erweitern, um Tripel, Quadrupel etc. zu halten. Wer für 2-Tupel keine eigene Klasse implementieren möchte, kann übrigens auf AbstractMap.SimpleEntry oder AbstractMap.SimpleImmutableEntry zurückgreifen.

Einführung in C Linker, Compiler, Preprocessor und mehr

Die Einführungsvorlesung “Computer Science 50: Introduction to Computer Science I” von Harvard College hat sehr gut gemachte Vorlesungen als Flash Video online, insbesondere die Vorlesungen über die C Grundlagen sind wirklich schön.

Meine Empfehlungen:

  • Week 8. Huffman coding. Preprocessing. Compiling. Assembling. Linking. CPUs. Ant-8.

  • Week 9. Writing secure C code. Buffer overruns. Dangerous functions.

ioexception.de

Benjamin Erb studiert seit 2006 Medieninformatik und interessiert sich insbesondere für Java, Web-Technologien, Ubiquitous Computing, Cloud Computing, verteilte Systeme und Informationsdesign.


Raimar Wagner studiert seit 2005 Informatik mit Anwendungsfach Medizin und interessiert sich für C++ stl, boost & Qt Programmierung, Scientific Visualization, Computer Vision und parallele Rechenkonzepte.


David Langer studiert seit 2006 Medieninformatik und interessiert sich für Web-Entwicklung, jQuery, Business Process Management und Java.


Sebastian Schimmel studiert seit 2006 Informatik mit Anwendungsfach Medizin und interessiert sich für hardwarenahe Aspekte, Robotik, webOs, C/C++ und UNIX/Linux.


Timo Müller studiert seit 2006 Medieninformatik. Er interessiert sich allen voran für Mobile and Ubiquitous Computing, systemnahe Enwticklung und verteilte Systeme, sowie Computer Vision.


Achim Strauß studiert seit 2006 Medieninformatik. Seine Interessen liegen in Themen der Mensch-Computer Interaktion sowie Webentwicklung und UNIX/Linux.


Tobias Schlecht studiert seit 2006 Medieninformatik und interessiert sich vor allem für Software Engineering, Model Driven Development, Model Driven Architecture, Requirements Engineering, Web-Technologien, UML2 und Java.


Fabian Groh studiert seit 2006 Medieninformatik. Seine Interessengebiete sind Computer Graphics, Computer Vision, Computational Photography sowie Ubiquitos Computing.

Archiv

September 2010
M D M D F S S
« Aug    
 12345
6789101112
13141516171819
20212223242526
27282930