Kontakte konsolidieren Teil 1

Flattr this!

Ich betreibe schon seit einiger Zeit eine “Konsolidierung” meiner sämtlichen Kontakte.  So habe ich nur noch eine Stelle (das Apple Adressbuch) an der ich Einträge erstellen/aktualisieren muss und habe sie dann zum Beispiel auf meinem Handy (ein Nokia N80).

Mit MacOS 10.5 ist eine neue – wie ich finde schöne – Funktion hinzugekommen:

Unter  Adressbuch->Einstellungen->Allgemein ist im unteren Bereich ein Button, mit dem man eine Synchronisation mit dem Yahoo Adressbuch einstellen kann. Da ich aufgrund von (seltenen, aber durchaus vorhandenen) Uploads zu FLICKR eh einen Yahoo Account besitze, und damit Email und Adressbuch habe, hat es sich quasi aufgedrängt, das mal zu testen. Und ich muss sagen, es funktioniert (apple-like) problemlos und im Hintergrund.

Als ich dann bei XING gestern dann noch eine Funktion fand um mein Yahoo Adressbuch mit angemeldeten und mit mir verbundenen Kontakten abzugleichen, schloss sich wieder ein Kreis :-).

Meine Kontakte dann über das Yahoo Adressbuch auf einen anderen Mac zu importieren habe ich noch nicht versucht, aber ich denke das sollte problemlos möglich sein. Alles in allem eine nette Funktion mit Mehrwert. 

REST resources

Flattr this!

Hier dann mal eine Übersicht, wie ich REST auf meine Anwendung hin abbilden möchte:

Das deckt sich auch ungefähr mit meinen Use-Cases. Ich werde jetzt versuchen eine Java Bean mit REST Funktionalität anzulegen um damit dann mein JPA Objekt zu bearbeiten :-).
Weiterhin muss ich mir noch stark überlegen, ob ich dann überhaupt noch JSP für die Darstellung brauche, oder ich nicht alles über Beans machen kann. (Wobei ich eigentlich gerne für die Display Logic – also die reine “Verpackung” bei JSP bleiben würde). Ich denke ich werde als Ausgabeformat der Resourcen(listen) ersteinmal bei XML bleiben, wobei sich als User natürlich auch anbieten würde, auch VCard anzubieten (aber ich muss ja in meinem Bereich bleiben 🙂 )

Software Update von MacOs via Bash

Flattr this!

Naja nach dem Update von MacOS auf Version 10.5.1 wollte mein Mac mini sich nicht mehr remote steuern lassen. Da ich momenten keinen Monitor für meinen kleinen Mac habe, musst ich wohl oder übel das notwendige Update per SSH ausspielen.Ich fand bei http://instant-thinking.de  eine Lösung: 

horus:~ philipp$ softwareupdate -l

 Damit erhalte ich eine Liste mit allen aktuellen Updates. 

horus:~ philipp$ sudo softwareupdate -ia

 Installiert mir schließlich alle vorhandenen Updates 🙂  Die Remote Verbindung klappte nach dem Update wieder problemlos. 🙂

tatsächlich….

Flattr this!

…. fast schon wieder n Jahr rum 😉 Also irgendwie komme ich gar nicht mehr dazu hier was zu posten.Hat sich schon eine ganze Menge ereignet in letzter Zeit :-)Achja… heute dann mal in Deutsch wieder, irgendwie ist das Englische grade entfallen.Zuallererst:Ich habe endlich ein Macbook und es ist soooo schön! Zwar in weiß (und langsam zeigt sich, dass es Flecken anzieht),  aber es ist deutlich schneller als mein kleiner G4 Mac Mini.Da ich munter am einrichten des Systems bin, hier schon mal ein paar Hinweise: 1. Um in der iTunes Bibliothek die Links (die kleinen Pfeile) hinter den Interpreten/Alben so umzuwandeln, dass sie nicht in den iTunes Store führen, sondern in die eigene Bibliothek, muss man im Terminal folgenden Befehl ausführen:   

defaults write com.apple.iTunes invertStoreLinks -bool YES    

Möchte man das alte Verhalten wiederhaben (Option(=alt)-KLICK auf den Pfeil Button führt zur Bibiothek), so schreibt man:  

defaults write com.apple.iTunes invertStoreLinks -bool NO

 Gefunden im macwelt.de Forum [1]  Weiterhin gibt es eine erste Beta vom Mail Plugin:

 PGP for Apple’s Mail    

