<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://www.swatinem.de/">
		<title>dWing News</title>		<link>http://www.swatinem.de/</link>
		<description>Die Neuigkeiten von dWing.</description>		<items>
			<rdf:Seq>
							<rdf:li rdf:resource="http://www.swatinem.de/news/meine-nachricht" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/web-frameworks-activerecord-lazy-loading" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/web-frameworks-pushpull" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/web-frameworks-model-view-und-controller" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/never-change-a-running-system" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/ist-openid-tot" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/openid-und-nodejs-die-zweite" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/ueber-einsamkeit-freunde-und-den-sinn-des-lebens" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/verantwortung" />
							<rdf:li rdf:resource="http://www.swatinem.de/news/openid-in-nodejs" />
						</rdf:Seq>
		</items>
	</channel>
		<item rdf:about="http://www.swatinem.de/news/meine-nachricht">
		<title>Meine Nachricht</title>
		<link>http://www.swatinem.de/news/meine-nachricht</link>
		<description>&lt;p&gt;Ich hatte grade eine &lt;em&gt;Erleuchtung&lt;/em&gt; wenn man es so formulieren will. Meine Nachricht ist, dass ich und alle Menschen auf der Welt ihr Leben und das was sie tun mit Herz und Seele tun, mit vollem Enthusiasmus und Liebe.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/web-frameworks-activerecord-lazy-loading">
		<title>Web-Frameworks: ActiveRecord, Lazy-Loading</title>
		<link>http://www.swatinem.de/news/web-frameworks-activerecord-lazy-loading</link>
		<description>&lt;p&gt;Ein ActiveRecord, oder besser gesagt Object Relation Mapper (ORM) bildet das M aus MVC. Also der Punkt bei dem es um die Speicherung der Daten geht.&lt;/p&gt;
&lt;p&gt;Das ActiveRecord Entwurfsmuster gibt dabei einige Basisoperationen vor. Meist einen Konstruktor mit dem ein neues Objekt erstellt wird, eine save Methode um Änderungen in die Datenbank zu speichern, bei einem noch nicht in der Datenbank vorhandenem Objekt wird dies hineingeschrieben. Eine remove Methode löscht das Objekt. Statische Methoden dienen dazu Objekte aus der Datenbank zu lesen.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Ein ActiveRecord selbst zu implementieren ist eigentlich einfacher als man denkt. Zumindest ein einfaches ActiveRecord was keine hasOne, hasAndBelongsToMany Beziehungen hat. Mein dWing hat ein ganz einfaches &lt;a href=&quot;http://hg.swatinem.de/dwing/file/cfd4d1dcece4/inc/active.class.php#l92&quot;&gt;ActiveRecord&lt;/a&gt;. Benutzten kann man es wie folgt:&lt;/p&gt;
&lt;pre&gt;
class Comment extends ActiveItem
{
  protected $tableName = 'comments';
  protected $definition = array('text' =&amp;gt; 'html', 'user_id' =&amp;gt; 'user',
    'time' =&amp;gt; 'time', 'content_id' =&amp;gt; 'required', 'content_type' =&amp;gt; 'required');
}
&lt;/pre&gt;
&lt;p&gt;Mein allgemeiner &lt;a href=&quot;http://hg.swatinem.de/dwing/file/cfd4d1dcece4/inc/active.class.php#l190&quot;&gt;__get()&lt;/a&gt;ter sorgt dabei für dynamische hasOne und hasMany Beziehungen, ganz ohne das man diese deklarieren muss.&lt;/p&gt;
&lt;p&gt;Dabei wird alles über Lazy-Loading realisiert. Es werden die Objekte nur dann erzeugt und aus der Datenbank geholt wenn diese benötigt werden.&lt;/p&gt;
&lt;p&gt;Greife ich z.b. auf $news-&amp;gt;comments zu, wird zuerst ein &lt;a href=&quot;http://hg.swatinem.de/dwing/file/cfd4d1dcece4/inc/comment.class.php#l72&quot;&gt;CommentIterator&lt;/a&gt; erzeugt. Dieser implementiert auch das Countable Interface. Das bedeutet, das wenn ich ein count($news-&amp;gt;comments) mache wird lediglich ein SQL COUNT() ausgeführt. Erst wenn ich den Iterator anfange zu iterieren wird das vollständige SELECT gemacht. Dabei liebe ich auch PHPs PDO.&lt;/p&gt;
&lt;pre&gt;
$statement-&amp;gt;setFetchMode(PDO::FETCH_CLASS, 'Comment');
$this-&amp;gt;elements = $statement-&amp;gt;fetchAll(); &lt;/pre&gt;
&lt;p&gt;Hier erzeugt mir PDO direkt meine Klassen ohne das ich dies selbst tun müsste.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Nun zu CakePHP. Was soll ich sagen? Obwohl die Modelle eine save() Methode haben und die besagten hasOne usw. Beziehungen würde ich das Cake ORM keinesfalls als ActiveRecord bezeichnen.&lt;/p&gt;
&lt;p&gt;Einerseits sind die Models anscheinend nicht als Globale Klasse verfügbar. Im Controller definiert man über eine $uses Variable welche Modelle man benutzen will. Dann sind diese als $this-&amp;gt;Model verfügbar. Und wenn man über eine der find() Methoden Daten haben will werden die nicht als Objekt oder Iterator über Objekte zurückgegeben sondern als ein wild gemischtes Array. Die &lt;a href=&quot;http://book.cakephp.org/view/1017/Retrieving-Your-Data#find-first-1019&quot;&gt;Cake Hilfe&lt;/a&gt; gibt ein Beispiel darüber. Ich muss ehrlich sagen, etwas unintuitiveres habe ich noch nicht gesehen.&lt;/p&gt;
&lt;p&gt;Auf der Unteren Ebene kriege ich ein Array, das ist auch das einzig Intuitive. Darunter ein Assoziatives Array, auch bekannt als Hashmap, Dictionary oder einfach Objekt. Dieses hat als Indizes die Modellnamen. Will ich eine News haben ist diese über $news['News'] verfügbar. Redundanz ist ja was schönes oder nicht? Und die hasOne, hasMany usw Beziehungen sind ebenfalls in der Ebene.&lt;/p&gt;
&lt;p&gt;Die Kommentare sind also in $news['Comment'][0] usw. An sich ist kein großer Unterschied zwischen $news-&amp;gt;comments und $news['Comment']. Aber das die News an sich unter $news['News'] zu finden ist verstehe ich nicht. Selbst wenn man diese Dinge als eine Hashmap ausgibt kann man diese besser gestalten.&lt;/p&gt;
&lt;p&gt;Und das was die find Methode liefert keine Objekte sind haben diese keine eigenen save() und remove() Methoden. Diese sind über das Modell erreichbar, was diese Operation immer auf die zuletzt zugewiesene Id anwendet. Absolutes Gegenteil von intuitiv.&lt;/p&gt;
&lt;p&gt;Ein weiterer Nachteil ist, das es kein Lazy-Loading gibt. Alle dazugehörigen Beziehungen werden aus der Datenbank ausgelesen, auch wenn man diese gar nicht braucht.&lt;/p&gt;
&lt;p&gt;Cake stammt aus der PHP4 Zeit, obwohl es ein Jahr nach dem Erscheinen von PHP5 entwickelt wurde. Leider scheint mir dies der Grund zu sein für dieses schlechte ORM. Ich habe zumindest keinerlei Verständnis dafür.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Für node.js benutze ich &lt;a href=&quot;https://github.com/LearnBoost/mongoose&quot;&gt;Mongoose&lt;/a&gt; als ActiveRecord. Ein Schema zu definieren ist darin auch sehr einfach:&lt;/p&gt;
&lt;pre&gt;
var Project = new Schema({
	  title: {type: String, required: true}
	, url: {type: String}
	, description: {type: String, required: true}
	, image: {type: String}
	, _user: {type: ObjectId, required: true}
});&lt;/pre&gt;
&lt;p&gt;Da MongoDB eine JSON basierte Datenbank ist, kann man direkt in den Objekten Unterobjekte speichern oder Arrays von Objekten. Dennoch ist es in einigen Situationen sinnvoll hasOne Beziehungen zu modellieren. Mongoose hat leider keine eingebaute Fähigkeit dazu. Es existieren einige Projekte dafür aber bisher hat mich keines überzeugt. Ich habe lieber selbst eine einfache hasOne Beziehung modelliert:&lt;/p&gt;
&lt;pre&gt;
var users = [];
var anonymous = new User();

