logo

  • Tobias Zeising-image
  • Tobias Zeising-image
  • Tobias Zeising-image
  • Tobias Zeising-image

Tobias Zeising

Welcome on the website and blog of Tobias Zeising. Here you find my photography portfolio, information about my software projects and some useful and interesting articles about photography and software development in my blog.

Alles neu, macht der Mai

An meiner Homepage und an meinem Blog hab ich schon einige Zeit nichts mehr verändert. Beides kommt noch aus einer Zeit wo mobile Endgeräte noch nicht im Mittelpunkt standen. Zudem ist das Styling etwas in die Jahre gekommen, so dass eine Veränderung mal wieder anstand. Die gibt es nun auch. Dazu habe ich nun meine Webseite und meinen Blog zusammengelegt. Beides ist nur noch über www.aditu.de erreichbar (blog.aditu.de gibt es nun nicht mehr). Alle alten Links funktionieren allerdings trotzdem noch und werden entsprechend umgeleitet. Bitte aktualisiert auch euer Feed, wenn ihr meinen Blog abonniert habt. Das ist nun unter http://www.aditu.de/feed zu erreichen.

Tja und was ist neu? Die Seite ist nun responsive und läuft sowohl auf Smartphones, als auch auf Tablets. Das Design basiert nun auf einem Grid, was ich sehr schick finde. Inhaltlich hat sich nicht viel geändert. Noch immer ist dort eine Auswahl meiner Fotos zu finden. Und nun eben auch mein Blog, der nun nicht mehr so prominent als eigene Seite unter einer eigenen URL verfügbar ist, aber natürlich nach wie vor von mir weiter mit interessanten Beiträgen aus der Softwareentwicklung und Fotografie gefüttert wird. Es lohnt sich also, immer mal wieder vorbei zu schauen, oder natürlich das RSS Feed zu abonnieren (am besten geht das mit selfoss ;)

Die Seite zu rsslounge und das rsslounge Forum habe ich in diesem Zuge deaktiviert und auf selfoss umgeleitet. Nachdem rsslounge schon völlig veraltet ist, der einzig sinnvolle Schritt.

Tja, dann wünsch ich euch viel Spaß beim durchsurfen von meiner neuen Webseite.

 

View Comments (0)

Close Post

Automatisches Backup für All-Inkl Webspace

Seit vielen Jahren habe ich meine ganzen Webgeschichten bei All-Inkl gehostet. Ich bin mit dem Anbieter ganz zufrieden. Die Server sind sehr zuverlässig, die Administrationsoberfläche ist durchdacht, der Support antwortet innerhalb von 15 Minuten und alle Funktionen und Extensions, die man so braucht, sind vorhanden. Eines fehlt aber: Eine einfache Möglichkeit Backups zu erstellen.

Mittlerweile hat sich so einiges bei meinem Webhoster angesammelt. Mein Anspruch ist es also, je nach Projekt ein Backup erstellen zu können. Sprich Verzeichnis XYZ und die dazugehörige MySQL Datenbank schön abgepackt als ZIP File, so dass ich die nur noch herunterladen und auf meinen Rechner archivieren muss. All-Inkl bietet zwar in ihren FAQs schon einige interessante Ansätze, aber entweder es betrifft nur den Backup einer MySQL Datenbank, oder man braucht gleich einen der Managed-Server Tarife.

Also habe ich selbst ein kleines Skript geschrieben, dass ein Backup erzeugt. Wichtig: Es funktioniert nur mit dem All-Inkl Premium Tarif, denn das Skript verwendet SSH und das gibt es erst ab den Premium Tarif. Eine Variante, bei der alleine mit PHP Bordmittel ein Backup durchgeführt wird, scheitert leider am begrenzten Speicher. All-Inkl gesteht PHP nur 64MB Arbeitsspeicher zu. Erstellt man also ein Backup für ein Verzeichnis und packt dieses in eine ZIP Datei, so ist bei 64MB Schluss und es kommt ein memory limit exceeded.

Nun aber zu meiner Lösung. Ich verwendet den SSH Zugang, führe damit ein mysqldump aus und packe alles mit tar in eine tar.gz Datei ein. Nachdem All-Inkl die SSH Extension von PHP nicht zur Verfügung stellt, verwende ich die phpseclib. Diese hervorragende Bibliothek rund um das Thema Verschlüsselung bietet einen rein PHP basierten SSH Client an. Die Verwendung des SSH Clients ist denkbar einfach:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

Über die phpseclib habe ich bereits an anderer Stelle schon einmal etwas geschrieben.

Nun aber zum Backup-Skript, dass wie folgt aussieht:

<?PHP

$sshUser = 'youruser';
$sshPassword = 'yourpass';
$sshHost = 'yourhost';
$base = "/www/htdocs/<ftpuser>/";
$backupDir = "backup/";

