Posts mit dem Label Jabber werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Jabber werden angezeigt. Alle Posts anzeigen

6. Juni 2013

Immediate Disconnect for strophe.js

Updated A Website Chat made easy with XMPP and BOSH with my findings on immediate disconnect with strophe.js on page unload.

Problem:
The connection should be closed when the page unloads. Unfortunately strophe.js (at least up to version 1.0.2) disconnects asynchronously, which does not work when the page is destroyed. After some time the XMPP server will notice, that the page disappeared and will close the connection. But if you do not want to wait, then we have to force strophe to close immediately.

Solution:
There is a strophe patch, which allows for synchronous connection closing. The patch must be applied to the strophe.js file. Just 2 lines of code in strophe,js and one line before calling disconnect().

See A Website Chat made easy with XMPP and BOSH.

_happy_closing()

2. Januar 2011

OAuth for TwiX

I finally added OAuth to TwiX, the Twitter-XMPP gateway.

Since August 2010 Twitter requires OAuth for API access. This is extremely stupid for background daemons like TwiX which do not have a user interface and especially no browser based UI.

TwiX is my C# playground. So, I needed an OAuth library for C#. TwiX runs on mono and .NET. I am running my instance of TwiX on a Linux server. Luckily almost all .NET libraries run without modification on mono.

A quick research returned several OAuth libraries, some are for ASP.NET, which I do not use, because TwiX is a faceless server daemon, not a Web application. I zeroed in on Shannon Whitley's implementation which comes with a handy sample project.

This example project has
- an OAuth core implementation
- a Twitter OAuth adapter
- a sample desktop app with embedded browser
= cool thing

I used the 2 OAuth classes in TwiX and converted the sample desktop app into a Twitter OAuth token generator tool (see screen shot). 1 hour of work, thanks Shannon.

This is a general Twitter token generator. It is not just for TwiX. The OAuthTwitterDesktopTool generates a twitter token and token secret for every Twitter app, if you know the app's consumer key and consumer secret. The OAuthTwitterDesktopTool is part of the TwiX distribution.

You can find TwiX with OAuth and the token generator on the TwiX homepage.

_happy_authorizing()

26. September 2010

A Website Chat made easy with XMPP and BOSH


A description of the live chat feature on http://avatar.lupuslabs.de/contact.html

10 years ago we spent weeks to develop a website chat. We implemented a chat server in C++, a PHP library, which talked to the chat server and JavaScript streaming in an iframe. Today it is much simpler.

Today we can use XMPP and BOSH and let the web page talk to my GTalk client, which runs all the time anyway.

Here is the shopping list of technologies:
These components do all the work. There is only some Javascript code and a little bit of plumbing required.

1. Set up ejabberd:

Download ejabberd from http://www.ejabberd.im/. The easiest way is to use the installer from http://www.process-one.net/en/ejabberd/downloads

For XMPP to work we need XMPP users. I prefer to run ejabberd with MySQL storage, because MySQL is the easiest way for me to add users and to manage the user list programatically. But the mnesia database also works.

Here is the config to use MySQL with ejabberd (to be added to ejabberd.cfg):
% {auth_method, internal}. % disabled
{auth_method, odbc}. % enabled
{odbc_server, {mysql, "localhost", "ejabberd", "mysql-user", "mysql-password"}}
Also I comment out XMPP in-band account registration, so that nobody creates users on my server:
{access, register, [{deny, all}]}.
This article explains how to create tables for ejabberd in the MySQL server: https://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver

2. Set up Apache as BOSH proxy:

Enable Apache modules "proxy" and "proxy_http". The debian way:
% a2enmod proxy
% a2enmod proxy_http
Add to the proxy configuration (Debian: proxy.conf)
ProxyPass /xmpp-httpbind http://127.0.0.1:5280/http-bind
ProxyPassReverse /xmpp-httpbind http://127.0.0.1:5280/http-bind
By default accessing the proxy is only allowed for localhost. Since Browers will access it, it needs to be accessible from anywhere. Add to the proxy configuration (Debian: proxy.conf)
Allow from all
ProxyRequests Off
3. Create an HTML file and start programming

Download Strophe and jQuery (or use the CDN version http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js). Add references to the HTML-head:
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src='strophe.min.js'></script>
4. Now comes the real fun: coding