Project.virtual(&quot;user&quot;).get(function () {
	return this.__user;
}).set(function (user) {
	this.__user = user;
	this._user = user;
});

Project.pre(&quot;init&quot;, function(next, doc) {
	if (!doc._user)
		return next();
	//if (doc._user &amp;amp;&amp;amp; users[doc._user])
	//	return next();
	User.findById(doc._user, function(err, user) {
		if (err || !user)
			return next(err);
		users[user.id] = user;
		return next();
	});
}).post(&quot;init&quot;, function() {
	this.__user = users[this._user] || anonymous;
	delete users[this._user];
});&lt;/pre&gt;
&lt;p&gt;Leider war dies um einiges schwieriger als ich gedacht habe. Ich definiere mir also zwei Funktionen die vor und nach dem erstellen des Objektes ausgeführt werden. Dabei ist die erstere Asynchron, also wird diese durch einen Callback beendet. In dieser hole ich mir mein verwandtes User Objekt aus der Datenbank und speichere dies in einem globalen Objekt zwischen, da diese neu hinzugefügten Objekte leider nicht übernommen werden wenn das tatsächliche Objekt erzeugt wird. Dies füge ich im zweiten Schritt an und lösche die globale Kopie, das diese nicht für die Laufzeit des Programms den Speicher zumüllt. Dann habe ich noch an meinem Modell eine Virtuelle Eigenschaft mit der ich das zuweisen eines neuen Users richtig behandeln kann.&lt;/p&gt;
&lt;p&gt;Ich habe zwar lange für diese Lösung gebraucht, elegant ist sie nicht aber ich kann sie einfach verallgemeinern und auslagern. Zu benutzen ist es auch einfach.&lt;/p&gt;
&lt;p&gt;Ein Problem gibt es allerdings: Da ich mit Callbacks arbeiten muss fällt Lazy-Loading leider weg. Eine getUser(callback) Methode zu definieren ist dabei keine Lösung. Die Views in node/Express sind synchron, können also keine asynchronen Methoden benutzen die auf Callbacks basieren. Damit muss ich nicht nur auf das bereits erklärte Pull-Modell verzichten bei dem sich die View selbst die zu darstellenden Daten holt, sondern auch auf das dynamische Laden verwandter Daten bei deren Zugriff.&lt;/p&gt;
&lt;p&gt;Ich will die Kopplung von Controller und View niedrig halten. Mein Controller soll nicht wissen ob die View nun auf project.user zugreift oder nicht. Also muss ich zwangsläufig project.user vorher laden, denn die View kann dies nicht nachträglich machen.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Insgesamt hat node.js mit Express einige Dinge die mir aus meiner Erfahrung mit dWing fehlen und auch performancekritisch sein können. Pull-Views sind nicht möglich, ebenso wenig das dynamische laden von hasOne, hasMany und ähnlichen Beziehungen. Wobei es dank MongoDB auch viel weniger von diesen gibt. Diese werden nicht wie bei SQL durch die Normalisierung erzwungen sondern nur wenn sie sinnvoll sind. Daher gibt es auch viel weniger.&lt;/p&gt;
&lt;p&gt;Die wirklich exzessive Verwendung von Callbacks in node ist sehr gewöhnungsbedürftig, aber ich habe mich schon daran gewöhnt. Mich nervt nur das was ich bereits angesprochen habe: Das ich im Controller wirklich &lt;em&gt;alles&lt;/em&gt; laden muss was die View braucht. Und das ich dies tatsächlich im Vorfeld machen muss, auch wenn ich es in der View möglicherweise nicht brauche. Dies kann mir unter Umständen die Performance zusammenhauen.&lt;/p&gt;
&lt;p&gt;Dennoch bin ich voll auf den Node Zug aufgesprungen. JavaScript ist einfach eine viel bequemere Sprache. So langsam kotzt mich PHP echt an mit den &lt;code&gt;$dollar&lt;/code&gt; Variablen, den &lt;code&gt;$array['Klammern']&lt;/code&gt; anstatt der viel einfacheren &lt;code&gt;Punkt.Notation&lt;/code&gt; wie in JS. Auch das komplizierte ausschreiben von &lt;code&gt;array('eigenschaft' =&amp;gt; 'wert')&lt;/code&gt; ist viel nerviger als einfach &lt;code&gt;{eigenschaft: 'wert'}&lt;/code&gt;. Aber jetzt wo ich wieder mein dWing angesehen habe finde ich die sehr ausgereiften Lazy-Loading Methoden von PHP sinnvoll, und das es tatsächlich Klassen mit Interfaces hat.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/web-frameworks-pushpull">
		<title>Web-Frameworks: Push/Pull</title>
		<link>http://www.swatinem.de/news/web-frameworks-pushpull</link>
		<description>&lt;p&gt;Im letzten Eintrag habe ich schon erwähnt das die Templates in dWing mehr Fähigkeiten haben. Ein Weg MVC Anwendungen zu machen, und wie es CakePHP tut und express gezwungenermaßen auch ist, dass der Controller bzw. die Ressource die darzustellenden Daten an die View übergibt. Das nennt man das Push-Modell.&lt;/p&gt;