$dbs = array(
    array(
        "name"   => "wordpress",
        "dbname" => "d1234567",
        "passwd" => "secret",
        "dir"    => "wordpress"
    ),
    array(
        "name"   => "website",
        "dbname" => "d321",
        "passwd" => "secret",
        "dir"    => "website/www"
    ),
    array(
        "name"   => "selfoss",
        "dir"    => "website/selfoss"
    ),
    array(
        "name"   => "database123",
        "dbname" => "d987324",
        "passwd" => "secret",
    )
);

// ssh connection
include('Net/SSH2.php');

$ssh = new Net_SSH2($sshHost);
if(!$ssh->login($sshUser, $sshPassword))
    die('ssh login failed');

$baseWithoutTrailingSlash = substr($base, 1);
foreach($dbs as $db) {
    echo $db["name"] . "<br />";
    ob_flush();

    // directory for backup
    $dir = "";
    if(isset($db["dir"]) && strlen(trim($db["dir"]))>0) {
        $dir = $baseWithoutTrailingSlash . $db["dir"];
    }

    // backup database
    $sql = "";
    if(isset($db["dbname"]) && strlen(trim($db["dbname"]))>0) {
        $db_name = $db["dbname"];
        $db_passwd = $db["passwd"];
        $sql_file = $db["name"] . "_" . date('Y.m.d') . ".sql";
        $sql = $baseWithoutTrailingSlash . $backupDir . $sql_file;
        echo $ssh->exec("mysqldump -u " . $db_name . " -p'" . $db_passwd . "' --allow-keywords --add-drop-table --complete-insert --quote-names " . $db_name . " > " . $base . $backupDir . $sql_file);
    }

    // generate tar.gz file
    $tar_file = $base . $backupDir . $db["name"] . "_" . date('Y.m.d') . ".tar.gz";
    $result = $ssh->exec("tar cfz " . $tar_file . " -C / " . $dir . " " . $sql);
    if(strlen(trim($result))>0)
        echo $result . "<br />\n";

    // delete temporarily database dump
    if(strlen($sql)>0 && strlen(trim($base))>4 && strlen(trim($sql_file))>4)
        echo $ssh->exec("rm " . $base . $backupDir . $sql_file);
}

echo "finished";

Über die Variablen $sshUser, $sshPassword und $sshHost wird der SSH Benutzer und Host festgelegt. $base ist der Basispfad eurer Installation. Bei All-Inkl ist das immer /www/htdocs/<ftp-username>/. Das Verzeichnis in $backupDir gibt an, wo das Backupskript liegt. In dem Beispiel unter /www/htdocs/<ftpuser>/backup/. Für dieses Verzeichnis müsst ihr entsprechend auch Schreibrechte setzen (chmod).

Über das Array $dbs werden die einzelnen Projekte definiert und die Datenbanken und Verzeichnisse festgelegt, für die ein Backup angelegt werden soll. In diesem Beispiel wird als erstes das Verzeichnis /www/htdocs/<ftp-username>/wordpress/ sowie ein Datenbankdump der Datenbank d1234567 in eine Datei wordpress_2013.05.01.tar.gz gepackt und unter /www/htdocs/<ftpuser>/backup/ abgelegt.

Als zweites passiert das gleiche für das Verzeichnis /www/htdocs/<ftp-username>/website/www und die Datenbank d321.

Das dritte tar.gz Paket enthält nur das Verzeichnis /www/htdocs/<ftp-username>/website/www und keine Datenbank.

Das vierte tar.gz Paket enthält nur ein Datenbankdump der Datenbank d987324.

Diese Liste kann man beliebig erweitern und man erhält so für jedes Projekt eine einzige tar.gz Datei. Legt man einen Cronjob an, so lässt sich beispielsweise ohne weiteren Aufwand ein wöchentliches Backup einrichten.

Das ganze Skript findet ihr auf github oder hier als ZIP zum download.

 

View Comments (5)

Close Post

Mit DISCO semantisch ähnliche Wörter finden

Das Thema semantische Suche und Web 3.0 ist ja seit geraumer Zeit ein Thema. Für ein aktuelles Projekt habe ich mich auf die Suche nach einer Bibliothek gemacht, die zu gegebenen Begriffen semantisch verwandte Wörter findet. Dabei bin ich auf DISCO gestoßen. DISCO ist eine Java basierte Anwendung, die in der Lage ist, semantisch ähnliche Begriffe zu finden. Dabei bietet DISCO folgende Funktionen:

  • Semantisch ähnlichste Wörter zu einem Eingabewort ausgeben: Z.B. schüchtern → scheu hölzern nervös unbeholfen ängstlich zurückhaltend ratlos naiv steif unsicher schweigsam
  • Größe der semantischen Ähnlichkeit zwischen zwei Eingabewörtern anzeigen: sim(Erdöl, Benzin) = 0,323; sim(Erdöl, Zuckerguss) = 0,016
  • Kollokationen zu einem Eingabewort ausgeben: Bier → tranken trinken brauen alkoholfreien trinkt braute gebraut zapfen ausgeschenkt Oktoberfest Pilsner