We basically create a BOSH connection from Javascript to ejabberd through apache/mod_proxy:
var conn = new Strophe.Connection('/xmpp-httpbind');
Create an XMPP user in MySQL (I am using phpmyadmin) and connect with this user:
conn.connect('test@wolfspelz.de', 'secret', OnConnectionStatus);
The OnConnectionStatus function may look like:

function OnConnectionStatus(nStatus)
{
if (nStatus == Strophe.Status.CONNECTING) {
} else if (nStatus == Strophe.Status.CONNFAIL) {
} else if (nStatus == Strophe.Status.DISCONNECTING) {
} else if (nStatus == Strophe.Status.DISCONNECTED) {
} else if (nStatus == Strophe.Status.CONNECTED) {
OnConnected();
}
}
When the connection is established, register message handlers and send our own presence:
function OnConnected()
{
conn.addHandler(OnPresenceStanza, null, "presence");
conn.addHandler(OnMessageStanza, null, "message");
conn.send($pres());
}
BTW: handlers should always return "true". Otherwise they are removed from the handler list. A message handler may look like:
function OnMessageStanza(stanza)
{
var sFrom = $(stanza).attr('from');
var sType = $(stanza).attr('type');
var sBareJid = Strophe.getBareJidFromJid(sFrom);
var sBody = $(stanza).find('body').text();
// do something, e.g. show sBody with jQuery
return true;
}
A presence handler may be:
function OnPresenceStanza(stanza)
{
var sFrom = $(stanza).attr('from');
var sBareJid = Strophe.getBareJidFromJid(sFrom);
var sType = $(stanza).attr('type');
var sShow = $(stanza).find('show').text();
// do something, e.g. show status icon with jQuery
return true;
}
The connection should be closed when the page unloads. Unfortunately strophe.js (at least up to version 1.0.2) disconnects asynchronously, which does not work when the page is destroyed. After some time the XMPP server will notice, that the page disappeared and will close the connection. But if you do not want to wait, then we have to force strophe to close immediately.