&lt;p&gt;Persönlich halte ich dadurch die Trennung von Controller und View einerseits zu stark, denn die View weiß nichts über den Controller, andererseits zu stark, denn der Controller muss alles über die View wissen um die darzustellenden Daten liefern zu können.&lt;/p&gt;
&lt;p&gt;Was ist wenn auf jeder Seite, also anders gesagt bei jedem Controller oder jeder Ressource etwas dynamisches in der View dargestellt werden soll. Ich kann entweder in jedem Controller diese Sachen der View übergeben was zu sehr viel redundantem Code führt. Oder aber ich übergebe dies an einer zentralen Stelle. In Cake im AppController, oder in Express in einem Helper.&lt;/p&gt;
&lt;p&gt;Dies ist aber auch nicht optimal: Sollte die View die Daten doch nicht benötigen ist es unnützer Overhead der das ganze verlangsamt.&lt;/p&gt;
&lt;p&gt;bei dWing gehe ich einen gemischten Weg. Die Ressource kann einerseits die Objekte an die View übergeben, pushen. Oder aber die View holt sich selbst was sie braucht, pull. Somit kann ich die Views ändern ohne den Rest der Anwendung anzugreifen. Es besteht also eine geringere Kopplung und Abhängigkeit der View von dem Controller. Außerdem halte ich meine Controller sauber, und schlussendlich bleibt das ganze auch performant.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Dies kann man leider leider in Express mit node.js nicht machen. Mehr dazu im Teil über Lazy-Loading und Async Callbacks.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/web-frameworks-model-view-und-controller">
		<title>Web Frameworks: Model, View und Controller</title>
		<link>http://www.swatinem.de/news/web-frameworks-model-view-und-controller</link>
		<description>&lt;p&gt;In letzter Zeit beschäftige ich mich wieder mehr mit Web Frameworks, da ich auf der Arbeit mit CakePHP arbeiten muss und nebenbei node.js und Express lerne. Und natürlich existiert noch mein &lt;a href=&quot;http://hg.swatinem.de/dwing&quot;&gt;dWing&lt;/a&gt;, das im Prinzip meine Meinung zum Thema Web Frameworks in Code gießt.&lt;/p&gt;