DISCO bietet verschiedenste Sprachdateien, darunter auch deutsch. Damit ist DISCO für viele interessant, die beispielsweise eine Verschlagwortung, einen Klassifikator oder eine Suche entwickeln oder verbessern wollen.

Das Projekt wurde von Peter Kolb entwickelt, der in der Computerlinguistik und Germanistischen Linguistik zuhause ist und dieses Thema im Rahmen seiner Magisterarbeit bearbeitet hat. Besonders klasse finde ich es, dass DISCO unter der Apache Lizenz zur Verfügung gestellt wurde. Dabei wird auf riesige Textbestände aus Wikipedia, dem Projekt Gutenberg und weitere Text-Korpora zurückgegriffen. Die deutschen Sprachdateien sind 3,4 GB groß.

In Java ist DISCO ziemlich schnell eingebunden. DISCO verwendet den Lucene Index, daher muss man die nötige JAR einbinden. In Maven funktioniert das mit folgender Abhängigkeit:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>3.5.0</version>
</dependency>

Um nun DISCO zu verwenden, muss man die DISCO API herunterladen und in das eigene Projekt einbinden. Nun kann man die Klasse DISCO verwenden:

DISCO disco = new DISCO("C:\\disco-language-de", false);
int freq = disco.frequency("Fisch");
ReturnDataCol[] similarWords = disco.collocations("Fisch");
for(int i=0; i&lt;similarWords.length; i++)
    System.out.println(similarWords[i].word + ": "
         + similarWords[i].value);

In diesem Beispiel wird zuerst die Klasse DISCO instanziiert. Der Konstruktor benötigt als ersten Parameter den Speicherort der DISCO Sprachdateien. Der zweite Parameter gibt an, ob die Sprachdateien in den Speicher geladen werden sollen. Anschließend wird geprüft, ob für das Wort “Fisch” semantisch ähnliche Worte vorhanden sind (freq). Anschließend werden semantisch ähnliche Worte abgerufen und aufgelistet. Der zweite Wert ist ein Score Wert für die Ähnlichkeit.

Meeresfrüchte: 18.9
Fleisch: 15.6
Geflügel: 15.599999
Krabben: 13.599999
Gemüse: 12.6
Milchprodukte: 10.9
Fisch: 10.6
Sushi: 10.5
frisst: 9.9
fangen: 9.4
...

An diesem Beispiel sieht man gut, dass DISCO mit wenigen Zeilen eingebunden ist. Gerade für das Anbieten von verwandten Begriffen, für eine Verschlagwortung oder für das Anreichern von Text (z.B. für einen Klassifikator) ist DISCO eine hervorragende Bibliothek. Insbesondere die Einfachheit ist bemerkenswert. Aber auch die Treffer können sich sehen lassen, das Ganze funktioniert schon recht gut.

Zur Webseite von DISCO: http://www.linguatools.de/disco/disco.html

 

View Comments (4)

Close Post

selfoss 2.5

Knapp eine Woche später gibt es schon wieder eine neue selfoss Version. Ich will garnicht viel schreiben, sondern nur eine kurze Liste der wichtigsten Änderungen liefern:

  • Eine Restful JSON API steht nun für Entwickler von Apps, Plugins oder anderen Systeme, die auf selfoss zugreifen wollen, zur Verfügung.
  • Es kann nun eine eigene user.css erstellt und eigene CSS Stylings ergänzt werden.
  • Für Leute, die mit dem Font Probleme haben, gibt es nun einen neuen Parameter use_system_font, mit dem auf eine System-Schriftart umgeschalten werden kann.
  • neue italienische und schwedische Sprachdatei
  • und weitere, kleinere Verbesserungen.

Selfoss gibts wie gewohnt hier zum download.

 

View Comments (11)

Close Post

selfoss 2.4

In letzter Zeit ist der Blog hier voll mit News zu meinem RSS Reader selfoss. Nachdem sich hier aber im Moment einiges tut, will ich nicht darauf verzichten, neue Versionen auch in diesem Blog anzukündigen. An alle, die das Thema nicht interessiert: Ich gelobe Besserung!

Nach der Ankündigung das mit dem Google Reader ab Juli Schluss ist, gabs erst einmal eine riesige Welle an Besuchern, für die selfoss eine gute Alternative ist. Gleichzeitig gab es aber auch zahlreiche neue Featurewünsche und Bugmeldungen. Was mich aber immernoch besonders freut: Es gab auch viele Entwickler, die auf github Pull Requests gestellt haben und selbst Verbesserungen an selfoss vorgenommen haben. Für diese zahlreichen Codeänderungen möchte ich mich bei allen Entwicklern bedanken!

