<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kau-Boys blog &#187; Webentwicklung</title>
	<atom:link href="http://kau-boys.de/category/webentwicklung/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Sun, 22 Jan 2012 17:33:25 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Gastartikel: Top Ten der Webdesign Fehler</title>
		<link>http://kau-boys.de/1370/webentwicklung/gastartikel-top-ten-der-webdesign-fehler?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gastartikel-top-ten-der-webdesign-fehler</link>
		<comments>http://kau-boys.de/1370/webentwicklung/gastartikel-top-ten-der-webdesign-fehler#comments</comments>
		<pubDate>Fri, 30 Sep 2011 20:17:34 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Gastartikel]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1370</guid>
		<description><![CDATA[Hallo meine lieben Leser. Heute gibt es eine kleine Premiere auf meinem Blog: Den ersten Gastartikel. Er wurde verfasst von Marianne, einer Mitarbeiterin von twago. Ich bin der Meinung, dass er auch für meine Leser ganz interessant ist. Und mal sehen, ob ich selbst keinen der Fehler bei meiner Website begangen habe. Aber hier nun [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo meine lieben Leser. Heute gibt es eine kleine Premiere auf meinem Blog: Den ersten Gastartikel. Er wurde verfasst von Marianne, einer Mitarbeiterin von <a href="http://www.twago.de" title="twago – Experten finden">twago</a>. Ich bin der Meinung, dass er auch für meine Leser ganz interessant ist. Und mal sehen, ob ich selbst keinen der Fehler bei meiner Website begangen habe. Aber hier nun der Artikel.</p>
<hr style="border: 0 none; background-color: lightgrey; height: 1px" />
<p>Bei den Milliarden Webseiten die man im World Wide Web finden kann, gibt es Seiten, die einen wahren optischen Genuss darstellen und auf denen man gern verweilt. Jedoch gibt es auch Millionen Seite, die man nicht gern besucht und schnell wieder vergisst. Es gibt unzählige Fehlerquellen bei der Erstellung einer Webseite. Hier werden im folgenden 10 vorgestellt.</p>
<p><span id="more-1370"></span></p>
<ol style="padding-left: 25px;" >
<li style="margin-top: 5px; font-weight: bold;">Worum geht es hier?<br />
<span style="font-weight: normal;">Innerhalb von ein paar Sekunden sollte dem Besucher bewusst sein, worum es auf der Seite geht. Schnell sollte für den Leser klar sein, warum er auf der Seite Zeit verbringen sollte.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Texte mich nicht zu!<br />
<span style="font-weight: normal;">Versuchen Sie unbedingt große Textblöcke zu vermeiden. Leser möchten sich zwar informieren, aber sie möchten auch unterhalten werden. Die Seite sollte scannbar sein, für alle die nur nach einzelnen Informationen suchen.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Was steht da?<br />
<span style="font-weight: normal;">Die Wahl der Schriftart, aber auch die Schriftgröße sollten wohl durchdacht sein und vor allem lesbar. Natürlich gibt es sehr viele Schriftarten, die ordentlich was her machen, jedoch hilft es nicht, wenn diese nicht komfortable für den Leser sind. Eine gute Lösung für das Problem der passenden Schriftgröße ist, wenn der Besucher die passende Größe selbst bestimmen kann.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Autsch! Das tut ja weh&#8230;<br />
<span style="font-weight: normal;">Meiden Sie weitestgehend besonders grelle und scharfe Farben. Die gewählten Farbkombinationen sollten auch nach 10 Minuten noch keine Kopfschmerzen verursachen. Das Farbkonzept sollte sich an der Farbwirkung und der Stimmung, die sie dem Leser vermitteln möchten, orientieren.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Wo ist denn nur?<br />
<span style="font-weight: normal;">Neben einem ansprechenden <a href="http://www.twago.de/expert/Webdesigner/Webdesigner" title="Webdesigner finden">Design</a>, muss eine gute und übersichtliche Navigationsstruktur den Leser auch zur gewünschten Seite führen und nicht verwirren. Spielen Sie nicht mit der Geduld des Besuchers.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Ach nein, nicht das auch noch!<br />
<span style="font-weight: normal;">Gehen Sie vorsichtig mit Flash-Elementen um. Nicht jeder Besucher mag Intros und die damit verbundenen Ladezeiten. Gekoppelt mit Musik, kann das zu einem Schreckmoment beim Besucher führen, der vielleicht nicht in der passenden Umgebung ist, um diese Mühe wertzuschätzen. Sollten Sie dem Leser doch etwas für seine Ohren bieten wollen, lassen Sie ihm dennoch die Wahl, durch das Klicken des „Play“-Buttons.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Das sieht ja komisch aus!<br />
<span style="font-weight: normal;">Stellen Sie frühzeitig sicher, dass Ihre Webseite auch mit allen gängigen Browsern richtig anzeigt wird. Nicht alle Browser können alle CSS Elemente oder <a href="http://www.twago.de/expert/Programmierer/Programmierer" title="Programmierer finden"> Programmiersprachen</a> in der neusten Version wie gewünscht und erhofft darstellen. Optimieren Sie die Webseite für die am meist genutzten Browser.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Hört das den gar nicht mehr auf?<br />
<span style="font-weight: normal;">Vermeiden Sie zu lange Seiten. Leser scrollen nicht gern auf endlosen Seiten um nach den gewünschten Inhalten zu suchen. Die Seiten sollten kurz gefasst und gut strukturiert sein.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Ich find das einfach nicht!<br />
<span style="font-weight: normal;">Machen Sie es dem Besucher leicht und ermöglichen Sie es ihm, mit Hilfe eines Suchfensters auf der ganzen Seite nach Inhalten suchen zu können.</span></li>
<li style="margin-top: 5px; font-weight: bold;">Nicht noch mehr Werbung!<br />
<span style="font-weight: normal;">Vorsicht ist geboten, bei der Anzahl der Werbeschaltungen auf der eigenen Seite. Ihre Leser werden den ganzen Tag mit Werbung konfrontiert, von daher sollten Sie die Nerven Ihrer Besucher nicht überstrapazieren. Zu viele Werbeflächen wirken abschreckend und verärgern den Besucher.</span></li>
</ol>
<p>Natürlich könnte man diese Liste noch um einige Fehlerquellen erweitern. Doch viel wichtiger ist, dass man mit wenigen Schritten viele Dinge auf einer Webseite wesentlich verbessern kann.</p>
<hr style="border: 0 none; background-color: lightgrey; height: 1px" />
<p>Ich hoffe der Artikel hat euch gefallen. Wenn ihr auch mal ein Thema für einen Artikel habt, den ihr gerne schreiben möchtet, aber selbst keinen Blog habt, auf dem ihr ihn veröffentlichen könnt, dann her damit. Wenn es thematisch passt werde ich ihn gerne für euch veröffentlichen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1370/webentwicklung/gastartikel-top-ten-der-webdesign-fehler/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome Frame ab sofort auch ohne Adminrechte nutzbar</title>
		<link>http://kau-boys.de/1312/webentwicklung/google-chrome-frame-ab-sofort-auch-ohne-adminrechte-nutzbar?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-chrome-frame-ab-sofort-auch-ohne-adminrechte-nutzbar</link>
		<comments>http://kau-boys.de/1312/webentwicklung/google-chrome-frame-ab-sofort-auch-ohne-adminrechte-nutzbar#comments</comments>
		<pubDate>Mon, 20 Jun 2011 17:28:53 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1312</guid>
		<description><![CDATA[Vor über einem Jahr hatte ich euch in dem Artikel Blog oder Website fit machen für den IE6 ja berichtet, wie man mit Hilfe des Plugins Google Chrome Frame dem Internet Explorer 6 die Welt von HTML5 eröffnen kann. Das Problem ist aber meistens, das genau die Nutzer, die noch den IE6 verwenden, in einem [...]]]></description>
			<content:encoded><![CDATA[<p>Vor über einem Jahr hatte ich euch in dem Artikel <a href="http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6">Blog oder Website fit machen für den IE6</a> ja berichtet, wie man mit Hilfe des Plugins <a href="http://code.google.com/intl/de/chrome/chromeframe/">Google Chrome Frame</a> dem Internet Explorer 6 die Welt von HTML5 eröffnen kann.</p>
<p>Das Problem ist aber meistens, das genau die Nutzer, die noch den IE6 verwenden, in einem Unternehmen sitzen. Diese können oft nicht selbst auf einen neuen Internet Explorer wechseln und da sie auch keine Berechtigung haben, Software zu installieren, können sie auch das Plugin nicht verwenden. Wie heute unter anderem bei <a href="http://www.golem.de/1106/84336.html">Golem</a> nachzulesen war, hat Google dieses Problem jetzt lösen können.</p>
<p>Mit der <a href="http://www.google.com/chromeframe/eula.html?user=true">aktuellen Entwicklerversion</a> ist kann jeder Nutzer, der nur über eingeschränkt Rechte verfügt Google Chrome Frame verwenden. Somit können Anwendungen, die noch den IE6 voraussetzen weiter genutzt werden und der Nutzer profitiert auf modernen Seiten gleichzeitig von den neuen Funktionen von HTML5, sofern die notwendigen Angaben im HTML-Quellcode gemacht wurden.</p>
<p>Es bliebt zu hoffen, dass möglichst viele Nutzer von dieser Möglichkeit erfahren und wir somit dem überfälligen Ende des IE6 vielleicht etwas näher kommen. Ich überlege zumindest, allen meinen IE6 Nutzern demnächst einen dezenten Hinweis zu geben, was ihnen mit dem Internet Explorer 6 entgeht, und was sie stattdessen sehen könnten.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1312/webentwicklung/google-chrome-frame-ab-sofort-auch-ohne-adminrechte-nutzbar/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webdesign mit unzähligen Usability-Sünden</title>
		<link>http://kau-boys.de/1261/webentwicklung/webdesign-mit-unzaehligen-usability-suenden?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=webdesign-mit-unzaehligen-usability-suenden</link>
		<comments>http://kau-boys.de/1261/webentwicklung/webdesign-mit-unzaehligen-usability-suenden#comments</comments>
		<pubDate>Sat, 02 Apr 2011 21:57:12 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Usabilty]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1261</guid>
		<description><![CDATA[Ich habe ja schon viele Website gesehen, denen ein zeitgemäßes Layout fehlt. Auch waren einige dabei, die noch immer nicht verstanden haben, wieso man keine Framesets mehr einsetzen sollte. Aber was mir heute zufällig vor Augen gesetzt wurde, das hat selbst mich vom Hocker gehauen. Ich war gerade mit dem Google Chrome Browser im Web [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe ja schon viele Website gesehen, denen ein zeitgemäßes Layout fehlt. Auch waren einige dabei, die noch immer nicht verstanden haben, wieso man keine Framesets mehr einsetzen sollte. Aber was mir heute zufällig vor Augen gesetzt wurde, das hat selbst mich vom Hocker gehauen.</p>
<p>Ich war gerade mit dem Google Chrome Browser im Web unterwegs, als mir auf einer Seite angezeigt wurde, dass ein notwendiges Plugin fehlt. Normalerweise wird mir dann gesagt, dass das Windows Media Player Plugin fehlt, weil mal wieder eine Seite eine proprietäres Audio- oder Videoformat nutzt. Aber nein, heute war es mal das Java-Plugin. Entweder hat mein Chrome dieses Plugin wirklich nicht installiert oder aber es hängt damit zusammen, dass heute das immerhin 24. Update für Java 6.0 installiert wurde. So langsam nervt das auch. Zumal bei dem Update dann zu allem Überfluss auch noch mein Malware-Scanner Alarm geschlagen hat. Aber zurück zur Website und der Usability-Sünde schlechthin.</p>
<p><span id="more-1261"></span></p>
<h2>Die etwas andere Navigation</h2>
<p>Da ich nicht nachforschen wollte, wieso mein Chrome keine Java-Plugin hat, habe ich kurzerhand die URL kopiert und die Seite im Firefox geöffnet. Dann traf mich der Schlag. Das Java-Applet, dass dort geladen wurde war die links Seitennavigation. Da es auch keine alternative Navigation gibt ist man also ziemlich verloren.</p>
<p>Mittlerweile habe ich festgestellt, dass es auf der Startseite einen kleinen Hinweis &#8220;Javascript deaktiviert? >> weiter&#8221; gibt, mit dem man dann auf eine Seite mit alternativer HTML Navigation kommt. Wohl gemerkt mit dem Hinweis JavaSCRIPT deaktiviert und nicht Java. Auch auf der Startseite findet man zwei Punkte am Ende der Seite. Eine lautet: &#8220;Bei Problemen mit unseren Seiten wenden Sie sich bitte an den Webmaster&#8221; und die andere &#8220;Sollten Sie Javascript deaktiviert haben, so klicken sie hier&#8221;. Nö, JavaScript habe ich eigentlich an, also wieso geht dann immer noch nix, wird sich dabei wohl der ein oder andere Nutzer denken und hoffentlich auch schon mal dem Webmaster angeschrieben haben.</p>
<p>Die alternative HTML Navigation ist auch nur auf den ersten Blick eine echte Alternative. Denn das Usability-Feature des Java-Applets liegt in einer Accordion Navigation. In der HTML Variante könnte man das ja sehr einfach nachbilden, da ja Frames benutzt werden. Aber nein, es gibt in der HTML Variante die weitern Unterpunkt einfach nicht. Nicht einmal von der Seite des übergeordneten Navigationspunktes gelangt man zu den Unterseite. </p>
<h2>Die vermeintliche Rettung</h2>
<p>Dabei gibt es auf der Seite sogar eine Sitemap, was sogar die Usability einer jeden Seite erhöhen kann. Von hier aus erreicht man selbst ohne Java-Plugin alle Unterseiten der Navigation. Das ist doch toll, werdet ihr jetzt sagen. Damit hat der Webentwickler die Usabilty-Sünde zumindest etwas wieder gut gemacht. Tja, könnte man sagen, wenn da nicht ein kleiner Haken an der Sache wäre. Man erreicht diese Sitemap nämlich nur über drei Wege:</p>
<ol>
<li>Man vermutet, dass es eine Sitemap gibt und tippt den Namen der selbigen (start.htm) in die Adresszeile ein. Wahrscheinlichkeit auf Lösung des Problems fast aussichtlos.</li>
<li>Man Benutzt einen Browser, der keine Framesets unterstützt und sieht daher den Hinweis im &lt;noframes&gt; Tag auf der Seite. Wahrscheinlichkeit auf Lösung des Problems noch aussichtloser.</li>
<li>Man verwendet einen Browser, der nur so lange die Navigation per Java-Applet anzeigt, bis man in der Navigation auf den Link zur Sitemap geklickt hat, der nämlich in der HTML-Version nicht vorhanden ist. Ihr könnt euch wohl schon denken, wie aussichtlos das sein wird <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ol>
<h2>Zusammenfassung und Fazit</h2>
<p>Fassen wir also nochmal zusammen. Die Seite ist ohne Java-Plugin nicht navigierbar. Die Alternative HTML-Version ist sehr schön im Kleingedruckten versteckt und die Sitemap, die eine Navigation zumindest annähernd möglich machen würde ist nur in der Java-Navigation zu finden. Auch wenn das Design nicht den Eindruck vermittelt, als wäre Seite aus dem letzten Jahrtausend, so muss man sich doch zurecht fragen dürfen, ob ein solche Seite, die bestimmt gut besucht ist, nicht mal eine Komplette Umgestaltung benötigt. </p>
<p>Man kann ja viel darüber Diskutieren, ob es Sinn macht in einer Website Elemente zu verwenden, die das Vorhandensein eines gewissen Plugins voraussetzen. Aber die Hauptnavigation (oder sogar die einzige der Seite) ausschließlich mit JavaScript oder wie in diesem Fall noch schlimmer mit Java zu realisieren ist wohl eine der größten Usability-Sünden, die ein Webentwickler nur begehen kann. Hoffen wir, dass hier kein vermeintlicher Experte am Werk war, der das auch noch als riesen Feature verkauft hat. </p>
<p>P.S. Die tausenden HTML-Fehlern im Quelltext der Seite hat der Autor dieses Artikels aus Höflichkeit nicht auch noch erwähnt <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1261/webentwicklung/webdesign-mit-unzaehligen-usability-suenden/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Stackoverflow: Helfen und helfen lassen mit Suchtpotential</title>
		<link>http://kau-boys.de/1025/webentwicklung/stackoverflow-helfen-und-helfen-lassen-mit-suchtpotential?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stackoverflow-helfen-und-helfen-lassen-mit-suchtpotential</link>
		<comments>http://kau-boys.de/1025/webentwicklung/stackoverflow-helfen-und-helfen-lassen-mit-suchtpotential#comments</comments>
		<pubDate>Wed, 08 Sep 2010 14:10:56 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1025</guid>
		<description><![CDATA[Mein letzer Artikel ist schon etwas länger her. Hiermit möchte ich euch gerne verraten, wieso ich meinen Blog in den letzten Tagen nicht so oft aktualisiert habe. Beruflich und auch privat stieß ich oft auf Probleme oder Fragen, die mir die Webcommunity beantworten konnte. Sehr oft landete ich dabei auf stackoverflow.com und ich habe dort [...]]]></description>
			<content:encoded><![CDATA[<p>Mein letzer Artikel ist schon etwas länger her. Hiermit möchte ich euch gerne verraten, wieso ich meinen Blog in den letzten Tagen nicht so oft aktualisiert habe. Beruflich und auch privat stieß ich oft auf Probleme oder Fragen, die mir die Webcommunity beantworten konnte. Sehr oft landete ich dabei auf <a href="http://stackoverflow.com">stackoverflow.com</a> und ich habe dort auch oft genau die richtige Antwort gefunden. Stackoverflow ist aber nicht nur ein weiteres Expertenforum sonder es geht einen Schritt weiter und wird damit zur ultimativen Frage- und Antwort-Plattform für Entwickler aller Art. Woran das liegt möchte ich hier kurz beschreiben:</p>
<p><span id="more-1025"></span></p>
<h2>Jeder kann Fragen stellen, ohne sich registrieren zu müssen</h2>
<p>Ein großer Nachteil an vielen Foren ist die obligatorische Registrierung. Es ist selbstverständlich notwendig, dass man den einzelnen erkennen kann, aber möchte ich mir noch einen Benutzernamen mit noch einem neuen Passwort merken? Und wieso will eigentlich jeder meine E-Mail-Adresse haben? Kann der Admin am Ende vielleicht mein Passwort im Klartext aus der Datenbank auslesen? Das alles sind wohl die Hemmschwellen vieler Foren, die viele Nutzer nicht überschreiten wollen.</p>
<p>Bei Stackoverflow kann jeder sofort eine Frage stellen, ohne dazu irgendwelche Daten von sich preisgeben zu müssen. Aber auch die &#8220;Registrierung&#8221; ist sehr einfach. Sie funktioniert sehr schnell und unkompliziert per <a href="http://de.wikipedia.org/wiki/Openid">OpenID</a>. Sehr schön ist hier auch die Umsetzung der OpenID Anmeldung. Ich habe sie vorher eigentlich nie genutzt, weil ich mir einfach diese kryptischen Links nie merken konnte. Anders bei Stackoverflow. Hier klickt man einfach auf das entsprechende Logo des Anbieters und wird sofort weiterleitet (oder man verwendet seine eigene URL, wenn man dort seine Daten wie in meinem Artikel &#8220;<a href="http://kau-boys.de/864/allgemein/die-eigene-domain-als-openid-benutzen">Die eigene Domain als OpenID benutzen</a>&#8221; beschrieben hinterlegt hat). Dort gibt man dann seine Zustimmung zur Übermittlung von Name, E-Mail-Adresse und OpenID-URL und das war es schon. Immer wenn man sich also z.B.: bei Google anmeldet, kann man auch sofort bei Stackoverflow loslegen.</p>
<h2>Forentod ausgeschlossen</h2>
<p>Nicht ist ärgerlicher für einen Forenbetreiber als mangelnde Teilnahme. Viele gut gemeinte Foren sind entweder nie richtig zum Laufen gekommen oder irgendwann einfach gestorben. Oder aber der Betreiber hat irgendwann keine Lust mehr und stellt das Forum ein. Letzteres könnte zwar bei Stackoverflow auch passieren, aber da die gesamte Datenbank mehr oder weniger regelmäßig als Dump unter der Creative Commons Lizenz veröffentlich wird, könnte man die Seite theoretisch klonen. Die mangelnde Teilnahme ist ebenso ausgeschlossen, da sich die Betreiber ein einfacher aber geniales Konzept überlegt haben. Wer eine Antwort auf eine Frage gegeben hat, die andere als gut Bewerten, der bekommt dafür Punkt. Schlecht Antworten können aber auch mit Minuspunkten bewertet werden. Aber nicht nur Experten die Fragen beantworten bekommen Punkt, auch für gute Fragen kann man bewertet werden (und auch für schlechte).</p>
<h2>Die Lösung auf einen Blick</h2>
<p>Es gibt viele Foren, die extrem gute Inhalte haben und ein sehr aktives Publikum, aber eine Sache haben sie alle gemein: Das finden der eigentlichen Lösung ist sehr schwierig. Denn nicht selten hat ein heiß diskutiertes Thema tausende Einträge und etliche Unterseiten und auf irgendeiner davon steht die Lösung auf meine Frage. Leider kann mir auch die Suchfunktion vieler Foren (die oft unübersichtlich und durch Captchas geschützt sind) nicht weiterhelfen.</p>
<p>Bei Stackoverflow werden die Antworten, die am meisten &#8220;up votes&#8221; bekommen haben auch ganz oben angesiedelt. Dabei kann auch eine Antwort von Fragensteller als Lösung markiert werden, die dann mit einem grünen Haken markiert direkt unter der Frage erscheint. Oft ist also sofort die Lösung zu finden. Antworten werden auch von Kommentaren getrennt behandelt, weshalb Diskussionen zur Frage oder einer Antwort nicht stören.</p>
<p>Stackoverflow ist außerdem wie ein Wiki aufgebaut. Das heißt, dass Benutzer auch die Fragen oder Antworten anderer bearbeiten können um z.B. Fehler in der Formatierung zu beheben. Auch direkte &#8220;Community Wiki&#8221; Fragen sind möglich. Diese werden oft für allgemeine Diskussionen genutzt.</p>
<h2>Langzeitmotivation und Suchtgefahr durch Bewertungssystem</h2>
<p>Der Grund, warum keine Frage lange unbeantwortet bleibt ist das bereits angedeutete Bewertungssystem. Nach Erreichen von bestimmten Punktzahlen können neue Funktionen von Stackoverflow genutzt werden. Außerdem kann man für bestimmte Aktionen oder zu bestimmten Ereignissen &#8220;Badges&#8221; erhalten. Das Sammeln von Punkten und Abzeichen trägt meiner Meinung nach am meisten dazu bei, dass es immer sehr schnell Antworten gibt und diese auch qualitativ hochwertig sind. Denn schlechte Fragen oder Antworten werden mit negativen Bewertungen (und negativen Punkten) abgestraft. Sehr schlechte, allgemeine oder auch subjektive Fragen können geschlossen werden, wobei hier nicht ein einzelner Nutzer entscheiden kann, sondern eine &#8220;kritische Masse&#8221; erreicht sein muss.</p>
<h2>Der Haken</h2>
<p>Es muss natürlich auch etwas geben, das negativ an der ganzen Sache ist. Aber das einzige, das man anführen könnte ist die Tatsache, dass es sich um ein ausschließlich englischsprachiges Angebot handelt. Daher müssen alle Fragen, Antworten und Kommentare in englischer Sprache verfasst werden. Aber da kein Programmierer ohne Englischkenntnisse lange überlebensfähig ist, sollte das keine größere Hürde darstellen. Es ist eher eine Gelegenheit sein Englisch ein bisschen zu üben. Also doch kein echter Nachteil <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Stackoverflow abseits von Programmierthemen</h2>
<p>Neben Stackoverflow gibt es noch viele weiter Angebote, die sich andern Themen oder aber speziellen Programmiersprachen widmen. Man sollte also immer einen Blick in die FAQ der Seite werfen und den Punkt &#8220;What kind of questions can I ask here?&#8221; bzw. &#8220;What kind of questions should I not ask here?&#8221; werfen. Dort stehen dann auch einige andere Seiten, die andere Themen behandeln. Aber mittlerweile kann auch jeder selbst Vorschläge für einen neuen Stackoverflow-Klon machen. Diese könnt ihr unter <a href="http://stackexchange.com">stackexchange.com</a> einsehen und dort auch neue vorschlagen. Es gibt dort z.B. eines, dass sich um das Thema WordPress dreht: <a href="http://wordpress.stackexchange.com">wordpress.stackexchange.com</a>. Und auch hier habt ihr alle Vorteile der schnellen Anmeldung und der tollen Funktionen. Wenn ich bei der Anmeldung das gleiche Login wie für Stackoverflow benutzt, werden die Accounts automatisch verknüpft und ihr bekommt dann sogar 100 Extrapunkte gutgeschrieben. In eurer Profilseite ist dann auch für andere Nutzer nachvollziehbar, wo sie euch noch antreffen können. Mein Profil bei Stackoverflow sieht wie folgt aus:</p>
<div style="text-align: center"><iframe src="http://stackoverflow.com/users/flair/299375.html" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" width="210" height="60"></iframe></div>
<h2>Fazit</h2>
<p>Für mich ist Stackoverflow nicht nur eine gute Anlaufstelle für meine Fragen, sondern ich bin auch sehr aktiv in der Beantwortung von Fragen. Dabei lernt man auch sehr oft von den Antworten andere Nutzer zur gleichen Frage noch das ein oder andere dazu. Natürlich kann man jetzt nicht komplett auf Recherchen in anderen Quellen verzichten, aber man sollte einfach mal bei der nächsten Fragestellung dort nachschlagen oder direkt eine Frage stellen. Ihr werdet überrascht sein, wie schnell ihr eine passende Antwort geliefert bekommt.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1025/webentwicklung/stackoverflow-helfen-und-helfen-lassen-mit-suchtpotential/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RewriteRule mit Leerzeichen in der Zieladresse</title>
		<link>http://kau-boys.de/887/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rewriterule-mit-leerzeichen-in-der-zieladresse</link>
		<comments>http://kau-boys.de/887/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse#comments</comments>
		<pubDate>Mon, 19 Apr 2010 10:22:03 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=887</guid>
		<description><![CDATA[Auf einer Seite die ich betreue wurde ich vor kurzem vor die Aufgabe gestellt eine RewriteRule in der .htaccess zu definieren, die auf eine PDF zeigt, die ein Leerzeichen im Dateinamen enthält. Das war gar nicht so einfach rauszufinden und selbst im sehr guten Forum von modrewrite.de konnte ich keine geeignete Lösung finden. In URLs [...]]]></description>
			<content:encoded><![CDATA[<p>Auf einer Seite die ich betreue wurde ich vor kurzem vor die Aufgabe gestellt eine RewriteRule in der .htaccess zu definieren, die auf eine PDF zeigt, die ein Leerzeichen im Dateinamen enthält. Das war gar nicht so einfach rauszufinden und selbst im sehr guten <a href="http://www.modrewrite.de/foren/index.php">Forum von modrewrite.de</a> konnte ich keine geeignete Lösung finden.</p>
<p>In URLs werden Leerzeichen einfach mit der Zeichenkette <code>%20</code> ersetzt, aber das alleine führt noch nicht zum Erfolg. Da das Prozentzeichen ein spezielles Zeichen in Rewrite Rules darstellt muss es mit einem Backslash escaped werden. Eine funktionierende Rewrite Rule mit einem Leerzeichen könnte also wie folgt aussehen:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
RewriteEngine on
RewriteRule ^kurzer-dateiname.pdf$ dateiname\%20mit\%20Leerzeichen\%20.pdf
</pre>
<p>Wer also den Dateinamen nicht ändern kann um Leerzeichen zu ersetzen (z.B. durch Unterstriche) kann mit dieser Regel trotzdem einen schöneren/kürzeren Dateinamen über die .htaccess anbieten.</p>
<p>Das war es auch schon. Heute gibt es mal nur einen kurzen Artikel, aber viel mehr gibt es auch nicht dazu zu sagen. Außer vielleicht, dass ihr niemals versuchen solltet ein Leerzeichen in der Zieladresse zu verwenden, da sonst die gesamte .htaccess ungültig wird und der Server einen 500 Fehler für jede Seite zurückliefert.</p>
<p>Ich hoffe der Tipp konnte euch weiterhelfe. Kommentare sind wie immer gern gesehen!</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/887/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:29:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=830</guid>
		<description><![CDATA[Nachdem wir uns in Teil 1 des Tutorials mit der Draggable Klasse beschäftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode für dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable">Teil 1 des Tutorials</a> mit der <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Klasse</a> beschäftigt haben, wenden wir uns heute seinem Bruder der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">Droppables Klasse</a> zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode für dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erklären. Die Zeilen 1-34 enthalten das grundlegende Gerüst der HTML-Seite sowie die Stylesheets, auf die ich nicht näher eingehen möchte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Part 2&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.item {
				padding: 40px;
				border: 1px solid #000;
				cursor: move;
				display: inline-block;
				margin-right: 20px;
			}
			.blue {
				background-color: #39c;
			}
			.green {
				background-color: #292;
			}
			div#shopping_cart {
				width: 180px;
				height: 180px;
				background: #fff;
				border: 5px solid #ccc;
			}
			div#shopping_cart.hover {
				border: 5px dashed #aaa;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;blue_box&quot; title=&quot;Blaue Box&quot; class=&quot;item blue&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;green_box&quot; title=&quot;Grüne Box&quot; class=&quot;item green&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;shopping_cart&quot;&gt;
			&lt;ul id=&quot;items_in_cart&quot;&gt;&lt;/ul&gt;
		&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('blue_box', {
				revert: true
			});
			new Draggable('green_box', {
				revert: true
			});
			Droppables.add('shopping_cart', {
				onDrop: addItem,
				hoverclass: 'hover'
			});
			function addItem(dragged, dropped, event){
				var itemCount = $('items_in_cart').select('li[id=&quot;item' +
									dragged.id + '&quot;] span').first();
				if(itemCount == undefined){
					$('items_in_cart').insert({
						bottom: '&lt;li id=&quot;item' + dragged.id +
								'&quot;&gt;&lt;span&gt;1&lt;/span&gt;x ' + dragged.title + '&lt;/li&gt;'
					});
				} else {
					itemCount.update(parseInt(itemCount.innerHTML) + 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In den Zeilen 35-39 sind zwei einfache &#8220;Artikel&#8221; aufgeführt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enthält. In diese fügen wir dann per Drag-and-Drop die Waren ein. Sehen wir uns nun aber den interessanten Teil des Quellcodes an, das JavaScript. Die Zeilen 41-46 sollten aus dem ersten Teil des Tutorials bekannt sein. Wir erzeugen hier zwei Draggables wobei wir die Option <code>reset</code> auf <code>true</code> setzen, damit die Artikel beim &#8220;loslassen&#8221; wieder auf ihre ursrpüngliche Position zurückkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schlüsselwort <code>new</code> erzeugen. Es existiert vielmehr schon eine Instanz, der wir mit der <code>add()</code> Funktion eine neue &#8220;Drop-Zone&#8221; hinzufügen. Es ist also möglich mehrere Bereiche einer Website für die Reaktion auf Draggables zu verwenden. Es wäre z.B. möglich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugefügten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion können auch mehrere Optionen übergeben werden, welche das sind könnt ihr in der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">API zu Droppables</a> nachlesen. Ich verwende hier die <code>hoverClass</code> Option, die der &#8220;Drop-Zone&#8221; eine Klasse zu weist, wenn der Benutzer mit einem Draggable darüber steht. Zusätzliche gebe ich eine Callback-Funktion für das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen könnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst übergeben. In der Funktion selbst fügen wir den Artikel an die Liste an und setzen die Anzahl auf 1, sofern er noch nicht enthalten ist. Wenn er enthalten ist erhöhen wir dir Anzahl um 1.</p>
<h2>Das Beispiel</h2>
<p>Das oben beschriebene Beispiel sieht dann wie folgt aus (es darf aber gerne unter Verwendung von Bildern anstelle von DIVs und mehr CSS noch ansprechender gestaltet werden):</p>
<div id="blue_box" title="Blaue Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #39c;"></div>
<div id="green_box" title="Grüne Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #292;"></div>
<div id="shopping_cart" style="width: 180px; height: 180px; background: #fff; border: 5px solid #ccc;">
<ul id="items_in_cart">
<li style="display: none;">Warenkorb</li>
</ul>
</div>
<p><script type="text/javascript" src="http://kau-boys.de/wp-content/uploads/2010/03/part2.js"></script></p>
<p>Wie ihr also sehen könnt ist es sehr einfach ein Element für die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie überlassen. Die Möglichkeiten sind schier unbegrenzt. Ich möchte euch also dazu animieren einfach einmal mit der Funktion zu experimentieren.</p>
<p>Das war es dann auch schon wieder mit diesem Teil des Tutorials. Im nächsten Teil sehen wir uns einen sehr speziellen Fall von Drag-and-Drop an und zwar mit dem Sortieren von Elementen. Wie einfach so etwas möglich ist und wie leicht sich die Sortierreihenfolge auslesen lässt, das erwartet euch in Teil 3 des Tutorials. Für welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? Über einen Kommentar dazu würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Assoziatives Array als HTML Tabelle ausgeben</title>
		<link>http://kau-boys.de/803/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=assoziatives-array-als-html-tabelle-ausgeben</link>
		<comments>http://kau-boys.de/803/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21:39:06 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippet]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=803</guid>
		<description><![CDATA[Sehr häufig wird gefordert ein assoziatives Array als HTML Tabelle auszugeben. Ich nutze hier sehr oft die implode() Funktion, um dabei mit möglichst wenig Quellcode zu dem Gewünschten Ergebnis zu kommen. Da ich meine Lösung wirklich sehr schön und genial einfach finde, wollte ich euch kurz die Funktion präsentieren. Als auszugebendes Array nehmen wir das [...]]]></description>
			<content:encoded><![CDATA[<p>Sehr häufig wird gefordert ein assoziatives Array als HTML Tabelle auszugeben. Ich nutze hier sehr oft die <a href="http://de.php.net/manual/en/function.implode.php">implode() Funktion</a>, um dabei mit möglichst wenig Quellcode zu dem Gewünschten Ergebnis zu kommen. Da ich meine Lösung wirklich sehr schön und genial einfach finde, wollte ich euch kurz die Funktion präsentieren. Als auszugebendes Array nehmen wir das MySQL-Debugging Array aus meinem vorherigen Artikel <a href="http://kau-boys.de/794/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse">MySQL unter PHP debuggen mit einer eigenen MySQL Klasse</a>.</p>
<pre class="brush: php; title: ; notranslate">
function array_to_table($a){
	$t='&amp;lt;table&amp;gt;';
	$t.='&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;'.implode('&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;', array_keys($a[0])).'&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;';
	foreach($a as $row){
		$t.= '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'.implode('&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;', $row).'&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;';
	}
	return $t.='&amp;lt;/table&amp;gt;';
}

// Ausgabe der Tabelle
echo array_to_table($mysqli-&amp;gt;queries);
</pre>
<p><span id="more-803"></span></p>
<p>In Zeile 3 werden die Schlüssel des assoziativen Array für die Überschriften der Spalten genutzt. Wir öffnen hier eine Zeile und eine Spalte und fügen dann mit Hilfe der implode() Funktion alle Schlüssel in diese Zeile ein. Die &#8220;Glue&#8221; für die implode() Funktion ist hierbei ein schließendes Tag für die Spalte und ein weiteres öffnendes. Am Ende der Zeile schließen wir noch die letzte Spalte und die Zeile. Die gleiche elegante Anwendung der implode() Funktion verwenden wir auch bei den einzelnen Spalten mit den Werten. Hier in einer foreach Schleife.</p>
<p>Mit dieser Funktion kann jedes assoziative Array sehr elegant ausgegeben werden. Dabei lässt sich die Funktion trefflich erweitern. So könnte z.B. in einem Parameter ein Array mit Schlüsselnamen übergeben werden, wenn die Schlüssel des Assoziativen Arrays nicht passend für die Tabelle sind. Oder es könnte jeder Zeile eine alternierende &#8220;gerade&#8221; und &#8220;ungerade&#8221; Klasse mitgegeben werden. Oder aber man vergibt Klassen um eine der vielen JavaScript Sortierungen auf die Tabelle anwenden zu können.</p>
<p>Wir ihr also sehen könnt ihr eure Fantasie bei der Erweiterbarkeit freien Lauf lassen. Ich vergebe meistens die Klassen für Sortierung einer Tabelle mit der <a href="http://www.millstream.com.au/view/code/tablekit/">Tablekit Sortierung</a>.</p>
<p>Ich hoffe, dass euch die Funktion bei eurer täglichen Arbeit helfen kann. Ich liebe die implode() Funktion, da man mit ihr sehr elegant PHP Arrays in Strings umwandeln kann. Ich verwende sie auch häufig beim Erstellen von SQL Statements in Verbindung mit dem <a href="http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html#id2785292">IN() Operator</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/803/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL unter PHP debuggen mit einer eigenen MySQL Klasse</title>
		<link>http://kau-boys.de/794/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse</link>
		<comments>http://kau-boys.de/794/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse#comments</comments>
		<pubDate>Thu, 04 Mar 2010 22:41:07 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=794</guid>
		<description><![CDATA[Bei einem meiner Projekte kam es zu ungewöhnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgeführt werden müssen und dabei auch noch die Werte per COUNT() gezählt werden wunderten mich die Zeiten nicht wirklich. Nun wollte ich natürlich wissen, welche Abfrage dabei besonders viel Zeit in Anspruch nimmt um dann gezielt [...]]]></description>
			<content:encoded><![CDATA[<p>Bei einem meiner Projekte kam es zu ungewöhnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgeführt werden müssen und dabei auch noch die Werte per <a href="http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count">COUNT()</a> gezählt werden wunderten mich die Zeiten nicht wirklich.</p>
<p>Nun wollte ich natürlich wissen, welche Abfrage dabei besonders viel Zeit in Anspruch nimmt um dann gezielt optimieren zu können. Ich setze in dem Projekt auf die <a href="http://de.php.net/manual/en/book.mysqli.php">MySQLi Klasse</a> von PHP. Da ich hierbei die Klasse objektorientiert nutze, war es sehr einfach möglich diese zu erweiterten. Eine Möglichkeit wäre es natürlich gewesen eine eigene Funktion zu schreiben, aber in diesem Fall hätte ich auch alle Skript anpassen müssen, in denen ich eine Query ausführe. Daher habe ich mich dazu entschlossen einfach die <a href="http://de.php.net/manual/en/mysqli.query.php">query() Funktion</a> von MySQLi zu überschreiben. Hier ein stark vereinfachtes Beispiel, wie so etwas aussehen könnte:</p>
<p><span id="more-794"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

class mysqliDebugger extends mysqli {

	public $queries = array();
	public $queries_time = 0;

	function __construct($host, $user, $pass, $name, $port, $sock){
		parent::__construct($host, $user, $pass, $name, $port, $sock);
	}

	function __destruct(){
		parent::__destruct();
	}

	function query($query){
		$start = microtime(true);

		if(!$result = parent::query($query)){
				$error_message = $this-&gt;error;
		}

		$end = microtime(true);

		$this-&gt;queries[] = array(
			'number' =&gt; count($this-&gt;queries),
			'query' =&gt; $query,
			'error' =&gt; $error_message,
			'time' =&gt; $end - $start
		);

		$this-&gt;queries_time += $end - $start;

		return $result;
	}
}

$mysqli = new mysqliDebugger('host', 'user', 'pass', 'name');
if($result = $mysqli-&gt;query('SELECT * FROM tablename')){
	while($row = $result-&gt;fetch_assoc()){
		// Verarbeiten der Ergebniszeilen
	}
}

if($result = $mysqli-&gt;query('SELECT * FROM tablename2')){
	while($row = $result-&gt;fetch_assoc()){
		// Verarbeiten der Ergebniszeilen
	}
}

?&gt;
</pre>
<p>Sehen wir uns die wichtigsten Zeilen des Quellcodes an. Die Zeilen 8-10 zeigen den Konstruktor unserer neuen Klasse, die den Konstruktor der geerbten Klasse MySQLi aufruft. In den Zeilen 16-36 überschreiben wir die query() Funktion der MySQLi Klasse mit unserer Debugging-Klasse. Dort wird zuerst einmal zur Protokollierung der Ausführungszeit der Startzeitpunkt mit Hilfe der <a href="http://de.php.net/manual/en/function.microtime.php">microtime() Funktion</a> ermittelt. Anschließend wird der Query mit dem Aufruf <code>parent::query($query)</code> an die query() Funktion der MySQLi Klasse übergeben. Einen eventuell auftretenden Fehler speichern wir dabei in einer Variablen ab.</p>
<p>In Zeile 23 speichern wir die Endzeit des Query. Anschließend speichern wir alle Werte, die wir zur späteren Auswertung benötigen in einem Array gespeichert. Zusätzlich summieren wir noch alle Zeiten auf, um später die Gesamtdauer aller Statements bestimmen zu können. Die ab Zeile 38 wird eine einfache Instanziierung und Nutzung der Klasse aufgezeigt, wie man sie auch von MySQLi kennt. Wer also in seinen Skripten schon MySQLi verwendet kann einfach beim Instanziieren der Klasse die neue Debugging-Klasse verwenden und muss keine weiteren Zeilen im Quellcode ändern. Ich empfehle eine kleine Bedingung zu verwenden, die feststellt, ob der Debugging-Modus aktiv ist und nur dann die Debugging-Klasse zu verwenden, wenn sie auch benötigt wird. Das spart im produktiven Einsatz etwas Rechenzeit. Eine mögliche Bedingung könnte wie folgt aussehen:</p>
<pre class="brush: php; gutter: false; title: ; notranslate">
if($debug){
	$mysqli = new mysqliDebugger('host', 'user', 'pass', 'name');
} else {
	$mysqli = new mysqli('host', 'user', 'pass', 'name');
}
</pre>
<p>Anstelle der <code>$debug</code> Variablen könntet ihr auch einen GET Parameter oder einen Session Parameter verwenden. Ich rate aber dringend davon ab einen einfach zu erratenden GET Parameter zu verwenden, da in solchen Fällen eure SQL-Statements für Unbefugte sichtbar werden könnten, was unter Umständen die Sicherheit eueres Systems gefährden könnte.</p>
<p>Nachdem wir die Daten gesammelt haben möchten wir sie natürlich auch ausgeben. Das solltet ihr auch wieder die vorherige Bedingung verwenden. Dazu erstellen wir einfach eine Tabelle, die die gesammelten Daten enthält:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;table style=&quot;border: 1px solid #000;&quot; rules=&quot;all&quot;&gt;
	&lt;caption&gt;Gesamtdauer: &lt;?= $mysqli-&gt;queries_time ?&gt;&lt;/caption&gt;
	&lt;tr&gt;
		&lt;th&gt;Anzahl&lt;/th&gt;
		&lt;th&gt;Query&lt;/th&gt;
		&lt;th&gt;Fehler&lt;/th&gt;
		&lt;th&gt;Zeit&lt;/th&gt;
	&lt;/tr&gt;
&lt;? foreach($mysqli-&gt;queries as $query) : ?&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;?= $query['number'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['query'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['error'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['time'] ?&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;? endforeach ?&gt;
&lt;/table&gt;
</pre>
<p>Nehmen wir an, wir die Tabelle aus dem ersten Statement ist in der Datenbank nicht vorhanden. In diesem Fall würden wir einen SQL-Fehler erhalten. In der Tabelle können wir dann direkt den Fehler ermitteln und entsprechend das Statement korrigieren. Auch hier wird das Statement gespeichert und die Zeit gemessen.</p>
<table style="color: rgb(185, 189, 182); background-color: rgb(27, 36, 38); width: 100%; padding: 5px; border: 1px solid #000;" rules="all">
<caption style="background-color: rgb(27, 36, 38);">Gesamtdauer: 0.0025820732116699</caption>
<tr>
<th>Anzahl</th>
<th>Query</th>
<th>Fehler</th>
<th>Zeit</th>
</tr>
<tr>
<td>0</td>
<td>SELECT * FROM tablename</td>
<td>Table &#8216;name.tablename&#8217; doesn&#8217;t exist</td>
<td>0.00076198577880859</td>
</tr>
<tr>
<td>1</td>
<td>SELECT * FROM tablename2</td>
<td></td>
<td>0.0018200874328613</td>
</tr>
</table>
<p>Ihr habt mit dieser kleinen Beispiel-Klasse einen sehr einfachen Debugger zur Hand, mit dem ihr sehr schnell die langsamen Statements in eurem System finden könnt. Ihr könnt die Klasse natürlich auch noch nach euren Wünschen erweitern und auch andere Funktionen von MySQLi überschreiben. Wenn ihr, so wie ich, zentral an einer Stelle die Datenbankverbindung erzeugt könnt ihr durch die Bedingung aus dem zweiten Quellcode eure gesamte Applikation debuggen.</p>
<p>Ich habe damit in meinem Projekt schon zwei überflüssige Statements finden können und einige andere Statements noch weiter optimieren können. Ich hoffe, dass euch der Debugger auch bei eurer täglichen Arbeit unterstützen kann. Über Anregungen und Kommentare Wrede ich mich wie immer freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/794/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Das Bermudadreieck des Internet Explorer &#8211; Oder: Wo zum Teufel ist mein Ordner hin?</title>
		<link>http://kau-boys.de/790/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin</link>
		<comments>http://kau-boys.de/790/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin#comments</comments>
		<pubDate>Wed, 03 Mar 2010 17:10:12 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=790</guid>
		<description><![CDATA[Heute bin ich mal wieder auf ein sehr faszinierendes Problem mit dem Internet Explorer gestoßen. Meine erste Vermutung war mal wieder ein Programmierfehler im vielgeliebten IE6, aber der Fehler trat auch im Internet Explorer 7 auf. Ich nutze in einem Projekt absolute Pfade in allen Dateinamen, Links und Formularen. Nun hatte ich aber im einem [...]]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich mal wieder auf ein sehr faszinierendes Problem mit dem Internet Explorer gestoßen. Meine erste Vermutung war mal wieder ein Programmierfehler im vielgeliebten IE6, aber der Fehler trat auch im Internet Explorer 7 auf.</p>
<p>Ich nutze in einem Projekt absolute Pfade in allen Dateinamen, Links und Formularen. Nun hatte ich aber im einem Formular dummerweise das Gleichheitszeichen nach dem Short Open Tag in PHP vergessen. Mein Formular sah also in verkürzter Form wie folgt aus: </p>
<pre class="brush: xml; title: ; notranslate">
&lt;form action=&quot;&lt;? ABSOLUTER_PFAD ?&gt;form.php&quot;&gt;
...
&lt;/form&gt;
</pre>
<p><span id="more-790"></span></p>
<p>Soweit so gut, aber im Grund durfte hierdurch kein Problem entstanden sein. Der absolute Pfad enthielt eine Angabe in der Form <code>http:/www.beispiel.de/formularordner</code>. Da nun dieser Pfad nicht zur Verfügung stand enthielt das <code>action</code> Attribut des Formulars nur den Wert <code>form.php</code>.</p>
<p>Das Formular wurde über einen Link aufgerufen und somit befand sich der Nutzer innerhalb des &#8220;formularordner&#8221;. Wenn nun also der Pfad relativ angegeben wird, müsste das Formular in genau diesem Ordner gesucht werden. Einige Nutzer bekamen aber eine schöne 404 Fehlermeldung. Da mir einer dieser Nutzer einen Screenshot des Dilemmas geschickt hat konnte ich feststellen, dass der Browser versuchte den Pfad <code>http./www.beispiel.de/form.php</code> zu öffnen. Hier war aber natürlich kein Formular zu finden.</p>
<p>Ich konnte den Fehler dann beheben, indem ich das Gleichheitszeichen wieder an seine korrekte Stelle eingefügt habe. Dadurch kam es nicht mehr zu den falschen Aufrufen. Der Vollständigkeit halber hier noch der korrekte Quellcode:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form action=&quot;&lt;?= ABSOLUTER_PFAD ?&gt;form.php&quot;&gt;
...
&lt;/form&gt;
</pre>
<p>Was aber genau beim Internet Explorer dazu geführt hat, dass er den Ordner einfach &#8220;verschluckt&#8221; hat konnte ich bisher noch nicht feststellen. Mir ist es auch bisher nicht gelungen den Fehler auf einem meiner Rechner zu reproduzieren. Es liegt auch nicht an einem grundsätzlichen Problem bei einem der Nutzer, denn nachdem sie den Browser neu geöffnet hatten funktionierte plötzlich alles wieder wie gewohnt.</p>
<p>Das erstaunlichste ist aber, dass dieser Fehler schon vor 13 Monaten im Skript vorhanden ist und erst jetzt von drei Nutzern entdeckt wurde, obwohl das betreffende Formular wohl hunderte Male am Tag genutzt wird.</p>
<p>Sollte jemand von euch schon einmal dieses Problem selbst erlebt haben und vielleicht sogar eine Erklärung oder Lösung dafür kennen würde es mich wirklich brennend interessieren. Mit dem absoluten Link funktioniert es aber soweit wieder und ich hoffe, dass der Internet Explorer nun den Ordner beibehält.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/790/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous &#8211; Teil 1: Draggable</title>
		<link>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable#comments</comments>
		<pubDate>Tue, 02 Mar 2010 16:38:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=785</guid>
		<description><![CDATA[Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel <a href="http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen</a> vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf dem Schritt zur fertigen Seite nachvollziehen.</p>
<p>Im ersten Teil geht es um die Grundlage einer Seite mit Drag-and-Drop. Wir verwenden für dieses Tutorial die Drag-and-Drop Funktionalität von <a href="http://script.aculo.us">Scriptaculous</a>, welches eine Erweiterung des <a href="http://www.prototypejs.org">Prototype Frameworks</a> ist. Um die hier gezeigten Funktionen selbst nachprogrammieren zu können benötigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal benötigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen möchten. Für das Element nehme ich exemplarisch ein DIV, aber ihr könnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; dir=&amp;quot;ltr&amp;quot; lang=&amp;quot;de-DE&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;title&amp;gt;Drag-and-Drop Teil 1&amp;lt;/title&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scriptaculous.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;h1&amp;gt;Drag-and-Drop&amp;lt;/h1&amp;gt;
		&amp;lt;div id=&amp;quot;draggable&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
			new Draggable('draggable');
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>Wichtig für das Aktivieren der Draggable Funktion auf ein Element ist eine ID für das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien für Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zusätzlich ist noch etwas CSS angegeben um dem DIV einen Rahmen und eine Hintergrundfarbe zu verpassen. Alles was nun notwendig ist, um das DIV aufnehmbar zu machen ist eine einzige Zeile JavaScript:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable');
</pre>
<p>Es wird hier eine neue Instanz des <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Objekts</a> erzeugt. Dem Konstruktor wird hierbei die ID des Elements übergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gefällig</h2>
<p>Da dieser Blog auch Prototype einsetzt, sollten wir es nicht bei einem Quellcode Auszug belassen, sondern einfach mal hier ein solches DIV einfügen. Also, hier kommt es:</p>
<div id="draggable" style="width: 100px; height: 100px; padding: 30px; background-color: #39c; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable')</script></p>
<p>Dieses DIV kann nun beliebig im Sichtbaren Bereich verschoben werden. Die Klasse bietet aber auch viele Optionen, die in einem Hash an die Funktion als zweiten Parameter übergeben werden können. Wir können z.B. die Bewegung eines Elements auf die horizontale beschränken und zusätzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine ursprüngliche Position zurücksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable2', {constraint: 'horizontal', revert: true});
</pre>
<p>Ich habe hier die ID um eine Zwei erweitert, damit ich auch dieses Beispiel hier vorführen kann. Wichtig ist natürlich immer, dass ihr für die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verhält sich dann wie folgt:</p>
<div id="draggable2" style="width: 100px; height: 100px; padding: 30px; background-color: #292; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable2', {constraint: 'horizontal', revert: true})</script></p>
<p>Da es hier in diesem Tutorial nicht darum geht alle möglichen Optionen zu erklären möchte ich euch gerne auf die <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">API Referenz der Draggable Klasse</a> verweisen. Dort findet ihr eine Liste aller Optionen und einige weitere Beispiele.</p>
<p>Damit möchte ich auch schon den ersten Teil des Tutorials abschließen. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verhält. Im zweiten Teil beschäftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es ermöglicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weitere Sicherheitslücken beim Internet Explorer 6 aufgetreten</title>
		<link>http://kau-boys.de/783/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten</link>
		<comments>http://kau-boys.de/783/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten#comments</comments>
		<pubDate>Mon, 01 Mar 2010 22:52:15 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=783</guid>
		<description><![CDATA[Es vergeht fast keine Woche, in dem nicht neue Sicherheitslücken im Internet Explorer 6 bekannt werden. Dieses Mal sind die Versionen 6 und 7 für Windows XP betroffen. User von Windows 7 sowie von Windows Server 2008 und Vista sind laut dem Blogartikel von Microsoft nicht betroffen. Wie so oft wird den Nutzern geraten die [...]]]></description>
			<content:encoded><![CDATA[<p>Es vergeht fast keine Woche, in dem nicht neue Sicherheitslücken im Internet Explorer 6 bekannt werden. Dieses Mal sind die Versionen 6 und 7 für Windows XP betroffen. User von Windows 7 sowie von Windows Server 2008 und Vista sind laut <a href="http://blogs.technet.com/msrc/archive/2010/02/28/investigating-a-new-win32hlp-and-internet-explorer-issue.aspx">dem Blogartikel von Microsoft</a> nicht betroffen.</p>
<p>Wie so oft wird den Nutzern geraten die Scripting Funktionen ihres Browsers zu deaktivieren. Dies ist aber nicht immer für den Benutzer möglich bzw. findet er oft die nötigen Einstellungen dazu nicht. Meiner Meinung nach wird durch diese Sicherheitslücken zunehmend die Angst vor JavaScript und Co. gestärkt. Das macht es für uns Webentwickler natürlich teilweise sehr schwer den effektiven und wohl dosierten Einsatz von clientseitigen Skriptsprachen zu rechtfertigen.</p>
<p>Nun kann man zwar nicht dem Internet Explorer die Schuld daran geben, denn schließlich tauchen bei jedem Browser mehrmals pro Jahr Sicherheitslücken auf. Aber beim Internet Explorer 6 häufen sich solche Fehler in letzter Zeit. Wenn das natürlich dazu führt, dass er IE6 schneller von Unternehmensrechnern verschwindet und damit seine Hauptzielgruppe verliert umso besser. Doch leider findet er sich noch immer auf jeder Standardinstallation eines Windows XP System und auch die Service Packs zwingen den Benutzer nicht zum Update. Microsoft hat zwar angekündigt den Support für Windows XP ohne SP3 zum Juli einzustellen, aber auf ein Support Ende des IE6 warten wir bisher vergeblich.</p>
<p>Wenn ich mir zu meinem Geburtstag diesen Monat etwas von Microsoft wünschen dürfte, dann wäre es nicht das neue Office 2010, was ja im Juni erscheinen soll, sondern das Ende einer Ära im Browsermarkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/783/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Internet Explorer ist tot! Lang lebe der Internet Explorer!</title>
		<link>http://kau-boys.de/768/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer</link>
		<comments>http://kau-boys.de/768/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer#comments</comments>
		<pubDate>Thu, 25 Feb 2010 16:01:50 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=768</guid>
		<description><![CDATA[Schon vor längerer Zeit hat Google angekündigt den Support für den Internet Explorer 6.0 für die meisten seiner Dienste nicht mehr fortzusetzen. Zu dieser Aussage gibt es jetzt auch ein genaues Datum, ab wann der Support eingestellt werden soll. Der Stichtag ist demnach der 13. März 2010. Was anschließend beim Aufruf der entsprechenden Dienste mit [...]]]></description>
			<content:encoded><![CDATA[<p>Schon vor längerer Zeit hat Google angekündigt den Support für den Internet Explorer 6.0 für die meisten seiner Dienste nicht mehr fortzusetzen. Zu dieser Aussage gibt es jetzt auch ein genaues Datum, ab wann der Support eingestellt werden soll. Der Stichtag ist demnach der 13. März 2010. Was anschließend beim Aufruf der entsprechenden Dienste mit dem Internet Explorer 6.0 zu sehen sein wird konnte ich noch nicht erfahren.</p>
<p>Da ich aber, wie in meinem Artikel <a href="http://kau-boys.de/674/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode">Internet Explorer 6 unter Windows 7 nutzen mit dem Windows XP Mode</a> beschrieben habe, selbst noch eine Installation des IE6 auf meinem Laptop laufen habe, werde ich euch dann berichten, ob die Dienste noch nutzbar sind. Auf der Homepage von <a href="http://www.youtube.com/">YouTube</a> ist für Nutzer des Internet Explorers schon länger ein Hinweis zu sehen, der zum Update des Browsers auffordert:</p>
<p><span id="more-768"></span></p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/YouTube-IE6-Warnung.png" title="YouTube IE6 Warnung" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/YouTube-IE6-Warnung-small.png" title="YouTube IE6 Warnung" alt="YouTube IE6 Warnung" /></a></p>
<p>Interessant ist hierbei auch, dass die Reihenfolge der vorgeschlagenen Browser bei jedem neuen Laden der Seite zufällig neu verteil wird. Genau das hat man ja auch Microsoft bei der aufgezwungenen Browserauswahl für Windows 7 gefordert.</p>
<p>Nachdem nun aber nicht nur Google dem IE6 abschwört, sondern auch in letzter Zeit immer mehr Berichte über Sicherheitsprobleme in fast allen Medien die Runde machen ist zu hoffen, dass der Internet Explorer 6 das Jahr 2010 nicht überleben wird. Es sollte mittlerweile auch dem letzten Admin klar sein, dass dieser in die Jahre gekommene Browser keine Zukunft mehr hat. Die vielen Unternehmen, die noch am Browser festhalten, weil es speziell angepasste Intranet-Lösungen dafür gibt sollten sich ernsthaft fragen, wie seriös ein Anbieter solch einer Software noch sein kann, wenn es mittlerweile schon zwei Nachfolgeversionen des IE6 gegeben hat. Die Zeit zum umstellen der Software war also sehr wohl da. Jeder von euch, der schon einmal eine Website aus den IE6 Zeiten auf den IE7 portiert hat wird mir wohl zustimmen können, dass die Anpassungen marginal waren. Das optimieren von Websites an den IE6 ist aber bis heute eine Königsdiziplin für Webdesigner und eine der sinnlosesten und zeitraubenden oberdrein.</p>
<p>Ich sehe im Internet Explorer 8 einen großen Schritt von Microsoft in die richtige Richtung. Der Internet Explorer in Version 9 soll dann den anderen standardkonformen Browsern in nichts mehr nachstehen. Mal sehen, was aus dieser Ankündigung am Ende wird. Aber da der Umstieg vom IE7 auf den IE8 und später den IE9 keine großen Hürden darstellen sollte ist zu hoffen, dass wir Webentwickler dann mehr Zeit für interessantere Dinge haben werden.</p>
<p>P.S. Bei all dem schlechten Gerede über den IE6 wollte ich noch erwähnen, dass ich heute die Umarbeitung des Themes meines Blog für den IE6 abgeschlossen habe. Alle transparenten PNGs sind nun in transparente GIFs konvertiert. Alle Nutzer die noch dazu gezwungen sind den IE6 zu nutzen können meinen Blog nun auch in all seiner Pracht genießen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/768/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Öffentlich-rechtlich und vorbildhaft &#8211; So muss eine Web 2.0 zu Olympia aussehen</title>
		<link>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen</link>
		<comments>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen#comments</comments>
		<pubDate>Tue, 23 Feb 2010 23:46:48 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=757</guid>
		<description><![CDATA[An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und natürlich ist die Präsenz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kanälen der beiden Öffentlich-rechtlichen zu sehen. Das erwartet [...]]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und natürlich ist die Präsenz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kanälen der beiden Öffentlich-rechtlichen zu sehen. Das erwartet man auch, denn dafür zahlen wir ja auch brav unsere Gebühren.</p>
<p>Was man nicht unbedingt erwartet und was mich sehr überrascht hat ist der sehr gute Web 2.0 auftritt. Es ist immer sehr gut zu sehen, auf welchen Kanälen gerade etwas live zu sehen ist und was gerade für neue Entscheidungen gefallen sind. Außergewöhnlich ist allerdings, wie dynamisch sich die Seite an die eigenen Interessen anpassen lässt:</p>
<p><span id="more-757"></span></p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de_.png" title="Startseite von olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-small.png" title="Startseite von olympia.ard.de" alt="Startseite von olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Wie ihr auf dem ersten Screenshot sehen könnt können die verschiedenen Bereiche ausgelendet werden. Die Einstellungen werden hierbei in einem Cookie gespeichert, sodass die Einstellungen bei einem erneuten Besuch erhalten bleiben.</p>
<p>Eine andere Möglichkeit die Seite anzupassen besteht darin die verschiedenen Elemente per Drag-and-Drop zu verschieben. Dies geht genauso flüssig und unproblematisch wie man es auch von <a href="http://www.google.de/ig">iGoogle</a> oder ähnlichen Seiten gewohnt ist. Auch hier werden die Anordnungen in demselben Cookie gespeichert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd.png" title="Drag-and-Drop auf olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd-small.png" title="Drag-and-Drop auf olympia.ard.de" alt="Drag-and-Drop auf olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Ebenfalls sehr nett gemacht ist die Mediabox, die sehr an die Steuerung von diversen MP3-Playern mit Albumansicht erinnert. Einige Inhalte seinen außerdem erst dann geladen zu werden, sobald der Benutzer an die entsprechende Stelle scrollt.</p>
<p>Einige von euch werden sich jetzt fragen wieso ich einen solchen Artikel geschrieben habe. Einerseits um wirklich mal ein Lob an einen sehr guten Internet Auftritt loszuwerden. Andererseits aber auch um einen kleinen Überblick zu geben, was alles mit recht einfachen Mitteln möglich ist. Dem Quellcode konnte ich entnehmen, dass die ARD auf das <a href="http://mootools.net/">JavaScript-Framework MooTools</a> setzt.</p>
<p>Ich möchte diesen Artikel zum Einstieg für eine kleine Reihe rund um Drag-and-Drop Funktionen und andere oft gesehene Techniken zu nehmen. Im ersten Teil dieser Reihe werde ich auf die Grundlagen von Drag-and-Drop eingehen und diese am Beispiel des <a href="http://script.aculo.us/">Scriptaculous Frameworks</a> zeigen. Anschließend werden ich dann zeigen, wie man per Drag-and-Drop Elemente sortieren kann. In einem weiteren Teil geht es dann vermutlich um die Kombination der Sortierung mit AJAX.</p>
<p>Wer jetzt Lust bekommen hat sich das Ganze mal live anzusehen kann das auf der <a href="http://olympia.ard.de/">Olympia Website der ARD</a> tun. Und das ZDF? Ja, das möchte ich nicht unerwähnt lassen. Auch hier gibt es viele Informationen rund um die WM und auch Livestreams. Aber die Seite ich nicht so dynamisch wie die der ARD. Besser gelöst finde ich hier aber der Liveticker. Dieser bekommt zwar die gleichen Einträge wie der bei der ARD, aber er aktualisiert sich von selbst und stellt auch sehr schön die aktuellen Zwischenergebnisse dar. Er läuft bei mir zurzeit fast ständig im Hintergrund. Also auch hier solltet ihr auch mal die <a href="http://olympia.zdf.de/">Olympia Website des ZDF</a> ansehen.</p>
<p>Ich hoffe ihr freut euch auf die kleine Tutorialreihe. Ich würde mich aber auch über eure Kommentare zu den Websites freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen#comments</comments>
		<pubDate>Wed, 17 Feb 2010 13:18:55 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=697</guid>
		<description><![CDATA[Ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: Einfacher Zeilen-Duplizierer mit Prototype auch auf Feldern funktioniert, die die Scriptaculous Ajax.AutoCompleter Funktion verwenden. Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enthält. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: <a href="http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Einfacher Zeilen-Duplizierer mit Prototype</a> auch auf Feldern funktioniert, die die <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Scriptaculous Ajax.AutoCompleter</a> Funktion verwenden.</p>
<p>Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enthält. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei ist allerdings, dass die AutoCompleter Funktion beim Erzeugen mit dem Felder verknüpft wird, auf das sie angewendet werden soll. Wenn man nun dieses Feld kopiert wird nicht eine neue Instanz des Ajax.AutoCompleter erzeugt, sondern die Referenz auf das alte Feld mit kopiert. Ein Eintrag im neu erzeugten Feld aktiviert also die AutoCompleter Funktion des vorherigen Feldes.</p>
<p><span id="more-697"></span></p>
<p>Um dieses Problem zu lösen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es möglich die Referenz zum vorherigen Feld zu lösen und eine neue Instanz des Ajax.AutoCompleter nach dem Erzeugen der Kopie zu erstellen. Hier aber zuerst noch einmal die Funktion selbst. Ich habe mittlerweile auch eine Option zum Fokussieren des ersten Feldes in der Kopie hinzugefügt:</p>
<pre class="brush: jscript; title: ; notranslate">
function addRow(selector, options){
	var lastRow = $$(selector).last();
	var newRow = lastRow.cloneNode(true);
	if (options.reset) {
		newRow.select('select', 'textarea', 'input').each(function(elm){
			elm.clear().checked = '';
		});
	}
	if(options.beforeInsert) options.beforeInsert(newRow);
	lastRow.insert({'after': newRow});
	if(options.afterInsert) options.afterInsert(newRow);

	if (options.focusFirst) {
		newRow.select('input', 'select', 'textarea').first().focus();
	}
}
</pre>
<p>Um die Ajax.Autocompleter Funktion nutzen zu können benötigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld für unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous</a>):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form id=&quot;addressform&quot; action=&quot;address_save.php&quot; class=&quot;niceform&quot;&gt;
	&lt;fieldset&gt;
		&lt;legend&gt;Choose an address&lt;/legend&gt;
		&lt;dl&gt;
			&lt;dt&gt;&lt;label for=&quot;address&quot;&gt;Address:&lt;/label&gt;&lt;/dt&gt;
			&lt;dd&gt;&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address[]&quot; style=&quot;width: 300px;&quot; /&gt;&lt;/dd&gt;
		&lt;/dl&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;input type=&quot;submit&quot; value=&quot;Send!&quot; /&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Wichtig sind hierbei natürlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mitübertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzufügen können, müssen wir beim Kopieren auch die ID verändern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript; title: ; notranslate">
function activateAutocomplete(newRow){
	var addressInput = $A(newRow.select('input')).first();
	addressInput.id += 1;
	addressInput.stopObserving();
	new Ajax.Autocompleter(addressInput.id, 'adresse_choices', 'get_addresses.php');
}
</pre>
<p>In der 2. Zeile selektieren wir das erste Element innerhalb der neuen Zeile (wir nehmen hier also an, dass es sich dabei um das AutoCompleter Feld handelt). Diesem fügen wir in der 3. Zeile zusätzlich zur ID eine 1 hinzu. Es entstehen also Felder nach dem Muster <code>"address1", "address11"</code> usw. Das reicht aus um die Felder genau zu referenzieren.<br />
In der 4. Zeile kommt die schon angesprochene Funktion zum Einsatz, die das Autocomplete für das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir können dabei als zweiten Parameter dasselbe DIV Element für die Vorschläge verwenden, da es ja nicht möglich ist, gleichzeitig in zwei Felder etwas einzutippen. Das DIV wird automatisch durch Scriptaculous unter das Feld positioniert, in dem es verwendet wird.</p>
<p>Damit das ganze nun auch dupliziert werden kann, fügen wir noch einen entsprechenden Link ein. Dieser muss dann die Callback-Funktion als zweiten Parameter in der Funktion erhalten. Ich verwende hier ein SPAN Element mit einem onclick Event. Es geht aber auch mit einem gewöhnlichen Link:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzufügen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr könnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel könnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Ich hoffe, dass euch die erweiterte Anwendung gefallen hat und vielleicht auf neue Ideen gebracht hat. Wenn ihr eine andere Anwendung kennt, bei der Ihr nicht weiterkommt würde ich mich wie immer über einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Internet Explorer 6 unter Windows 7 nutzen mit dem Windows XP Mode</title>
		<link>http://kau-boys.de/674/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode</link>
		<comments>http://kau-boys.de/674/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode#comments</comments>
		<pubDate>Mon, 01 Feb 2010 14:26:12 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=674</guid>
		<description><![CDATA[Wer sich von euch jetzt fragen sollte &#8220;Wieso sollte ich den IE6 unter Windows 7 nutzen?&#8221; dem würde ich gerne &#8220;Willst du nicht!&#8221; antworten. Aber diejenigen unter uns, die Webseiten entwickeln und auch mit dem IE6 eine Website testen müssen, wird dieser Artikel wohl helfen. Unter Windows kann ja bekanntermaßen immer nur eine Version des [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich von euch jetzt fragen sollte &#8220;Wieso sollte ich den IE6 unter Windows 7 nutzen?&#8221; dem würde ich gerne &#8220;Willst du nicht!&#8221; antworten. Aber diejenigen unter uns, die Webseiten entwickeln und auch mit dem IE6 eine Website testen müssen, wird dieser Artikel wohl helfen.</p>
<p>Unter Windows kann ja bekanntermaßen immer nur eine Version des Internet Explorers installiert sein. Da der IE8 auch einen Kompatibilitätsmodus für den IE7 besitzt hat man so schon mal zwei Fliegen mit einer Klappe geschlagen. Aber wie soll man unter Windows 7 einen IE6 installieren. Zum Glück gibt es hier eine sehr einfache und sehr benutzerfreundliche Methode. Zum Testen des Chrome Frame für<a href="http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6"> meinem letzen Artikel</a> habe ich noch eine virtuelle Maschine mit Windows XP unter <a href="http://www.virtualbox.org/">Suns VirtualBox</a> verwendet. Es geht aber sehr viel einfacher und erfordert keine Zeitaufwändige Installation eines XP-Systems, für das man auch noch eine Lizenz benötigt. Wer also keine mehr rumliegen hat und nicht unbedingt eine XP-VM benötigt, kann sich trotzdem den IE6 für Win7 holen.</p>
<p><span id="more-674"></span></p>
<h2>Der Windows XP Modus</h2>
<p>Alles was ihr benötigt ist der sogenannten Windows XP Mode. Dabei handelt es sich um eine spezielle Version von Microsofts Virtual PC. Alle Programme, die dort installiert sind, können auch unter Windows 7 gestartet werden. Und nicht wie man es von VMs gewohnt, indem man die VM startet und dort die Programme ausführt, sondern indem man sie direkt aus dem Startmenü von Windows 7 aufruft und auch direkt in Win7 nutzen kann.</p>
<p>Damit ihr den Windows XP Mode benötigt ihr mindestens eine Windows 7 Professional Lizenz oder höher. Benutzer von Win7 Starter oder Home können den Modus leider nicht nutzen. Zum installieren geht ihr einfach auf die <a href="http://www.microsoft.com/windows/virtual-pc/download.aspx">Download-Website für den Windows XP Mode</a> wählt eure Windows 7 Version und die gewünschte Sprache aus und installiert beide Dateien nacheinander. Anschließend könnt ihr die virtuelle Maschine über das Startmenü aufrufen und die nötigen Einstellungen für Windows XP durchführen. Ihr solltet in diesem Zusammenhang auch die Updates installieren aber auf KEINEN FALL das Update für den Internet Explorer 7.</p>
<h2>Den Internet Explorer 6 unter Windows 7 nutzbar machen</h2>
<p>Damit ihr nun den IE6 auch unter Windows 7 nutzen könnte ist ein sehr simpler Eingriff notwendig. Ihr müsst lediglich eine Verknüpfung zum IE6 in das Startmenü für &#8220;Alle Benutzer&#8221; kopieren. Dazu klickt ihr einfach mit der rechten Maustaste auf den &#8220;Start&#8221; Kopf und wählt &#8220;Öffnen &#8211; Alle Benutzer&#8221;:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-Startmenü-für-alle-Benutzer.png" alt="Windows XP Mode - Startmenü für alle Benutzer" title="Windows XP Mode - Startmenü für alle Benutzer" /></p>
<p>Alle Verknüpfungen die hier zusätzlich zu den bereits abgelegten hinzugefügt werden sind anschließend in Windows 7 aufrufbar. Ihr könnt nun also hier eine Verknüpfung zum IE6 anlegen. Das geht wiederrum recht schnell, wenn ihr einfach die Verknüpfung auf dem Desktop per Drag-and-Drop hierher zieht:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-Verknüpfung-für-IE6-kopieren.png" alt="Windows XP Mode - Verknüpfung für IE6 kopieren" title="Windows XP Mode - Verknüpfung für IE6 kopieren" /></p>
<p>Nun solltet ihr zur Sicherheit die Virtuelle Maschine einmal neustarten. Es funktioniert vielleicht auch ohne Neustart, aber bei mir war er notwendig (eventuell wegen der installierten Updates).</p>
<h2>Den IE6 in Windows 7 aufrufen</h2>
<p>Wenn alles richtig eingerichtet wurde, solltet ihr im Startmenü unter Windows 7 einen Unterordner in &#8220;Windows Virtual PC&#8221; mit der Bezeichnung &#8220;Windows XP Mode-Anwendungen&#8221; vorfinden. Dort sollte dann der Internet Explorer 6 aufrufbar sein:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-in-Win7-starten.png" alt="Windows XP Mode - IE6 in Win7 starten" title="Windows XP Mode - IE6 in Win7 starten" /></p>
<p>Nachdem ihr den Internet Explorer gestartet habt könnt ihr ihn so verwenden, als wäre er direkt in Windows 7 installiert. Da aber nicht nur der IE6 sondern das gesamte System gestartet wird kommt es manchmal zu kuriosen Meldungen. So wird euch z.B. auch ab und zu auf Updates hingewiesen oder darauf, dass ihr keinen Virenscanner in der VM installiert habt. Wenn euch die Meldungen stören, solltet ihr einfach die erforderlichen Schritte in der VM durchführen. </p>
<p>Hier noch ein kleines &#8220;Beweisfoto&#8221; der Familienzusammenführung, für alle, die daran Zweifel haben, dass es so einfach ist:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-und-IE8-in-Windows-7.png" title="Windows XP Mode - IE6 und IE8 in Windows 7" class="thickbox"><br />
<img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-und-IE8-in-Windows-7-small.png" alt="Windows XP Mode - IE6 und IE8 in Windows 7" title="Windows XP Mode - IE6 und IE8 in Windows 7" /><br />
</a></p>
<h2>Fazit</h2>
<p>Mit dem Windows XP Mode ist es sehr einfach alte Programme unter Windows 7 zu nutzen. Es ist dabei sogar möglich mit der erweiterten Version von Virtual PC mehr als eine virtuelle Maschine zu betreiben. Wenn auch eine der anderen VMs eine Windows Installation ist, könnt ihr hier auch die Programme unter Win7 nutzbar machen. Wer also einen &#8220;echten Internet Explorer 7&#8243; haben möchte, könnte z.B. eine weitere XP-VM aufsetzen oder eine Vista-VM nutzen. Ihr könnte in den VMs dann z.B. auch ältere Version von anderen Browsern installieren um diese gleichzeitig unter Win7 nutzen zu können. Zwar kann man viele andere Browser auch in mehreren Versionen auf einem System installieren, aber z.B. beim Firefox gibt es dabei immer mal wieder Probleme mit den Profilen.</p>
<p>Hat jemand von euch noch andere sinnvolle Anwendungen des Windows XP Mode gefunden? Vielleicht um ein paar Spieleklassiker zum Laufen zu bringen? Über Kommentare würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/674/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Blog oder Website fit machen für den IE6</title>
		<link>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=blog-oder-website-fit-machen-fuer-den-ie6</link>
		<comments>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6#comments</comments>
		<pubDate>Sat, 30 Jan 2010 16:22:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=662</guid>
		<description><![CDATA[Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support für den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigermaßen ansehnlich präsentiert bekommen. Das größte Problem ist [...]]]></description>
			<content:encoded><![CDATA[<p>Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support für den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigermaßen ansehnlich präsentiert bekommen.</p>
<p>Das größte Problem ist oft, dass die schönen Themes nicht auf den IE6 angepasst wurden und daher zu sehr unschönen Darstellungen führen. Ich habe in einer virtuellen Maschine noch eine Installation vom Internet Explorer 6 laufen und damit mal selbst meinen Blog getestet. Das Ergebnis sah leider wie folgt aus:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/vorher.png" class="thickbox" title="Blog vor der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/vorher_small.png" alt="Blog vor der Installation des Plugins" title="Blog vor der Installation des Plugins" /></a></p>
<p><span id="more-662"></span></p>
<p>Wie ihr hier sehen könnt sind die transparenten PNG Bilder im IE6 nicht transparent, da dieser nur transparente GIF Bilder unterstützt. Viel schlimmer war aber, dass die Sidebar mit den Widgets komplett nach unten gerutscht war. Um das zu beheben hätte ich sehr viele Dinge im CSS Layout und vermutlich auch im HTML-Quellcode ändern müssen. Daher habe ich überlegt, was man stattdessen tun könnte.</p>
<h2>Die Lösung: Google Chrome Frame</h2>
<p>Schon vor längerer Zeit hatte ich etwas vom <a href="http://code.google.com/intl/de-DE/chrome/chromeframe/">Google Chrome Frame</a> gelesen, der die Webkit Rendering Engine und die JavaScript Engine des Chrome Browsers in den Internet Explorer bringt. Dazu muss der Benutzer lediglich ein Plugin für den Internet Explorer installieren und der Website-Betreiber muss dem Plugin mitteilen, dass der Inhalt automatisch damit gerendert werden soll.</p>
<h2>Den Browser zum Rendern mit dem Chrome Frame veranlassen</h2>
<p>Alles was der Website-Betreiber tun muss, ist folgenden Meta-Tag in seinen Quellcode einzufügen:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;chrome=1&quot; /&gt;
</pre>
<p>Das <code>X-UA-Compatible</code> Meta-Tag sorgt dafür, dass das Plugin aktiviert wird und der Benutzer den Inhalt richtig dargestellt bekommt, vorausgesetzt natürlich er hat es auch installiert. Um einen Benutzer des Internet Explorers dazu zu bewegen das Plugin zu installieren, hat Google ein kleines JavaScript-Snippet bereitgestellt, mit dem der Benutzer einen Link zur Download-Seite des Plugins bekommt:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;placeholder&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	CFInstall.check({
		node: &quot;placeholder&quot;,
		destination: &quot;http://www.waikiki.com&quot;
	});
&lt;/script&gt;
</pre>
<p>Damit die Aufforderung zum Download auch nur Benutzern des IE6 angezeigt wird, habe ich zusätzlich ein <a href="http://de.selfhtml.org/css/layouts/browserweichen.htm#alternative">Conditional Comment</a> benutzt, um das Snippet nur auf IE6 Benutzer anzuwenden, damit Benutzer des Internet Explorer 7 und höher keine Aufforderung bekommen. Außerdem müssen damit auch alle Nutzer eines andern Browsers nicht die JavaScript-Datei vom Google Server laden.</p>
<h2>Der Blog nach der Installation des Plugins</h2>
<p>Für diejenigen von euch, die etwas skeptisch sind, ob der ganze Aufwand lohnt, habe ich hier nun das &#8220;nachher&#8221; Bild, damit ihr sehen könnt, dass es wirklich funktioniert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/nachher.png" class="thickbox" title="Blog nach der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/nachher_small.png" alt="Blog nach der Installation des Plugins" title="Blog nach der Installation des Plugins" /></a></p>
<p>Wie ihr sehen könnt, sieht der Blog nun wieder richtig aus. Als kleinen Bonus des Plugins könnt ihr auch den Inspektor nutzen, wie man ihn von Chrome oder Safari gewöhnt ist. Aber die Besucher eures Blog werden das wohl eher nicht nutzen.</p>
<p>Ich hoffe, dass euch dieser Tipp helfen konnte. Mich würde interessieren, was ihr vom Google Chrome Frame haltet oder was für euch dagegen spricht. Hat ihn vielleicht jemand auch im Einsatz und schon echte Probleme oder Nachteile damit feststellen können? Über Kommentare würde ich mich wie immer sehr freuen &#8230; über ein baldiges Aussterben des IE6 aber noch viel mehr <img src='http://kau-boys.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/662/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Arrays und andere komplexe Daten mit PHP in einer MySQL-Datenbank speichern</title>
		<link>http://kau-boys.de/643/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern</link>
		<comments>http://kau-boys.de/643/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern#comments</comments>
		<pubDate>Sun, 24 Jan 2010 00:11:06 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=643</guid>
		<description><![CDATA[Viele von euch werden wohl schon einmal vor dem Problem gestanden haben, dass sie ein Array oder ein Objekt in der Datenbank speichern mussten. Hier möchte ich ein paar Vorschläge unterbreiten, wie man das Problem nicht lösen sollte und wie es besser gehen kann. Der schlechte Weg Die einfachste und gleichzeitig auch schlechteste Methode wäre [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von euch werden wohl schon einmal vor dem Problem gestanden haben, dass sie ein Array oder ein Objekt in der Datenbank speichern mussten. Hier möchte ich ein paar Vorschläge unterbreiten, wie man das Problem nicht lösen sollte und wie es besser gehen kann.</p>
<h2>Der schlechte Weg</h2>
<p>Die einfachste und gleichzeitig auch schlechteste Methode wäre es, für jeden Index eines Arrays oder jede Eigenschaft eines Objekts eine neue Spalte zu erzeugen. Bei diesem Ansatz werden unter Umständen viele Zeilen erzeugt, die nicht immer einen Wert enthalten. Das ist zwar nicht so gravierend, aber durch diesen Ansatz erhöht sich auch die Anzahl der Spalten schnell auf eine unübersichtliche Anzahl. Zuletzt ist es hierbei bei jeder Änderung des Arrays oder Objekts notwendig die Datenbanktabelle anzupassen.</p>
<p><span id="more-643"></span></p>
<h2>Eine bessere Lösung gefällig?</h2>
<p>Etwas besser Lösung, die fast immer funktioniert aber nicht für alle Fälle optimal ist, wäre eine Serialisierung des Arrays oder Objekts. Hierbei werden die Daten mit der <a href="http://de.php.net/manual/en/function.serialize.php">serialize()</a> Funktion in einen String konvertiert und können somit direkt in eine <a href="http://dev.mysql.com/doc/refman/5.1/en/char.html">VARCHAR</a> oder <a href="http://dev.mysql.com/doc/refman/5.1/en/blob.html">TEXT</a> Spalte speichert werden. Dabei muss der String natürlich noch durch die Funktion <a href="http://de.php.net/manual/en/mysqli.real-escape-string.php">real_escape_string()</a> (in diesem Beispiel von der MySQLi Klasse) &#8220;escaped&#8221; werden.</p>
<h3>Speichern der Daten</h3>
<pre class="brush: php; title: ; notranslate">
// Das zu speichernde Array
$array = array('vorname' =&gt; 'Max', 'name' =&gt; 'Mustermann');
// Serialisieren der Daten
$string = serialize($array);
// Speichern der Daten
$mysqli-&gt;query('INSERT INTO table_name (array) VALUES (&quot;'.$mysqli-&gt;real_escape_string($string).'&quot;)'))
</pre>
<p>Das Beispiel setzt natürlich voraus, dass die Variable <code>$mysqli</code> eine Instanz der MySQLi Klasse mit einer gültige Verbindung zu einer Datenbank enthält. Wir haben hier ein einfaches assoziatives Array, das serialisiert wird und anscheinend gespeichert wird. Die serialisierten Daten sehn in diesem Beispiel wie folgt aus:</p>
<h3>Der zu speichernde String</h3>
<pre class="brush: plain; gutter: false; title: ; notranslate">
a:2:{s:7:&quot;vorname&quot;;s:3:&quot;Max&quot;;s:4:&quot;name&quot;;s:10:&quot;Mustermann&quot;;}
</pre>
<p>Das Auslesen der Daten wird mit der Funktion <a href="http://de.php.net/manual/en/function.unserialize.php">unserialize()</a> durchgeführt, die aus dem String wieder ein assoziatives Array erzeugt. Dazu lesen wir zuerst die Daten mit einem gewöhnlichen Query aus und konvertieren anschließend die Daten:</p>
<h3>Auslesen der Daten</h3>
<pre class="brush: php; title: ; notranslate">
// Auslesen der Daten
$result = $mysqli-&gt;query('SELECT array FROM table_name');
$row = $result-&gt;fetch_assoc();
$string = $row['array'];
// Unserialisieren der Daten
$array = unserialize($string);
</pre>
<p>Diese Methode zum Speichern von komplexen Daten funktioniert recht gut, aber der serialisierte String benötigt dabei mehr Speicherplatz als für ein normales assoziatives Array eigentlich nötig wäre. Wie es eleganter geht zeige ich euch im nächsten Beispiel.</p>
<h2>Die elegante Lösung mit JSON</h2>
<p>Das Format <a href="http://de.wikipedia.org/wiki/JSON">JSON</a> entspringt zwar der Skriptsprache JavaScript, aber es wird zu Zeiten von AJAX sehr oft auch serverseitig verwendet und erzeugt. Da die meisten serverseitigen Sprachen also auch JSON unterstützen bietet es sich auch für die Speicherung von komplexeren Datenstrukturen an. Die Anpassung des vorherigen Quellcodes beschränkt sich dabei auch auf eine einzige Zeile. Wir ersetzen lediglich die serialize() durch die <a href="http://de.php.net/manual/en/function.json-encode.php">json_encode()</a> Funktion. Die Zeile 6 aus dem vorherigen Quellcode sieht dann folgt aus:</p>
<h3>Speichern der Daten</h3>
<pre class="brush: php; first-line: 3; title: ; notranslate">
...
$string = serialize($array);
...
</pre>
<p>Hierbei werden die Datei des assoziativen Arrays in die JSON Notation konvertiert. Hierbei ist der resultierende String kompakter als bei der Serialisierung, da die Länge der einzelnen Arraywerte nicht und Datentypen nicht gespeichert werden:</p>
<h3>Der zu speichernde String</h3>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
{&quot;vorname&quot;:&quot;Max&quot;,&quot;name&quot;:&quot;Mustermann&quot;}
</pre>
<p>Beim Lesen der Daten aus der Datenbank müssen sie dann selbstverständlich auch wieder in das ursprüngliche Format zurück konvertiert werden. Dabei kommt wie ihr schon vermutet die Funktion <a href="http://de.php.net/manual/en/function.json-decode.php">json_decode()</a> zum Einsatz. Diese erzeugt aber normalerweise ein Standard-Objekt. Um das in unserem Beispiel verwendete assoziative Array zu erhalten, wird als zweiter Paramater &#8220;true&#8221; übergeben. Der Änderung am Quellcode aus dem vorherigen Beispiel sieht dann wie folgt aus:</p>
<h3>Auslesen der Daten</h3>
<pre class="brush: php; first-line: 5; title: ; notranslate">...
$array = json_decode($string, true);
</pre>
<p>Die Verwendung von JSON sichert nicht nur die Daten sondern auch die Schlüssel eines Arrays. Dabei spielt es keine Rolle, ob das Array assoziativ ist oder Zahlen als Schlüssel verwendet. Auch wird die Sortierung dabei nicht verändert. Wer lediglich die Werte eines Array speichern möchte, also keine Schlüssel benötigt, kann auch einen noch einfacheren Weg gehen.</p>
<h2>Array in der Datenbank light</h2>
<p>Der einfachste Werte mehrere Daten eines Array in einer Datenbank zu speichern sind die Funktionen <a href="http://de.php.net/manual/en/function.explode.php">explode()</a> und <a href="http://de.php.net/manual/en/function.implode.php">implode()</a>. Hierbei werden die einzelnen Werte des Arrays durch den &#8220;Delimiter&#8221;, den man als ersten Parameter angibt voneinander getrennt bzw. miteinander verbunden. Auch bei dieser Variante müssen in den beiden Beispiel-Quellcodes nur die Funktionen für die Umwandlung ausgetauscht werden. Zu beachte ist hierbei, dass der &#8220;Delimiter&#8221; nicht in den Werten vorkommen darf. Wer also beispielsweise ein Array mit Datumsangaben im Format 2010-01-23 mit implode verbinden möchte, darf nicht den Bindestrich als &#8220;Delimiter&#8221; verwenden.</p>
<p>Die Werte können wie auch zuvor in einer VARCHAR oder TEXT Spalte gespeichert werden. Sehr hilfreich sind die beiden Funktionen aber auch beim Speichern in einer Spalte mit dem Spaltentyp <a href="http://">SET</a>. Da hierbei aber die Werte zusätzlich von Anführungsstrichen umgeben sein müssen, muss der &#8220;Delimiter&#8221; auch die Anführungsstriche enthalten. Die implode Funktion würde in der Speicherfunktion dann wie folgt eingesetzt:</p>
<h3>Speichern der Daten in einer SET Spalte</h3>
<pre class="brush: php; first-line: 3; title: ; notranslate">
...
$string = implode('&quot;, &quot;', $array);
...
</pre>
<h2>Fazit</h2>
<p>Wie ihr also seht, gibt es viele Wege komplexere Daten in einer Datenbank zu speichern. Das Beispiel mit JSON als Repräsentation sollte in jeder serverseitigen Skriptsprache funktionieren, die JSON unterstützt. Solltet ihr PHP verwenden müsst ihr natürlich auch sicherstellen, dass JSON bei euch aktiviert ist. Am einfachsten geht das wie immer mit Hilfe der <a href="http://de.php.net/manual/en/function.phpinfo.php">phpinfo()</a> Funktion, die in der Ausgabe einen &#8220;json&#8221; Abschnitt haben sollte.</p>
<p>Diejenigen von euch, die einen WordPress Blog haben und sich schon einmal die Datenbanktabelle angesehen haben, werden vermutlich die JSON Strings schon gesehen haben. Den WordPress speichert z.B. Arrays eines Plugins automatisch in der JSON Notation in der &#8220;options&#8221; Tabelle ab. Das macht es einem Pluginentwickler sehr einfach das Array zu speichern.</p>
<p>Ich hoffe, dass euch das kleine Tutorial weiterhelfen oder auf neue Ideen bringen konnte. Über Anregungen würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/643/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft tritt der W3C SVG Working Group bei</title>
		<link>http://kau-boys.de/598/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=microsoft-tritt-der-w3c-svg-working-group-bei</link>
		<comments>http://kau-boys.de/598/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei#comments</comments>
		<pubDate>Wed, 06 Jan 2010 13:06:38 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=598</guid>
		<description><![CDATA[Wie Microsoft gestern auf seinem IEBlog mitgeteilt hat, werden sie der W3C SVG Working Group beitreten. Dies bedeutet, dass SVG für Microsoft in Zukunft einen höheren Stellenwert hat und sie sich damit nicht mehr auf VML beschränken. Für uns als Webentwickler wird damit das Thema in Zukunft wohl interessanter werden. Bisher musste man einen Nutzer, [...]]]></description>
			<content:encoded><![CDATA[<p>Wie Microsoft gestern auf seinem <a href="http://blogs.msdn.com/b/ie/archive/2010/01/05/microsoft-joins-w3c-svg-working-group.aspx">IEBlog mitgeteilt hat</a>, werden sie der W3C SVG Working Group beitreten. Dies bedeutet, dass SVG für Microsoft in Zukunft einen höheren Stellenwert hat und sie sich damit nicht mehr auf VML beschränken.</p>
<p>Für uns als Webentwickler wird damit das Thema in Zukunft wohl interessanter werden. Bisher musste man einen Nutzer, der den Internet Explorer verwendent stets dazu nötigen sich <a href="http://www.adobe.com/svg/viewer/install/">ein Plugin von Adobe zu installieren</a>, zu welchem aber im letzen Jahr die Weiterentwicklung eingestellt wurde.</p>
<p><span id="more-598"></span></p>
<p>All denjenigen von euch, die bisher noch kein SVG eingesetzt haben, würde ich empfehlen es einfach mal auszuprobieren. Aus vielen Vektorprogrammen lässt sich direkt der SVG Quellcode erzeugen. Dieser kann dann entweder direkt in einem unterstützdenden Browser geöffnet werden, oder aber in eine Website eingebunden werden. Hier habe ich mal ein kleines Beipspiel integriert. Wer aber keine SVG fähigen Browser hat, wird das Bild leider nicht sehen können. Diejenigen müssen dann wohl bis zum IE9 warten, bis es ohne Plugin angezeigt werden kann:</p>
<p><object data="http://kau-boys.de/wp-content/uploads/2010/01/SVG-Logo.svg" type="image/svg+xml" width="300" height="300"></object><br />
Quelle: <a href="http://de.wikipedia.org/wiki/Datei:SVG-Logo.svg">Wikipedia.de</a></p>
<p>Wikipedia verwendet schon seit längerem SVG Grafiken für verschiedene Bilder. Wer mehr über SVG und das manuelle Erstellen einer Verktorgrafik lernen möchte, findet z.B. <a href="http://www.selfsvg.info">auf der Seite selfsvg.info</a> eine recht ausführliche Beschriebung der einzelnen Elemente und deren Eigenschaften.</p>
<p>Habt ihr SVG schon einmal eingesetzt? Welche Tools nutz ihr zur Erstellung und wo seht ihr die Grenzen von SVG? Über Kommentare würde ich mich wie immer freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/598/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PDF-Dokument ohne PDFlib mit PHP erzeugen</title>
		<link>http://kau-boys.de/581/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pdf-dokument-ohne-pdflib-mit-php-erzeugen</link>
		<comments>http://kau-boys.de/581/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen#comments</comments>
		<pubDate>Mon, 04 Jan 2010 17:45:47 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=581</guid>
		<description><![CDATA[Viele von euch werden wohl XAMPP benutzen, um lokal in PHP zu entwickeln und zu testen. In der Windows-Version enthält es auch die PHP-Extension PDFlib, die aber leider auf vielen Hostingpaketen mit Linux als Betriebssystem nicht enthalten ist. Da PDFlib mehrere hundert Euro Lizenzgebühren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von euch werden wohl <a href="http://www.apachefriends.org/">XAMPP</a> benutzen, um lokal in PHP zu entwickeln und zu testen. In der Windows-Version enthält es auch die PHP-Extension <a href="http://www.pdflib.com/">PDFlib</a>, die aber leider auf vielen Hostingpaketen mit Linux als Betriebssystem nicht enthalten ist. Da PDFlib mehrere hundert Euro Lizenzgebühren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose Alternativen gibt. Glücklicherweise gibt es Alternativen und eine sehr umfangreiche möchte ich euch kurz vorstellen.</p>
<h2>Die kostenlose TCPDF Library</h2>
<p>Nachdem ich ein paar kostenlose PDF Klassen für PHP getestet habe, hat sich ein klarer Sieger herausgestellt. <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf">Die Klasse TCPDF</a> zeichnet sich nicht nur durch seinen großen Funktionsumfang, sondern auch durch seine sehr gute Quellcode-Kommentierung und die <a href="http://www.tcpdf.org/doc/index.html">gute Dokumentation der Funktionen</a>.</p>
<p><span id="more-581"></span></p>
<h2>Ein einfaches Beispiel</h2>
<p>Um zu zeigen, wie einfach es ist eine PDF zu erzeugen hier ein kleines Beispiel. Und wie man es von einem Programmierbeispiel erwartet schreiben wir einen einfachen Text mit &#8220;Hallo Welt&#8221; in die PDF:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	require_once('tcpdf/tcpdf.php');

	$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
	$pdf-&gt;setPrintHeader(false);
	$pdf-&gt;setPrintFooter(false); 

	$pdf-&gt;SetFont('times', 'BI', 20);
	$pdf-&gt;AddPage();
	$pdf-&gt;Cell(0, 10, 'Hallo Welt!', 0, 1, 'C', 0, 'http://kau-boys.de');
	$pdf-&gt;Output('example1.pdf', 'I');
?&gt;
</pre>
<p>Zuerst wird die Klasse per <a href="http://de.php.net/manual/de/function.require.php">require</a> eingebunden. Anschließend erzeugen wir an neues TCPDF Objekt und weisen ihm als Orientierung Portrait (Hochformat) mit Millimeter als Einheit und einer Seitengröße im DIN A4 Format zu. Anschließend deaktivieren wir noch die Standard Kopf- und Fußzeile.</p>
<p>Mit <a href="http://www.tcpdf.org/doc/classTCPDF.html#af5d40d44c6433913765c780b1589bff0">setFont()</a> können wir die Schriftart, die Formatierung und die Schriftgröße festlegen. Jetzt fügen wir eine neue Seite hinzu und erzeugen eine Zelle mit unserem Text und einem Link. Zuletzt geben wir die Datei aus und der Browser zeigt sie direkt an. Alternativ kann auch der Download-Dialog erzwungen werden. Das Beispiel könnt ihr euch hier ansehen:</p>
<p><a href="http://kau-boys.de/beispiele/tcpdf/example1.php">Beispiel</a></p>
<p>Das Beispiel ist stark vereinfach und nutzt nur die allernötigsten Funktionen. Auf der Seite von TCPDF findet ihr auch <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples">eine Liste mit vielen weiteren Beispielen</a>, die ihr euch ansehen solltet. Sehr beeindruckend sind auch die Beispiele mit Formularen, die entweder mit Funktionen von TCPDF oder mit einem einfachen HTML-Formular erzeugt werden können.</p>
<p>Ich hoffe, dass euch das kleine Beispiel weiterhelfen konnte und euch dazu ermutigt hat, es einfach einmal selbst auszuprobieren. Über Kommentare würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/581/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Große Rechtschreibreform im WWW: HTML 5 heißt jetzt HTML5</title>
		<link>http://kau-boys.de/433/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5</link>
		<comments>http://kau-boys.de/433/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5#comments</comments>
		<pubDate>Tue, 20 Oct 2009 21:57:09 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=433</guid>
		<description><![CDATA[Manche werden sich jetzt vermutlich wundern, was mit dem Titel gemeint ist. Heute haben sich die beiden Organisationen WHATWG (Web Hypertext Application Technology Working Group) und W3C (World Wide Web Consortium) auf einen einheitlichen Namen für die nächste HTML Version geeinigt. Das W3C verwendete bisher die Schreibweise mit einem Leerzeichen und die WHATWG entsprechend ohne [...]]]></description>
			<content:encoded><![CDATA[<p>Manche werden sich jetzt vermutlich wundern, was mit dem Titel gemeint ist. Heute haben sich die beiden Organisationen <a href="http://www.whatwg.org">WHATWG</a> (Web Hypertext Application Technology Working Group) und <a href="http://www.w3.org">W3C</a> (World Wide Web Consortium) auf einen einheitlichen Namen für die nächste HTML Version geeinigt.</p>
<p>Das W3C verwendete bisher die Schreibweise mit einem Leerzeichen und die WHATWG entsprechend ohne Leerzeichen. Nachdem die Meldung in vielen Foren und Newsseiten die Runde gemacht hat, wurde heute um 13:43 Uhr bereits der <a href="http://de.wikipedia.org/wiki/HTML5">deutsche Wikipedia Artikel zu HTML5</a> geändert. Auch das W3C hat ihre <a href="http://dev.w3.org/html5/spec/Overview.html">Spezifikation zu HTML5</a> heute bereits angepasst.</p>
<p><span id="more-433"></span></p>
<p>Für manche von euch scheint das keine große Nachricht zu sein, aber jetzt haben wir endlich Gewissheit, wie wir HTML5 schreiben müssen. Ich finde die Schreibweise ohne Leerzeichen auch nur konsequent, da z.B. CSS3 auch keines enthält. Aber im Markup-Language Umfeld gibt es ja dann noch XHTML 1.0 und andere, die man mit Leerzeichen schreibt. Aber ohne würden die auch komisch aussehen. Ich trauere ja immer noch ein bisschen XHTML 2.0 nach, das zu Gunsten von HTML5 nicht weiter verfolgt wird. Aber hoffentlich lernen alle Web-Entwickler wenigstens in Zukunft validen HTML5 Quellcode zu schreiben.</p>
<p>Was meint ihr zu dem Thema? Ist das wirklich eine Nachricht wert, oder seid ihr der Meinung, das W3C und die WHATWG sollten sich eher um wichtigere Dinge kümmern? Ich würde mir z.B. endlich mal eine endgültige CSS3 Spezifikation wünschen, damit wir endliche Dinge wie Border-Radius und Schatten verwenden können.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/433/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