&lt;p&gt;Ich habe mir vorgenommen in einigen Beiträgen zu den Themen Object-Relation-Mapping (ORM) bzw ActiveRecord, Push/Pull-Modell, Lazy-Loading und Asnyc Callbacks zu sprechen.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Heute geht es allerdings um Model-View-Controller. Dieses Entwurfsmuster ist dazu gedacht die Speicherung der Daten, die Logik und die Darstellung zu trennen. Persönlich finde ich die Logikschicht absolut überbewertet. Ich finde in modernen Anwendungen sollte es sich mehr um die Grundobjekte drehen und was ich mit diesen machen kann. Und auch dort ist weniger mehr. Denn eigentlich muss ich nur vier Operationen machen können. Diese auslesen (read, GET), erstellen (create, POST), bearbeiten (update, PUT) und löschen (delete, DELETE). In Klammern habe ich jeweils die Begriffe aus CRUD und den HTTP Methoden angegeben.&lt;/p&gt;
&lt;p&gt;Im Grunde genommen geht es nicht darum &lt;em&gt;was&lt;/em&gt; ich mache, sondern mit &lt;em&gt;welchem Objekt&lt;/em&gt; ich dies tue. Bewerte ich einen Eintrag auf dWing dann gibt es keinerlei &lt;em&gt;bewerte&lt;/em&gt; Operation auf meinen Einträgen. Stattdessen erstelle ich eine Bewertung zu diesem Eintrag. Somit habe ein weiteres Objekt, auf das ich eine der vier Grundoperationen (erstellen) anwende. So einfach ist dies.&lt;/p&gt;
&lt;p&gt;Mein dWing ist genau nach diesem Muster aufgebaut. Meine Ressourcen implementieren einfach das &lt;a href=&quot;http://hg.swatinem.de/dwing/file/cfd4d1dcece4/inc/rest.class.php#l72&quot;&gt;RESTful Interface&lt;/a&gt; und alles andere geschieht automatisch. In Express gibt es das &lt;a href=&quot;https://github.com/visionmedia/express-resource&quot;&gt;express-resource&lt;/a&gt; Modul, welches auch automatisch die Resource laden kann. Sehr fein :-) Bei CakePHP sehe ich keine solche Ressourcenorientierung. Dort werden die URLs nach dem /controller/methode Muster interpretiert. Andere Routen können definiert werden aber ich halte dies für recht unbequem.&lt;/p&gt;
&lt;p&gt;Statische Seiten werden dort auch über einen Controller geleitet. Bei dWing geschieht dies automatisch im normalen Routing. Kein großer Unterschied. Bei Express musste ich mir selbst auch einen Router basteln der auf ein statisches Template umleitet.&lt;/p&gt;
&lt;p&gt;Die Template Systeme von Cake und Express folgen dem Layout Prinzip. Also ist ein Layout Template definiert, dem z.b. als &lt;code&gt;body&lt;/code&gt; variable der Inhalt übergeben wird. In dWing inkludiert jedes Template Kopf und Fuß einzeln. Etwas umständlicher, allerdings wird es so möglich das ich den Inhalt des Titel Elementes in meinem statischen Template definiere bevor ich den Kopf einbinde. In Cake und Express ist es nicht möglich solche Variablen vom Template zum Layout zu übergeben. Dafür muss ich mir noch etwas überlegen.&lt;/p&gt;
&lt;p&gt;Bei dWing haben die Templates allgemein mehr Fähigkeiten, mehr dazu im Teil Push/Pull und ActiveRecord.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/never-change-a-running-system">
		<title>Never change a running system?!?</title>
		<link>http://www.swatinem.de/news/never-change-a-running-system</link>
		<description>&lt;p&gt;Da mein Laptop sowohl unter Linux als auch Windows ziemlich träge lief habe ich ihn nun eingestampft um neu aufzusetzen. Eigentlich hatte ich dies mi Februar schon vor aber habe es doch noch etwas verzögert um eine stabilere Ubuntu Version zu erwischen, die aktuelle Nightly von 11.04 alias Natty Narwhal.&lt;/p&gt;