Die neueste Version 2.4 hat daher zahlreichsten Änderungen, Verbesserungen und behobene Bugs. Hier eine kurze Liste mit den wichtigsten Änderungen:

  • Neben den Tags werden nun auch die ungelesenen Artikel angezeigt.
  • Es kann nun nach einzelnen Feeds gefiltert werden.
  • Neue Internationalisierungen für die Sprachen Deutsch, Englisch, Französisch, Türkisch, Niederländisch, Tschechisch, Russisch, Lettisch und Chinesisch.
  • Neuer Konfigurationsparameter um die Startseite festzulegen (neueste,  ungelesene oder markierte Beiträge)
  • Neuer Konfigurationsparameter um Beiträge automatisch als gelesen zu markieren, wenn man diese öffnet.
  • Neuer Parameter für einen Anonymisierungsdienst (z.B. anonym.to).
  • Ein neuer Shortcut r um die Liste neu zu laden.
  • Neue Sharebuttons für Twitter, Google+, Facebook, pocket und Email

Das komplette Changelog findet ihr hier.

Die neueste Version 2.4 findet ihr wie gewohnt hier: http://selfoss.aditu.de. Wer Probleme hat, kann gerne das Forum nutzen, oder auf github ein Issue erstellen.

An dieser Stelle sei auch auf das Firefox Addon für selfoss verwiesen. Vielen Dank an Ivan Strokanev dafür!

 

View Comments (4)

Close Post

Google Reader down = selfoss neue Version

Wie es manche von euch vielleicht mitbekommen haben, wird der Google Reader zum 1. Juli abgeschalten. Ich finde das sehr schade, denn es wird wahrscheinlich RSS nicht gerade neuen Aufwind geben. Dabei muss man allerdings zugeben, dass RSS schon immer ein Schattendasein geführt hat und die meisten Leute nicht einmal wissen was das ist.

Für meinen RSS Reader selfoss bedeutet die Ankündigung von Google einen ziemlich heftigen Zulauf. Die Besucherzahlen sind seit Donnerstag in die Höhe geschnellt und entsprechend viele Supportanfragen habe ich bekommen. Sehr viele haben aber auch auf github Pull Requests gestellt und zahlreiche Verbesserungen beigetragen.  Etwas das mich immer sehr freut, denn es zeigt ein Bewusstsein dafür, dass Software nichts Starres ist, sondern von Benutzern frei gestaltet werden kann.

selfoss

Ein neues Release 2.2 gab es schnell zwischendrinnen um allen Google Reader Nutzern einen OPML Import zu bieten. Release 2.3 folgt recht knapp und hat sehr viele Verbesserungen. Hier die Erweiterungen im Überblick:

  • OPML Import: Feeds können nun sehr einfach vom Google Reader oder einem anderen RSS Reader übernommen werden. Einen Export werde ich auch noch einbauen, es soll ja keine Einbahnstraße bleiben.
  • PostgreSQL Datenbank Unterstützung
  • Cronjob über CommandLine: Bisher musste immer http://<yourselfossurl>/update via wget aufgerufen werden. Jetzt kann auch direkt die update.php via CommandLine aufgerufen werden.
  • Readability support: Nun kann man in der Konfiguration seinen readability.com API Key hinterlegen. Der große Vorteil: gekürzte RSS Feeds enthalten dann im selfoss den vollen Text, der zudem noch für ein sauberes Lesen bereinigt wurde.
  • Neuer Shortcut: Nun kann mit dem Shortcut t zu dem nächsten Beitrag gesprungen werden. Dabei wird der aktuelle Beitrag aber als gelesen markiert.

Zudem wurden zahlreiche kleinere Bugs behoben. Für alles Weitere habe ich ein Support-Forum eingerichtet: http://selfoss.aditu.de/forum

So viele Benutzer finden durch die Vielfalt von Plattformen und die starken Unterschiede in die Anforderungen an einen RSS Reader natürlich auch entsprechend viele Fehler und Verbesserungen. Um die werde ich mich die nächsten Wochen kümmern. Version 2.3 wird also nicht die letzte sein.

An der Stelle auch einen Hinweis an alle rsslounge Benutzer: Ich schaffe es zeitlich nicht zwei Reader zu betreuen und weiterzuentwickeln. Nachdem sich selfoss funktional stark an rsslounge angenähert hat, werde ich rsslounge nicht mehr weiterentwickeln. Einen entsprechenden Hinweis habe ich auch auf der rsslounge Webseite angebracht.

 

View Comments (19)

Close Post

selfoss 2.1

Vor wenigen Wochen habe ich die neueste Version von selfoss veröffentlicht. Leider war darin noch ein sicherheitsrelevanter Bug. So konnte auch ohne Authentifizierung auf das RSS Feed von selfoss zugegriffen werden. Also schnell die aktuellste Version laden und installieren. Das Ganze ist natürlich nur relevant, wenn ihr den Passwortschutz verwendet. Ist selfoss ohnehin öffentlich erreichbar, dann ist das kein Problem.