Diese Beta läuft nun auch wieder unter Macos 10.5 Leopard. Meinen gpg key findet ihr übrigens direkt unter meinem Foto. Man erhält diese Beta, indem man sich in die Mailingliste einträgt. Es läuft noch nicht alles perfekt, aber zumindest kann man gpg wieder schützen.Ich werde in der nächsten Zeit übrigens Beiträge zu folgenden Themen posten: 

  1. gpg – was ist das und wofür braucht man das
  2. ssh  – was ist das und wofür braucht man das
  3. ssh mit key files – der sichere Komfort

 Es ist zumindest ein kleiner Beitrag, ein wenig Information zu verbreiten, nachdem zumindest die Politik in Deutschland kein Interesse daran hat, den Schutz der persönlichen Daten weiterhin aufrecht zu erhalten. 

Subversion – how to do?

Flattr this!

Ich wollte grad versuchen mein bisherigen Projekt auf den innoQ subversion server zu schieben. Allerdings hat es bisher noch nicht so funktioniert.
Weder
http://www.innoq.com/secure noch
https://www.innoq.com (nach dem wiki sollte das ja nach innoq.de weitergeleitet werden)
noch https://www.innoq.de/secure gingen.
Bei letzterem kam allerdings ein authentification error.
Vielleicht kann mir ja jemand einen Tipp geben.

JPA YEEHA!

Flattr this!

Besser später als nie, hier also dann mal – nach laaaanger Zeit mal wieder – mein aktueller Status.
Mittlerweile bin ich ein ganzes Stück weiter und so fange ich sogar an, dem ganzen System von Persistence etwas abgewinnen zu können. Einzig die Frage bleibt, wieso JPA per default partout alle Feldnamen als groß schreibt. Naja das wird sich sicherlich auch noch klären. Aber zuersteinmal der Reihe nach:
Das – anfängliche Problem, dass ich ja einen Integer Primary Key brauche, aber auch zum Beispiel auch ein User Objekt anhand eines Namens (der ja nach meiner Definition auch eindeutig sein soll) erstellen will, ergab sich die Zwickmühle, dass es ein System geben muss, welche einem quasi einfache SQL Searches erlaubt… gibt es auch.
Anhand einer Präsentation, von Phillip fand sich dann auch eine recht kurze (und demnach schmerzlose) Lösung:

@Entity
@Table(name = "Users")
@NamedQuery(name = "findWithName", 
    query = "SELECT u FROM User u WHERE u.name = :Name")
public class User {
    ...
}

Das sagt der Klasse, dass sie, wenn ich eine Query namens (“findWithName”) ausführe, das nachfolgende SQL Statement benutzen soll und demnach auch den Parameter ‘Name’
Der Aufruf schaut dann so aus:

User user = (User) em.createNamedQuery("findWithName")
            .setParameter("Name", "TestUser").getSingleResult();

Nunja ein schöner, langer Aufruf. Aber immerhin wird mir ein User Objekt erstellt, wenn ein User mit Namen ‘TestUser’ existiert!
Kommen wir zum nächsten Punkt – mein Lieblingspunkt an diesem Morgen, weil das mich ziemlich viel Zeit und Schweizß gekostet hat (obwohls doch eigentlich so einfach ist) – die Kardinalitäten – ODER AUCH -” wie papern, wer n Eintrag an’nen User?”
Ich bin in mich gegangen und kam mit der Entscheidung aus mir (sagt man das so?), dass ich für jeden Eintrag, der von User A nach User B geschickt wird, ein Eintrag in der Datenbank erstellt wird. Also selbst, wenn User A an B und C die gleiche Aufgabe verteilen würde, würden zwei Einträge erstellt. Ich weiß, dass es dann recht unmöglich ist, zum Beispiel zwei User für eine Aufgabe vorzusehen und diese Aufgabe dann bei User B erledigt ist und bei User C noch offen – letztendlich ging es mir auch ersteinmal darum, die Abhängigkeiten hin zu bekommen.
Also erstmal die Veriante mit Stützrädern (zwei Tabellen) und dann hinterher (so morgen) schau ich mal, ob ich das auch freihändig schaffe (so drei Tabellen).
Letztendlich schaut das mit JPA ähnlich aus wie bei Willem und seinen RoR (gabs da nich mal n Lied mit RoR, RoR, RoR the Boat? aber ich glaube das war Row… egal).
Also vielleicht zuerst einmal die beiden Klassen und wie diese zusammenhängen:

Ja die Attribute laden quasi dazu ein, auf eine 3. Tabelle auszulagern ;-).
Es gibt also zwischen User und Entry exact zwei 1-zu-N Beziehungen:
1. Hat ein User genau eine Inbox mit N erhaltenen Entries
2. Hat ein User genau eine Outbox mit N versandten Entries
Da Willem nich Ruhe geben wollte, habe ich die Tabellen gleich mal Pluralisiert (okay ist auch sonst ne ganz gute Idee) und die IDs _id getauft.
Für JPA geht man nun wie folgt vor:

...
public class User {
    ...
    @OneToMany(mappedBy = "recipient")
    private Collection inbox;
    @OneToMany(mappedBy = "sender")
    private Collection outbox;
    ...
}
...

sagt einem, dass jeweils die Attribute (eigentlich die Items aus den Collections) inbox und outbox an das Attribut (und hierbei geht es wohl wirklich um das Objekt ansich) “recipient”/ “sender” gemapped werden.
In der Klasse Entry muss dann natürlich quasi “das Kind konfiguriert werden” (das klingt jetzt seltsam aber im Moment fällt mir nix gescheiteres ein):

...
public class Entry {
    ...
    @ManyToOne()
    @JoinColumn(name="recipient_id")
    private User recipient;
    @ManyToOne()
    @JoinColumn(name="sender_id")
    private User sender;
        ...
    }
...

Na gemerkt? ManyToOne anstatt OneToMany….ach war klar? Na,… okay :-).
Nun werden halt nur noch schnell die Feldnamen aus der DB Table angegeben und besagte Objekte erstellt ( recipient/ sender ). Geht ja eigentlich ganz schnell…
Das Setten/Getten probiere ich dann mal morgen und dann auch gerne mit 1+1+1 = 3 Tabellen. Gibt einem ja dann doch ein wenig mehr Möglichkeiten.
Das EJB3 Buch ist übrigens gut. Man liest, schreibt, sucht dann noch nen anderes Beispiel und dann versteht man es erst ;-). Nach und nachen rücken aber erster und letzter Schritt immer näher zusammen.
Ich wünsche allen eine erfolgreiche Woche.

Betr. JPA

Flattr this!

Bisher hat der Umbau der vorhanden Klassen hinsichtlich der Nutzung von JPA promblemloser funktioniert als gedacht. Bisher versuche ich halt nur, das User Objekt aus der Tabelle User auszulesen.
Letztendlich muss ich aber mein bisheriges Konzept soweit umstellen, dass ich die Validierung von Eingaben aus der User Klasse in eine sperate Application Klasse auslagere.
Allen anschein nach klappt das Laden der User Klasse mit Hilfe eines EntityManagers fehlerlos, allerdings scheint es da an einigen Stellen noch zu Problemen zu kommen.
Nach der Überarbeitung sieht die User Klasse nun wie folgt aus:

Die Methoden isLogin and isWithName werden dann wahrscheinlich auch ausgelagert werden müssen. Das Attribut error wird wohl einer Fehlerbehandlungsklasse weichen und in Folge dessen als Sammlung von Exceptions implimentiert werden.
Als Primary Key habe ich mich jetzt für das Attribut Name entschieden, da es scheinbar nur möglich ist, die find Methode des EntityManagers anhand eines Primary keys zu nutzen und ich aller Vorraussicht nach eher nach Namen als nach IDs suchen werde.
Das Laden des Objektes passiert nun in einer neuen Klasse Application:

Leider wird mir bei der Methode showID() eine NullPointerException geworfen, die ich noch nicht ganz nachvollziehen kann :-/. Letztendlich wird mir JPA aber denke ich eine Menge an Arbeit abnehmen, sobald es erstmal stabil läuft.
Bei Sun habe ich allerdings noch ein Beispiel gefunden, was wie perfekt für mich zu sein scheint, weil es schon ziemlich viel von dem behandelt, was ich eigentlich machen möchte [1]

Was bisher so geschieht…

Flattr this!

Moin…
Ich wollte mal wieder ein wenig Feedback geben, woran ich bisher so sitze…
Letztendlich bin ich endlich mit einer schönen Datenbankklasse ausgestattet, die mir auch die Dinge bietet, auf die ich angewiesen sein werde – ob da jetzt noch etwas dazu kommt, wird sich zeigen, aber erstmal reicht mir das, was bisher vorhanden ist. Zudem bin ich auf ein paar Besonderheiten von JSP/Java und MySQL gestossen, die in meinen Augen recht unlogisch sind, aber nunja, vielleicht gibt sich das noch.
Mein bisheriger Plan ist es, jetzt erstmal die Grundfunktionen des Servers mit einer einfachen HTML Oberfläche zu erstellen, um dann den Client mit Hilfe von YUI dynamischer zu gestallten.
Aber jetzt erstmall ein Überblick über die Klassen:

Die statische Config Klasse ist erst später hinzugekommen, sodass ich die Attribute aus der Datenbankklasse, welche den Zugriff betreffen wohl dann entferne und die Benutzerdaten zentral in der Config Klasse speichere.
Ich habe jetzt auch schon erste Tests mit einer Session hinter mir, aber das Klassendesign ist noch sehr gewöhnungsbedürftig ^^.

Die Klasse TOOLS soll einfach zur Sammlung verschiedener Funktionen dienen.
Die md5 Methode dient einfach dazu, einen gegeben String als md5 Summe zurückzugeben. Dies brauche ich u.a. für die Passwörter.
Sobald ich die erste HTML Oberfläche habe (die dann einfaches Anmelden, Erstellen und Auflisten von Einträgen beherrschen wird, werd ich erste Funktionstests machen.
Das Schöne, was ich an Eclipse gefunden habe ist, dass man per Vorgabe einfache TextKlassen für Klassen erstellen kann. Dort werden alle Methoden einmal aufgerufen.
Ob das für ein Unit Testing ausreicht muss ich dann noch mal sehen.

Achja… Java und MySQL: Die erhaltenen Einträge aus der Datenbank speichert Java in einem sog. Resultset. Mit der methode next() kann man die verschiedenen Einträge durchblättern. Das komische ist nur, dass wenn – nachweislich – nur ein Eintrag vorhanden ist, muss man dennoch einmal die next() methode aufrufen.
Also muss man von 0. Eintrag auf den 1. blättern? O_o. Meiner Meinung nach irgendwie unnlogisch. Dementsprechend hat mich das auch ein wenig aufgehalten.
Betroffen war u.a. diese Methode aus der Klasse User:

public void load(){
    this.DB.Query("SELECT `ID`, `password` " + 
                   "FROM `users` WHERE `name` = '"+this.name+"' ");
    try {
        ResultSet res = this.DB.getLastResult();
        System.out.println(res.toString());
        res.next();
        this.ID = res.getInt("ID");
        this.password = res.getString("password");
    }catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Ob ich jetzt das “erste Blättern” in der getLastResult() unterbringe habe ich mir noch nicht überlegt.
Wünsche allen frohes Schaffen und ein schönes Rest-Wochenende!

simple iPhoto Gallery Script

Flattr this!

Some time ago, i searched for a very simple possibility for publishing some photos online.
As a Mac User i am recently using iPhoto for collecting and organizing my photos.

I reused some old PHP code and create a simple Script, that searches through some iPhoto Web Exports to build a nice index page with folder previews:

phpGallery Screen1

The folder structure should be as the following:
phpGallery Screen2

As i do not have other language Versions of iPhoto, i do not know, if the scripts works also with other Versions of iPhoto.

Here you can download the very first version of the script:

PHP_Gallery_Script_for_iPhoto06_german

Die Sache mit den Emails (vorsicht, hoher Geek Faktor!)

Flattr this!

Da einem Kollegen von mir Namentlich Bartosz, regelmäßig teilweise wirklich unglaubliche Dinge passieren, habe ich mal angefragt, und werde jetzt hin und wieder daraus etwas schildern…. tada…. *Tusch oder so*

Bartosz Welt:

Neulich beim abendlichen Chat mit einem Bekannten:

< 23:21:19 xxxxxxxxx: die uni bei uns hat jetzt nen neuen spamfilter - exchange spam irgendwas, extern gehostet bei microsoft. halte ich nicht sehr viel von, daß auch nur eine meiner mails durch microsofts hände geht... also habe ich dem support ne mail geschrieben, daß ich bitte auf den spamfilter verzichten will. leider scheint meine nachricht bei denen im spam gelandet zu sein. klasse. gut gemacht, microsoft. >

Just ein paar Tage bekam ich von dem Administrator der Universität Coventry – wie wahrscheinlich viele Studenten der Uni Coventry folgende Email:

< There is currently a problem with email in that incoming emails to the University are being bounced back to senders. The problem has been traced to the external iCritical anti-spam service and they are currently investigating. We expect a further update from them in half an hour or so. Most external email systems will continue trying to deliver for some time and so when iCritical fix the problem, these pending emails should then be delivered. That process may take some time however (as there will be a backlog). We are currently hopeful of seeing any such delay cleared by Monday. Outgoing mail will not be affected by this fault. >

Es ist schon erstaunlich…. da nutzen die einen extra Anbieter für Ihre Spambewältigung…

Da ich obiges Gespräch noch deutlich im Hinterkopf hatte, habe ich das einfach mal meinem Kontakt mitgeteilt und verhielt folgende doch recht spassige Antwort:

< Von: Bartosz xxxxxxxxxxxxx
Datum: 20. Januar 2007 23:30:04 GMT+00:00
An: Philipp Haussleiter
Betreff: Re: Fwd: Email problem – Update
Jetzt rate mal was die fürn n spamfilter haben? 😀

Zumindest einen, dessen Webseite mehr nach Enterprise und Web 2.0 aussieht als die von unserem off-site SPAM-Filter:

https://spam.frontbridge.com/

Sicher, mir kann das an sich auch schnurz piepe sein, was die Uni einsetzt – ich habe für meine Uni-Mail-Adresse sofort eine Weiterleitung auf bartosz@xyz gesetzt, für den Fall daß irgendein Depp da ne Mail hinschickt, benutze aber auch an der Uni immer nur meine Privatadresse.

Lustigerweise ist eine Weiterleitung an eine nicht-Uni-Adresse übrigens verboten. Angeblich verursacht das sonst hohe Kosten wegen der großen zu übertragenden Datenmengen. Aber wenn alle ununterbrochen YouTube-Videos schauen und sich per MSN Messenger (ja, auf den stehen die hier alle total) und Webcam unterhalten, dann ist alles in Butter… Ich leite meine @tcd.ie-Adresse daher an meine, ebensowenig gewollte oder bewußt genutzte, @cs.tcd.ie-Adresse weiter. Von *dieser* Adresse aus dann ist eine Weiterleitung dann plötzlich erlaubt, egal ob nach Timbuktu oder Tatarstan. Das liegt daran, daß die Informatik ihr eigenes Netz betriebt und ihre eigenen Regeln aufstellt. Albern ist es aber allemal.

Und dieser ganze Unfug führt zu albernen Situationen wie dieser: Ich habe letztens eine Mail an Paul geschickt. Der sitzt am Schreibtisch neben mir, vielleicht einen Meter entfernt. Meine Mail ging erst per SSH-Tunnel, der per OpenVPN durch den SOCKS-Proxy der Uni getunnelt wird (um die blöde Regelung zu umgehen, daß nur bestimmte Dienste und Ports erlaubt sind) zum OpenWrt-Router bei meinen Eltern in Dortmund. Von dort aus ging es weiter zum Mailserver von all-inkl.de. Dieser hat die Nachricht dann an Pauls Mailserver an der Carnegie Mellon University geschickt. Paul hat die Mail empfangen und mit mutt gelesen – eingeloggt auf einem CMU-Server per SSH, über SOCKS getunnelt.

Hätte er an meine @tcd.ie Adresse zurückgeschrieben, wäre die Reise noch abenteuerlicher geworden: Von Pauls Schreibtisch aus über SSH und SOCKS mit mutt geschrieben, wäre die Nachricht nach einem kurzen Aufenthalt in den USA nach Irland zurückgekommen. Der tcd.ie-Mailserver hätte sie an den cs.tcd.ie-Server geleitet. Dieser wiederum hätte die Nachricht an bartosz@xyz und damit zu all-inkl.de in Deutschland geschickt. Von hier hätte ich sie abgerufen, mit Thunderbird über den SSH-Tunnel im OpenVPN-Tunnel zum OpenWrt-Router durch den SOCKS-Proxy. Ich mag gar nicht zählen, wie oft diese Nachricht das TCD-Netzwerk betreten und verlassen hätte – und all das nur, um deren Bandbreite zu schonen. Das sind schon ein paar ganz tolle Helden, die das hier alles geplant haben.

Und die Krönung des ganzen ist dann noch der externe Spam-Filter. Die Nachricht hätte eine weitere Runde über den großen Teich gedreht, weil sie der tcd.ie-Mailserver zur Kontrolle an frontbridge.com geschickt und von dort wieder zurückbekommen hätte.

Ja, so ist das, wenn Administratoren sich aufspielen und technisch versierte Nutzer sich widersetzen. Wahrscheinlich sollten wir, wie 99% des Univolkes, den erbärmlichen Webmailer einsetzen und niemals hinterfragen, ob dies der Weisheit letzter Schluß sein kann…

Gruß,
– Bartosz

PS: Meine Rechtschreibprüfung kennt “Timbuktu” nicht… sowas.

Ich muss mir unbedingt mal die Zeit nehmen um die Emails auf der großen Weltkarte einzuzeichnen >