&lt;p&gt;Nundenn, gleich vorweg: Das Vorhaben war ein Misserfolg sonder gleichen.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Windows: Die Installation war gut gelungen, hätte mir auch nichts anderes erwartet, das System läuft nun schneller als Vorher, das war auch meine Absicht. Mit den Treibern gibt es allerdings leichte Probleme. Die Synaptics Treiber für mein Touchpad von der Acer Seite lassen sich nicht installieren, sie behaupten mein Touchpad würde nicht unterstützt werden. Die neueste Version von der Synaptics Seite installiert stattdessen Srybe, was auf Gesten auf Multitouchpads ausgelegt ist. Ich habe also ein wie gewohnt hässliches System Icon was ein noch hässlicheres Einstellungsfenster für die Gesten hat die ich sowieso nicht verwenden kann denn mein Touchpad hat keine Unterstützung für mehrere Finger. Das wirklich &lt;strong&gt;einzige&lt;/strong&gt; für das ich die Treiber gebraucht hätte, das Scrollen am rechten Rand, geht trotzdem nicht. So ist das System zum surfen im Web nicht geeignet, aber dazu benutze ich Windows ja eh nicht.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Nun zu Linux bzw. Ubuntu, was ein viel größeres Epic Fail darstellt. Da ich ein System mit Komplettverschlüsselung haben will bin ich auf die Alternate CD angewiesen die einen textbasierten Installer mitbringt. Ich erstelle einen USB Stick und will diesen starten. Die Sprachauswahl beim boot geht, aber sobald ich mit der Installation beginnen will kommt ein schwarzer Bildschirm und nichts passiert. Schnell ausprobiert das dies mit einer älteren Alternate CD auch der Fall ist. Begründen kann ich dies nicht, aber als Lösung habe ich nun 10.04 installiert und inkrementell zuerst auf 10.10 dann auf 11.04 aktualisiert.&lt;/p&gt;
&lt;p&gt;Dann das wichtigste: Die Installation der Grafiktreiber. Es wird der Nvidia und der experimentelle Nouveau Treiber angeboten. Klarstellend muss ich sagen das sowieso Nouveau im Einsatz ist, allerdings ohne 3D Unterstützung. Nvidia Treiber installiert, funktionierte bisher immer Wunderbar, Neustart und dann kriege ich beim Hochfahren einen schwarzen Bildschirm. Ich wusste nicht was los ist aber nachdem ich einfach mal probierte mein Verschlüsselungspasswort blind einzugeben startete das System normal, allerdings von 3D Unterstützung keine Spur. Ich schaue im Kernel Log nach und dort steht meine Grafikkarte würde nicht unterstützt werden, dabei steht im Readme explizit das sie unterstützt wird. Dann habe ich schnell den experimentellen Nouveau 3D Treiber ausprobiert, auch ohne Erfolg.&lt;/p&gt;
&lt;p&gt;Im Endeffekt habe ich durch die Installation des Nvidia Treibers statt einem Eingabefeld für das Verschlüsselungspasswort nun einen schwarzen Bildschirm und darf dies blind eintippen, außerdem habe ich eine zu niedrige Auflösung durch die das Bild gestreckt und hässlich ist, dazu ist das Scrollen in Anwendungen insbesondere Firefox extrem langsam und unbenutzbar. Videos schauen brauche ich gar nicht probieren, dadurch läuft die CPU auf Vollgas und ruckelt trotzdem. Das schlimmste auch noch: Durch mangelnde Stromsparfunktion läuft die Grafikkarte immer im höchsten Takt obwohl sie keinerlei Arbeit leistet sondern die CPU alles machen muss. Dadurch läuft der Laptop heiß und zuzelt die Batterie leer. Außerdem funktioniert der Schlafmodus nicht richtig, er wacht einfach nicht daraus auf.&lt;/p&gt;
&lt;p&gt;Ich kann also kaum Web surfen wegen des Scrollings, kann keine Filme schauen, kann den Laptop nicht für den mobilen Einsatz benutzen.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Und die ganze Scheiße nur wegen geschlossenen Treibern. Unter Windows Synaptics, unter Linux Nvidia. Mein aktueller PC hat AMD Grafik, eigentlich dachte ich das die 3D Treiber noch etwas nachhinken aber ich bin gerade positiv überrascht, dass ich das Liveimage einfach mit 3D und Unity benutzen kann, ohne irgendwelche dummen Treiber oder sonstwas.&lt;/p&gt;
&lt;p&gt; Also nächsten mal sicherlich AMD auf dem Laptop und weniger Stress.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/ist-openid-tot">
		<title>Ist OpenID tot?</title>
		<link>http://www.swatinem.de/news/ist-openid-tot</link>
		<description>&lt;p&gt;Durch meine Mitarbeit an der node-openid Bibliothek und der Gestaltung meiner neuen Webseite bin ich mal wieder intensiv in den Kontakt mit OpenID gekommen.&lt;/p&gt;