Zum Download der Version 2.1

 

View Comments (4)

Close Post

selfoss 2.0

Meine bevorzugte Art neue Informationen und News im Netz zu lesen, ist immernoch mein RSS Reader. In Zeiten von Facebook und Twitter sehen viele RSS als Auslaufmodell. Ich bin mir da nicht so sicher, gerade was News Seiten und Blogs angeht ist die Unterstützung hervorragen. Für andere Quellen gibt es eine Menge Webdienste, die beliebige Seiten in RSS Feeds umwandeln.

Nun habe ich meinen RSS Reader selfoss überarbeitet und in der Version 2.0 veröffentlicht. Das leichtgewichtige PHP Programm lässt sich schnell und einfach einrichten, bietet eine schlichte und übersichtliche Oberfläche und ist natürlich für lau. Für die aktuellste Version habe ich die Oberfläche nochmal komplett neu gebaut. Diese ist nun responsive und unterstützt sowohl Smartphones, als auch Tablets.

selfoss 2.0 Oberfläche

Für die Version 1.3 hatte ich noch eine spezielle Android App. Diese hatte ich mit jQuery mobile und phonegap umgesetzt. Mich konnte die Kombination nicht überzeugen. So richtig flüssig ist das Ganze nie gelaufen und so habe ich mich entschlossen, lieber eine vernünftige webbasierte Version zu machen. Dazu habe ich die aktuelle Oberfläche auf einer ganzen Reihe von Geräten ausführlich getestet: iPhone 4s, iPhone 5, Samsung Galaxy S3, HTC One X, iPad 3. Überall läuft die Seite korrekt und schnell.

Wichtig war mir auch, die einzelnen Plattformen zu berücksichtigen. So sollte z.B. bei der Desktopvariante der gesamte Platz vernünftig genutzt werden. Daher werden dort die Beiträge dreispaltig angezeigt, was auf WideScreen-Displays angenehmer zu lesen ist. Auf Tablets und Smartphones hingegen werden Bilder erst nach dem Klick auf einen Link angezeigt und geladen. So kann man Traffic sparen, denn oft werden in Blogeinträgen übertrieben große Bilder nur zu Zierde verwendet.

Weitere Änderungen sind Tags, die für die einzelnen Datenquellen verwendet werden können. Nach diesen kann dann gefiltert werden. Auch zwei neue Datenquellen für mmo-spy.de und golem.de sind mit im Gepäck.

Weitere Informationen und den Download gibt es auf der Webseite von selfoss: selfoss.aditu.de

 

View Comments (6)

Close Post

Unser Bücherregal

Der Blogeintrag ist für alle, die auch auf einem Berg von Büchern sitzen und nicht wissen, wie sie die am besten verstauen sollen. Nach langem überlegen, wie wir unsere Bücher am besten sortieren können, haben wir uns für den unpraktischsten, aber schicksten Ansatz entschieden. Wir haben unser Bücherregal nach Farben sortiert. Das sieht ziemlich schick und ordentlich aus und man findet die Bücher trotzdem erstaunlicherweise leicht, weil man sich an den Einband dann doch  immer recht gut erinnern kann.

bookshelf_thumb

Wer meinen Blog schon länger liest, der wird sich vielleicht an das Originalbild erinnern, dass uns dazu inspiriert hat. Und ja: bei uns Zuhause gibt es schon einen Fernseher, aber es wird definitiv mehr gelesen.

 

View Comments (0)

Close Post

Bildband meiner Fotos

Wer meinen Blog schon länger liest, weiß dass ich die Fotobücher von blurb echt gut finde. Die Qualität ist herausragend und der Leineneinband mit Schutzumschlag wirkt edel und sehr professionell. Über die Feiertage habe ich einen Bildband von meinen Fotos angefertigt und dort die schönsten Bilder der letzten zehn Jahre gesammelt. Erneut habe ich das große Querformat (33 x 28cm) gewählt. Als Einband kommt das Proline hellbeige zum Einsatz, dass nach meiner Ansicht am schönsten aussieht. Ein wirkliches Highlight ist aber das Papier. Das ProLine Perlglanz sieht einfach klasse aus. Die Farben wirken kräftig, das Papier schimmert ganz leicht und wirkt durch das hohe Gewicht von 190 g/m² sehr hochwertig.

Das Ergebnis ist echt wieder super geworden und so habe ich mich entschlossen das gute Stück auch über blurb.de zum Verkauf anzubieten. Nachdem ich mir wieder die Premiumausführung ausgesucht habe, ist das ganze nicht grad billig. Aber trotzdem biete ich es mal an. Wer also Interesse hat, kann sich das Buch hier näher ansehen und bestellen.

Nochmal die Eckdaten:

Und hier noch ein paar Bilder von meinem Exemplar:

Fotobuch mit Schutzumschlag

Fotobuch ohne Schutzumschlag

Titelseite

Zwei Bilder

Tropfenbild