There is a patch, which allows for synchronous connection closing. The patch must be applied to the strophe.js file:
diff --git a/src/core.js b/src/core.js
index 5aeb06a..f79ae29 100644
--- a/src/core.js
+++ b/src/core.js
@@ -2161,7 +2161,8 @@ Strophe.Connection.prototype = {

             req.date = new Date();
             try {
-                req.xhr.open("POST", this.service, true);
+               var async = !('sync' in this && this.sync === true);
+                req.xhr.open("POST", this.service, async);
             } catch (e2) {
                 Strophe.error("XHR open failed.");
                 if (!this.connected) {
How to use the patch:
    this.conn.flush();
    this.conn.sync = true; // Set sync flag before calling disconnect()
    this.conn.disconnect();

5. Summary

Of course, all these functions and callbacks should be prototype based and bind the instance to the closure. We should also use a model-view architecture and handle the protocol stuff in the model, while notifying the view of really important events.

Here are the files:
contact.html - the "driver" which loads everything and produces the GUI
model.js - the model does it, classes: Model, Room, Participant
view.js - the view shows it, the view registers listeners with the model
utils.js - utility classes, logging, unit test, oberver pattern
config.js - configurations for test and production
setup.js - selects the appropriate configuration
style.css
lib/strophe.js - including the above patch
lib/jquery-1.4.2.min.js
lib/jquery-ui-1.8.5.custom.min.js
_happy_chatting()

29. Juli 2010

IBM recommends XMPP for Realtime Web Apps


There is a new tutorial from IBM about how to build modern realtime web apps. In the tutorial IBM suggests using XMPP, BOSH from JavaScript. It is worth reading.

http://www.ibm.com/developerworks/xml/tutorials/x-realtimeXMPPtut/index.html

This is exactly how weblin.lite was built 2 years. Even including the HTTP proxy to circumvent the JavaScript security limitation, tunneling XMPP through HTTP with BOSH, using a real XMPP server for message routing and a JavaScript XMPP client library to communicate. Also: jQuery, Ajaj, XML, JSON, WebServices, mysql. Basically, all the cool web-tech stuff we like.

Congrats to the weblin dev team. The best dev team I've ever had.

_happy_boshing()

Yes, we have been there. Now it is so much a standard, that IBM recommends the technology. It will be picked up by many others and we are already the experts. So much for certain ignorant investors and business angels, who do not recognize technology in their portfolio, even if it jumps into their face. We will be there without you.

23. Juli 2010

Vorbereitung für Tokio

Morgen Samstag 13:55 fliege ich von von Hamburg nach Frankfurt. Nach 5 h Aufenthalt (war billiger) von Frankfurt nach Tokio. Komme dort Sonntag
15 h Ortszeit an.

Tokio hat 7 h Unterschied zu Schland. Wenn hier 10 h ist, ist dort schon 17 h. Die Japaner sind uns was voraus. Ich werde da 3 Wochen sein. Und es wird heiss. Habe viele T-Shirts dabei.

Treffe in Tokio einen alten Freund aus Weblin-Zeiten. Mal sehen was da in Japan so geht Das wird ein Spass. Und ein Abenteuer - lost in translation.

happy_traveling()

24. September 2009

TwiX - Jabber Twitter Gateway Version 0.4.8

I was spamming my twitter account accidentally. Actually it was my Jabber/Twitter gateway, which got an XMPP error message from a broken jabber server and tweeted the error, then sent me a confirmation, got another error message and tweeted it again. Infinite loop!

The main problem is, that the error message looks very much like a good message. That's a Jabber "feature". A good message looks like:

<message from="JID" to="JID">
<body>...Started</body>
</message>
If that produces an error, then comes back:
<message from="JID">to="JID"type="error">
<body>...Started</body>
  <error code="500" type="wait">
  <internal-server-error xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
  </error>
</message>
...which looks very much like the original message, if you do not check for the type="error" bit and just forward the body to the twitter API.

Fixed.

TwiX has now been updated to version 0.4.8. Get it here.

_happy_looping()

16. September 2009

ejabberd crash solved by raising number of network connections

I was bothered by ejabberd crashes. Suddenly it started to crash quicky. The crash dumps said something like:

eheap_alloc: Cannot allocate 747325720 bytes of memory (of type "heap")
and:
eheap_alloc: Cannot allocate 934157120 bytes of memory (of type "old_heap").
I tried the installer, tried compiling erlang and ejabberd from source. I usually run ejabber in a virtual server. I tried on the native host. Nothing helped. We had a similar problem before with a memory bug related to mnesia tables where a server with 5000 clients reaches 3 GB in 5 days and crashes. That case was solved by upgrading the erlang runtime from R12B-3 to R12B-5.

But in this case it needed only 5 minutes and 1000 users to suck up the entire system memory. This was different. The number of about 1000 client connections was the constant of all crashes. @zeank suspected that the problem is the limit of open file descriptors, 1024 by default. The open file descriptor limit means also the max number of TCP (client) connections. Setting this to a higer value, e.g. 32.000 solves the problem.

In practice: insert into ejabberdctl
after:
ERL_MAX_PORTS=32000
the line:
ulimit -n $ERL_MAX_PORTS
_happy_ejabbering()

20. September 2008

TwiX - a Twitter to Jabber (XMPP) Gateway

Tired of waiting for Jabber device updates from Twitter.com?

Try TwiX ...

...and use your Jabber client to send and receive tweets.

TwiX polls twitter.com for new tweets and sends them to your Jabber account as instant message. It also sends your tweets to twitter.com.

Features:

  • Twitter from your Jabber client
  • get tweets to your Jabber client
  • runs on Windows and Linux with .NET and mono
  • Jabber command line + statistics
  • detailed log output
  • many command line options (you won't really need)
  • TwiX runs well on just the 3 account parameters shown below

Release: TwiX-0.5.0.zip (Best ever)
Source code: TwiX-src-0.5.0.zip (MS Visual Studio 2008)
License: 3-clause BSD (Use it but don't sue me)

Sample command line:
% twixd -twitter my-twitter-token:my-twitter-token-secret
-xmpp my-real-jid@jabber.org
-client my-twitter-gateway@jabber.org/TwiX:gateway-password

Command line options:
Usage:
-twitter : # required: twitter oauth token and secret, colon separated
-xmpp # required: your Jabber ID to send/receive tweets
-client : # required: an arbitrary Jabber account to be used by this Jabber client as a relay, colon separated
-interval # optional (default=120) twitter polling interval
-hideself # optional (default=yes) hide my own status updates
-xmppresponse # optional (default=yes) tell me about the submission status
-xmppupdates # optional (default=yes) send updates at all
-xmppreconnectinterval # optional (default=30) XMPP reconnect interval
-loglevel # optional (default=user) max log level
-logfile # optional (default=) log file name
-logconsole # optional (default=yes) log to console
-version # optional: print version info
-help # optional: this text

Jabber command line:
/twix quit
/twix reload
/twix stats
/twix resetstats
/twix set xmppresponse <on|off>
/twix set xmppupdates <on|off>

_happyTwittering()

24. Mai 2008

RSS-Feeds: eine Fehlentwicklung - warum XMPP besser gewesen wäre

Ich bin ja wirklich ein Fan von RSS-Feed-Readern. Inzwischen besuche ich gar keine Blogs mehr, sondern lese nur noch die Feeds im Reader. Echt toll, dass die Nachrichten zu mir kommen, statt dass ich alle Websites abklappern muss.

Schade nur...

...dass die Nachrichten gar nicht zu mir kommen, sondern dass meine Software sie abholen muss. Ich muss zwar nicht alle Websites abklappern, aber mein RSS-Client schon. Der schaut ständig nach ob es was neues gibt (polling). Dabei sollt er eigentlich benachrichtigt werden. Der Begriff RSS-Feed ist glatt gelogen. RSS-Feeds sollten RSS-Fetch heißen. Nochmal: Die Nachrichtenquelle sollte eine Nachricht an meinen Reader schicken, statt dass mein Reader alle 10 Minuten nachschaut ob etwas neues da ist. Traffoc-mässig echt eine Schweinerei und nur im Zeitalter von Torrent und Videodownloads gerade noch tragbar.

Diese Fehlentwicklung liegt natürlich daran, dass der ganze RSS-Mechanismus auf Web-Technologien aufbaut, die wegen HTTP per se nur Request-Response können. Dabei gibt es etablierte Technologien mit denen man einen echten News-Feed aufbauen könnte, z.B. XMPP/Jabber.

Was besser gewesen wäre

Bei XMPP ist mein Client ständig mit meinem Server verbunden. Andere Server können jederzeit zu meinem Server Kontakt aufnehmen und dieser schickt dann alles an mich weiter. Wenn ich einen News-Feed haben will, dann registriere ich mich mit meiner Adresse bei der Nachrichtenquelle. Die Nachrichtenquelle schickt mir dann immer eine Mitteilung, dass etwas neues da ist (mit Titel und Zusammenfassung). Mein Reader zeigt es mir sofort (!) an und ich kann die Nachricht lesen. Kein "Pollen", keine Verzögerung, kein unnötiger Traffic.

Jetzt mal ehrlich...

...RSS ist Really Stupid Syndication. Diese Art von News-Pollen gehört in den Mülleimer der Geschichte. Die Zeit ist reif für ein Message-basiertes News-System. Die Technik ist verfügbar: XMPP und andere IM.

Aber inzwischen gibt es so viel Content der die schlechte alte Technik benutzt, dass wir noch lange damit leben werden müssen. Und mit Web-basierten RSS-Readern entspannt sich auch die Lage beim Traffic, weil ein Betreiber (z.B. Google) die Feeds für alle gemeinsam abfragt. Und wenn es komplizierter gewesen wäre, dann hätte es sich vielleicht nicht so durchgesetzt und es wäre weniger Content verfügbar.

Lesen Sie auch bald wieder hier: "Web und Request-Response: eine Fehlentwicklung - warum ein Mesh und Messaging besser gewesen wäre".

6. Mai 2008

IM Protokolle: eine Fehlentwicklung - warum SMTP besser gewesen wäre

Ich bin ja wirklich ein Freund von XMPP als Instant Message Protokoll. Und ich finde auch IM als Dienst mit all seinen Anwendung von Status Updates, über Chat bis Unified Messaging ganz toll.

Aber: dafür hätte man keine neuen Protokolle gebraucht. SMTP mit ein paar kleinen Erweiterungen hätte völlig ausgereicht. Messaging ist ja sozusagen die Kernkompetenz von SMTP. Dafür wäre sicher kein neues Protokoll nötig gewesen. Was sind Status Updates anderes als Messages? Chat: Messages mit einer Thread-ID. SMTP kann beliebige Content-types: text, HTML usw. Das hat HTTP schließlich von SMTP gelernt. Wie wir alle wissen kann SMTP sogar multipart messages (MIME). Das muss ein IM Protokoll erst mühsam nachmachen.

Um hier mal mit Mythen und Halbwahrheiten aufzuräumen:

IM ist schneller als Email

EMail ist nur deshalb langsam weil mein Email-Reader nur alle 5 Minuten die Email abholt. Würde er seine TCP Verbindung zum Mailserver stehen lassen, dann könnte der Server immer sofort die Email an den Client weiterleiten. Sozusagen COMET für SMTP. Wenn es bei HTTP geht, dem Prototyp eines Request/Response-Protokolls, dann geht es auch bei SMTP. Noch besser: jeder sollte einen SMTP Server im Email-Client haben und der Company-Server forwarded einfach live an den Client. SMTP Messages gehen meistens 3 Hops: Sender -> lokaler Server -> entfernter Server -> Empfänger. Das ist genau die gleiche Topologie wie bei XMPP.

IM ist SPAM-resistenter als Email

Nur manche IM Systeme sind SPAM-resistenter und zwar deshalb, weil das Gesamtsystem in einer Hand ist. z.B. können bei zentraler Registrierung Accounts gebannt werden. Oder weil sie Dialback und Sender-Authentifizierung machen. Das ist aber nicht das Protokoll, sondern das Gesamtsystem. Ein Emailsystem mit Sender-Auth, Dialback und Benutzern, die nicht alles glauben ist genauso gut oder schlecht SPAM-resistent wie IM.

Mit SMTP kann man nur Emails verschicken

SMTP kapselt alles was man will. Alle MIME-Typen (MIME! klingelts?), vor allem auch XML. Auf XML sind ja ein paar IM Protokolle mächtig stolz. Mit beliebigem XML in SMTP lassen sich auch beliebige Daten übertragen. Es gibt sogar einen SMTP Network-Layer in .NET zum Transport von SOAP-XML als Remote Procedure Call. Natürlich hätte man auch ein bisschen Status-XML übertragen können. Oder Subscriptions, Notifications, Requests, Responses, und alles was man sich nur wünschen kann.

Warum SMTP besser ist (gewesen wäre)

SMTP ist hochentwickelt im Vergleich zu IM Protokollen. Und das sogar immer noch obwohl IM nun schon über 10 Jahre alt ist.

SMTP ist einheitlich während die IM-Welt zersplittert ist.

SMTP hat Offline Storage eingebaut. Manche IM Protokolle mussten das erst wieder erfinden.

Die SMTP Infrastruktur war schon weltweit operativ, robust und verstanden. Es wäre nicht notwendig gewesen neue Software zu machen, zu betreiben, kennen zu lernen.

Meine IMs würden automatisch archiviert, wie Emails. Es gäbe da keinen Unterschied. GMail hat das gerade wieder erfunden.

Es gibt Web-basierte Email-Reader, sehr praktisch im Urlaub. Auch das haben die IMs wieder erfunden (z.B. Meebo), aber warum ist das überhaupt separat. Ach ja, GMail hat GTalk mit eingebaut. Schade, dass sie überhaupt was einbauen mussten.

Was notwendig gewesen wäre

Um SMTP noch ein bisschen leichter zu machen hätte man z.B. SMTP Pipelining verwenden können. Pipelining befreit SMTP von den 4 Round-Trips. Nicht dass es wirklich wichtig wäre.

Eine Art SMTP-COMET oder einfach ein SMTP-Server für Jedermann.

Jetzt mal ehrlich...

...meine Kommunikationsanwendung ist Thunderbird oder Outlook. Die Buddyliste gehört in Thunderbird. Sie sollte identisch mit dem Adressbuch sein. Ein Adressbuch mit Online-Status. Und kurze Email heißen dann IM.

Trotzdem gibt es XMPP und andere IM Protokolle. Und dabei wird es auch bleiben. Lesen Sie auch bald wieder hier: "RSS-Feeds: eine Fehlentwicklung - warum XMPP besser gewesen wäre".

17. Januar 2006

Alles freundlich

Der beliebteste Jabber Server der Welt jabber.org schickt jedem neu angemeldeten User eine persönliche Nachricht des Admins, dass er in der Jabber Welt willkommen sei und wo er mehr über Jabber erfahren kann. Das ist schön, denn dann ist die frische IM-Box nicht ganz so leer. Der Admin, der den Text verfasst hat, weisst ausserdem darauf hin, dass man darauf nicht antworten müsse.

Auch LLuna User sind Jabber User und neue LLuna User bekommen auch die Nachricht. Weil LLuna User nett sind, antworten Sie gerne und schicken ein freundliches "Hi" zurück an jabber.org. Der Server schickt alles weiter an seinen Admin und der Admin hat eine IM-Mailbox voll mit freundlichen "Hi"s neuer LLuna User.

Zum Glück erkennt der Admin, dass diese User von LLuna sind, weil LLuna netterweise die User ID mit "lluna_" prefixt. Er bittet den Projektleiter von LLuna die freundlichen "Hi"s abzustellen und der freundliche Projektleiter programmiert ein Stückerl Code ins LLuna, dass vermeidet, dass freundliche LLuna User aus Versehen indirekt den Admin von jabber.org nerven. Mit anderen Worten LLuna schickt jetzt keine mehr an eine JID ohne User ID. Und natürlich erscheint eine freundliche Dialogbox, die auf diesen Umstand hinweist.

Woher kommen die vielen LLuna User?
http://www.entwickler.com/itr/news/psecom,id,26289,nodeid,82.html
http://www.testticker.de/pcpro/news/netzwerke/news20060113013.aspx
http://www.computerwelt.at/detailArticle.asp?a=100401&n=5
http://www.ibusiness.de/aktuell/db/1137064280.html
GIGA Tool of the day

_happy_coding()

24. August 2005

Google macht Jabber/XMPP

Die Jabber Mailing-Liste ist ganz aus dem Haeusschen. Google hat Google-Talk veroeffentlicht. Einen Instant-Messenger mit VoIP Funktion. Und der basiert auf Jabber. Das ist toll fuer die Jabber Community, denn es bedeutet, dass eine verteilte Open Source Architektur jetzt mit kommerziellem Nachdruck mit den zentralen/proprietaeren Systemen von AOL, MS, Yahoo konkurriert.

Und das ist toll fuer virtuelle Praesenz auf Basis des Jabber Protokolls (sprich: LLuna), weil Google eine riesige Jabber Infrastruktur aufbaut, die fuer virtuelle Praesenz geeignet ist. Weil Google an virtueller Praesenz interessiert sein sollte, weil das in die Geschaeftsstrategie von Google passt

Google ist insofern anders, als viele Webdienste, weil Google nicht auf eine Website konzentriert ist und damit Angst haben muss die user zu verlieren, wenn sie sich ueberall treffen koennen. Google lebt von der Dynamik des ganzen Web. LLuna (virtuelle Praesenz) zeigt das wahre Leben im Web und zwar auf den Seiten wo Google seine Werbung plaziert. Google hat die Vertriebsstruktur mit der man Ads in LLuna plazieren kann. Muss ich noch mehr sagen?

Ach ja: hat mir jemand mal bitte einen gmail Account? Ich wuerde gerne Google-Talk testen. Spenden bitte an wolf@bluehands.de
_happy_coding_

1. Juli 2005

Jabber Software Foundation stellt sich selbst ein Bein

Apple hat seit einiger Zeit auch einen Instant Messenger. Apple spielt dabei den Good Guy und verwendet ein Open Source Instant Message Protokoll, naemlich Jabber. Natuerlich will Apple das Programm schoen machen fuer die User und dazu gehoert ein Bild von den Kontakten in der Buddyliste. Da fragte sich der Apple-Entwickler, wo er das Bild unterbringen soll. Der Benutzer will sein Bild uploaden. Das Bild soll im Server gespeichert werden, damit andere User es dort abrufen koennen. Leider hatte die JSF das JEP-0008, in dem der Avatarspeicher im Server spezifiziert war, zurueckgezogen. Aber es gab einen Rettungsanker. In der digitalen Visitenkarte (genannt vCard) kann man auch ein Bild unterbringen. Das tut Apple dann auch, und ist voellig standardkonform.

Daraufhin geht ein Aufschrei durch die Jabber Community, wie schlecht das technisch gemacht ist, weil jeder, der eine Email- oder Postadresse vom anderen braucht, sich die vCard runterlaedt und dann ausser 300 Byte Daten auch noch 10 Kb Bild bekommt ohne sich wehren zu koennen. Das ist wirklich schlecht und zeigt, dass das Bild nicht in die vCard gehoert. Schade, dass die JSF das JEP-0008 fuer ungueltig erklaert hat. Denn Apple haette es bestimmt verwendet. So blieb aber nicht anderes uebrig als das Bild in die vCard zu speichern.

Warum die JSF JEP-0008 'retracted' hat kann man nur vermuten. Ich glaube das geschah in der fruehen Euphorie des Publish and Subscribe (PubSub, JEP-0060). Damals meinten mache Leute in der Jabber Community, dass man eigentlich alles mit PubSub machen sollte und wollten die Entwickler davon abhalten, 'alte' Protokolle zu verwenden. Das war 1. unfreundlich gegenueber den Entwicklern, die das schon implementiert hatten (z.B. LLuna) und 2. ein Schuss ins Knie, wie die iChat/Avatar Geschichte zeigt. Zu allem Ueberfluss ist PubSub in 3 Jahren nicht so richtig in die Gaenge gekommen, so dass es seit 3 Jahren keine technisch vernuenftige Avatar-Spezifikation gibt, obwohl es schonmal eine gab.

_happy_coding_

27. Mai 2005

Gemeinsam surfen mit Miranda Instant Messenger Plugin

Endlich mal wieder Funcoden! 3 Programmiernaechte habe ich gebraucht fuer ein Miranda Plugin. Jetzt koennen Miranda User sich mit LLuna auf Webseiten treffen. Man kann in der Kontaktliste einfach die URLs vom Buddy abfragen. Wenn der antwortet, dann Klick und auf die Seite gehopst.

Link zum download.

Miranda ist ein Multiprotokoll Open Source Instant Messenger. Als Progammierer kann ich Miranda nur empfehlen. Projekt in das Developer Studio werfen, build, fertig. Es gibt wenig Doku, aber Code ist die beste Dokumentation, wenn man durchsteppen kann. Man kann durch den Miranda-Kern und andere Plugins laufen und lernen. Es gibt viele Plugins, auch mit Source, und die Community ist aktiv im Forum und beantwortet Fragen. Super Sache.

_happy_coding_

2. Januar 2005

SAX sucks

Eine Kritik am SAX Interface

Neulich auf der Jabber Developer Liste: Ein Noob-Developer beschwert sich, dass er das Jabber Protokoll nicht verarbeiten kann, weil das letzte Tag nicht kommt. (Zur Erklärung ein paar Vokabeln: Noob = Newbie (engl.) = Neuling, Jabber = XML-basiertes Instant Mesage Protokoll, das letzte Tag = das schliessende XML-Tag eines XML-Dokuments). Neben den üblichen mailinglistentypischen dümmlichen Antworten, erhält er die wertvolle Empfehlung, einen SAX Parser statt dem DOM Parser zu verwenden. Das ist richtig, denn im Jabber Protokoll wird ein XML-Strom verarbeitet. Der gesamte Strom ist ein einziges Dokument und da dieses nie fertig ist, geht es nicht mit einem DOM Parser. Danach war einen Tag Ruhe, dann kam die nächste Frage etwa so: "Der SAX Parser meldet zu viel und das falsche. Der SAX Parser ist nicht brauchbar. Was nun?"

Da hat er leider Recht. Der SAX Parser meldet nämlich Öffnen und Schliessen jedes XML-Tags und jedes Fitzelchen Daten zwischen den Tags, selbst wenn das nur ein Zeilenumbruch ist. Damit kann der Applikationsentwickler aber leider nichts anfangen. Eine Jabber Message sieht als XML so aus:

<message from='cs@bluehands.de' to='hw@bluehands.de'>
<body>Hallo Welt!</body>
</message>

Der SAX Parser liefert dafür eine Serie von Callbacks:

startElement "message"
characterData "\n "
startElement "body"
characterData "Hallo Welt!"
endElement "body"
characterData "\n"
endElement "message"

Was soll man jetzt damit anfangen? Klar, der Anwendungsprogrammierer muss alle Teilinformationen sammeln bis das Ende der Message signalisiert wird. Dann kann er die gesamte Message auswerten. Anders ausgedrückt: XML hat eine hierarchische Struktur. SAX serialisiert und unterdrückt die Struktur. Der Anwendungsprogrammierer muss die Struktur wieder rekonstruieren. Eine Aufgabe, die in eine Bibliothek gehört. Leider ist sie bei SAX Parsern nicht enthalten. Nu ist an SAX Parsern nichts falsch, denn SAX heisst "Simple API for XML". Man wundert sich nur, warum es nach vielen Jahren XML immer noch keine besseren Schnittstellen für XML-Streaming gibt.

Was man eigentlich will ist eine Mischung aus DOM und SAX. Für die Verarbeitung von XML-basierten Protokollen braucht man einen Parser, der wie eine SAX Parser XML-Fragmente verarbeitet, der dann aber jedes komplette XML-Tag als Struktur liefert, so dass man nicht selbst die Struktur rekonstruieren muss. Also eine Art "Fragment API for XML". Wenn jemand fragt, wie man das Jabber Protokoll verarbeitet, heisst die richtige Antwort: nimm einen FAX Parser, z.B. meinen.

_happy_coding_

7. November 2003

On Jabber

ICQ, MSN, AIM: wie Messaging Dienste unter einen Hut gebracht werden. Jabber bietet "all in one" auf Open Source Basis. Nicht nur für Messaging

Oft entsteht gute Software, weil ein Entwickler ein Problem für sich selbst löst und das Ergebnis dann anderen zugänglich macht. Das war sicherlich der Fall bei Jeremie Miller, dem Gründer des Jabber.org Projekts. 1998 war es einfach leid, 4 oder 5 verschiedene Instant Messanger und mehrere IRC Kanäle zu beobachten, um mit seinen Freunden online Kontakt zu halten. So begann er ein neues Instant Message System zu entwickeln, dass mit allen anderen Systemen kommunizieren konnte, sodass die Benutzerin nur noch ein Instant Message Programm braucht.

Im Gegensatz zu den existierenden Instant Message Systemen (ICQ, AIM, MSN, usw.) wurde Jabber von Anfang an auf XML aufgebaut. Die Architektur von Jabber ist sehr ähnlich zu Email: ein Netzwerk von Servern leitet Nachrichten vom Sender zum Empfänger. Auch die Adressen der Benutzer sehen aus wie Email Adressen, z.B. wolf@jabber.bluehands.de. Übermittelt werden meistens kurze Nachrichten (Instant Messages = Kurzmitteilungen). Der zweite wichtige Bestandteil ist die ständige Aktualisierung des Online-Status, damit die Absenderin weiß, ob der Empfänger online ist. Das ist auch der große Unterschied zu Email: Kurzmitteilungen kommen sofort an und man weiß, ob der Empfänger da ist.

Die Kommunikation mit den anderen Instant Message Systemen erledigt ebenfalls der Jabber Server. Der Server wandelt die XML-Nachrichten der Jabber-Klienten in die Protokolle der anderen Instant Message Systemen um und Instant Messages von einem Benutzer im ICQ werden für mich in XML umgewandelt. Auf dieser Weise wird Jabber zum universellen Übersetzer zwischen verschiedenen Instant Message Systemen.

Die Jabber-Klienten müssen nur einfache XML-Nachrichten verarbeiten. Jabber Nachrichten sind meistens kurze XML-Stücke. So sieht eine Kurznachricht in Jabber aus:

<message to="wolf@jabber.bluehands.de">
Hallo Klaus
</message>


So eine Nachricht, teilt Christine mit, dass ich online bin:

<presence to="christine@jabber.bluehands.de">
<status>online</status>
</presence>



Das sind die beiden am häufigsten benutzten Nachrichtentypen. Zusätzlich bietet das Jabber Protokoll viele andere Möglichkeiten, Informationen abzufragen oder auszutauschen. Das Protokoll ist einfach erweiterbar durch XML Namespaces für weitere Anwendungen, wie Börsenticker, Newsheadlines oder beliebige andere strukturierte Daten.

"Schön, aber was bringt mir das?", höre ich Sie sagen. Zuerst einmal: egal welche IM Klienten Ihre Kommunikationspartner verwenden, Sie brauchen nur einen. Und den können Sie aus einer langen Liste wählen. Darüber hinaus wird Jabber immer mehr auch als Messaging Middleware verwendet. Durch die Kombination von einfach zu programmierenden Klienten und einem erweiterbaren Protokoll stößt Jabber auch in die Bereiche der Maschine-zu-Mensch und Maschine-zu-Maschine Kommunikation vor. Das heisst, Sie können mit Ihrem Jabber-Klienten auch den Zustand von Maschinen überwachen oder RPC/SOAP über Jabber tunneln. Im Gegensatz zu HTTP-basierter XML-Kommunikation funktioniert Jabber auch ohne Einschränkungen bidirektional und eventbasiert.

Inzwischen gibt es schon zigtausende Jabber-Server und Millionen Benutzer in der ganzen Welt. Obwohl Jabber noch jung ist, wächst es sehr schnell und entwickelt sich rasant. Die Zeit wird zeigen, ob Jabber's Open Source Technologie die Erwartungen erfüllen kann und zu einem - oder neben HTTP dem - Standardsystem für XML-basierte Echtzeitkommunikation wird.

_happy coding_