&lt;p&gt;Nun bin ich über einen sehr &lt;a href=&quot;http://lwn.net/Articles/425244/&quot;&gt;guten Artikel&lt;/a&gt; gestolpert der die Frage stellt, ob OpenID nun tot ist. Ganz provokant wird OpenID als der erfolgreichste Fehlschlag des Webs bezeichnet.&lt;/p&gt;
&lt;p&gt;Auch aus meiner Sicht ist sicherlich etwas falsch gelaufen. Die auch im Artikel angesprochene Asymmetrie ist überdeutlich: fast jeder Internetnutzer hat wahrscheinlich ohne es selbst zu wissen schon mehrere OpenIDs, dennoch gibt es extrem wenige Webseiten bei denen man sich mittels OpenID anmelden kann. Nur die wenigsten setzen ganz auf OpenID, so wie ich.&lt;/p&gt;
&lt;p&gt;Der Grund warum ich es einsetze ist einfach: Ich habe weder Lust noch Fachwissen um hundertprozentige Sicherheit zu gewährleisten. Die billigsten Webseiten speichern einfach die Passwörter im Klartext in der Datenbank, andere benutzen dafür Hashwerte die je nach benutzter Hashfunktion und Salt auch relativ unsicher sind. Ein offizielles SSL Zertifikat kann sich keine Privatseite leisten, über ein selbst signiertes wie ich es benutze schreit der Browser standardmäßig. Dadurch ist das Passwort meist unverschlüsselt im Netzwerk unterwegs. Für die Persistenz kann man auch noch mehr oder weniger unsichere Cookies verwenden.&lt;/p&gt;
&lt;p&gt;Alles in allem: Echte Sicherheit zu gewährleisten ist schwer und mit OpenID kann ich all dies an den OpenID Provider delegieren. Das Benutzerpasswort kriege ich nie mit, das einzige was meinen Benutzer identifiziert ist seine OpenID, und die ist sowieso öffentlich. Diese wird auch für Persistenz benutzt und im Cookie gespeichert. Auch hier kann das Cookie gern über XSS oder sonstige Methoden gestohlen werden, es sind ja keine sensitiven Informationen darin enthalten.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Zurück zum Thema: Es gibt zu wenige Seiten bei denen man sich mittels OpenID anmelden kann. Zudem ist das Protokoll auch übermäßig komplex wie ich bei meiner Arbeit an der Bibliothek feststellen musste.&lt;/p&gt;
&lt;p&gt;Der Artikel geht aber noch auf ein anderes Problem mit OpenID ein: Der Standard ist für die Authentifizierung gedacht, das heißt sicherzustellen, das dem Benutzer die eingegebene OpenID (z.b. swatinem.de) wirklich gehört.&lt;/p&gt;
&lt;p&gt;Über Erweiterungen wie Simple Registration (Sreg) oder Attribute Exchange (AX) kann die Webseite weitere Daten wie beispielsweise E-Mail Adresse und Name anfordern. Diese Erweiterungen sind optional und es ist nicht sichergestellt, das der OpenID Provider diese Informationen auch liefert, also muss man so oder so eine Registrierungsmaske bereitstellen.&lt;/p&gt;
&lt;p&gt;Nebenbei Erwähnt: Sreg definierte nur wenige Attribute und wurde daher durch AX ersetzt. AX stattdessen setzt auf absolut flexible an RDF angelehnte URIs als Attribut Schlüssel und somit nicht einheitlich, zu unübersichtlich und zu kompliziert.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Ich als technisch versierter Nutzer kann einerseits nicht nachvollziehen warum so viele Webseiten unnötig viele Nutzerdaten haben wollen, andererseits will ich absolute Kontrolle darüber haben welche Webseite welche Daten von mir hat. OpenID bietet mir genau das.&lt;/p&gt;
&lt;p&gt;Als Alternative ist die Anmeldung über Facebook sehr beliebt, nicht allerdings bei mir. Möglicherweise ist das zugrundeliegende OAuth ein einfacheres und besser Protokoll als OpenID, allerdings nerven mich zwei Sachen: erstens das die Webseite von Facebook anscheinend beliebig viele Daten erhalten und ausnutzen kann. Andererseits, weshalb ich die Anmeldung über Facebook nicht implementieren werde: Für die Anmeldung über Facebook ist es erforderlich das die Webseite bei Facebook eingetragen ist, und dazu benötigt man ein Facebook Konto. Dieser Netzwerkeffekt und Anmeldezwang ist es was ich an Facebook am meisten verabscheue und gegen was ich auch weiterhin ankämpfen werde.&lt;/p&gt;
&lt;p&gt;Ich will einfach ein dezentrales System wie E-Mail, Jabber, OpenID und möglicherweise &lt;a href=&quot;https://github.com/diaspora/diaspora/&quot;&gt;Diaspora&lt;/a&gt; bei dem jeder miteinander agieren kann egal welchen Dienstanbieter er benutzt. Was wäre bitte E-Mail wenn ich mit meiner Googlemail Adresse nur an Googlemail senden könnte und nicht an GMX oder Hotmail? Dieser Zwang zu einem Dienstanbieter und dadurch dessen Monopolisierung ist meiner Meinung nach eine der größten Gefahren für die Freiheit im Web und muss daher dringend entgegengewirkt werden.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/openid-und-nodejs-die-zweite">
		<title>OpenID und node.js die zweite</title>
		<link>http://www.swatinem.de/news/openid-und-nodejs-die-zweite</link>
		<description>&lt;p&gt;Nachdem ich meine eigenen Experimente eine OpenID Bibliothek für node.js zu schreiben &lt;a href=&quot;news/openid-in-nodejs&quot;&gt;aufgegeben&lt;/a&gt; habe, bin ich vor einigen Tagen auf eine &lt;a href=&quot;https://github.com/havard/node-openid&quot;&gt;neue Bibliothek &lt;/a&gt;gestolpert. Ausprobiert und gleich einen Fehler beseitigt, wegen dem meine delegierte Adresse nicht funktioniert hat. Ich habe dann auch schnell angefangen weitere Verbesserungen zu machen, ich habe eine Simple Registration und eine Attribute Exchange Erweiterung geschrieben und mich für den gegebenen Anlass auch bei github angemeldet um &lt;a href=&quot;https://github.com/Swatinem/node-openid&quot;&gt;meinen Fork&lt;/a&gt; zu veröffentlichen.&lt;/p&gt;