Die Bindung

Nochmal zwei Bilder

Nahaufnahme vom leicht schimmernden Papier

Nahaufnahme Hardcovereinband

Ein weiteres Bild

 

View Comments (0)

Close Post

Fotografie Feature 2012

Natürlich darf auch dieses Jahr nicht mein Best of für das vergangene Jahr fehlen. Diesmal sowohl für 500px als auch deviantart. Insgesamt bin ich nicht mehr so viel auf den Foto Communitys unterwegs. Es gibt zwar viele tolle Fotografien, wie ihr hier ja sehen könnt, aber insgesamt ist es schwerer geworden wirklich was neues zu entdecken.

Viel Spaß mit dem Fotografie Feature und ein schönes neues Jahr 2013!

500px.com

*** woman on the prowl chords Cold* ...? ??????? ??? ????! Sunset Storm Light Cave SG here comes the sun Crater Lake Frozen Waterfall ... Seljalandsfoss . Mini Matterhorn Majestic Elements windows Thorsmork Valley Karoo Blitzkrieg Red Reef Sky II Ripples and Flames Fairy tale Eyjafjallajokull Volcano Iceland C'est la vie Tribute to a master Fragments of Water Homage to the Mountain The Pyramid Next generation Inception A Place Called Heaven Untitled Untitled golden light Sylvestris Volcanic Iceland Das Hydra Untitled [ ... dreams ] Namib Rand Sunrise «glance» Scars Mossy Embrace Explosion Just Rained.. Godly Flow Bromo before sunrise. Pink & Blue Onesse Untitled Headlights Pampa... Good morning! =) Will God be here? Celestial Existence Transparency Cape Dyrhólaey Rainbows apologize for angry skies ... Old Bagan Morning Splendor Untitled Silhouette Sunrise at Siak River Black Strange Place To Be Polar lights over Svalbard Return to the Origins A Desert's Sky Driftwood

deviantart.com

When I was 18 Hatter cat Feral Strings Tears of joy in the garden of giants D107 Headlights Gather lu-- Rosedale Tree 3 Prelude From Fjallabak The Crown Conspiracy, MJ Sullivan Paramnesia Sylvestris little mermaid Passing light Misty Pink Vantage Point Autumn Tent with View Stars Fall Grosser Lugstein Curse you Guybrush Threepwood Rune Spell last to know Karoo Blitzkrieg The Pyramid

Meine eigenen Bilder 2012 auf deviantart

journey's end shining cobweb gap red nails elusive sanctuary windmill floating harvest sundown Bayern

 

View Comments (0)

Close Post

Spring DI, Annotationen und zwei Instanzen einer Klasse

Spring ist echt eine feine Sache. Wer auf das Framework setzt, bekommt eine Menge Arbeit abgenommen und ein solides Grundkonzept zur Verfügung gestellt. Manchmal treibt es einen aber auch in den Wahnsinn, weil Dinge, die völlig klar sind nicht so funktionieren wie man will. Ein solches Problem hatte ich erst und schreibe diesen Blogeintrag für alle, die auch darüber stolpern.

Ich verwende Dependency Injection mittels Annotationen aus dem JSR 330. In der applicationContext.xml wird dann mit

<context:component-scan base-package="my.application">

die Auswertung der Annotationen aktiviert. Das funktioniert wunderbar, wenn man den Fall hat, der in 99,99 % der Fälle gilt: Man hat ein Interface und eine Implementierung für dieses Interface. Diese eine Implementierung wird dann einmal instanziiert und verwendet. Nun habe ich aber eine Implementierung, von der ich zwei Instanzen brauche.

In meinem Beispiel habe ich eine Bibliothek für den Zugriff auf ein Active Directory. Diese sieht wie folgt aus:

Die active.directory.lib ist eine Fremdbibliothek, die ebenfalls auf Annotationen aufbaut und von mir nicht geändert werden kann. Diese bietet zwei Klassen:

  • EasyService: Ein vereinfachter Zugriff auf Benutzerinformationen, verwendet die AdDao Klasse
  • AdDao: Eine Zugriffsklasse, die auf niedrigen Level den Zugriff auf das Active Directory durchführt

Die Klasse UserServiceImpl ist in meinem Projekt und verwendet sowohl den EasyService (für den Zugriff auf ein Active Directory) und direkt die Klasse AdDao für den Zugriff auf ein weiteres Active Directory. Also definiere ich alle Beans explizit in der applicationContext.xml. So kann ich genau festlegen, welche Komponente welche AdDao Instanz verwenden soll:

<bean id="userService" class="my.application.UserServiceImpl">
<property name="adDao" ref="adDao1" />
 <property name="easyService" ref="easyService" />
</bean>

<bean id="easyService" class="active.directory.lib.EasyService">
 <property name="adDao" ref="adDao2" />
</bean>

<bean id="adDao1" class="active.directory.lib.AdDao">
 <property name="location" value="ad1.mycompany.com" />
