<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.10" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>The Log Book Of Manuel Kiessling</title>
	<link>http://manuel.kiessling.net/blog</link>
	<description></description>
	<pubDate>Thu, 24 Jan 2008 16:44:26 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.10</generator>
	<language>en</language>
			<item>
		<title>Huawei E220 UMTS/HSDPA Modem unter Mac OS X 10.5 Leopard</title>
		<link>http://manuel.kiessling.net/blog/2008/01/23/huawei-e220-umtshsdpa-modem-unter-mac-os-x-105-leopard/</link>
		<comments>http://manuel.kiessling.net/blog/2008/01/23/huawei-e220-umtshsdpa-modem-unter-mac-os-x-105-leopard/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 15:27:37 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>software</category>

		<category>apple</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2008/01/23/huawei-e220-umtshsdpa-modem-unter-mac-os-x-105-leopard/</guid>
		<description><![CDATA[Wieder mal so ein Fall, bei dem ich ohne Blogoshpäre (früher wär&#8217;s das Usenet gewesen) aufgeschmissen gewesen wäre, deshalb als Dank das ganze in der deutschen Version.
Also, um das USB UMTS/HSDPA Modem Huawei E220 unter Mac OS X 10.5 Leopard ans Laufen zu bekommen, gehe man wie folgt vor:

Man lädt diese Software herunter: e220_drivers.zip
Nach dem [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder mal so ein Fall, bei dem ich ohne Blogoshpäre (früher wär&#8217;s das Usenet gewesen) aufgeschmissen gewesen wäre, deshalb als Dank das ganze in der deutschen Version.</p>
<p>Also, um das USB UMTS/HSDPA Modem <em>Huawei E220</em> unter Mac OS X 10.5 Leopard ans Laufen zu bekommen, gehe man wie folgt vor:</p>
<ul>
<li>Man lädt diese Software herunter: <a href="e220_drivers.zip" title="e220_drivers.zip">e220_drivers.zip</a></li>
<li>Nach dem Entpacken startet man die Datei <em>MacDriver(2.7)-intel.pkg</em></li>
<li>Nach abgeschlossener Installation schliesst man das Modem an</li>
<li>Dann startet man die Datei <em>HuaweiDataCardApp.app</em>, dort trägt man seinen APN ein, in meinem Fall war das <em>internet.t-mobile</em>, bei Vodafone ist es afaik <em>web.vodafone.de</em></li>
<li>Dann geht man in die Systemeinstellungen <em>Netzwerk</em>. In meinem Fall gab es bereits ein Objekt <em>HUAWEI mobile</em>, ansonsten halt per + hinzufügen.
<li>Bei Telefonnummer trägt man *99# ein, unter <em>Weitere Optionen&#8230;</em> trägt man bei <em>Modem</em> unter Hersteller <em>Andere</em> und bei Modell <em>HUAWEI Mobile Connect - 3G Modem&#8230;</em> ein.
<li>Dialog mit <em>OK</em> beenden, im Hauptdialog - ganz wichtig - <em>Anwenden</em> klicken, und dann hat bei mir <em>Verbinden</em> tatsächlich funktioniert.
</ul>
<p>Englisches Vorbild dieses Postings: <a href="http://gotloli.net/?p=7">http://gotloli.net/?p=7</a>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2008/01/23/huawei-e220-umtshsdpa-modem-unter-mac-os-x-105-leopard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My-Hammer, das Fernsehen und die Serverlast: Teil 3</title>
		<link>http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/</link>
		<comments>http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/#comments</comments>
		<pubDate>Wed, 26 Dec 2007 10:19:31 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>software</category>

		<category>php</category>

		<category>My-Hammer</category>

		<category>mysql</category>

		<category>television</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/</guid>
		<description><![CDATA[Was kann ich tun, damit meine Webseite nicht zusammenbricht, obwohl ein reichweitenstarker TV Sender einen längeren Beitrag über die Seite bringt? Teil 3 beschäftigt sich mit dem Thema Caching. Die anderen Teile:


Teil 1: Allgemeine Überlegungen
Teil 2: Datenbankoptimierung
Teil 2.1: Praxistipps Datenbank
Teil 3: Caching
Teil 4: Zukünftige Optimierungen (folgt)


Meiner Erfahrung nach kann man zusammenfassend sagen: Es gibt nur [...]]]></description>
			<content:encoded><![CDATA[<p>Was kann ich tun, damit meine Webseite nicht zusammenbricht, obwohl ein reichweitenstarker TV Sender einen längeren Beitrag über die Seite bringt? Teil 3 beschäftigt sich mit dem Thema Caching. Die anderen Teile:</p>
<blockquote>
<p>
<a href="http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/">Teil 1: Allgemeine Überlegungen</a><br />
<a href="http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/">Teil 2: Datenbankoptimierung</a><br />
<a href="http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/">Teil 2.1: Praxistipps Datenbank</a><br />
<strong><a href="http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/">Teil 3: Caching</a></strong><br />
Teil 4: Zukünftige Optimierungen (folgt)
</p>
</blockquote>
<p>Meiner Erfahrung nach kann man zusammenfassend sagen: Es gibt nur eine einzige Massnahme, die mehr Performance bringt als Caching, und das ist noch mehr Caching. Das gilt, um mal zum Haupthema zurückzukehren, vor allem in Bezug auf Performance bei plötzlichen Besucheranstürmen.</p>
<h3>Statische Inhalte</h3>
<p>Wenn man einen TV Beitrag über die eigene Plattform überleben will, dann gibt es nichts, aber auch wirklich gar nichts Wichtigeres als dies hier: <em>Die Startseite der Plattform ist eine statische HTML Seite</em>. Und zwar in aller Konsequenz, was heissen soll, dass der Aufruf der Seite nicht nur keine Datenbankverbindung zur Folge hat, sondern dass noch nicht einmal der PHP Interpreter auch nur gestartet wird. Die Startseite von My-Hammer ist eine .html Seite, die im Gegensatz zu den .php Seiten per Apache-Konfiguration mod_php noch nicht mal von Weitem zu sehen bekommt. Selbiges sollte konsequenterweise auch für alle JavaScript und CSS Dateien, die von der Startseite eingebunden werden, gelten. Ob man hierfür nun mit Proxylösungen arbeitet oder Seiten regelmäßig vorgeneriert, ist Geschmackssache.</p>
<p>Man darf nie den Performancevorteil reinen HTMLs unterschätzen - selbst wenn sich die Datenbanken schon alle verabschiedet haben und die Webserver bereits richtig unter Dampf sind: Eine HTML Seite auszuliefern schafft sogar ein Webserver, der schon ziemlich am Ende ist. Und man wahrt vor allem noch am ehesten sein Gesicht, wenn die ganzen neuen Benutzer, die aufgrund des TV Beitrages neugierig geworden sind, zumindest die Startseite zu sehen bekommen. Was immer man neben der Startseite noch an Seiten statisch vorgenerieren kann, ohne dass der angebotene Dienst selber &#8220;statisch&#8221; wird, sollte man natürlich machen (denn wie oft ändern sich schon Seiten wie <em>Über uns</em>?). Hierbei macht es Sinn, sich mithilfe der Zugriffsstatistiken einmal anzuschauen, welchen Weg neue Benutzer in der Regel auf der Plattform nehmen, um so auch wirklich jene Seiten zu cachen, die bei einem Ansturm am ehesten angesurft werden.</p>
<p>Eine dynamische Seite als statische Seite vorzugenerieren ist dabei natürlich die konsequenteste Version von Caching, aber nicht immer praktikabel. My-Hammer nutzt eine zweite Stufe des Cachings, bei dem zwar weiterhin dynamische Seiten ausgeliefert werden, diese aber ganz oder teilweise in dedizierten Cache-Backends (wir nutzen dazu <a href="http://www.danga.com/memcached/">memcached</a>) abgelegt sind, um Ergebnisse teurer Datenbankabfragen, die nicht immer absolut live zur Verfügung stehen müssen, zwischenzuspeichern. Diese zwischengespeicherten Einträge können zum einen nach einer gewissen Zeit ablaufen und werden dann neu aus der Datenbank erzeugt, oder können gezielt als &#8220;dirty&#8221; markiert werden, wenn die Datenbestände die sie widerspiegeln sich ändern. </p>
<p>Wie oben erwähnt kann es sich außerordentlich lohnen, diese Cacheinhalte auf dedizierten Maschinen bereitzustellen - was wiederum deutlich zeigt, dass manche Massnahmen zur Performancesteigerung bestenfalls halbgar sind, wenn Admins und Programmierer nicht zusammenarbeiten.</p>
<h3>Everybody needs a 304</h3>
<p>(oder: Wie ich dem Browser des Users helfe, optimal zu cachen)</p>
<p>Bisher bin ich lediglich auf ein Ziel von Performanceoptimierung eingegangen - zu verhindern, dass die eigenen Server zusammenbrechen, wenn&#8217;s mal brenzlig wird. Man muss sich aber unbedingt bewusst machen, dass Optimierungen auf dem Server erstmal keinen Wert an sich darstellen, sondern nur dem eigentlichen Ziel dienen: dem User die Benutzung der eigenen Seite so schnell und angenehm wie möglich zu machen - indem die Seite grundsätzlich erreichbar bleibt, und indem die Seite sich so schnell wie möglich aufbaut.</p>
<p>Wenn man sich das erstmal bewusst gemacht hat, ist auch klar dass es sich sogar lohnen kann, etwas Rechenzeit auf dem Server zu investieren, um sie dem Client (also Browser) abzunehmen.</p>
<p>Aber der Reihe nach. Es gibt ein wichtiges Hilfsmittel, um den Aufbau einer Webseite im Browser deutlich zu beschleunigen (abgesehen von den üblichen Massnahmen wie geringer Dateigröße, möglichst wenig eingebetteten Objekten etc.), und das ist die Verwendung des HTTP Status <em>304 Not Modified</em>. Diesen kann der Server senden, wenn er anhand der Anfrage des Clients erkennt, dass exakt der Inhalt, den der Browser bereits in seinem Cache hat, nochmal über die Leitung wandern würde - in diesem Fall sendet der Server diesen Inhalt dann eben nicht nochmal, sondern teil dem Browser nur mit, er möge auf den Inhalt seines Caches zurückgreifen.</p>
<p>Dies kann zu erheblichen Performancesteigerungen auf Seiten des Clients führen, denn die Zeit die zum Download des Inhalts einer Seite benötigt wird, entfällt.</p>
<p>Es gibt nun zwei Faktoren, die das Status 304 Handling beeinflussen und spezielle Anpassungen erfordern, um optimales Clientcaching zu ermöglichen: Die Auslieferung von Seiten über PHP Skripte (gilt prinzipiell auch für andere Skriptsprachen) und der Betrieb einer Plattform in einem Webserver-Cluster.</p>
<p>Zuerst zu letzterem: Um in der gegenseitigen Kommunikation festzustellen, ob ein Inhalt vom Server neu ausgeliefert werden muss oder der Browser den Inhalt aus dem eigenen Cache lädt, gibt es den sogenannten <em>Etag</em>. Ein ganz kurzer Abriss, wie die Verwendung abläuft. Der Client fragt eine Ressource beim Server an. Es ist der erste Zugriff innerhalb dieser Browsersitzung, deshalb schickt der Client kein Etag mit. Der Server sendet daraufhin die Inhalte aus, und schickt in den Headern den Etag des aktuellen Inhalts dieser Ressource mit, sagen wir &#8220;12345&#8243; (der Server schickt dazu den Header <em>Etag: &#8220;12345&#8243;</em>).</p>
<p>Fragt der Client nun erneut dieselbe Ressource beim Server an, schickt er in seinen Headern wiederum die Information mit, dass er in seinem Cache bereits die Inhalte mit dem ETag &#8220;12345&#8243; gespeichert hat, und der Server ihn informieren möge falls sich die Inhalte nicht geändert haben (der Client schickt dazu den Header <em>If-None-Match: &#8220;12345&#8243;</em>). Der Server kann dann schauen, ob die Inhalte die er ausliefern würde immer noch das ETag &#8220;12345&#8243; haben, und in diesem Fall den erwähnten HTTP Status 304 senden, oder, falls Inhalt und ETag nicht mehr zueinander passen, den neuen Inhalt schicken.</p>
<p>Die Frage ist nun: Wie genau ist denn definiert, was im Etag steht? Nun, im Prinzip gar nicht. Es gibt kein vorgeschriebenes Format, wichtig ist nur die Definition des Etag an sich: dass nämlich ein eindeutiges Etag zu einem eindeutigen Inhalt einer bestimmten Ressource gehört, und deshalb festgestellt werden kann ob sich der Inhalt einer Ressource zwischen zwei Requests geändert hat oder nicht. Man kann sich den Etag deshalb der Einfachheit halber als Checksumme des Inhalts vorstellen (und in der Tat besteht eine Möglichkeit den Etag zu generieren darin, z.B. die MD5 Summe des Inhalts zu berechnen).</p>
<p>Woher kommt der Etag? Beim Apache ist es Teil der Kernfunktionalität, für eine angeforderte Ressource den Etag zu berechnen und mitzusenden, sowie entsprechend zu reagieren wenn ein Client den <em>If-None-Match</em> Header sendet. Alles out-of-the-box also, aber genau hier liegen für uns die Probleme:</p>
<p><strong>Problem 1:</strong> Defaultmässig berechnet Apache den Etag für eine Ressource, indem eine Art Quersumme aus diesen Informationen generiert wird: I-Node-Nummer der angefragten Datei, letzter Änderungszeitpunkt (mtime) der angefragten Datei, und Größe der angefragten Datei. Betreibt man eine Webseite auf nur einem Server, hat man kein Problem, denn wenn z.B. die Datei <em>/index.html</em> zwischen zwei Aufrufen nicht verändert wird, hat sie bei beiden Zugriffen denselben Etag, da keiner der drei Faktoren inode, mtime, size zwischenzeitlich verändert wurde.<br />
Betreibt man aber einen Cluster aus mehreren Webservern, und besteht die Möglichkeit, dass ein Client bei zwei aufeinanderfolgenden Aufrufen derselben Ressource zuerst auf einem Webserver, beim zweiten Aufruf aber auf einem anderen landet, dann ist, auch wenn auf beiden Servern die exakt gleiche Datei liegt, der Etag beide Male ein anderer, denn selbst wenn letzter Änderungszeitpunkt und Größe der Datei auf beiden Servern identisch sind: dass die I-Node-Nummer die gleiche ist, ist praktisch ausgeschlossen. Der Server wird also keine 304 Status senden, obwohl er es könnte.</p>
<p>Abhilfe ist zum Glück sehr einfach möglich, und lohnt sich schon beim Wechseln von einem auf zwei Server: Man muss dem Apache mitteilen, dass er die I-Node-Nummer nicht mehr zur Berechnung des Etag heranziehen soll. Dies erledigt an zentraler Stelle die Anweisung <em>FileETag MTime Size</em>. Mehr dazu im <a href="http://httpd.apache.org/docs/2.2/mod/core.html#fileetag">Apache Handbuch</a>.</p>
<p><strong>Problem 2:</strong> <em>mod_php</em> hebelt die Verwendung von Etag für PHP Skripte aus. Das macht ja prinzipiell auch Sinn: selbst wenn die Skriptdatei <em>/index.php</em> sich zwischen zwei Aufrufen inhaltlich überhaupt nicht geändert hat, kann sie dennoch völlig unterschiedliche Inhalte an den Client ausliefern - genau das ist ja Sinn und Zweck des Einsatzes von dynamischen Seiten.</p>
<p>Trotzdem kann es Sinn machen, dass der Server den Status 304 an einen Client sendet, wenn dieser dieselbe Ressource erneut anfragt. Zum Beispiel bei CSS Skripten, die von jeder Seite der Plattform eingebunden werden, und aus programmiertechnischen Erwägungen als PHP Skripte realisiert sind, aber deren Inhalt sich trotzdem sehr selten ändert. Jeder Seitenaufruf würde den Browser veranlassen, dies referenzierte CSS Datei anzufragen, und der Server würde jedes Mal den Inhalt senden, obwohl sich dieser seit dem letzten Aufruf nicht geändert hat. Das macht den Seitenaufbau im Client langsam, und ist zudem eine Ressourcenverschwendung.</p>
<p>Wie kann man nun sicherstellen, dass ein Client den 304 Status auch beim Abruf von PHP Skripten erhält, falls sich der Inhalt nicht verändert hat, aber auch auf keinen Fall einen 304 Status bekommt, falls der Inhalt sich geändert hat? Die Lösung ist leider nicht ganz so trivial wie beim ersten Problem, aber doch vergleichsweise einfach zu realisieren.<br />
Da wie erwähnt der Zustand der Skriptdatei selbst praktisch keine Rolle spielt, darf man nur mit dem von diesem Skript auszuliefernden Inhalt arbeiten. Eine Lösung wäre, bei den Skripten, für die man den Etag Mechanismus einsetzen möchte, folgenden Code ans Ende anzuhängen (lässt sich natürlich einfach in eine zentrale Funktion kapseln):</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff;">$output</span> = <span style="color: #000066;">ob_get_clean</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// Gesamte Ausgabe, die an den Client gesendet werden soll, abfangen und zwischenspeichern</span>
<span style="color: #0000ff;">$etag</span> = <span style="color: #ff0000;">'&quot;'</span>.<span style="color: #000066;">sha1</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$output</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">'&quot;'</span>; <span style="color: #808080; font-style: italic;">// Prüfsumme der Ausgabe berechnen</span>
<span style="color: #808080; font-style: italic;">// Ist der Inhalt identisch mit dem, den der Client gecached hat?</span>
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'HTTP_IF_NONE_MATCH'</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #0000ff;">$etag</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">// Wenn ja, dann sende nur den Status 304</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">header</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'HTTP/1.x 304 Not Modified'</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000066;">header</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Etag: '</span>.<span style="color: #0000ff;">$etag</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000066;">die</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #808080; font-style: italic;">// Wenn nicht, dann sende den Inhalt inkl. des neuen Etags</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">header</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Etag: '</span>.<span style="color: #0000ff;">$etag</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000066;">echo</span> <span style="color: #0000ff;">$output</span>;
    <span style="color: #000066;">die</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Voraussetzung ist dafür die Verwendung von <em>output buffering</em>.</p>
<p>Eines muss man ganz klar festhalten - für den Server fällt exakt dieselbe Arbeit an, egal ob der User den Inhalt schlussendlich zugesendet bekommt oder nur die lapidare Meldung, er möge doch auf seinen Cache zurückgreifen. Es mag nach deutlich zuviel Overhead aussehen, PHP soviel Arbeit erledigen zu lassen, nur um das Ergebnis dieser Arbeit dann wegzuschmeissen; aber der Effekt auf die Lade- und damit Seitenaufbauzeiten beim Client ist wirklich beeindruckend, wenn man diesen Mechanismus geschickt einsetzt.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Project OpenMassMailer started</title>
		<link>http://manuel.kiessling.net/blog/2007/11/15/project-openmassmailer-started/</link>
		<comments>http://manuel.kiessling.net/blog/2007/11/15/project-openmassmailer-started/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 09:14:43 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>software</category>

		<category>open source</category>

		<category>php</category>

		<category>mysql</category>

		<category>OpenMassMailer</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/11/15/project-openmassmailer-started/</guid>
		<description><![CDATA[
This week I finally managed to start a new open source software project: OpenMassMailer. I saw the need for a simple yet flexible mass mailing solution after realizing that none of the existing open source software in this category could deliver exactly what we needed at the company.
OMM is not planned to become the one-size-fits-all [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image28" src="http://manuel.kiessling.net/blog/wp-content/uploads/2007/11/omm_logo_42x42_blog.png" alt="omm_logo_42x42_blog.png" align="left" hspace="16" vspace="4" /></p>
<p>This week I finally managed to start a new open source software project: OpenMassMailer. I saw the need for a simple yet flexible mass mailing solution after realizing that none of the existing open source software in this category could deliver exactly what we needed at the company.</p>
<p>OMM is not planned to become the one-size-fits-all solution for mass mailing. This is exactly what I found to be the problem of the existing solutions. OMM will be targeted at large companies that need a solution which fits perfectly into their workflow. An example? OMM will not feature an HTML editor. Why? Because if you do serious mass mailing at a large scale, you won&#8217;t create your newsletters with a sketchy editor in your browser - you have a web design department where the HTML for your newsletter will be produced in high quality using high quality tools.</p>
<p>In essence, with OMM, I want to follow this principle:</p>
<blockquote><p>
Il semble que la perfection soit atteinte non quand il n&#8217;y a plus rien à ajouter, mais quand il n&#8217;y a plus rien à retrancher.</p>
<p />
<em>(Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.)</em>
</p></blockquote>
<p>The homepage of OMM is located at <a href="http://openmassmailer.org/" title="The homepage of OMM Open Mass Mailer">http://openmassmailer.org/</a>.</p>
<p>My plan is to get other developers on board as early as possible. On ARSC, my former project, I worked mainly alone, and this time I would like to create a result of real teamwork.</p>
<p>If you would like to participate, the best place to go is the OMM Google Group at <a title="The OMM Open Mass Mailer mailing list / Google Group" href="http://groups.google.com/group/openmassmailer/">http://groups.google.com/group/openmassmailer/</a>.</p>
<p>Everything developers need to know to get started will soon be available on the <a href="https://openmassmailer.org/trac/wiki/DevelopersGettingStarted">Trac wiki of OMM</a>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/11/15/project-openmassmailer-started/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kerner und die Staatsverschuldung</title>
		<link>http://manuel.kiessling.net/blog/2007/10/03/kerner-und-die-staatsverschuldung/</link>
		<comments>http://manuel.kiessling.net/blog/2007/10/03/kerner-und-die-staatsverschuldung/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 22:01:02 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>television</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/10/03/kerner-und-die-staatsverschuldung/</guid>
		<description><![CDATA[Soeben bei Kerner: Zu Gast ist Dr. Karl Heinz Däke, Präsident des Bundes der Steuerzahler. Es folgt das Übliche, das aktuelle Schwarzbuch ist veröffentlicht, man plaudert über diverse Beispiele von Verschwendung von Steuergeldern.
Zum Abschluss des Gesprächs, Kerner (sinngemäß): &#8220;Ich hab jetzt nicht so genau auf die Uhr geguckt, aber vom Gefühl her würde ich sagen, [...]]]></description>
			<content:encoded><![CDATA[<p>Soeben bei Kerner: Zu Gast ist Dr. Karl Heinz Däke, Präsident des Bundes der Steuerzahler. Es folgt das Übliche, das aktuelle Schwarzbuch ist veröffentlicht, man plaudert über diverse Beispiele von Verschwendung von Steuergeldern.</p>
<p>Zum Abschluss des Gesprächs, Kerner (sinngemäß): &#8220;Ich hab jetzt nicht so genau auf die Uhr geguckt, aber vom Gefühl her würde ich sagen, wir haben ca. 15 Minuten gesprochen - wenn man das mal umrechnet anhand der jährlichen Steuerverschwendung, wieviele öffentliche Gelder sind denn in dieser Viertelstunde verschwendet worden?&#8221; Dr. Däke: &#8220;Naja, ich weiss ja nicht wie gut Sie schätzen können, aber ich würde sagen da wurden jetzt ca. 485.000 Euro rausgeworfen&#8221;.</p>
<p>Hätte ich gar nicht gedacht, dass JBK den Rundfunkgebührenzahler <strong><em>so</em></strong> teuer kommt.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/10/03/kerner-und-die-staatsverschuldung/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Wie man Replikationsunterbrechung durch Deadlocks bei INSERT INTO &#8230; SELECT verhindert</title>
		<link>http://manuel.kiessling.net/blog/2007/08/07/wie-man-replikationsunterbrechung-durch-deadlocks-bei-insert-into-select-verhindert/</link>
		<comments>http://manuel.kiessling.net/blog/2007/08/07/wie-man-replikationsunterbrechung-durch-deadlocks-bei-insert-into-select-verhindert/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 20:43:12 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>software</category>

		<category>mysql</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/08/07/wie-man-replikationsunterbrechung-durch-deadlocks-bei-insert-into-select-verhindert/</guid>
		<description><![CDATA[Der My-Hammer Auftragsradar, der unsere Auftragnehmer auf Wunsch regelmässig per E-Mail über neu eingestellte Auktionen anhand einstellbarer Filterkriterien informiert, baut bei jedem Durchlauf eine eigene Suchtabelle auf. Diese wird gefüllt mit einer Untermenge der Daten unserer Haupt-Auktionstabelle, nämlich nur den derzeit laufenden Auktionen.
Die Verwendung von INSERT INTO &#8230; SELECT ist hier naheliegend, zum Beispiel so:

INSERT [...]]]></description>
			<content:encoded><![CDATA[<p>Der <a href="http://www.my-hammer.de/showPage.php?id=auftragservice">My-Hammer Auftragsradar</a>, der unsere Auftragnehmer auf Wunsch regelmässig per E-Mail über neu eingestellte Auktionen anhand einstellbarer Filterkriterien informiert, baut bei jedem Durchlauf eine eigene Suchtabelle auf. Diese wird gefüllt mit einer Untermenge der Daten unserer Haupt-Auktionstabelle, nämlich nur den derzeit laufenden Auktionen.<br />
Die Verwendung von <em>INSERT INTO &#8230; SELECT</em> ist hier naheliegend, zum Beispiel so:</p>

<div class="wp_syntax"><div class="code"><pre class="sql"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> Suchtabelle <span style="color: #993333; font-weight: bold;">SELECT</span> a, b, c <span style="color: #993333; font-weight: bold;">FROM</span> Auktionstabelle <span style="color: #993333; font-weight: bold;">WHERE</span> x = y</pre></div></div>

<p>Es ergab sich folgendes Problem: Der Query wird wie jeder andere auch auf die Datenbankslaves repliziert. Dort wurde er auch korrekt ausgeführt. Jedoch nicht immer auf dem Master: hier kam es regelmäßig zu Deadlocks auf der Auktionstabelle, da dies eine InnoDB Tabelle ist (bei MyISAM Tabellen können Deadlocks nicht auftreten).</p>
<p>Wenn ein MySQL Slave jedoch feststellt, dass beim gleichen Query auf dem Master und auf dem Slave unterschiedliche Fehler auftreten (Slave: no error; Master: deadlock), unterbricht dieser die Replikation. Es hilft dann nur ein <em>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;</em>.</p>
<p>Ich habe mich daraufhin nach Lösungen umgeschaut. Erste Anlaufstelle ist das Kapitel <a href="http://dev.mysql.com/doc/refman/5.1/de/innodb-deadlocks.html">Vom Umgang mit Deadlocks</a> im MySQL Handbuch.</p>
<p>Mein erster Versuch war, den 4. Tipp dieses Kapitels zu befolgen: Das Einstellen eines niedrigeren Isolationslevels. Da perfekte Datenkonsistenz für die benötigte Suchtabelle nicht nötig ist (<em>dirty reads</em> also akzeptabel sind), verwendete ich gleich den niedrigsten Level <em>READ UNCOMMITED</em>. Das Ergebnis war gelinde gesagt verheerend, es traten noch mehr Deadlocks auf als zuvor.</p>
<p>Deshalb bin ich dazu übergegangen, die beteiligten Tabellen explizit mit einem <em>READ LOCK</em> zu sperren - viele Artikel zu diesem Thema haken diese Vorgehensweise sofort als nicht gangbar ab, da die Performance darunter leide. Da es sich beim Auftragsradar jedoch um einen Cronjob handelt, der nur alle paar Minuten einmal läuft, und der <em>INSERT INTO &#8230; SELECT</em> Query sehr schnell durchläuft, erschien mir das Risiko, eine unserer wichtigsten Tabellen für diesen Query zu sperren, als gering.</p>
<p>Wie sich zeigte, brachte dies den gewünschten Erfolg: Seitdem sind an dieser Stelle keinerlei Deadlocks mehr aufgetreten, und der Rest der Plattform zeigt sich von den seltenen und kurzen Locks völlig unbeeindruckt.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/08/07/wie-man-replikationsunterbrechung-durch-deadlocks-bei-insert-into-select-verhindert/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My-Hammer, das Fernsehen und die Serverlast: Teil 2.1</title>
		<link>http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/</link>
		<comments>http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 20:09:59 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>linux</category>

		<category>software</category>

		<category>open source</category>

		<category>My-Hammer</category>

		<category>mysql</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/</guid>
		<description><![CDATA[Dies ist Teil 2.1 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:


Teil 1: Allgemeine Überlegungen
Teil 2: Datenbankoptimierung
Teil 2.1: Praxistipps Datenbank
Teil 3: Caching
Teil 4: Zukünftige Optimierungen (folgt)

Eine praxisnahe Zusammenstellung der Massnahmen, die sich bei My-Hammer.de bewährt haben:
InnoDB vs MyISAM
Ich schrieb bereits, dass man InnoDB nicht nur dann in Erwägung ziehen sollte, wenn man Transaktionssicherheit benötigt. Eine [...]]]></description>
			<content:encoded><![CDATA[<p>Dies ist Teil 2.1 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:</p>
<blockquote>
<p>
<a href="http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/">Teil 1: Allgemeine Überlegungen</a><br />
<a href="http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/">Teil 2: Datenbankoptimierung</a><br />
<strong><a href="http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/">Teil 2.1: Praxistipps Datenbank</a></strong><br />
<a href="http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/">Teil 3: Caching</a><br />
Teil 4: Zukünftige Optimierungen (folgt)</p>
</blockquote>
<p>Eine praxisnahe Zusammenstellung der Massnahmen, die sich bei <a href="http://www.my-hammer.de/">My-Hammer.de</a> bewährt haben:</p>
<h3>InnoDB vs MyISAM</h3>
<p>Ich schrieb bereits, dass man InnoDB nicht nur dann in Erwägung ziehen sollte, wenn man Transaktionssicherheit benötigt. Eine Tabelle von MyISAM auf InnoDB umzustellen kann unter Umständen Geschwindigkeitsvorteile bringen, nämlich dann, wenn das zweite wichtige Feature von InnoDB neben der Transaktionssicherheit, das Row Level Locking, effektiv zum Zug kommen kann. Um herauszufinden, ob dies der Fall ist, kann man wie folgt vorgehen:</p>
<h4>Mitloggen aller Queries</h4>
<p>
Wenn man für einen bestimmten Zeitraum (bei einer gut besuchten Seite reichen wenige Minuten) einmal alle Abfragen, die an die Datenbank gestellt werden, mitschreibt, kann man aus diesem Log eine Menge interessanter Informationen ziehen. Um festzustellen, ob eine Tabelle vom Row Level Locking profitieren könnte, muss man die lesenden (SELECT) und schreibenden (INSERT, UPDATE, DELETE etc.) Abfragen gegenüberstellen.<br />
Wird aus einer Tabelle sehr häufig gelesen, die Daten in der Tabelle aber nur sehr selten verändert, dann macht das Table Level Locking von MyISAM in der Regel keine Probleme: Zwar wird bei einem UPDATE, INSERT oder DELETE die gesamte Tabelle für nachfolgende Lesezugriffe gesperrt (d.h. diese müssen warten), bis der Schreibprozess abgeschlossen ist. Aber da dies nur selten geschieht, kommt es auch selten vor, dass ein Leseprozess warten muss, so dass daraus keine spürbare Verzögerung im Gesamtsystem resultiert.
</p>
<p>
Gleiches gilt im umgekehrten Fall: Wird in eine Tabelle praktisch nur geschrieben, aber selten daraus gelesen (wie es z.B. bei Logtabellen häufig der Fall ist), dann kollidieren auch hier die &#8220;Interessen&#8221; nur so selten, dass nicht mit Performanceeinbußen zu rechnen ist.
</p>
<h4>Slow Log</h4>
<p>
Interessant sind also jene Tabellen, bei denen Schreib- und Lesezugriffe in einem ausgeglicheneren Verhältnis stehen. In welcher Relation die beiden Zugriffsarten dabei mindestens stehen müssen, damit es sich &#8220;lohnt&#8221; InnoDB einzusetzen, ist schwer zu sagen. Ein Blick ins Slow-Log von MySQL hilft hier weiter: Wenn man immer wieder bei denselben Tabellen auf langsame Queries stösst, die nicht wegen des Queries selbst langsam waren, sondern weil sie auf ein Lock warten mussten, hat man auf jeden Fall aussichtsreiche Kandidaten.
</p>
<h4>SHOW PROCESSLIST</h4>
<p>
Eine weitere Methode ist, sich einmal für einige Minuten immer wieder die Liste der laufenden Prozesse in MySQL auflisten zu lassen (SHOW PROCESSLIST). Wenn man dort immer wieder dieselben Queries sieht, deren Status <em>Locked</em> ist, dann weiss man wo das Problem liegt. Diese Methode mag zwar auf den ersten Blick wie ein Glücksspiel wirken, aber gerade weil man immer nur die Prozesse sieht, die zufällig gerade laufen wenn man den Befehl absetzt, fallen die problematischen Prozesse erst recht auf, die immer wiederkehren und oft vielleicht sogar während zwei oder mehr SHOW Aufrufen immer noch laufen. Meiner Meinung nach die schnellste Methode, Flaschenhälse zu finden.
</p>
<p>Mehr zum Thema Locking gibt es im <a href="http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html">Kapitel &#8216;Internal Locking Methods&#8217; des MySQL Handbuchs</a>.</p>
<p>
Nehmen wir also an, man hat einige Tabellen identifiziert, bei denen Queries öfter als gesund ist auf einen Lock warten müssen. Dies könnte beispielsweise eine Sessiontabelle sein (falls man z.B. PHP nutzt und die Sessionfunktionen so angepasst hat, dass diese eine MySQL Datenbank als Storage nutzen, ein ziemlich klassisches Szenario). Diese Tabelle wird bei jedem Seitenaufruf zu Beginn einmal gelesen, um die Session des aufrufenden Benutzers zu laden, und am Ende des Skripts wird der Sessioninhalt dieses Benutzers wieder geschrieben. Also ein sehr ausgewogenes Verhältnis zwischen lesenden und schreibenden Zugriffen - jeder Seitenaufruf, der gerade an dem Punkt angelangt ist, an dem die Session geschrieben wird, würde also die Tabelle sperren für sämtliche anderen Seitenaufrufe, die in diesem Moment aus der Sessiontabelle lesen möchten - das Performanceproblem ist ab einer bestimmten Anzahl von gleichzeitigen Benutzern vorprogrammiert.
</p>
<p>
Klassischerweise geht man nun so vor, dass man die Tabelle in InnoDB umwandelt und wieder einige Zeit das Slow Log oder die Prozessliste beobachtet - sinkt die Lock_Time der Abfragen deutlich, hat man einen Flaschenhals erfolgreich eliminiert.
</p>
<p>
Nun, es wäre freilich zu schön, wenn es nicht doch den ein oder anderen Haken bei der Sache gibt; zum Glück lassen sich die meisten aber zumindest einigermassen elegant umschiffen.<br />
Eine Einschränkung von InnoDB ist beispielsweise, dass der FULLTEXT Index nicht unterstützt wird. Dies war bei My-Hammer ein Problem, weil wir eine Tabelle, die ziemlich eindeutiger Kandidat für eine Umstellung von MyISAM auf InnoDB war, in einem Teil unserer Applikation auch durchsuchen mussten, und zwar eben gerade einige TEXT-Felder, was ohne FULLTEXT Index nicht wirklich Spass macht.<br />
Die Lösung war, die Tabelle umzuwandeln und damit in der Tabelle selbst auf die FULLTEXT Indizes zu verzichten, per cronjob aber eine weitere Tabelle regelmässig mit den Daten der Ursprungstabelle zu füllen. Geschrieben wurde in diese Tabelle nur durch besagten Crobjobs, ansonsten fanden ausschliesslich Lesezugriffe statt, womit MyISAM wieder die perfekte Wahl war - und wir hatten unsere FULLTEXTs wieder. Schöner Nebeneffekt: durchsucht werden müssen eh nur eine Untermenge aller Zeilen der Ursprungstabelle, und es müssen auch nicht alle der (recht zahlreichen) Spalten in die Suchtabelle übertragen werden.<br />
Dadurch konnten wir nicht nur das Lockingproblem der ursprünglichen Tabelle lösen, sondern aufgrund der schlankeren Datenbasis in der Suchtabelle die Suche deutlich beschleunigen.<br />
Wichtig ist jedoch: diese Lösung ist nur möglich, weil wir in diesem Fall darauf verzichten können, auf absoluten Livedaten zu suchen.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nomen est halt doch nicht immer omen</title>
		<link>http://manuel.kiessling.net/blog/2007/06/26/nomen-est-halt-doch-nicht-immer-omen/</link>
		<comments>http://manuel.kiessling.net/blog/2007/06/26/nomen-est-halt-doch-nicht-immer-omen/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 21:27:08 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>other</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/06/26/nomen-est-halt-doch-nicht-immer-omen/</guid>
		<description><![CDATA[Heute im IHK Magazin (Klo, Langeweile, fragt
nicht) gelesen, in den Mitteilungen zum Handelsregister (jaja, *wirklich* Langeweile, sag ich doch):

Löschungen von Amts wegen: fuerimmer.com Aktiengesellschaft

]]></description>
			<content:encoded><![CDATA[<p>Heute im IHK Magazin (Klo, Langeweile, fragt<br />
nicht) gelesen, in den Mitteilungen zum Handelsregister (jaja, *wirklich* Langeweile, sag ich doch):</p>
<blockquote><p>
Löschungen von Amts wegen: fuerimmer.com Aktiengesellschaft
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/06/26/nomen-est-halt-doch-nicht-immer-omen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My-Hammer, das Fernsehen und die Serverlast: Teil 2</title>
		<link>http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/</link>
		<comments>http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 07:31:12 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>linux</category>

		<category>software</category>

		<category>php</category>

		<category>My-Hammer</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/</guid>
		<description><![CDATA[Dies ist Teil 2 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:


Teil 1: Allgemeine Überlegungen
Teil 2: Datenbankoptimierung
Teil 2.1: Praxistipps Datenbank
Teil 3: Caching
Teil 4: Zukünftige Optimierungen (folgt)

Hinweis:  Thematisch durchaus verwandt berichtet Tom Bachem über die Systemarchitektur von sevenload.
Welche Massnahmen kann man nun konkret ergreifen, um sich auf einen TV Beitrag über die eigene Webseite vorzubereiten? [...]]]></description>
			<content:encoded><![CDATA[<p align="left">Dies ist Teil 2 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:</p>
<blockquote>
<p>
<a href="http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/">Teil 1: Allgemeine Überlegungen</a><br />
<strong><a href="http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/">Teil 2: Datenbankoptimierung</a></strong><br />
<a href="http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/">Teil 2.1: Praxistipps Datenbank</a><br />
<a href="http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/">Teil 3: Caching</a><br />
Teil 4: Zukünftige Optimierungen (folgt)</p>
</blockquote>
<p align="left"><strong>Hinweis:</strong>  Thematisch durchaus verwandt berichtet Tom Bachem <a href="http://blog.thomasbachem.com/2007/05/28/die-sevenload-systemarchitektur/">über die Systemarchitektur von sevenload</a>.</p>
<p align="left">Welche Massnahmen kann man nun konkret ergreifen, um sich auf einen TV Beitrag über die eigene Webseite vorzubereiten? Ich versuche so allgemein wie möglich zu bleiben, aber da es um konkrete Ratschläge gehen soll und ich holprige Umschreibungen vermeiden möchte, wird das Vokabular ab jetzt etwas LAMP-lastig; bitte entsprechend auf die eigene Technik ummünzen.</p>
<p align="left" style="font-weight: bold">Massnahme 1: Datenbankoptimierung</p>
<p align="left">Wurde ja schon erwähnt: die Indizes. Ich verrate wahrscheinlich nicht einmal DB Anfängern etwas neues, wenn ich betone, dass dies essentiell ist. Wenn man die Indizes nicht im Griff hat, braucht man sich die anderen Punkte noch gar nicht anschauen. Deshalb: Ins Slow-Log gucken. Vor allem: Immer wieder. Einen Status Quo gibt es nicht! Immer wieder <a href="http://dev.mysql.com/doc/refman/5.0/en/explain.html">EXPLAIN</a> bemühen, vom stumpf auf die Strukturen in phpMyAdmin gucken findet man die Performancefresser nicht.</p>
<p align="left">Es gibt diese missverständliche Formel &#8220;Braucht man Geschwindigkeit, nimmt man MyISAM, braucht man Sicherheit, InnoDB&#8221;. InnoDB ist nicht nur einen Blick wert, wenn man Transaktionssicherheit braucht. Im Gegensatz zu MyISAM lockt InnoDB bei schreibenden Queries immer nur die betreffenden Zeilen, MyISAM dagegen grundsätzlich die gesamte Tabelle. InnoDB hat zwar aufgrund der größeren Komplexität etwas mehr &#8220;Grundoverhead&#8221;, aber das intelligentere Locking kann immens wertvoll sein in bestimmten Szenarien und das mehr als wettmachen. Wenn man eine Tabelle hat die man hinsichtlich Struktur und Indices schon perfekt durchoptimiert hat (genau das aber wiederum erstmal sicherstellen!), und trotzdem tauchen Queries auf diese Tabelle immer noch im Slow Log auf, dann sollte man prüfen, ob diese Queries vielleicht immer auf einen Lock warten. In diesem Fall InnoDB auf jeden Fall eine Chance geben. Das hat bei uns konkret bei den Session und Cachetabellen (dazu später mehr) enorm viel gebracht, weil dort die Lese- und Schreibzugriffe ein ausgewogenes Verhältnis haben.</p>
<p align="left">Ein Aspekt, der wenig berücksichtigt wird, ist die Größe der Felder, auf die man Indices setzt. Es kann sich lohnen, hier sparsam zu sein, denn ein kleinerer Spaltentyp bedeutet auch weniger Speicherplatzverbrauch für den Index auf diese Spalte, und das kann im Zweifel nur gut (= schneller) sein. Man ist halt geneigt, seine Primary IDs immer als INT anzulegen. Aber nehmen wir mal den Klassiker Benutzertabelle: Wird man wirklich in nächster Zeit 4 Milliarden User haben? Das dürfte selbst bei eBay noch ein bisschen dauern. Erstmal tut es also auch ein MEDIUMINT, setzt man diesen UNSIGNED, ist das Limit bei 16 Millionen. Hat man soviele User, bewegt man sich wohl eh in völlig anderen Dimensionen.<br />
Zumal das Umwandeln einer Spalte in einen Typ mit größerem Wertbereich (also z.B. von MEDIUMINT nach INT) unproblematisch ist. Wichtig ist allerdings auch, dass man sämtliche Felder, die einen Fremdschlüssel auf ein MEDIUMINT Feld darstellen, ebenfalls als MEDIUMINT anlegt, sonst hat man bei Joins nichts gewonnen.
</p>
<p align="left">Was bei der Skalierung von MySQL immer enorm hilft ist Replikation. Dazu wurde schon so viel geschrieben, dass ich mir die Wiederholung spare, nur dies: Wir fahren bisher sehr gut damit, das Balancing der Nur-Lese Zugriffe direkt in unserer Applikation zu regeln, und nicht über einen eigenen Software- oder Hardware-Loadbalancer. Da bei fast jedem Seitenaufruf der Master sowieso früher oder später konnektiert werden muss, kann man diese Verbindung auch nutzen, um MASTER STATUS und SLAVE STATUS zu vergleichen, um so ein Fallback auf den Master zu realisieren, falls alle Slaves einmal mehr als 0 Sekunden hinter dem Master zurückhängen. Was sich übrigens ziemlich gut vermeiden lässt, wenn man Master und Slaves per Gigabit statt Fast Ethernet anbindet.</p>
<p align="left">Ein oft nicht wahrgenommener Vorteil von Replikation: Man kann einen Slave für&#8217;s Backup bereitstellen, auf dem man die Datenbank stoppen und auf Dateisystemebene wegkopieren kann (oder man hält nur den Slave Thread an und macht einen Dump), so dass man einen sauberen Snapshot der Datenbank hat, ohne das Gesamtsystem anhalten zu müssen.</p>
<p align="left">Ein weiterer wichtiger Hebel für die Skalierung ist es, für spezielle Aufgaben jeweils eigene DB Server bereitzustellen, z.B. ein oder mehrere Maschinen nur für die Sessiontabellen, nur für Tabellen mit Cache-Inhalten, nur für Logtabellen; prinzipiell kann jede Tabelle, die nicht in Form von Joins oder Subselects zusammen mit anderen Tabellen gleichzeitig abgefragt werden muss, auch getrennt von den anderen Tabellen auf einem eigenen Server liegen. Darüber hinaus macht die Trennung von sehr verschiedenen Tabellen wie Session- und Logtabellen alleine deshalb schon Sinn, weil man dann die Datenbanksoftware für diese speziellen Aufgaben optimieren kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My-Hammer, das Fernsehen und die Serverlast: Teil 1</title>
		<link>http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/</link>
		<comments>http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 20:43:25 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>linux</category>

		<category>software</category>

		<category>open source</category>

		<category>php</category>

		<category>My-Hammer</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/</guid>
		<description><![CDATA[Dies ist Teil 1 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:


Teil 1: Allgemeine Überlegungen
Teil 2: Datenbankoptimierung
Teil 2.1: Praxistipps Datenbank
Teil 3: Caching
Teil 4: Zukünftige Optimierungen (folgt)

Vergangenen Donnerstag zeigte das ProSieben Magazin Galileo einen ca. 10-minütigen Beitrag über My-Hammer (kurze Infos zur Sendung hier). Vom Ansatz her ging es um &#8220;Branchenbuch vs. My-Hammer&#8221;, aber für die [...]]]></description>
			<content:encoded><![CDATA[<p>Dies ist Teil 1 der Artikelserie zum Thema Webseiten-Skalierung. Die anderen Teile:</p>
<blockquote>
<p>
<strong><a href="http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/">Teil 1: Allgemeine Überlegungen</a></strong><br />
<a href="http://manuel.kiessling.net/blog/2007/06/26/my-hammer-das-fernsehen-und-die-serverlast-teil-2/">Teil 2: Datenbankoptimierung</a><br />
<a href="http://manuel.kiessling.net/blog/2007/07/17/my-hammer-das-fernsehen-und-die-serverlast-teil-21/">Teil 2.1: Praxistipps Datenbank</a><br />
<a href="http://manuel.kiessling.net/blog/2007/12/26/my-hammer-das-fernsehen-und-die-serverlast-teil-3/">Teil 3: Caching</a><br />
Teil 4: Zukünftige Optimierungen (folgt)</p>
</blockquote>
<p>Vergangenen Donnerstag zeigte das ProSieben Magazin <em>Galileo</em> einen ca. 10-minütigen Beitrag über My-Hammer (<a href="http://www.prosieben.de/wissen/galileo/themen/artikel/40712/">kurze Infos zur Sendung hier</a>). Vom Ansatz her ging es um &#8220;Branchenbuch vs. My-Hammer&#8221;, aber für die Betrachtung hier ist das gar nicht so sehr von Interesse - es ist noch nichtmal von Interesse, ob so ein Beitrag positiv oder negativ für uns ist (in dem Fall war&#8217;s wie fast immer positiv) - sobald das Magazin, in dem über uns berichtet wird, genug Reichweite hat, schießen die Zugriffe in die Höhe. Die wichtigste Erkenntnis, die wir immer wieder machen: zumindest bei den Privaten scheinen die Zuschauer sprichwörtlich mit dem Laptop auf den Knien vorm Fernseher zu sitzen. Die Zugriffe kommen extrem schnell und gebündelt (beim Galileo-Beitrag war aber interessant, dass die Zugriffe wieder auf einen Schlag kamen, aber erst in dem Moment, in dem der Beitrag vorbei war).</p>
<p>Genau dieses plötzliche Auftreten so vieler Zugriffe ist natürlich die Herausforderung - dieselbe Anzahl User auf nur 15 Minuten verteilt wären kein Problem, aber TV sorgt dafür, dass das meiste innerhalb der ersten 5 Minuten passiert. Und es ist wirtschaftlich natürlich ziemlich unvernünftig, die für diese 5 Minuten benötigte Rechenpower anzuschaffen, nur damit sie die anderen 525.595 Minuten im Jahr vor sich hindümpelt.</p>
<p>Trotzdem kann man eine Webseite auch auf solche Extremsituationen vorbereiten - My-Hammer hat am Donnerstag perfekt standgehalten, lediglich eine leichte Verzögerung in den Ladezeiten war während der kritischen Phase spürbar.</p>
<p>Um kurz die Dimensionen klarzumachen, erstmal eine Grafik, welche den ein- und ausgehenden IP Traffic für unser Netzwerk anzeigt. Man sieht sehr deutlich den Sprung auf das gut 2,5-fache des normalen Werts. Der Faktor selbst klingt vielleicht erstmal nicht so dramatisch, aber wie erwähnt geht es nicht um die Masse an sich, sondern das extrem gebündelte Auftreten dieser Masse an Zugriffen:</p>
<p align="center"><img id="image18" alt="IP-Traffic My-Hammer" src="http://manuel.kiessling.net/blog/wp-content/uploads/2007/06/traffic_my-hammer-galileo.png" /></p>
<p align="left">Ich behaupte mal, man erkennt recht gut, wann die Sendung lief&#8230;</p>
<p align="left">Also, wie kann man die Serversysteme auf so etwas vorbereiten? Klar: mehr Server kaufen. Das ist durchaus ein Aspekt, aber nicht das Allheilmittel. Vor allen Dingen kann das sehr ineffektiv und unwirtschaftlich sein. Angenommen, man hat Server A mit einer gewissen Leistungsfähigkeit. Nun kann man sich Server B mit doppelt so schnellem Prozessor, doppeltem Arbeitsspeicher und doppelt so schnellen Festplatten kaufen. Dann hat man schon Unmengen von Geld ausgegeben, und hat gerade mal eine Steigerung der Leistungsfähigkeit von 100% (mal davon abgesehen, dass die Rechnung &#8220;doppelt so schnelle Hardware, doppelt so viel Leistung&#8221; in der Praxis auch nicht wirklich hinhaut). Dagegen kann ein einziger geschickt gesetzter Index in der Datenbank manchmal 1000% bessere Performance bringen, ohne dass man etwas an der Hardware tut.</p>
<p align="left">Wenn man den Anschaffungspreis neuer Hardware mal auf den Stundenlohn eines Entwicklers umrechnet, wird man schnell zu dem Schluss kommen, dass es sich auch finanziell durchaus rechnen kann, diesen einige Tage lang auf die Datenbank anzusetzen um zu schauen, ob nicht doch irgendwo ein wichtiger Index vergessen wurde oder einige Tabellenstrukturen besser ganz anders aufgebaut sein sollten.</p>
<p align="left">Das sind nur ein paar grundsätzliche Überlegungen. Spürbaren Erfolg wird man nur haben, wenn man ein ganzes Bündel an Massnahmen ergreift und vor allem immer das Gesamtsystem vom Code über die Datenbank bis hin zu den Servern und dem Netzwerk im Überblick hat. Die vielleicht wichtigste Faustregel, wenn man über Performanceoptimierung von Webseiten spricht, scheint mir daher zu sein: Coder und Admins an einen Tisch! Es hilft nichts, wenn die Entwickler meinen, die Geschwindigkeit des Systems sei doch schliesslich Sache des Admins. Umgekehrt ist es extrem hilfreich, wenn die Programmierer auch einen gewissen Sysadmin-Background haben, und die Admins umgekehrt auch Programmiererfahrung haben; was bei uns glücklicherweise sogar sehr ausgeprägt der Fall ist.</p>
<p align="left">Die weiteren Teile befassen sich mit den konkreten Massnahmen, die man ergreifen kann um sich auf einen TV Beitrag vorzubereiten.</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/06/23/my-hammer-das-fernsehen-und-die-serverlast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hat sich ja längst erledigt!</title>
		<link>http://manuel.kiessling.net/blog/2007/06/16/hat-sich-ja-langst-erledigt/</link>
		<comments>http://manuel.kiessling.net/blog/2007/06/16/hat-sich-ja-langst-erledigt/#comments</comments>
		<pubDate>Sat, 16 Jun 2007 20:02:26 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>Uncategorized</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/06/16/hat-sich-ja-langst-erledigt/</guid>
		<description><![CDATA[Die Linkspartei wischt Bedenken, dass nach wie vor der Geist der SED durch ihre Partei wehen könnte, mit der Bemerkung beiseite, alleine durch das Alter der meisten Parteimitglieder sei doch ersichtlich, dass praktisch kaum jemand aus dieser Zeit überhaupt noch dabei ist.
Das ist interessant. Dieser Logik folgend kann ich dann ja auch völlig beruhigt NPD [...]]]></description>
			<content:encoded><![CDATA[<p>Die Linkspartei wischt Bedenken, dass nach wie vor der Geist der SED durch ihre Partei wehen könnte, mit der Bemerkung beiseite, alleine durch das Alter der meisten Parteimitglieder sei doch ersichtlich, dass praktisch kaum jemand aus dieser Zeit überhaupt noch dabei ist.</p>
<p>Das ist interessant. Dieser Logik folgend kann ich dann ja auch völlig beruhigt NPD wählen, denn alleine aus &#8220;biologischen&#8221; Gründen ist ja praktisch keiner von &#8220;damals&#8221; mehr dabei!
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/06/16/hat-sich-ja-langst-erledigt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using apt on Etch connecting to an apt-proxy on Sarge causes trouble with .diff files</title>
		<link>http://manuel.kiessling.net/blog/2007/02/09/using-apt-on-etch-connection-to-an-apt-proxy-on-sarge-causes-trouble-with-diff-files/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/09/using-apt-on-etch-connection-to-an-apt-proxy-on-sarge-causes-trouble-with-diff-files/#comments</comments>
		<pubDate>Fri, 09 Feb 2007 09:30:29 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>linux</category>

		<category>software</category>

		<category>open source</category>

		<category>debian</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/index.php/2007/02/09/using-apt-on-etch-connection-to-an-apt-proxy-on-sarge-causes-trouble-with-diff-files/</guid>
		<description><![CDATA[Say you have an installation of apt-proxy running on a Debian Sarge machine to serve files for apt on your other machines, then you will receive errors like this when issuing an apt-get update on an Etch machine: Error reading from server. Remote end closed connection.The reason is that Etch tries to download a file [...]]]></description>
			<content:encoded><![CDATA[<p><img hspace="4" align="left" alt="openlogo-nd-50.png" id="image12" src="http://manuel.kiessling.net/blog/wp-content/uploads/2007/02/openlogo-nd-50.png" />Say you have an installation of <em>apt-proxy</em> running on a Debian Sarge machine to serve files for <em>apt</em> on your other machines, then you will receive errors like this when issuing an <em>apt-get update</em> on an Etch machine: <em>Error reading from server. Remote end closed connection</em>.The reason is that Etch tries to download a file called <em>Packages.diff</em> which Sarge&#8217;s <em>apt-proxy</em> doesn&#8217;t know how to serve.</p>
<p>apt-proxy therefore log notes the following:</p>
<blockquote><p><em>2007/02/09 10:10 CET [Channel,129,213.203.200.122] [debug] Request: GET /debian/dists/etch/main/binary-amd64/Packages.diff/Index<br />
2007/02/09 10:10 CET [Channel,129,213.203.200.122] [debug] abort - unknown extension</em></p></blockquote>
<p>Adding the following line to <em>/etc/apt/apt.conf</em> on your Etch machines will tell them not to download those files:</p>
<blockquote><p><em>Acquire::PDiffs &#8220;false&#8221;;</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/09/using-apt-on-etch-connection-to-an-apt-proxy-on-sarge-causes-trouble-with-diff-files/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Old homepage available again</title>
		<link>http://manuel.kiessling.net/blog/2007/02/02/old-homepage-available-again/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/02/old-homepage-available-again/#comments</comments>
		<pubDate>Fri, 02 Feb 2007 14:20:33 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>intern</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/index.php/2007/02/02/old-homepage-available-again/</guid>
		<description><![CDATA[Before I switched to WordPress, I had a &#8220;classical&#8221; homepage like everybody else had before everybody else switched to a blog. However, I hate throwing away stuff in real life as much as in the virtual world.
Thus, with the magic help of Xen, I was able to re-setup my old homepage, and made it available [...]]]></description>
			<content:encoded><![CDATA[<p>Before I switched to WordPress, I had a &#8220;classical&#8221; homepage like everybody else had before everybody else switched to a blog. However, I hate throwing away stuff in real life as much as in the virtual world.</p>
<p>Thus, with the magic help of Xen, I was able to re-setup my old homepage, and made it available via <a title="The old homepage of Manuel Kiessling" href="http://old.manuel.kiessling.net/">http://old.manuel.kiessling.net/</a>. It should be 99% functional, and still contains some of the more interesting stuff I created over the years, but never migrated to my new homepage.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/02/old-homepage-available-again/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My &#8220;to watch&#8221; movie list</title>
		<link>http://manuel.kiessling.net/blog/2007/02/01/my-to-watch-movie-list/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/01/my-to-watch-movie-list/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 20:39:50 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>movies</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/index.php/2007/02/01/my-to-watch-movie-list/</guid>
		<description><![CDATA[(Mostly inspired by Silent Bob&#8217;s list, as we really seem to share the same taste)

300
Pan&#8217;s Labyrinth
The Fountain
The Departed
The Last King Of Scotland
Das Parfüm
Clerks II (I should probably watch Clerks first however&#8230;)
Thank You For Smoking
Children Of Men

But Mission Impossible III? Are you kidding?

]]></description>
			<content:encoded><![CDATA[<p>(Mostly inspired by <a title="Kevin Smith's Top Ten Films of 2006" href="http://silentbobspeaks.com/?p=305">Silent Bob&#8217;s list</a>, as we really seem to share the same taste)</p>
<ul>
<li>300</li>
<li>Pan&#8217;s Labyrinth</li>
<li>The Fountain</li>
<li>The Departed</li>
<li>The Last King Of Scotland</li>
<li>Das Parfüm</li>
<li>Clerks II (I should probably watch <em>Clerks</em> first however&#8230;)</li>
<li>Thank You For Smoking</li>
<li>Children Of Men</li>
</ul>
<p>But <em>Mission Impossible III</em>? Are you kidding?
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/01/my-to-watch-movie-list/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ARSC Really Simple Chat</title>
		<link>http://manuel.kiessling.net/blog/2007/02/01/arsc-really-simple-chat/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/01/arsc-really-simple-chat/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 09:26:48 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>arsc</category>

		<category>software</category>

		<category>open source</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/index.php/2007/02/01/arsc-really-simple-chat/</guid>
		<description><![CDATA[As my server crashed last week, I decided to not set up a homepage for my Open Source webchat project ARSC again.
It simply isn&#8217;t worth the hassle, because I didn&#8217;t do any work on ARSC for over 1 year now.
The SourceForge project page of ARSC is of course still active, and I don&#8217;t see any [...]]]></description>
			<content:encoded><![CDATA[<p>As my server crashed last week, I decided to not set up a homepage for my Open Source webchat project ARSC again.<br />
It simply isn&#8217;t worth the hassle, because I didn&#8217;t do any work on ARSC for over 1 year now.</p>
<p>The <a href="http://sourceforge.net/projects/arsc/">SourceForge project page of ARSC</a> is of course still active, and I don&#8217;t see any sense in deactivating it, because the <a href="http://sourceforge.net/project/showfiles.php?group_id=32699&#038;package_id=24856&#038;release_id=373708">latest stable release</a> still works very well, supporting PHP4 and PHP5, MySQL 4 and 5, <em>register_globals = Off</em> and PHP&#8217;s <em>safe_mode</em>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/01/arsc-really-simple-chat/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VHCS rocks</title>
		<link>http://manuel.kiessling.net/blog/2007/02/01/vhcs-rocks/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/01/vhcs-rocks/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 08:52:52 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>linux</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/?p=4</guid>
		<description><![CDATA[VHCS, the Virtual Hosting Control System, seems to be a full-featured and stable OSS alternative to Confixx, Plesk and Co. I don‘t use it myself (yet), but did set up an installation for a friend who needed a simple to use yet complete solution to administrate his eMail and Websites.
Installation on a freshly-installed Debian Sarge [...]]]></description>
			<content:encoded><![CDATA[<p><img align="left" id="image7" alt="logo_right.gif" title="logo_right.gif" src="http://manuel.kiessling.net/blog/wp-content/uploads/2007/02/logo_right.thumbnail.gif" />VHCS, the <a title="Homepage of the Virtual Hosting Control System project" href="http://www.vhcs.net/">Virtual Hosting Control System</a>, seems to be a full-featured and stable OSS alternative to Confixx, Plesk and Co. I don‘t use it myself (yet), but did set up an installation for a friend who needed a simple to use yet complete solution to administrate his eMail and Websites.</p>
<p>Installation on a freshly-installed Debian Sarge system went absolutely smooth - a new release with full support for Etch is on the way.</p>
<p>The feature list is quite impressive, you can completely manage everything commonly needed in a LAMP environment, even a webmail client is included. As far as I can see, no „dirty hacks“ are used, besides VHCS itself you only need common and official Debian packages.</p>
<p>Not that there aren‘t drawbacks: With the basic installation, everything runs unencrypted - no SCP, only FTP, and Postfix, Courier Imap, Apache and MySQL all running in non-SSL mode. I did not yet find the time to have a closer look at the configuration, looks like those can be enabled.</p>
<p>VHCS is actually designed to provide a complete hosting solution, including the management of resellers which in turn can completely manage their users, and those user can completely manage their Web/Mail/Database environment. But it already makes sense if you have only one user and this user is you (or, as in my case, a friend of yours who knows a bit about LAMP but not wouldn‘t be able to set up everything from scratch himself).
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/01/vhcs-rocks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Relaunch der Webseite</title>
		<link>http://manuel.kiessling.net/blog/2007/02/01/relaunch-der-webseite/</link>
		<comments>http://manuel.kiessling.net/blog/2007/02/01/relaunch-der-webseite/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 08:47:02 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>intern</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/?p=3</guid>
		<description><![CDATA[Ich habe meine Homepage mal wieder komplett über den Haufen geworfen, und diesmal gehe ich ganz neue Wege. Mir ist klar geworden, dass wenn ich den ganzen Tag lang an Webportalen bastle und programmiere, es auch mal ganz entspannend sein kann, die private Homepage mit einem Dau-Tool wie iWeb zu pflegen, und nicht alles bis [...]]]></description>
			<content:encoded><![CDATA[<p><img align="left" id="image8" alt="200x.jpg" src="http://manuel.kiessling.net/wp-content/uploads/2007/02/200x.jpg" />Ich habe meine Homepage mal wieder komplett über den Haufen geworfen, und diesmal gehe ich ganz neue Wege. Mir ist klar geworden, dass wenn ich den ganzen Tag lang an Webportalen bastle und programmiere, es auch mal ganz entspannend sein kann, die private Homepage mit einem Dau-Tool wie iWeb zu pflegen, und nicht alles bis ins letzte Detail selbst zu machen - das ist zwar immer nette Bastelei, bleibt aber zu oft mangels Zeit auf halber Strecke liegen.Also einfach Vorlage auswählen, ein bisschen das Design zurechtklicken, mit Inhalten füllen, und einfach per rsync auf einen simplen Webserver schieben (welcher immerhin noch „selbstgemacht“ ist) - mal sehen, ob sich das als brauchbar erweist.</p>
<p><strong>Update:</strong> Das Blog bleibt aber vorerst WordPress - iWeb bietet das zwar auch auf eine recht elegante Weise, aber der Nachteil ist dass ich das Blog dann wirklich nur mit iWeb pflegen kann, außerdem gibt&#8217;s keinerlei Kommentarfunktion, außer, man wirft Apple 99 Euro pro Jahr in den Rachen.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2007/02/01/relaunch-der-webseite/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Decorators in PHP5</title>
		<link>http://manuel.kiessling.net/blog/2006/07/09/decorators-in-php5/</link>
		<comments>http://manuel.kiessling.net/blog/2006/07/09/decorators-in-php5/#comments</comments>
		<pubDate>Sun, 09 Jul 2006 10:33:33 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>software</category>

		<category>open source</category>

		<category>php</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2006/07/09/decorators-in-php5/</guid>
		<description><![CDATA[Until now I thought that decorating an object variable or method isn’t possible with PHP5, because __set, __get and __call, if you use them directly, are only working if you set or get variables (or call methods) that have not yet been defined.
But Ivo Jansch describes a nifty workaround by creating a forward class that [...]]]></description>
			<content:encoded><![CDATA[<p>Until now I thought that decorating an object variable or method isn’t possible with PHP5, because __set, __get and __call, if you use them directly, are only working if you set or get variables (or call methods) that have not yet been defined.</p>
<p>But <a href="http://www.achievo.org/blog/authors/1-Ivo-Jansch">Ivo Jansch</a> describes a nifty workaround by creating a forward class that overrides the built-in __set, __get and __call methods. This forward class can then be used to extend your decorator classes, allowing you to decorate variables and methods of your classes even if they have already been defined. Read the complete post here: <a href="http://www.achievo.org/blog/archives/44-Building-proxies,-decorators-and-delegates-in-PHP5.html">Building proxies, decorators and delegates in PHP5</a>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2006/07/09/decorators-in-php5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Video chat between Mac and PC</title>
		<link>http://manuel.kiessling.net/blog/2006/06/03/video-chat-between-mac-and-pc/</link>
		<comments>http://manuel.kiessling.net/blog/2006/06/03/video-chat-between-mac-and-pc/#comments</comments>
		<pubDate>Sat, 03 Jun 2006 07:51:39 +0000</pubDate>
		<dc:creator>Manuel Kiessling</dc:creator>
		
		<category>technology</category>

		<category>software</category>

		<category>apple</category>

		<guid isPermaLink="false">http://manuel.kiessling.net/blog/2007/07/05/video-chat-between-mac-and-pc/</guid>
		<description><![CDATA[Once upon a time this was an article that ranted about how complicated and in most cases completely not possible it was to realize a decent video chat session between a Mac OS X and a Windows PC.
However, with the advent of Skype 2.0 for Mac OS X, this is no longer true. We are [...]]]></description>
			<content:encoded><![CDATA[<p>Once upon a time this was an article that ranted about how complicated and in most cases completely not possible it was to realize a decent video chat session between a Mac OS X and a Windows PC.</p>
<p>However, with the advent of <a href="http://www.skype.com/download/skype/macosx/">Skype 2.0 for Mac OS X</a>, this is no longer true. We are finally there.</p>
]]></content:encoded>
			<wfw:commentRss>http://manuel.kiessling.net/blog/2006/06/03/video-chat-between-mac-and-pc/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