&lt;p&gt;Bei der ganzen Arbeit bin ich über einen &lt;a href=&quot;http://groups.google.com/group/nodejs/browse_thread/thread/7d50b59048ea8f89#&quot;&gt;Fehler in der querystring Implementierung&lt;/a&gt; der node Standardbibliothek gestolpert. Die Verwendung von node 0.3 oder eines nicht-standard Moduls beseitigt das Problem dabei.&lt;/p&gt;
&lt;p&gt;Ich habe nun heute versucht die inzwischen zufriedenstellend funktionsreiche OpenID Bibliothek in eine auf &lt;a href=&quot;http://expressjs.com/&quot;&gt;express.js&lt;/a&gt; basierende Seite einzubauen, als Anfang von einer Benutzerverwaltung. Leider ohne großen Erfolg. Da express selbst auch das querystring der Standardbibliothek verwendet bricht es bei einer OpenID Antwort ebenfalls zusammen. Ich hatte dann nochmal versucht node 0.3 anstatt 0.2 zu probieren, dies schlug aber auch fehl. Die Socketverbindung bricht aus unbegreiflichen Gründen ab, ähnlich &lt;a href=&quot;http://groups.google.com/group/nodejs/browse_thread/thread/bd184cbe472728fd/82ed82826afd1c23?lnk=gst&amp;amp;q=%22socket+hang+up%22#82ed82826afd1c23&quot;&gt;diesem Fehlerbericht&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alles in allem bin ich aber dennoch mit dem Fortschritt zufrieden. Unter bestimmten Voraussetzungen funktioniert OpenID einwandfrei, diese Voraussetzungen müssen jetzt nur noch im Zusammenspiel mit express erfüllt werden. Danach kann dann fleißig die tatsächliche Benutzerverwaltung mit automatischer Benutzerkontoerstellung und vielem mehr implementiert werden.&lt;/p&gt;
&lt;p&gt;Eigentlich hatte ich auch noch vor etwas den PHP+MySQL mit dem node.js+MongoDB Stack zu vergleichen bei bestimmten Arten von Queries.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/ueber-einsamkeit-freunde-und-den-sinn-des-lebens">
		<title>Über Einsamkeit, Freunde und den Sinn des Lebens</title>
		<link>http://www.swatinem.de/news/ueber-einsamkeit-freunde-und-den-sinn-des-lebens</link>
		<description>&lt;p&gt;Nachdem ich heute den ganzen Tag „Zuhause“ in Wien vergammelt bin, einen Film nach dem anderen geschaut habe und mich Einsam gefühlt habe, habe ich mich nach einem Chat mit meiner Mutter spontan entschieden nach hause nach Reichenhall zu fahren.&lt;/p&gt;