</bean>

<bean id="adDao2" class="active.directory.lib.AdDao">
 <property name="location" value="ad2.mycompany.com" />
</bean>

Meine Annahme war nun, dass Spring die Annotationen auswertet und die Angaben aus der applicationContext.xml ergänzt und daraus dann die Objekte erstellt. In der Praxis knallt es aber mit der Exception “no unique bean”:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [active.directory.lib.AdDao] is defined: expected single matching bean but found 2: [adDao1, adDao2]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:796)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
	... 53 more

Tatsächlich scheint der Ablauf also folgender zu sein:

  1. Spring ermittelt alle mit @Named annotierten Beans
  2. Spring ermittelt alle Beans aus der applicationContext.xml
  3. Alle Objekte werden erstellt und die Abhängigkeiten injiziert (bzzzt! Hier knallt es)
  4. Wurden Beans explizit in der applicationContext.xml referenziert, dann werden diese Abhängigkeiten überschrieben

Das bedeutet, dass die explizite Zuordnung nicht sofort wirkt und es zu einem Fehler kommt. Ein Verhalten, mit dem man nicht unbedingt rechnet, denn man hat ja explizit definiert, welche Bean wo verwendet werden soll.

Jetzt könnte ich aus der EasyService Klasse einfach die Annotation entfernen, was eine schlechte Idee ist, denn die Bibliothek ist nicht von mir. Die Lösung ist einfacher: Man kann Spring einen Hinweis für das Autowire geben und mit der Option autowire-candidate sagen, dass eine Bean nicht herangezogen werden soll. In diesem Fall sieht das so aus:

...
<bean id="adDao2" class="active.directory.lib.AdDao" autowire-candidate="false">
<property name="location" value="ad2.mycompany.com" />
</bean>

Jetzt wird in einem ersten Schritt nur die adDao1 Bean für die Dependency Injection verwendet und ein einem zweiten Lauf wird das adDao Objekt des EasyService durch die korrekte Implementierung (adDao2) ersetzt.

 

View Comments (0)

Close Post

Neue scotty Version mit PHP Support

Aktuell ist bei mir scotty auf den Schirm. Seit dem Release haben wir wieder einiges verbessert. Unter anderem wird jetzt das PHP Gateway unterstützt. Das ist eine feine Sache: Man muss lediglich eine PHP Datei auf den eigenen Server oder Webhoster hochladen und kann darüber tunneln. Bei Bedarf können natürlich wieder eigene RSA Keys verwendet werden. Wie das geht, findet ihr auf der Scotty Webseite. Das ist ziemlich einfach und schnell passiert und man hat so in wenigen Schritten, ohne irgendwie SSH oder sonstwas konfigurieren zu müssen, einen Proxy zum tunneln. Also vergesst tunneln via SSH: Mit scotty geht das viel einfacher.

 

View Comments (2)

Close Post

Gastartikel: scotty um Zensur zu umgehen

Flo hat vorgeschlagen, eine kleine Tutorial-Serie zu starten. In der wird er vorstellen, was man mit scotty alles so machen kann. Finde die Idee sehr gut, denn mit scotty kann man eine ganze Menge mehr machen, als man auf den ersten Blick sieht. Wir starten mit der Basisfunktion: Dem Umgehen von filternden Proxies. Flo hat zusammen mit mir scotty entwickelt, ist langjähriger und erfahrener Java Entwickler und hat ein Händchen dafür knifflige Probleme zu lösen. Aber nun übergebe ich das Wort.

Szenario: Dein PC ist hinter einem filternden Proxy (Censorship)

Im ersten Fall verfügt meine Workstation ausschließlich über einen zentralen und filternden HTTP Proxy Zugang zum Internet. Häufig ist selbst dieser Zugriff auf einen kleinen Benutzerkreis beschränkt und erfordert die Eingabe von Benutzernamen und Passwort. Der HTTP Proxy filtert nun leider Webseiten, die wir aufgrund der Meinung des HTTP Proxy Betreibers nicht betreten dürfen. Das bedeutet wir können dringend benötigte Informationen nicht erreichen oder Nachrichten, welche wir sicher und aus einem vertrauenswürdigen Netz senden müssen, nicht absetzen.

Scotty, we transport what you can’t – und bringt uns damit überall hin.

Scotty bringt Abhilfe und öffnet das Netz. Im folgenden wird scotty für das beschriebene Szenario installiert und konfiguriert. Folgende 2 Dateien müssen dafür heruntergeladen und wie beschrieben gestartet werden.

Scotty transporter – Ausgangspunkt im eingeschränkten Netz

scotty transporter wird auf dem Rechner mit eingeschränktem Internetzugang gestartet. Scotty startet einen lokalen Proxyserver und lauscht standardmäßig auf Port 8008 auf eingehende Anfragen des Browsers.

Folgende Schritte müssen also ausgeführt werden:

  1. Download scotty-transporter.jar
  2. Starte scotty-transporter.jar via Kommandozeile:
java -jar scotty-transporter.jar -g [Gateway im freien Internet]
-proxyHost [filternder Proxy] -proxyPort [filternder Proxy port]

Im Beispiel sind die wichtigsten Parameter aufgeführt:
-g Ist die Adresse des Gateways, d.h. Die IP/Domain und Port des Rechners auf dem scotty-gateway-standalone.jar gestartet wurde.
-proxyHost und -proxyPort ist der filternde Proxy und dessen Port, über den die Verbindung zum Gateway aufgebaut wird.

Nun muss nur noch der Proxy im Browser auf localhost:8008 umgestellt werden und die Kommunikation läuft über den scotty transporter.

Scotty macht nun im Detail folgendes:

  1. scotty-transporter verschlüsselt die ursprüngliche Anfrage und schickt Sie an den filternden HTTP Proxy
  2. Der filternde Proxy kann kann die Anfrage nicht analysieren und uns damit Seiten vorenthalten, er leitet sie brav weiter an unseren scotty Gateway im freien Netz.
  3. scotty Gateway führt die Anfrage aus und gibt die Antwort wieder verschlüsselt an den scotty transporter und damit an den Browser zurück.

Um zu sehen, ob scotty gerade Daten überträgt, wird ein kleines Systray Symbol in der Taskleiste angezeigt. ( Ein kleiner, animierter Lade-Indicator) Darüber kann scotty-transporter auch beendet werden, rechts Klick auf das Symbol – Exit.

scotty Gateway – das Tor zur freien Welt

scotty Gateway ist wohl die wichtigste Komponente von scotty. Dieses kleine Programm bezieht die Daten aus dem freien Internet. Der Gateway wird auf einem Rechner mit freien Internetzugang gestartet. Scotty lauscht dann standardmäßig auf Port 9000 auf eingehende Anfragen.
Der scotty Gateway kann auch auf der Google Appengine deployed werden. scotty ist vollständig in Java implementiert und damit unabhängig vom verwendeten Betriebssystem, solange eine Java Runtime von mindestens 1.6 vorhanden ist. (Läuft auch auf Steckdosen-PCs)

  1. Benötigt wird ein Gateway PC/Server mit freien Internetzugang.
  2. Download scotty-gateway-standlone.jar
  3. Starte scotty-gateway-standalone.jar (durch Doppelklick oder via Kommandozeile)
java -jar scotty-gateway.jar

Damit ist der Gateway gestartet und nimmt Anfragen entgegen.

Fazit

Scotty ermöglicht den Zugang zu unrechtmäßig gesperrten Internsetseiten und befriedigt damit das Grundbedürfnis einer freien und offenen Informationswelt. Scotty darf ausschließlich angewendet werden, wenn die Seiten aufgrund von Zensur eines Regimes nicht verfügbar sind. Scotty sollte ausdrücklich nicht verwendet werden, um rechtmäßige Filtersysteme, wie Sie heute praktisch in jedem Unternehmen und jeder Organisation zu finden sind., zu umgehen.

Über Feedback oder Fragen freuen wir uns sehr, daher gerne in das Support Forum posten http://www.scotty-transporter.org/forum

 

View Comments (3)

Close Post

Load more posts...
twitter block image

My tweets

About me

About me

My name is Tobias Zeising. I'm from Munich, the capital of Bavaria, located in Germany. Currently, I'm working as Software Engineer in Munich.

Photography has been a hobby of mine for more than ten years. I love to capture nature and the strong spirit of the moment!

tobias.zeising@aditu.de

500px deviantart.com Tobias Zeising auf twitter Tobias Zeising auf facebook RSS Feed

Search my blog

Here you can search in my blog.

Equipment

Equipment

I use the following equipment:
- Canon EOS 60d
- Sigma 50mm 2.8 Macro
- Sigma EX 10-20mm / 4-5.6
- Canon EF-S 17-85mm IS USM
- Canon EF-S 18-200mm

Some of my older photos where captured with the Konica 300, 510, Canon EOS 300d or 20d.

  • selfoss-image

selfoss

selfoss is a multipurpose rss reader, live stream, mashup, aggregation web application. I programmed this online tool in php and use it as a personal message center. selfoss is free, open source and available for everyone.

http://selfoss.aditu.de

  • scotty transporter-image

scotty transporter

Scotty is a free opensource proxy software for bypassing filter and censorship systems. A free and unrestricted web is one of the greates values our society have. This Java based software helps people who are victims of censorship of governments or private organizations.

http://www.scotty-transporter.org

  • deviantart-image

deviantart

This is my userpage on the biggest art community in the world. There you can find a huge gallery with photos I have captured within the last few years.

http://ssilence.deviantart.com

Portfolio & Blog-image

Portfolio & Blog

You can find more of my photos in the portfolio section. In my blog you can find a lot of nice photos too.