&lt;p&gt;Während der Fahrt habe ich dann über mein Leben nachgedacht und einige Sachen die mein Neffe gesagt hatte. Am Ende ist das ganze dann sogar in Tränen geendet. Kinder haben zum Glück die Fähigkeit die Wahrheit einfach so auszusprechen ohne ein Blatt vor den Mund zu nehmen, ich finde das super. Er hatte gesagt, das ich mich den einen Abend hab einladen lassen, womit er absolut Recht hatte. Ein anderes mal vor längerer Zeit hatte er mich einmal mit dem Satz ärgern wollen, ich habe gar keine Familie. Ich antwortete, dass er ja auch Teil meiner Familie sei. Richtig. Aber auch was er sagte ist absolut richtig. Ich habe keine Familie die ich selbst gegründet habe und die ohne mich nicht funktionieren würde. Und dies macht mich auch unglücklich.&lt;/p&gt;
&lt;p&gt;Hm irgendwie fällt es einem doch schwer seine ganzen wirren Gedanken zu ordnen und aufzuschreiben, im Gehirn geistern immer nur Fetzen umher, ich versuche es dennoch so gut ich kann.&lt;/p&gt;
&lt;p&gt;Der erste Satz, dass ich mich selbst einlade begründet sich dadurch das ich mich absolut Einsam fühle und es für mich einfach ein super Gefühl ist bei meiner Familie zu sein. Es fühlt sich an als wenn man irgendwo dazugehört. Aber das auch nur so halb, wie oben beschrieben wäre eine echte Familie natürlich besser zu der man tatsächlich gehört. Aber zurück zum Wesentlichen: Ich genieße es bei der Familie zu sein weil ich mich sonst einsam fühle. Es ist im Prinzip nur ein Mittel zum Zweck nicht einsam zu sein. Ich nutze die Menschen also aus. Klingt komisch ist aber so.&lt;/p&gt;
&lt;p&gt;Prinzipiell ist Freundschaft auch nur ein gegenseitiges ausnutzen um seine eigene Einsamkeit für eine kurze Zeit auszuschalten. Dabei gibt es verschieden Arten von Freunden. Diejenigen denen man im Laufe des Tages begegnet und kleinere bedeutungslose Gespräche führt, diejenigen Freunde, die man aktiv „ausnutzt“ um sich nicht Einsam zu fühlen und diejenigen mit denen man solch tiefe Einblicke in die Seele wie ich sie gerade kundtue teilen kann. Da ich eine mir nicht erklärliche Hemmung habe solche persönlichen Sachen im Gespräch von Angesicht zu Angesicht anzusprechen betrifft die letzte Kategorie die Allgemeinheit die meinen Blog liest bzw. mit denen ich über unpersönlichen Chat mehr sagen kann als es persönlich der Fall wäre.&lt;/p&gt;
&lt;p&gt;„Für eine kurze Zeit“. Da ist auch irgendwie schon das nächste Problem. Das miteinander sein ist nur eine kurzweilige Lösung für das Symptom der Einsamkeit. Anstatt eine langfristige Lösung zu sein ist es nur eine kurze Betäubung, nichts weiter als eine Droge. Die Einsamkeit ein Entzugserscheinung. Aber was ist dann der tieferliegende tatsächliche Auslöser für diesen Konflikt?&lt;/p&gt;
&lt;p&gt;Meiner Meinung nach ist es das Problem das man selbst nichts mit seinem Leben anfangen kann und keine Begründung für seine eigene Existenz findet. Die Flucht in verschiedene Ablenkungen ist keine Lösung sondern nur temporär. Manche Leute nehmen Drogen, sind Alkoholiker. Ich habe mich früher in Computerspiele geflüchtet, bis zu 12 Stunden am Stück gespielt. Nicht irgendein beliebiges Spiel, es war ein ganz bestimmtes Spiel, auf einem ganz bestimmten Server auf dem eine familienähnliche Stimmung war. Die Flucht in die echte menschliche Gesellschaft kann sich leider manchmal als schwierig erweisen. Die meisten Menschen arbeiten, lernen, und sowieso ist es nicht ihre Aufgabe nur für mich da zu sein um mich zu unterhalten und mich durch ihre Anwesenheit davon abzulenken wie scheiße mein Leben doch eigentlich ist. Stichwort ausnutzen.&lt;/p&gt;
&lt;p&gt;Im Prinzip bin ich ein absolut Egoistischer Mensch. Ich will dass andere Leute mich unterhalten aber im Idealfall bräuchte ich gar keine Menschen. Wäre ich von mir selbst aus Glücklich bräuchte ich keine Menschen die mich von meinem Unglück ablenken. Schon seit längerem ist es mein Traum ein Arbeitsoholiker (engl. Workoholic) zu sein. Jemand der rein durch seine Tätigkeit Glücklich ist und daher nichts anderes im Kopf hat. Wozu sollte man dann noch zwischenmenschliche Kontakte pflegen wenn man durch etwas anderes Glück erhält.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;Ich habe leider den Fluch das ich in allem die größeren Zusammenhänge erkenne. Das heißt ich bin mir dessen bewusst, das der zwischenmenschliche Kontakt nur eine Sucht ist die meine Einsamkeit lindert. Das wäre kein Problem wenn ich mich nicht durch den reinen Gedanken jemand anderen für meine Zwecke auszunutzen schlecht fühlen würde.&lt;/p&gt;
&lt;p&gt;Im Endeffekt läuft aber alles darauf hinaus das ich mich mal wieder in einer sehr großen Krise befinde. Ich sehe meine Position im Leben nicht, ich sehe kein Ziel vor Augen. Es ist wieder wie vor einiger Zeit, dass es für meine Gefühlswelt keinen Unterschied macht ob ich in diesem Moment aufhörte zu existieren. Ohne Antrieb mir selbst einen Sinn zu geben treibe ich nun umher und lebe meine „Sucht“ nach diversen Ablenkungen aus. Nur mit dem Unterschied das mir klar ist, dass menschliche Kontakte selbst nur eine Ablenkung sind und man durch die Befriedigung andere Menschen ausnutzt. Mit dieser Erkenntnis ist der Genuss dieser Ablenkung auch wieder geschmälert. Außerdem ist die Vielfalt der Menschen die man ausnutzen könnte geschmälert, ich kenne in Wien nur sehr wenige und diese haben zwecks Arbeit und Lernen wahrlich besseres zu tun als nur meine Sucht nach Ablenkung von der Einsamkeit zu befriedigen. Warum sollten sie auch mit der Erkenntnis nur ausgenutzt zu werden?&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/verantwortung">
		<title>Verantwortung</title>
		<link>http://www.swatinem.de/news/verantwortung</link>
		<description>&lt;p&gt;Ich finde es erstaunlich wie viel Angst ich davor habe und wie viel Widerstand ich erzeuge dagegen endlich selbst Verantwortung für mein Leben zu übernehmen.&lt;/p&gt;</description>
	</item>
		<item rdf:about="http://www.swatinem.de/news/openid-in-nodejs">
		<title>OpenID in node.js</title>
		<link>http://www.swatinem.de/news/openid-in-nodejs</link>
		<description>&lt;p&gt;Ich habe mich die letzten paar Stunden damit beschäftigt wie man denn OpenID in JavaScript über node.js implementieren könnte und ich bin recht früh an eine Mauer gestoßen als ich mir die Kryptographie von OpenID angeschaut habe. Dabei wird eine Byteweise XOR Verknüpfung mit einem generierten Schlüssel gemacht. Diffie-Hellman heißt das dann.&lt;/p&gt;
&lt;p&gt;Dabei sind mir einige Dinge über JS aufgefallen die sowohl positiv als auch negativ sind. In JS sind Strings ausnahmslos Unicode. Es gibt gar keine nicht Unicode Strings. Sehr gut. Aber wenn ich byteweise etwas machen will dann ist es schlecht wenn mir charCodeAt() einen Unicodepunkt liefert und kein Byte. node.js’ Buffer schafft abhilfe, allerdings sehr kompliziert.&lt;/p&gt;
&lt;p&gt;Als zweites fällt mir eher bei Ruby und Python auf, deren Code ich studiert habe, das die beiden Sprachen Zahlen mit beliebiger Präzision transparent unterstützen. Diese braucht man zur Schlüsselberechnung. In PHP wo ebenfalls Zahlen mit beliebiger Präzision fehlen wird ein externes Modul dafür benutzt. Dies pisst mich allerdings auch an. Ich will nicht für jede mathematische Operation eine Funktion aufrufen. In node gibt es wie ich bisher sehe noch keinen Wrapper für solch eine Bibliothek, also müsste ich den selbst schreiben. Gefällt mir nicht so sehr.&lt;/p&gt;
&lt;p&gt;Was ist das Fazit dieses kleinen Experiments? JS ist eine Nette Sprache für Spielzeuganwendungen, aber wenn es ernster wird fehlen leider gewisse Sprachfunktionen die es in anderen Sprachen gibt.&lt;/p&gt;</description>
	</item>
	</rdf:RDF>

