<?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>t3n Magazin &#187; TECHNOLOGIE</title>
	<atom:link href="http://t3n.de/magazin/category/technologie/feed/" rel="self" type="application/rss+xml" />
	<link>http://t3n.de/magazin</link>
	<description>Open. Web. Business.</description>
	<lastBuildDate>Wed, 16 May 2012 10:14:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Frameworks und Gratis-Tools, die Webentwicklern das Leben erleichtern</title>
		<link>http://t3n.de/magazin/frameworks-andere-werkzeuge-webentwickler-weggefahrten-228544/</link>
		<comments>http://t3n.de/magazin/frameworks-andere-werkzeuge-webentwickler-weggefahrten-228544/#comments</comments>
		<pubDate>Mon, 07 May 2012 09:09:22 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=228544</guid>
		<description><![CDATA[Immer mehr Endgeräte, zahlreiche Konfigurationen und wachsende Ansprüche der Nutzer zwingen zu aufwändigen Internet-Auftritten, optisch wie technologisch. Open-Source-Frameworks und Gratis-Tools wollen deshalb Web-Entwicklern das Leben erleichtern. Was bleibt, ist die Qual der Wahl. Ein Wegweiser. Die Idee ist fixiert, die Entwicklung beginnt, es folgen die bekannten Aufgaben: Layout von Logik trennen, eine passende Datenbank finden [...]]]></description>
			<content:encoded><![CDATA[<p>Immer mehr Endgeräte, zahlreiche Konfigurationen und wachsende Ansprüche der Nutzer zwingen zu aufwändigen Internet-Auftritten, optisch wie technologisch. Open-Source-Frameworks und Gratis-Tools wollen deshalb Web-Entwicklern das Leben erleichtern. Was bleibt, ist die Qual der Wahl. Ein Wegweiser.</p>
<p><span id="more-228544"></span></p>
<p>
<figure id="attachment_230095" class="caption alignnone">
	<img class="size-large wp-image-230095" title="tec_frameworks_bild" src="http://t3n.de/magazin/wp-content/uploads/2011/11/tec_frameworks_bild-596x299.jpg" alt="tec frameworks bild" width="596" height="299" />
	<figcaption>Foto: joexx/Photocase</figcaption>
</figure>
</p>
<p>Die Idee ist fixiert, die Entwicklung beginnt, es folgen die bekannten Aufgaben: Layout von Logik trennen, eine passende Datenbank finden und die Browser-Unabhängigkeit gewährleisten. Doch das Rad rollt bereits, warum also neu erfinden? Und die angebotenen Frameworks und Tools sind keineswegs überladene Alleskönner. Vielmehr tendieren die Hersteller zu spezialisierten Lösungen, die keine Leistungseinbußen durch zuviel Funktionalität mit sich bringen. Es gilt daher die Devise: Je spezifischer die Anforderung, desto passender das Framework. Der Vielzahl der Angebote entsprechend erhebt dieser Rundgang keinen Anspruch auf Vollständigkeit, sondern liefert auf den folgenden Seiten und in der anschließenden Tabelle einen Überblick der wichtigsten Vertreter.</p>
<h2>CSS und HTML</h2>
<p>Gerade bei der Browser-Unabhängigkeit gibt es viel zu tun. Da verwundert es kaum, dass gerade auf diesem Gebiet zahlreiche Bibliotheken um die Gunst der Entwickler buhlen. Etwa, um das Design zu vereinheitlichen. Darum kümmern sich CSS-Frameworks wie „960 Grid System“. Das Framework teilt eine 960 Pixel breite Seite in zwölf oder sechzehn Spalten ein. Über CSS-Klassen werden HTML-Blockelemente dann auf die Spalten verteilt, um ein stets einheitlich ausgerichtetes Gerüst zu erhalten.</p>
<p>Eher Geschmackssache sind CSS-Frameworks, die für ein typografisch einheitliches Bild sorgen oder Formulare „verschönern“. Um entsprechend Einfluss nehmen zu können, enthalten manche solcher Bibliotheken HTML-Templates. Sie sorgen zudem für optimierte Tabellen, W3C-konforme HTML-Mails oder bringen mit „Hacks“ technologisch humpelnde Browser wieder auf die Beine.</p>
<p>In eine gänzlich andere Kerbe schlagen „less“ und „Sass“: Sie erlauben den Einsatz von Funktionen, Variablen und Verschachtelungen in eigenem <a href="http://bit.ly/kZS9bf" >CSS</a>-Code [1]. Das erleichtert etwa den Umgang mit Farbcodes oder mehrfach eingesetzten Effekten.</p>
<h2>JavaScript</h2>
<p>Ebenfalls der Browser-Unabhängigkeit geschuldet sind JavaScript-Frameworks. Sie verkürzen und vereinheitlichen Standard-Befehle der Skriptsprache, etwa den mühseligen Zugriff auf einzelne HTML-Elemente via „document.getElementById('id').style.display = 'none'“. Die Bibliothek „Prototype“ macht daraus ein simples „$('id').hide()“. Natürlich unabhängig vom verwendeten Browser und inklusive diverser Abfragen, ob das Element überhaupt existiert.</p>
<p>Neben derartiger Entwickler-Freiheit liegt die Stärke der JavaScript-Frameworks vor allem in der Usability: Tabellen sortieren, Inhalte verstecken und Formular-Eingaben auf ihre Richtigkeit prüfen funktioniert ohne Server-seitigen Code und mittels weniger Zeilen JavaScript. Auch AJAX, die portionierbare Server-Kommunikation durch die Hintertür, Drag and Drop und diverse Animationen sind mit den Bibliotheken möglich.</p>
<h2>Rich Internet Applications (RIA)</h2>
<p>Von einer Rich Internet Application ist die Rede, wenn der Nutzer mit der Seite interagieren kann, als befände er sich in einer Desktop-Anwendung. In die Klasse der „RIAs“ rutschen also sämtliche Frameworks, die das Erstellen solcher Applikationen unterstützen. Dass in dieser Kategorie mit „jQuery UI“ ein Namensvetter des JavaScript-Frameworks „jQuery“ auftaucht, ist also nur mitnichten Zufall: Die RIA-Version der Bibliothek enthält neben CSS- und JavaScript-Bibliothek ordnerweise Bilder und Symbole, die je nach Farbschema der eigenen Seite eingebunden werden.</p>
<p>Doch nicht nur mit HTML, CSS und JavaScript sind Anwendungen realisierbar, auch über Browser-Plugins wie Flash oder Silverlight ist ein beinahe natives Erlebnis möglich. Entsprechend warten Adobe und Microsoft mit Frameworks auf, um die Entwicklung solcher Applikationen zu erleichtern. Vorraussetzungen dafür sind neben einem entsprechend motivierten Benutzer vor allem ein Betriebssystem und ein Browser, die das Plugin auch zulassen. Was nach einem lächerlichen Apple-Adobe-Streit klingt, erlangt durch die stetig steigende Zahl mobiler Geräte neue Bedeutung.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/frameworks-andere-werkzeuge-webentwickler-weggefahrten-228544/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web-Apps entwickeln mit HTML, CSS3 und JavaScript</title>
		<link>http://t3n.de/magazin/web-apps-entwickeln-native-app-effekt-228688/</link>
		<comments>http://t3n.de/magazin/web-apps-entwickeln-native-app-effekt-228688/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 13:31:30 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=228688</guid>
		<description><![CDATA[Die Frage, ob man besser eine native App oder eine plattformunabhängige Web-App entwickeln sollte, wird aktuell rege diskutiert. Die Antwort darauf ist abhängig von der Komplexität und den Eigenschaften, die eine mobile Applikation aufweisen soll. Wir zeigen, was plattformunabhängige Web-Apps bereits können und welche Vor- und Nachteile sie gegenüber ihren nativen Geschwistern haben. &#160; Eine [...]]]></description>
			<content:encoded><![CDATA[<p>Die Frage, ob man besser eine native App oder eine plattformunabhängige Web-App entwickeln sollte, wird aktuell rege diskutiert. Die Antwort darauf ist abhängig von der Komplexität und den Eigenschaften, die eine mobile Applikation aufweisen soll. Wir zeigen, was plattformunabhängige Web-Apps bereits können und welche Vor- und Nachteile sie gegenüber ihren nativen Geschwistern haben.</p>
<p><span id="more-228688"></span></p>
<p>&nbsp;</p>
<p>
<figure id="attachment_230107" class="caption alignnone">
	<img class="size-large wp-image-230107" title="More Application on Mobile [Konvertiert]" src="http://t3n.de/magazin/wp-content/uploads/2011/11/tec_web_apps_bild-596x283.jpg" alt="tec web apps bild" width="596" height="283" />
	<figcaption>Foto: kimberrywood/iStock</figcaption>
</figure>
Eine Web-App ist eine Website, die für mobile Endgeräte aufbereitet wird und dank der kommenden Internet-Standards HTML5 und CSS3 sowie der Skriptsprache JavaScript Eigenschaften einer nativen App erhält. Sie wird gewöhnlich mit dem internen Browser geöffnet und auf dem Homescreen verknüpft.</p>
<p>Die Entwicklung kann dabei auf verschiedene Arten erfolgen: Entweder entwickelt man eine Web-App programmatisch und hat die volle Kontrolle über den Quellcode. Oder man verwendet Frameworks, die durch ihre vordefinierten Templates und Funktionen die Entwicklung erheblich erleichtern (können).</p>
<h2>Web-App in Handarbeit</h2>
<p>Ein Vorteil der Web-App-Programmierung ist der einfache Einstieg für Web-Entwickler, da sie keine neue Programmiersprache erlernen müssen, sondern ihr bisheriges Wissen in die Entwicklung einer mobilen Website einfließen lassen können. So sieht eine einfache App, die ein Bild und eine Überschrift anzeigt, kaum anders aus als eine herkömmliche HTML-Seite. Allerdings wird diese später auch offline verfügbar sein.</p>
<h2>Only for iPhone</h2>
<p>Ruft man diese Website mit dem iPhone (ab iOS 3.0) auf, so wird, während die Inhalte
der Startseite geladen werden, ein so genannter Splashscreen, also ein
Lade-Bild, angezeigt („apple-touch-startup-image“). Das Meta-Tag „viewport“
legt die Auflösung fest, mit der die Seite vom Browser gerendert werden
soll. Im Beispiel soll die Auflösung des Geräts verwendet werden. Zusätzlich
wird die initiale Skalierung der Seite festgelegt und ob der Inhalt der
Seite durch den User skaliert werden darf (etwa durch „Pinch to Zoom“).</p>
<div class="article_code_box"><span class="article_code_title">Eine einfache Web-App</span></p>
<pre>&lt;?xml version=„1.0“ encoding=„utf-8“?&gt;
&lt;!DOCTYPE html&gt;
&lt;html manifest=„config/cache.manifest“&gt;
&lt;head&gt;
 &lt;title&gt;A simple Web-App&lt;/title&gt;
 &lt;meta name=„viewport“ content=„width=device-width, initial-scale=1.0, user-scalable=no“ /&gt;
 &lt;meta name=„apple-mobile-web-app-capable“ content=„yes“ /&gt;
 &lt;meta name=„apple-mobile-web-app-status-bar-style“ content=„black“ /&gt;
 &lt;link rel=„apple-touch-icon“ href=„images/icon.png“ /&gt;
 &lt;link rel=„apple-touch-startup-image“ href=„images/splashscreen.png“ /&gt;
 &lt;link rel=„stylesheet“ href=„css/simple.css“ type=„text/css“ media=„screen,mobile“ /&gt;
 &lt;script type=„text/javascript“ xsrc=„js/simple.js“&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;header&gt;
 &lt;h1&gt;Eine einfache Web-App&lt;/h1&gt;
 &lt;/header&gt;
 &lt;section id=„content“&gt;
 &lt;img xsrc=„images/picture.jpg“ /&gt;
 &lt;/section&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><span class="article_code_subtitle">Listing 1</span></p>
</div>
<p><figure id="attachment_228689" class="caption alignleft">
	<img title="Im Grunde ist eine Web-App nichts anderes als eine optimierte Webseite." src="http://t3n.de/magazin/wp-content/uploads/2011/11/dms_de1420a307b4342fd911d5b7f1337275-113x170.jpg" alt="Im Grunde ist eine Web-App nichts anderes als eine optimierte Webseite." width="113" height="170" />
	<figcaption>Im Grunde ist eine Web-App nichts anderes als eine optimierte Webseite.</figcaption>
</figure></p>
<p>Die drei Meta-Tags in Listing 1 werden derzeit nur von iOS interpretiert. Alle anderen mobilen Betriebssysteme ignorieren diese Tags, sodass sich keine Komplikationen dadurch ergeben.</p>
<p>Setzt man das Attribut „content“ beim Meta-Tag „apple-mobile-web-app-capable“ auf „yes“, so wird die Web-App nach dem Aufruf über den Homescreen im Vollbild-Modus ohne Browser-Leiste angezeigt. „apple-mobile-web-app-status-bar-style“ definiert das Aussehen der Status-Leiste und kann einen der folgenden Werte annehmen:</p>
<ul>
<li>default (grau)</li>
<li>black (schwarz)</li>
<li>black-translucent (schwarz, transparent)</li>
</ul>
<h2>App-Icon</h2>
<p>Um die Web-App mit dem Homescreen des iPhones zu verknüpfen, wird ein Icon in der Größe 114x114 Pixel im Format PNG benötigt. An dieser Stelle besteht die Möglichkeit, mehrere „apple-touch-icons“ mit unterschiedlichen Größen anzugeben. Für das Beispiel wird die Icon-Größe des iPhone 4 verwendet, da die älteren iPhones dieses Icon in einer akzeptablen Qualität herunterrechnen können.</p>
<p>Android unterstützt App-Icons ab Version 2.1, das passende Tag heißt „apple-touch-icon-precomposed“. Wird ausschließlich dieses Tag verwendet, stellt das iPhone das App-Icon allerdings ohne die Standard-Effekte wie abgerundete Ecken, Schattierungen und Reflexionen dar; das Icon gilt dann als „precomposed“.</p>
<div class="article_code_box"><span class="article_code_title">Icon für Android</span></p>
<pre>&lt;link rel=„apple-touch-icon-precomposed“ href=„icon_android.png“ /&gt;</pre>
<p><span class="article_code_subtitle">Listing 2</span></p>
</div>
<h2>Offline arbeiten</h2>
<p>Eine wichtige Eigenschaft von Web-Apps ist es, Inhalte auch offline verfügbar machen zu können. HTML5 stellt Webseiten dafür einen sogenannten Application Cache zur Verfügung, mit dessen Hilfe Inhalte auch ohne Netzverbindung verwendet werden können. Die Einbindung dieses Caches ist recht einfach, da es sich hierbei um ein Manifest handelt, das in Form einer Textdatei vorliegen muss.</p>
<div class="article_code_box"><span class="article_code_title">Application-Cache-Manifest</span></p>
<pre>CACHE MANIFEST
# 2011-10-26 Version 1.0

CACHE:
index.html
css/simple.css
js/simple.js
images/splashscreen.png
images/picture.jpg

NETWORK:

FALLBACK:
*.html /offline.html</pre>
<p><span class="article_code_subtitle">Listing 3</span></p>
</div>
<p><figure id="attachment_228690" class="caption alignleft">
	<img title="Die Web-App unterscheidet sich auf dem Homescreen nicht von den nativen Apps." src="http://t3n.de/magazin/wp-content/uploads/2011/11/dms_5f884d2352a5b4ffdf32075586289f2c-113x170.jpg" alt="Die Web-App unterscheidet sich auf dem Homescreen nicht von den nativen Apps." width="113" height="170" />
	<figcaption>Die Web-App unterscheidet sich auf dem Homescreen nicht von den nativen Apps.</figcaption>
</figure></p>
<p>Im CACHE-Bereich des Manifests werden alle Ressourcen angegeben, die vom Browser zwischengespeichert werden sollen. Unter NETWORK werden alle Ressourcen aufgelistet, die nicht speicherbar sind. Dazu zählen etwa Schnittstellen wie jene der Twitter-API. Sollten bestimmte Resourcen nicht verfügbar sein, so können im FALLBACK-Bereich Alternativen festgelegt werden. Im Beispiel wird festgelegt, dass für jede nicht vorhandene HTML-Seite die Datei „offline.html“ angezeigt werden soll.</p>
<p>Der Application Cache wird durch das Attribut „manifest“, das den Pfad zum Manifest enthält, im HTML-Tag aktiviert. Damit der Browser das Cache-Manifest interpretieren kann, muss dieses mit dem MIME-Type „text/cache-manifest“ vom Server ausgeliefert werden.</p>
<h2>Cache aktualisieren</h2>
<p>Um den Cache einer Web-App zu aktualisieren, leert der Benutzer entweder den Browser-Cache oder der Inhalt des Cache-Manifests ändert sich. Es reicht also nicht aus, dass sich der Inhalt einer Datei ändert. Im Beispiel-Manifest wird deshalb ein Datum und eine Versionsnummer in Form eines Kommentars verwendet. Ändert sich eine Datei, reicht es, im Manifest das Datum und die Version anzupassen, um der Web-App Änderungen mitzuteilen.</p>
<h2>Design, Layout und UX</h2>
<p>Um der Web-App einen nativen App-Look zu verpassen, kommen diverse CSS3-Eigenschaften zum Einsatz. CSS3 erfährt eine breite Unterstützung unter den mobilen Browsern, daher stellt es für Web-App-Entwickler ein äußerst nützliches Werkzeug dar. Einige der Eigenschaften im Überblick:</p>
<ul>
<li>Eigene Schriftarten in eine Webseite zu integrieren ist eigentlich kein neues Feature von CSS3, denn „@font-face“ wurde bereits mit CSS2 eingeführt. In der neuen Version unterstützt „@font-face“ jedoch beliebige TrueType- oder OpenType-Schriftarten.</li>
</ul>
<div class="article_code_box"><span class="article_code_title">TrueType- und OpenType-Schriftarten mit CSS3</span></p>
<pre>@font-face {
 font-family: Monospace;
 src: url('fonts/own_monospace.otf');
}</pre>
<p><span class="article_code_subtitle">Listing 4</span></p>
</div>
<ul>
<li>Dank CSS3 können Texte und Boxen mit einem Schatten versehen werden, ohne dafür spezielle Grafiken laden zu müssen. Das Rendering der Schatten ist allerdings sehr rechenintensiv, daher sollte sparsam mit diesen optischen Elementen umgegangen werden.</li>
</ul>
<div class="article_code_box"><span class="article_code_title">Schatten mit CSS3</span></p>
<pre>/* Die erzeugten Schatten sind nach oben und rechts je zwei Pixel breit. Der dritte
* Parameter bestimmt den Blur-Effekt, der letzte die Farbe des Schattens. */
box-shadow: 2px 2px 2px #000;
text-shadow: 2px 2px 2px #000;</pre>
<p><span class="article_code_subtitle">Listing 5</span></p>
</div>
<ul>
<li>Auch abgerundete Kanten und Verläufe können mit CSS3-Bordmitteln realisiert werden. Aufgrund der neuen Tags sind auch hier die Grafiken überflüssig, was die Performance verbessert und damit die Ladezeit verkürzt.</li>
</ul>
<div class="article_code_box"><span class="article_code_title">Abgerundete Kanten mit CSS3</span></p>
<pre>/* Vier Angaben im Uhrzeigersinn für jede Ecke */
border-radius: 5px 5px 5px 5px;

/* Zwei Angaben, wodurch die untere linke Ecke den Wert der oberen linken und die
* rechte untere Ecke den Wert der rechten oberen Ecke übernimmt */
border-radius: 5px 5px;

/* Eine Angabe für alle vier Ecken */
border-radius: 5px;</pre>
<p><span class="article_code_subtitle">Listing 6</span></p>
</div>
<div class="article_code_box"><span class="article_code_title">Farbverläufe mit CSS3</span></p>
<pre>/* Parameter eins legt fest, ob der Verlauf linear oder radial verläuft.
* X- und Y-Koordinaten legen den Start- und Endpunkt (2. und 3. Parameter) fest.
* Die beiden letzten Parameter schließlich definieren die beteiligten Farben. */
-webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#0000FF);</pre>
<p><span class="article_code_subtitle">Listing 7</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/web-apps-entwickeln-native-app-effekt-228688/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Responsive Webdesign: Mit CSS3-Mediaqueries Webseiten flexibel aufbauen</title>
		<link>http://t3n.de/magazin/anpassungsfahig-228011/</link>
		<comments>http://t3n.de/magazin/anpassungsfahig-228011/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 07:59:20 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=228011</guid>
		<description><![CDATA[Vorbei die Zeiten, in denen sich Webentwickler auf Webseiten nur innerhalb einer verbindlich maximalen Standardbreite austoben durften. Smartphones und Tablets fordern aufgrund ihrer physikalischen Größe Tribut. Doch wie erreicht man, dass Webseiten überall gut aussehen? „Reaktionsfähiges Webdesign“ passt Inhalte automatisch der zur Verfügung stehenden Darstellungsgröße an. Das Anforderungsprofil einer Webseite kann man schnell auf einen [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://t3n.de/magazin/wp-content/uploads/2011/08/dms_ae45d66ec1e72d7647df0d3c13c211ee.jpg"><img src="http://t3n.de/magazin/wp-content/uploads/2011/08/dms_ae45d66ec1e72d7647df0d3c13c211ee.jpg" alt="dms ae45d66ec1e72d7647df0d3c13c211ee" title="dms_ae45d66ec1e72d7647df0d3c13c211ee" width="550" height="224" class="alignnone size-full wp-image-228012" /></a>Vorbei die Zeiten, in denen sich Webentwickler auf Webseiten nur innerhalb einer verbindlich maximalen Standardbreite austoben durften. Smartphones und Tablets fordern aufgrund ihrer physikalischen Größe Tribut. Doch wie erreicht man, dass Webseiten überall gut aussehen? „Reaktionsfähiges Webdesign“ passt Inhalte automatisch der zur Verfügung stehenden Darstellungsgröße an.</p>
<p><span id="more-228011"></span></p>
<p>Das Anforderungsprofil einer Webseite kann man schnell auf einen Nenner bringen: Der Anwender sollte eine Seite jederzeit erreichen und benutzen können – egal ob am großen Bildschirm daheim, am Laptop im Café oder auf dem Smartphone in der U-Bahn. Es geht darum, Inhalte bereitzustellen, die der User ohne Mühe immer und überall konsumieren kann.</p>
<p>Das ist auch im Sinne eines jeden Webseitenbetreibers, denn schließlich möchte man keinen Besucher ausschließen, nur weil dieser zufällig gerade per Smartphone im Web unterwegs ist. Betrachtet man die Desktop-Version für große Monitore als gesetzt, hat ein Webentwickler drei Möglichkeiten, eine mobile Variante bereitzustellen:</p>
<ul>
<li>Er liefert die Webseite eins zu eins mit der vollen Gesamtbreite (gewöhnlich ab 900 oder gar 1100 Pixel) auch an Smartphones aus. Der Benutzer muss bei dieser Variante oft zoomen, um Texte lesen zu können, Bilder anzuschauen oder um einen Überblick zu erhalten, welche Bereiche der Webseite er sich näher ansehen möchte.</li>
<li>Der Webentwickler liefert zusätzlich zur Desktop-Version eine mobile Variante einer Webseite aus – mit eigenem Design und möglicherweise sogar eigenen Inhalten. Der Benutzer erhält eine grafisch reduzierte Variante, kann schnell durch die Inhalte surfen, hat aber auch keinen Zugriff auf die Inhalte der Desktop-Version.</li>
<li>Die Webseite passt sich automatisch der Darstellungsgröße des Browsers an. Bei großen Bildschirmen geizt man nicht mit Platz und die Inhaltselemente zeigen eine große Typographie und viel Whitespace. Bei kleinen Bildschirmen arrangieren sich die Elemente der Webseite hingegen so, dass die Darstellung auch bei Platzmangel überzeugen kann – ohne dass der Benutzer zoomen muss.</li>
</ul>
<p>Letzteres klingt doch mal richtig gut, oder? Responsive Web Design
macht es möglich. Mit den neuen Möglichkeiten von HTML5, CSS3 und
JavaScript können Webentwickler vorgeben, wie sich die
Webseite der Darstellungsgröße anpasst und nicht, wie sich der Benutzer
an die Webseite anpassen muss, um die Inhalte zu konsumieren. Das
funktioniert unter anderen dank CSS3-Mediaqueries.</p>
<h2>CSS3-Mediaqueries</h2>
<p>
<figure id="attachment_228012" class="caption aligncenter">
	<img src="http://t3n.de/magazin/wp-content/uploads/2011/08/el-sendero-del-cacao.jpg" alt="Die Seite „El Sendero del Cacao“ passt sich der Browserbreite an." title="El Sendero del Cacao" width="550" height="224" class="size-full wp-image-228012" />
	<figcaption>Die Seite „El Sendero del Cacao“ passt sich der Browserbreite an.</figcaption>
</figure>
</p>
<p>Mit den CSS3-Mediaqueries kann man ein HTML-Element je nach Eigenschaft des darzustellenden Browsers ein anderes Aussehen verpassen. So könnte man die Seite auf einem Desktop-Rechner mit großem Bildschirm mehrspaltig nebeneinander zeigen. Neben der breiten Inhaltsspalte hätten dann noch zwei oder sogar drei Randspalten mit Zusatzinformationen Platz. Auf Smartphones hingegen müsste man den Inhalt linear, also unter- und nacheinander aufreihen, damit der Anwender den Inhalt einfacher lesen kann. Bei identischem HTML können Webentwickler so ein wenig mit CSS nachhelfen. Ein Konstrukt mit Mediaqueries könnte so aussehen:</p>
<h3>Mediaqueries innerhalb einer CSS-Datei</h3>
<pre class="prettyprint lang-css linenums"><code>@media screen and (max-width: 768px) and (orientation: portrait) {
	.meinElement {
		background-color: #c22;
	}
}</code></pre>
<p>Zur Erklärung: Man gibt dem Element mit der CSS-Klasse „meinElement“ eine rote Hintergrundfarbe, wenn der Bildschirm eine Breite von 768 Pixeln nicht überschreitet und im Falle eines mobilen Gerätes im Hochformat gehalten wird.</p>
<p>Ein knappes Dutzend Eigenschaften <a title="Media Features" href="http://reference.sitepoint.com/css/mediaqueries" >[1]</a> wie width/height, device-width/device-height oder sogar device-aspect-ratio kann man mit den Mediaqueries zwar nicht ausgeben, aber sich je nach Unterstützung durch den jeweiligen Browser zur Nutze machen.</p>
<p>So kann man also zuvor definierte Eigenschaften eines HTML-Elements in CSS für Auflösungen unter einer bestimmten Breite (max-width für den Browser und max-device-width für das Gerät insgesamt) oder über einer bestimmten Breite (min-width/min-device-width) überschreiben.</p>
<p>Die Mediaqueries kann man auf unterschiedliche Art und Weise einbinden, um sie zu nutzen. Als gesonderte Stylesheet im HTML:</p>
<pre class="prettyprint lang-html"><code>&lt;link rel="stylesheet" href="bigscreen.css" media="screen and (min-width: 1024px)"&gt;</code></pre>
<p>als @import-Regel innerhalb eines Stylesheets:</p>
<pre class="prettyprint lang-html"><code>@import url("bigscreen.css") screen and (min-width: 1024px);</code></pre>
<p>oder eben auch als Block um CSS-Definition, wie im oberen Beispiel zu „.meinElement“.</p>
<p>Damit die Mediaqueries überhaupt greifen, und da das ständige rein- und rauszoomen den Lesefluss schnell trüben kann, gilt es, die Verkleinerung zu unterbinden. Vom iPhone kennt man dieses Verhalten: Der Browser zeigt eine große
Webseite verkleinert auf dem Display an, mit einem Doppeltip auf das
Display oder einer Wischgeste kann man einen Bereich vergrößern. Dazu hat Apple ein HTML-Meta-Element für den &lt;head&gt; einer Seite eingeführt, das sich mittlerweile zum de-facto-Standard gemausert hat:</p>
<pre class="prettyprint lang-html"><code>&lt;meta name="viewport" content="initial-scale=1.0, width=device-width"&gt;</code></pre>
<p>Mit ihm setzt man den Zoom-Level auf 1.0 (100%) und gibt an, dass der Darstellungsbereich des Browsers genau so breit sein soll wie die Bildschirmbreite. Dass ist wichtig, denn auch ein iPhone mit der Bildschirmbreite von 768 Pixeln soll genau 768 Pixel darstellen. Das verhindert – Unterstütztung des Browsers vorausgesetzt – das Rein- und Rauszoomen und damit die lästige Arbeit beim Surfen.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/anpassungsfahig-228011/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TYPO3-Websites vor Hackerangriffen schützen</title>
		<link>http://t3n.de/magazin/webseiten-server-typo3-schutzen-website-gehackt-mal-228548/</link>
		<comments>http://t3n.de/magazin/webseiten-server-typo3-schutzen-website-gehackt-mal-228548/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 15:36:37 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=228548</guid>
		<description><![CDATA[Die Unternehmens-Präsenz einer international operierenden Firma und die Website des Kaninchenzüchter-Vereins haben eines gemein: Sie sind Teil des World Wide Web und damit global erreichbar – für Kunden, Kaninchenliebhaber, aber auch für Hacker. Denn sie sind ein potenzielles Angriffsziel. Dabei ist es keineswegs so, dass die Unternehmens-Website eher zum Ziel wird. Umso wichtiger ist es [...]]]></description>
			<content:encoded><![CDATA[<p>Die Unternehmens-Präsenz einer international operierenden Firma und die Website des Kaninchenzüchter-Vereins haben eines gemein: Sie sind Teil des World Wide Web und damit global erreichbar – für Kunden, Kaninchenliebhaber, aber auch für Hacker. Denn sie sind ein potenzielles Angriffsziel. Dabei ist es keineswegs so, dass die Unternehmens-Website eher zum Ziel wird. Umso wichtiger ist es daher, für den Fall der Fälle vorbereitet zu sein.</p>
<p><span id="more-228548"></span></p>
<p>&nbsp;</p>
<p>
<figure id="attachment_230010" class="caption alignnone">
	<img class="size-large wp-image-230010" title="Access code" src="http://t3n.de/magazin/wp-content/uploads/2011/11/tec_typo3_website_hack-596x349.jpg" alt="tec typo3 website hack" width="596" height="349" />
	<figcaption>Foto: olly/Fotolia</figcaption>
</figure>
</p>
<p>Im Jahr 2011 war das Thema Sicherheit im Internet medial präsenter denn je. Nicht nur in den einschlägigen Kreisen, sondern auch in den klassischen Massenmedien Radio, Fernsehen und Zeitung wurde viel darüber berichtet. Hacker-Gruppierungen wie „LulzSec“ oder „Anonymous“ haben anhand prominenter Beispiele gezeigt, dass sogar die „großen“ Firmen offensichtlich nicht genug in die Absicherung ihrer eigenen Systeme investieren. Ob nun die GEMA, Sony oder gar die CIA – Hacker sind in ihre Systeme eingedrungen und haben sich entweder geheime Informationen angeeignet oder aber die Websites lahmgelegt. Das zeigt auch, dass auf diesem Gebiet aktuell sowohl Wissensmangel als auch Handlungsbedarf besteht.</p>
<p>Dem Kompromittieren (Hacken) einer Website liegen unterschiedliche Motivationen zugrunde. Es können Freizeit-Spaß, Ruhm und (Hacker-)Ehre oder aber schlicht finanzielle Interessen sein. Denn dem finanziell motivierten Hacker kommt die Kaninchenzüchter-Website gerade recht, wenn er dort ohne viel Aufwand ein paar Links zu dubiosen pharmazeutischen Händlern unterbringen kann. Wer eine Internetseite betreibt, sollte deshalb grundsätzlich damit rechnen, Angriffsversuchen ausgesetzt zu sein. Dabei ist es egal, ob für die Website WordPress, Drupal, TYPO3 oder einfache HTML-Seiten im Einsatz sind. Im Folgenden wird generell auf die Problematik eingegangen, wobei TYPO3 an einigen Stellen als Beispiel dient.</p>
<h2>Was ist eine sichere Internetseite?</h2>
<p>Allgemein gesprochen gilt etwas als sicher, wenn die Integrität, Erreichbarkeit und Vertraulichkeit gewährleistet ist. Eine Website ist unsicher, wenn unerwünschte Inhalte untergebracht werden können, sie gar keine Inhalte mehr liefert oder der Zugriff auf vertrauliche Informationen möglich ist. Eine Internetseite sicher zu betreiben bedeutet also, eben dies zu verhindern. Was einfach klingt, kann aber durchaus eine komplexe und aufwändige Angelegenheit sein. Grundsätzlich gilt: Je größer der Schaden sein kann, desto mehr Aufwand muss man in die Absicherung investieren. Die CIA wird hier zwar sicher mehr Budget haben als die Kaninchenzüchter, trotzdem können beide Seiten ausreichend abgesichert werden. Handlungsbedarf besteht aber nicht nur, nachdem eine Website kompromittiert wurde, sondern schon vorher. Und dafür gibt es vier überlebenswichtige Grundregeln.</p>
<h2>1. Updates</h2>
<p>Es ist unerlässlich, die eingesetzte Software auf dem Server (bspw. TYPO3), aber auch den eigenen PC, der ja zur Administration der Website verwendet wird, aktuell zu halten. Dadurch werden zumindest bekannt gewordene Sicherheitslücken geschlossen. Für Software auf dem PC wird man in den meisten Fällen benachrichtigt, sobald Updates vorhanden sind. Für Benachrichtigungen über Aktualisierungen der eingesetzten Software auf Server-Seite abonniert man am besten die entsprechenden Newsletter, Mailinglisten oder RSS-Feeds. <a href="http://bit.ly/9n1A8i" >Im Falle von TYPO3 ist das etwa die Mailing-Liste</a> [1]. Ebenfalls eine gute Anlaufstelle ist <a href="http://www.heise.de/security/news/news.rdf" >Heise Security</a> [2], die über alle bekannt gewordenen Sicherheitsprobleme berichten.</p>
<p><figure id="attachment_228549" class="caption aligncenter">
	<img title="Die wichtigsten Kriterien für Sicherheit." src="http://t3n.de/magazin/wp-content/uploads/2011/11/dms_9a80cab948689274ce5cec28479cc23f-596x540.jpg" alt="Die wichtigsten Kriterien für Sicherheit." width="596" height="540" />
	<figcaption>Die wichtigsten Kriterien für Sicherheit.</figcaption>
</figure></p>
<h2>2. Backups</h2>
<p>Die Nützlichkeit und Notwendigkeit, ein regelmäßiges Backup anzufertigen, liegt auf der Hand. Allein um das Sicherheits-Kriterium der Erreichbarkeit gewährleisten zu können, wenn es zu Datenverlust durch Fehlbedienung oder Fehlfunktion kommt. Ebenso unabdingbar ist die Verfügbarkeit eines Backups, wenn eine Website nach einem erfolgreichen Agriff kompromittiert und verändert wurde.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/webseiten-server-typo3-schutzen-website-gehackt-mal-228548/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Einer für alle: Single-Sign-On für Websites</title>
		<link>http://t3n.de/magazin/website-login-alle-229654/</link>
		<comments>http://t3n.de/magazin/website-login-alle-229654/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 10:11:11 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=229654</guid>
		<description><![CDATA[Seit Jahren spricht niemand mehr von Data Portability, und auch der Hype um OpenID flacht aus vielerlei guten Gründen immer weiter ab. Es ist an der Zeit, Bilanz zu ziehen, die Themen „Online Identity“ und „Single Sign-On“ neu anzugehen und aus den Fehlern der letzten Jahre zu lernen. Ein Ausblick. Die OpenID-Foundation [1] hat Single [...]]]></description>
			<content:encoded><![CDATA[<p>Seit Jahren spricht niemand mehr von Data Portability, und auch der Hype um OpenID flacht aus vielerlei guten Gründen immer weiter ab. Es ist an der Zeit, Bilanz zu ziehen, die Themen „Online Identity“ und „Single Sign-On“ neu anzugehen und aus den Fehlern der letzten Jahre zu lernen. Ein Ausblick.</p>
<p><span id="more-229654"></span></p>
<p>Die <a href="http://openid.net/" >OpenID</a>-Foundation [1] hat Single Sign-On sicherlich nicht erfunden, aber sie hat es, zumindest in Entwicklerkreisen, populär gemacht. Während die wenigsten Netizens etwas mit den Begriffen SAML, Information Card oder Shibboleth anfangen können, sind die meisten doch auf irgendeine Art mit OpenID in Berührung gekommen.</p>
<p>Denn die Mission der OpenID-Foundation ist die Entwicklung eines Standards zum sicheren, schnellen und einfachen Login. Trotz großer Partner wie Google, Yahoo, MySpace und AOL hat OpenID aber ironischerweise genau das Gegenteil bewirkt.</p>
<p><figure id="attachment_229655" class="caption alignleft">
	<img title="Das OpenID-Plugin für WordPress setzt voraus, dass sich der Nutzer mit OpenID auskennt." src="http://t3n.de/magazin/wp-content/uploads/2012/02/dms_0e92dbcc2a3dd5ffc4059cf8bb4802cd-114x170.jpg" alt="Das OpenID-Plugin für WordPress setzt voraus, dass sich der Nutzer mit OpenID auskennt." width="114" height="170" />
	<figcaption>Das OpenID-Plugin für WordPress setzt voraus, dass sich der Nutzer mit OpenID auskennt.</figcaption>
</figure></p>
<p>Um den Ansprüchen von Google und Yahoo gerecht zu werden, <a href="http://willnorris.com/2009/07/openid-directed-identity-identifier-select" >wurde OpenID um etliche, teilweise optionale, Funktionen erweitert</a> [2]. Da aber nicht jede Plattform die gleichen Anforderungen an einen Identity-Provider hat oder die Ressourcen zur Umsetzung fehlen, gibt es heute eine Vielzahl von OpenID-Servern, die sich technisch so sehr unterscheiden wie Facebooks Connect von „Sign in with Twitter“.</p>
<p>Auf der anderen Seite stehen eben jene gerade Erwähnten, Twitter und Facebook, die sich, unter anderem wegen der enormen Komplexität, bewusst gegen OpenID und für OAuth entschieden haben.</p>
<p>Doch nicht nur auf technischer Seite wurden Fehler begangen. Bis heute sind die Themen OpenID und Single Sign-On keine Themen für die breite Masse. Statt an der <a href="http://factoryjoe.com/blog/2009/04/06/does-openid-need-to-be-hard/" >Usabitity</a> [3] oder einer einheitlichen Oberfläche zu arbeiten, sorgte noch mehr Technik für noch weniger Akzeptanz. Nutzer mussten den Begriff OpenID kennen, URLs als Identifier akzeptieren und verstehen, warum ein Google-Login für einen Login an anderer Stelle wichtig ist.</p>
<p>Nach <a href="http://openid.net/get-an-openid/what-is-openid/" >Angaben der OpenID-Foundation</a> sind derzeit knapp eine Milliarde Nutzerkonten als OpenID nutzbar [4] ; das <a href="http://www.webmonkey.com/2011/01/openid-the-webs-most-successful-failure/" >macht den Standard wohl zu „The Web's Most Successful Failure“</a> [5]. Letztes Jahr hat die OpenID-Foundation eine Menge ähnlicher Kritiken einstecken müssen. Bekannte Firmen wie 37signal entschlossen sich im Laufe der Zeit dafür, sich von dem offenen Standard zu distanzieren.</p>
<p>Die OpenID-Foundation scheint diese Vorwürfe und Abgänge aber ernst zu nehmen und arbeitet an diversen Projekten, um die bisher begangen Fehler in den Griff zu bekommen. Doch auch andere Organisationen und Firmen arbeiten an möglichen Alternativen.</p>
<h2>Google Identity Toolkit</h2>
<p>Durch das Chaos der unterschiedlichen OpenID-Implementierungen und der vielen alternativen Identity-Provider wie Facebook und Twitter ist ein ganz neues Geschäftsmodell entstanden. Unternehmen wie Janrain, Ping-Identity oder Gigya verdienen ihr Geld mit Login-Mechanismen „as a Service“. Der jüngste Dienstleister in diesem Sektor ist Google mit seinem <a href="http://code.google.com/apis/identitytoolkit/" >Identity Toolkit</a> [6].</p>
<p><figure id="attachment_229656" class="caption aligncenter">
	<img title="Die Benutzeroberfläche des Identity-Toolkits orientiert sich an den Vorgaben des Account-Choosers." src="http://t3n.de/magazin/wp-content/uploads/2012/02/dms_1e0eca812e573763e99fc15a1725716d-596x292.jpg" alt="Die Benutzeroberfläche des Identity-Toolkits orientiert sich an den Vorgaben des Account-Choosers." width="596" height="292" />
	<figcaption>Die Benutzeroberfläche des Identity-Toolkits orientiert sich an den Vorgaben des Account-Choosers.</figcaption>
</figure></p>
<p>Das Toolkit lässt sich über eine relativ simple JavaScript-API implementieren und übernimmt die komplette Logik des Anmeldeprozesses. Damit schaffen Google und Janrain das, was OpenID eigentlich leisten wollte: Sie implementieren einen einfachen und standardisierten Single-Sign-On-Weg. Das Identity Toolkit ist aber vor allem deshalb interessant, weil es als erster Service den, von der OpenID-Foundation entwickelten, Account Chooser anbietet.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/website-login-alle-229654/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>TYPO3: Zehn Tipps &amp; Tricks für Extbase und Fluid</title>
		<link>http://t3n.de/magazin/zehn-tipps-tricks-extbase-fluid-227639/</link>
		<comments>http://t3n.de/magazin/zehn-tipps-tricks-extbase-fluid-227639/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 13:15:27 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=227639</guid>
		<description><![CDATA[Immer mehr TYPO3-Entwickler setzen auf die Kombination aus Extbase (MVC) und Fluid (Templating). Wer von dieser Art zu programmieren infiziert ist, kommt so schnell nicht mehr davon los. Wir leisten mit zehn Praxistipps Entwicklungshilfe. Fluid-Snippets in Netbeans Mag. Artikel Heft 24 Bei der Arbeit mit Fluid fallen zwei Dinge sofort auf: Es ist sehr viel [...]]]></description>
			<content:encoded><![CDATA[<p>Immer mehr TYPO3-Entwickler setzen auf die Kombination aus Extbase (MVC) und Fluid (Templating). Wer von dieser Art zu programmieren infiziert ist, kommt so schnell nicht mehr davon los. Wir leisten mit zehn Praxistipps Entwicklungshilfe.<span id="more-227639"></span></p>
<h2>Fluid-Snippets in Netbeans</h2>
<p>Mag. Artikel Heft 24</p>
<p>Bei der Arbeit mit Fluid fallen zwei Dinge sofort auf: Es ist sehr viel Code nötig, und durch die zunächst ungewöhnliche Notation entstehen immer wieder Fehler, die man schwer findet. Da wäre eine Art Snippet-Verzeichnis praktisch, mit dem man oft benötigte Code-Fragmente auf Knopfdruck einfügen kann. Zumindest für die beliebte IDE Netbeans <a title="Netbeans" href="http://www.netbeans.org" >[1]</a> gibt es nun etwas Derartiges – so genannte Code Templates <a title="MVC-Mailingliste" href="http://bit.ly/k1dozf" >[2]</a>. Eine überarbeitete und erweiterte Version der Datei findet sich außerdem bei Typovision <a title="Netbeans Code-Templates" href="http://bit.ly/jGOwj5" >[3]</a>.</p>
<table class="table">
<tbody>
<tr>
<td class="table_header" valign="top mceVisualAid">Code</td>
<td class="table_header" valign="top mceVisualAid">Code-Fragment</td>
</tr>
<tr>
<td valign="top mceVisualAid">alias</td>
<td valign="top mceVisualAid">&lt;f:alias map="{key:value}"&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">base</td>
<td valign="top mceVisualAid">&lt;f:base /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">ts bzw. cobject</td>
<td valign="top mceVisualAid">&lt;f:cObject typoscriptObjectPath="path"&gt;&lt;/f:cObject&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">count</td>
<td valign="top mceVisualAid">&lt;f:count subject="{objects}" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">cycle</td>
<td valign="top mceVisualAid">&lt;f:cycle values="{array}" as="value"&gt;&lt;/f:cycle&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">debug</td>
<td valign="top mceVisualAid">&lt;f:debug title="debugname"&gt;{debug_var}&lt;/f:debug&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">esc bzw. escape</td>
<td valign="top mceVisualAid">&lt;f:escape&gt;text&lt;/f:escape&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">flash</td>
<td valign="top mceVisualAid">&lt;f:renderFlashMessages /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">for</td>
<td valign="top mceVisualAid">&lt;f:for each="{array}" as="value" key="key"&gt;&lt;/f:for&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">crop</td>
<td valign="top mceVisualAid">&lt;f:format.crop maxCharacters="15" append="&amp;nbsp;[...]"&gt;&lt;/f:format.crop&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">currency</td>
<td valign="top mceVisualAid">&lt;f:format.currency currencySign="sign" decimalSeparator="dsep" thousandsSeparator="tsep"&gt;&lt;/f:format.currency&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">date</td>
<td valign="top mceVisualAid">&lt;f:format.date format="d.m.Y-H:i:s"&gt;&lt;/f:format.date&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">html</td>
<td valign="top mceVisualAid">&lt;f:format.html parseFuncTSPath="lib.parseFunc"&gt;&lt;/f:format.html&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">nl2br</td>
<td valign="top mceVisualAid">&lt;f:format.nl2br&gt;&lt;/f:format.nl2br&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">number</td>
<td valign="top mceVisualAid">&lt;f:format.number decimals="decimals" decimalSeparator="dsep" thousandsSeparator="tsep"&gt;&lt;/f:format.number&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">padding</td>
<td valign="top mceVisualAid">&lt;f:format.padding padLength="length" padString="string"&gt;&lt;/f:format.padding&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">printf</td>
<td valign="top mceVisualAid">&lt;f:format.printf arguments="arguments"&gt;&lt;/f:format.printf&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">form</td>
<td valign="top mceVisualAid">&lt;f:form action="action" controller="controller" object="{object}" name="name" arguments="arguments" &gt;&lt;/f:form&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">checkbox</td>
<td valign="top mceVisualAid">&lt;f:form.checkbox property="property" checked="{condition}" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">errors</td>
<td valign="top mceVisualAid">&lt;f:form.errors for="for"&gt;{error.propertyName} {error.message} {error.code}&lt;/f:form.errors&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">hidden</td>
<td valign="top mceVisualAid">&lt;f:form.hidden name="name" value="value" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">password</td>
<td valign="top mceVisualAid">&lt;f:form.password property="property" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">radio</td>
<td valign="top mceVisualAid">&lt;f:form.radio property="property" checked="{condition}" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">select</td>
<td valign="top mceVisualAid">&lt;f:form.select property="property" options="{key:value}"
optionLabelField="labelfield"
optionValueField="valuefield" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">submit</td>
<td valign="top mceVisualAid">&lt;f:form.submit value="value" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">textarea</td>
<td valign="top mceVisualAid">&lt;f:form.textarea property="property" rows="rows" cols="cols" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">textfield bzw. input</td>
<td valign="top mceVisualAid">&lt;f:form.textfield property="property" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">upload</td>
<td valign="top mceVisualAid">&lt;f:form.upload property="property" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">group</td>
<td valign="top mceVisualAid">&lt;f:groupedFor each="{array}" as="items" groupBy="group_by" groupKey="group_key"&gt;{group_key}:&lt;f:for each="{items}" as="value" key="key"&gt;&lt;/f:for&gt;
&lt;/f:groupedFor&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">if</td>
<td valign="top mceVisualAid">&lt;f:if condition="{condition}"&gt;&lt;/f:if&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">ife</td>
<td valign="top mceVisualAid">&lt;f:if condition="{condition}"&gt; &lt;f:then&gt;&lt;/f:then&gt;&lt;f:else&gt;&lt;/f:else&gt;&lt;/f:if&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">img bzw. image</td>
<td valign="top mceVisualAid">&lt;f:image src="source" alt="alt" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">layout</td>
<td valign="top mceVisualAid">&lt;f:layout name="name" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">section</td>
<td valign="top mceVisualAid">&lt;f:section name="name"&gt;&lt;/f:section&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">render</td>
<td valign="top mceVisualAid">&lt;f:render partial="name" arguments="arguments" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">link</td>
<td valign="top mceVisualAid">&lt;f:link.action action="action" controller="controller"&gt;&lt;/f:link.action&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">linka</td>
<td valign="top mceVisualAid">&lt;f:link.action action="action" controller="controller" arguments="{key:value}"&gt;&lt;/f:link.action&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">extlink</td>
<td valign="top mceVisualAid">&lt;f:link.external uri="url" &gt;&lt;/f:link.external&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">email</td>
<td valign="top mceVisualAid">&lt;f:link.email email="email" /&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">page</td>
<td valign="top mceVisualAid">&lt;f:link.page pageUid="uid"&gt;&lt;/f:link.page&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">securityifa</td>
<td valign="top mceVisualAid">&lt;f:security.ifAuthenticated"&gt;&lt;f:then&gt;&lt;/f:then&gt;&lt;/f:security.ifAuthenticated"&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">securityifh</td>
<td valign="top mceVisualAid">&lt;f:security.ifHasRole" role="role"&gt; &lt;f:then&gt;&lt;/f:then&gt;&lt;/f:security.ifHasRole"&gt;</td>
</tr>
<tr>
<td valign="top mceVisualAid">trans bzw. translate</td>
<td valign="top mceVisualAid">&lt;f:translate key="key" /&gt;</td>
</tr>
</tbody>
</table>
<p>Nach dem Download lassen sich die Templates in Netbeans über „Einstellungen, Import“ laden. In den Import-Optionen reicht ein „All“ und „OK“. Nach einem Neustart stehen die Code-Templates zur Verfügung. Um nun ein Code-Template zu verwenden, reicht in einer Fluid-Datei (Typ: HTML) ein Code-Schnipsel aus der abgedruckten Tabelle. Ein anschließender Klick auf Tab fügt das zugehörige Fragment ein.</p>
<h2>String-Vergleiche in Fluid</h2>
<p>Im If-ViewHelper von Fluid kann man über die Eigenschaft „condition“ nahezu alles vergleichen – Zahlen (kleiner, größer, gleich), Booleans (TRUE, FALSE) etc. – nicht jedoch auf Gleichheit mit einem String. Einem Bugtracker-Eintrag zufolge sei das schwierig zu implementieren.</p>
<p>Aber gerade eine solche Abfrage braucht man in der Praxis relativ oft. Man kann nun anfangen, über den Alias-ViewHelper eben einen Alias für den abzufragenden String zu erstellen und gegen diesen zu prüfen. Das bringt allerdings zwei Nachteile mit sich: Für jeden abzufragenden String müsste der in Frage kommende Programmteil mit einem Alias-ViewHelper ummantelt werden. Außerdem wird der Code unübersichtlich, da an der Stelle der Überprüfung nun nicht mehr der Prüfstring selbst, sondern der Alias verwendet wird – beides also suboptimal. Auch das Schreiben eines eigenen ViewHelper scheint nicht adäquat.</p>
<p>Aber es geht auch einfacher: Die beiden Operatoren müssen dazu lediglich in ein Array verwandelt werden und schon funktioniert der Vergleich wie gewünscht.</p>
<div class="article_code_box"><span class="article_code_title">String-Vergleich in Fluid</span></p>
<pre>&lt;f:if condition="{0:blog.title} == {0:'Testtitel'}"&gt;
	Funktioniert: Der Titel lautet 'Testtitel'.
&lt;/f:if&gt;</pre>
<p><span class="article_code_subtitle">Listing 1</span></p>
</div>
<h2>Kommentare im ViewHelper</h2>
<p>Um im anfänglichen Code-Gewusel der Views den Überblick nicht zu verlieren, eignen sich Kommentare zur Strukturierung. Da man sich aber letztlich in HTML befindet, ist es eben nur möglich, HTML-Kommentare zu verwenden. Diese allerdings sind im Quellcode selbst sichtbar.</p>
<p>Eine andere Lösung muss also her. Hier bietet es sich an, einen eigenen ViewHelper zu erstellen, der nichts anderes macht, als Kommentare nicht anzuzeigen: Nach der Installation der Extension „efempty“ – diese enthält ein Extbase/Fluid-Grundgerüst – wird der ViewHelper um eine Klasse erweitert. Im Verzeichnis Classes/ViewHelpers/ genügt dafür eine Datei CommentViewHelper.php mit folgendem Inhalt:</p>
<div class="article_code_box"><span class="article_code_title">CommentViewHelper.php</span></p>
<pre>&lt;?php
class Tx_Efempty_ViewHelpers_CommentViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
	public function render() {
		return '';
	}
}
?&gt;</pre>
<p><span class="article_code_subtitle">Listing 2</span></p>
</div>
<p>Anschließend reicht überall dort, wo der ViewHelper verwendet wird, eine Namespace-Anweisung am Anfang der Datei.</p>
<div class="article_code_box"><span class="article_code_title">Namespace im View</span></p>
<pre>{namespace tv = Tx_Efempty_ViewHelpers}
...
&lt;tv:comment&gt; Hier können Sie nun beliebig kommentieren. Sie können sogar andere ViewHelper auskommentieren! :-)&lt;/tv:comment&gt;</pre>
<p><span class="article_code_subtitle">Listing 3</span></p>
</div>
<h2>Übersetzte Fehlermeldungen</h2>
<p>Wer mittels „&lt;f:form.errors&gt;{error.propertyName} {error.message} {error.code}&lt;/f:form.errors&gt;“ Fehlermeldungen ausgibt, wird schnell feststellen, dass diese lediglich in englischer Sprache erscheinen. Übersetzen lassen sich die Ausgaben nicht, denn bislang sind sie hart kodiert (dies soll sich zukünftig ändern).</p>
<p>Um dieses Problem zu lösen, ist etwas Fantasie nötig: Für jeden Fehler gibt es einen eindeutigen Code. Dieser besteht laut Vereinbarung aus dem Timestamp, an dem der Fehler „erfunden“ wurde. Daher kann davon ausgegangen werden, dass es in einem System nur einen Fehler mit eben dieser Meldung gibt. Somit kann über den Translate-ViewHelper und den Code als Schlüssel die Fehlermeldung übersetzt werden.</p>
<div class="article_code_box"><span class="article_code_title">Resources/Private/Language/locallang.xml</span></p>
<pre>&lt;languageKey index="de" type="array"&gt;
	&lt;label index="1221560718"&gt;Der Wert ist leer!&lt;/label&gt;
&lt;/languageKey&gt;</pre>
<p><span class="article_code_subtitle">Listing 4</span></p>
</div>
<div class="article_code_box"><span class="article_code_title">Im View</span></p>
<pre>&lt;f:translate key="{error.code}" /&gt;</pre>
<p><span class="article_code_subtitle">Listing 5</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/zehn-tipps-tricks-extbase-fluid-227639/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kanban: Entwicklungsprozesse im Produktionsablauf geschickt verschlanken</title>
		<link>http://t3n.de/magazin/kanban-simple-227559/</link>
		<comments>http://t3n.de/magazin/kanban-simple-227559/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 09:28:58 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=227559</guid>
		<description><![CDATA[Kanban befindet sich im Aufwind. Zwar liegt der Bekanntheitsgrad nach wie vor hinter Scrum, jedoch zu Unrecht. Lassen sich doch mit Kanbans schlankem Vorgehensmodell vor allem in der Support- und Wartungsphase von Projekten schnell verblüffende Ergebnisse erzielen. Kanban [1] ist ein relativ neues, schlankes Vorgehensmodell zum einfachen Verwalten von Entwicklungsprozessen. Man hat sich dabei die [...]]]></description>
			<content:encoded><![CDATA[<p>Kanban befindet sich im Aufwind. Zwar liegt der Bekanntheitsgrad nach wie vor hinter Scrum, jedoch zu Unrecht. Lassen sich doch mit Kanbans schlankem Vorgehensmodell vor allem in der Support- und Wartungsphase von Projekten schnell verblüffende Ergebnisse erzielen.<span id="more-227559"></span></p>
<p>Kanban <a title="Kanban" href="http://www.limitedwipsociety.org/" >[1]</a> ist ein relativ neues, schlankes Vorgehensmodell zum einfachen Verwalten von Entwicklungsprozessen. Man hat sich dabei die Grundprinzipien der – ursprünglich von Toyota für die Automobilindustrie entwickelten – „Lean Production“ zum Vorbild genommen und versucht, diese Prinzipien auf die Software-Entwicklung zu übertragen. Die wichtigsten Ideen daraus:</p>
<ul>
<li>Es soll eine gleichmäßige Arbeitsbelastung geschaffen werden. Engpässe und Lastspitzen sind zu vermeiden, da sie den gesamten Prozess verlangsamen. Alles ist „im Fluss“.</li>
<li>Produktionsfaktoren und Mitarbeiter müssen aus-, aber nicht überlastet sein. So lässt sich die Produktivität erhalten.</li>
<li>Nur der Nachschub wird extern organisiert („push“), in ihrem Aufgabenbereich arbeiten die Teams jedoch eigenverantwortlich und weisen sich Aufgaben selbst zu („pull“).</li>
</ul>
<h2>Einsatzgebiet</h2>
<p>Sobald ein Projekt ausgeliefert wurde, beginnt dessen Nachbetreuung, also die Support- und Maintenance-Phase. Diese ist gekennzeichnet durch viele kleine, kurz getaktete, oftmals unzusammenhängende Arbeitspakete von unterschiedlicher Priorität und Dauer. Aufgaben werden gern per Bugtracker-Ticket, Mail oder schlimmstenfalls mündlich zugewiesen.</p>
<p>Typischerweise befinden sich außerdem noch weitere Projekte in dieser Phase. Eine unübersichtliche Situation also, die sich kaum effektiv organisieren oder zumindest kontrollieren lässt. Und weder Scrum noch das alte Wasserfallmodell helfen hier weiter, da der Overhead beider Methoden einfach zu groß ist. Allein die Planungsdauer einer Sprintphase kann bereits den Umfang eines Arbeitspakets überschreiten. Hier nun liegen die Stärken von Kanban.</p>
<h2>Funktionsweise</h2>
<p>Das zentrale Element in Kanban ist das so genannte Kanban-Board, ein Whiteboard, auf das alle Mitarbeiter Zugriff haben. Das Board ist in verschiedene, frei definierbare Spalten aufgeteilt, die den Workflow des Entwicklerteams visualisieren. In diesen Spalten landen anschließend Arbeitspakete, die auf Karten notiert und priorisiert werden. Das Entwicklungsteam bedient sich anschließend selbst („Pull“ statt „Push“) und arbeitet so Paket für Paket ab. Ist eine Aufgabe erledigt, wandert das Paket eine Spalte weiter.</p>
<p>Was ein Paket ist, bestimmt das Team. Ebenso die Hürden, um von einer Spalte in die nächste zu kommen: Wichtig sind einheitliche Kriterien. So kann ein Paket alles sein, was länger als zwei Stunden und weniger als zwei Tage zur Umsetzung benötigt. Und als erledigt gilt ein Paket womöglich dann, wenn es tatsächlich ins Produktivsystem gespielt wurde. Auf diese Art lässt sich auch ein großes Arbeitspaket von mehreren Tagen Aufwand ganzheitlich nachverfolgen – von der Analyse bis zum Rollout.</p>
<p><figure id="attachment_227560" class="caption aligncenter">
	<img title="Ein Kanban-Board visualisiert die einzelnen Prozesschritte und ihren Status." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_61c1fe61ed790b2d8f551e0ae7fe7382-596x383.jpg" alt="Ein Kanban-Board visualisiert die einzelnen Prozesschritte und ihren Status." width="596" height="383" />
	<figcaption>Ein Kanban-Board visualisiert die einzelnen Prozesschritte und ihren Status.</figcaption>
</figure></p>
<p>Trotz geringer Reglementierung – ein Grundsatz Kanbans muss immer gelten: Jede Spalte hat ein eigenes „Work in Progress“-Limit (WiP-Limit), das nicht überschritten werden darf. Das WiP-Limit legt fest, wie viele Arbeitspakete sich gleichzeitig in einem Prozessschritt befinden dürfen. Es bestimmt sich somit aus der Entwicklungskapazität des Teams und verhindert damit dessen Überlastung. Auch Engpässe im Prozess fallen sofort auf. Ein Arbeitspaket, das partout nicht abgenommen wird, sorgt demnach für Stau in den vorhergehenden Schritten – in der Lehre des Kanban, die alles „im Fluss“ halten und gleichmäßig bewegen will, stellt das ein Problem dar, dem man sich umgehend annehmen muss.</p>
<h2>Messtechnik</h2>
<p>Kanban bietet vielfältige Metriken, um die Leistung eines Teams zu messen oder Flaschenhälse im Prozess aufzuspüren. So lässt sich etwa feststellen, wie lange ein Arbeitspaket braucht, um den gesamten Workflow zu durchlaufen („Cycle Time“). Diese Zahl stellt im Durchschnitt und auf alle Pakete gerechnet nichts anderes als die Entwicklungsgeschwindigkeit des Teams dar.</p>
<p>Ein „Cumulative Flow“-Diagramm hingegen deckt auf, in welchem Prozessschritt Engpässe auftreten und sich Arbeitspakete stauen. Dazu wird die Summe aller Pakete pro Prozessschritt in Abhängigkeit der Zeit gemessen. So kann man gezielt gegensteuern, indem man etwa das Abnahme/Testing-Team aufstockt, falls es bei der Abnahme immer wieder zu Verzögerungen kommt.</p>
<p><figure id="attachment_227561" class="caption aligncenter">
	<img title="Ein Cumulative-Flow-Diagramm macht Engpässe sichtbar – zu sehen an den Stellen, an denen die Linien stärker auseinander laufen." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_d263ced3199a809b0e51de66ea51644c-596x301.jpg" alt="Ein Cumulative-Flow-Diagramm macht Engpässe sichtbar – zu sehen an den Stellen, an denen die Linien stärker auseinander laufen." width="596" height="301" />
	<figcaption>Ein Cumulative-Flow-Diagramm macht Engpässe sichtbar – zu sehen an den Stellen, an denen die Linien stärker auseinander laufen.</figcaption>
</figure></p>
<p>Das Verwalten mehrerer Projekte ist ebenfalls problemlos zu bewerkstelligen, ohne für jedes Projekt ein neues Whiteboard aufstellen zu müssen. Dazu gibt es zwei unterschiedliche Ansätze: Ergänzt man das Board um weitere Zeilen („Swimlanes“), lassen sich diese jeweils einem bestimmten Projekt zuordnen. Alternativ sind Kanban-Karten in verschiedenen Farben gebräuchlich.</p>
<p><figure id="attachment_227562" class="caption aligncenter">
	<img title="Für unterschiedliche Projekte eignen sich entweder unterschiedlich gefärbte Karten oder eigene Zeilen auf dem Whiteboard." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_15f199f79f7344e803ce1a7a256d117e-596x225.jpg" alt="Für unterschiedliche Projekte eignen sich entweder unterschiedlich gefärbte Karten oder eigene Zeilen auf dem Whiteboard." width="596" height="225" />
	<figcaption>Für unterschiedliche Projekte eignen sich entweder unterschiedlich gefärbte Karten oder eigene Zeilen auf dem Whiteboard.</figcaption>
</figure></p>
<p>Auch online lässt sich das Kanban-Modell visualisieren. Entsprechende Werkzeuge wie Greenhopper <a title="Greenhopper" href="http://www.atlassian.com/software/greenhopper/" >[2]</a> oder das Kanban-Tool <a title="Kanban-Tool" href="http://kanbantool.com/" >[3]</a> sind aufgrund des zeit- und ortsunabhängigen Zugangs besonders bei verteilten Teams an unterschiedlichen Standorten sinnvoll.</p>
<h2>Fazit</h2>
<p>Nach einem Jahr Kanban-Nutzung in der Wartungsphase fällt das Urteil des Autors durchwegs positiv aus: Denn so simpel das Prinzip auch ist, in der Praxis zeigen sich verblüffende Effekte, sobald sich das Team darauf eingestellt hat. Durch die zentrale Bündelung aller Aufgaben am Kanban-Board gerät nichts in Vergessenheit.</p>
<p>Arbeitspakete werden nicht mehr per Mail oder gar auf Zuruf verteilt, sondern strukturiert erfasst und im Kontext der anderen Projekte betrachtet, was die Koordination der verschiedenen Aufgaben erheblich verbessert. Entwickler können sich endlich wieder auf die Entwicklung konzentrieren, anstatt ihre anstehenden Aufgaben verwalten zu müssen. Die WiP-Limits vermeiden indes eine Überlastung und störende Kontextwechsel zwischen verschiedenen Aufgaben. All das hat für erheblich mehr Ruhe und Konzentration im sonst hektischen Entwickleralltag gesorgt.</p>
<p>Aber auch das Projektmanagement profitiert von Kanban: Ein einziger Blick auf das Board sorgt für Transparenz und bringt einen schnellen Überblick. Wie hoch ist die Auslastung? Wer arbeitet gerade an welcher Aufgabe? Was steht als nächstes an? Aufwändige Status-Meetings und Nachfragen reduzieren sich von selbst auf ein kurzes, tägliches Stand-Up-Meeting vor dem Board. Die Arbeitsplanung und umständliche Lokalisierung freier Entwicklerkapazitäten wird vereinfacht, da letztlich nur noch Karten ans Board gepinnt werden müssen</p>
<p>Unterm Strich sorgt Kanban damit für eine höhere Mitarbeiterzufriedenheit und Produktivität, obschon das System (fast) ohne Regeln auskommt. Henrik Kniberg, Kanban-Evangelist, bemerkt dazu lapidar: „Just inches from „Do whatever“, but still surprisingly powerful“ <a title="Kanban and Scrum (Minibook)" href="http://bit.ly/5iznN1" >[4]</a>. Recht hat er.</p>
<div class="article_author_box">
<p class="article_author_header"><span>Der Autor</span></p>
<div class="article_author_description"><img title="Daniel Haller " src="http://t3n.de/magazin/wp-content/uploads/authors/6cf1ce325c9ef9cfce690eea4703d1aa_thumb.jpg" alt="Daniel Haller " />Daniel Haller studierte in Darmstadt Media System Design, wo er 2009 diplomierte. Seitdem arbeitet er als Technischer Manager und Entwickler bei der Frankfurter Agentur BlueMars.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/kanban-simple-227559/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wireframing: Von der Idee zur App</title>
		<link>http://t3n.de/magazin/idee-app-227593/</link>
		<comments>http://t3n.de/magazin/idee-app-227593/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 08:36:11 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=227593</guid>
		<description><![CDATA[„Ich habe da eine Idee für eine App!“ Das hört man des Öfteren. Entscheidend für den Erfolg einer App ist aber nicht nur eine wirklich gute Idee, sondern die richtige Herangehensweise bei der Konzeption. Dabei gibt es Basics, die jeder Konzepter kennen sollte, und nützliche Tools, die einem den Weg zur App erleichtern. Ob Furzkissen-App [...]]]></description>
			<content:encoded><![CDATA[<p>„Ich habe da eine Idee für eine App!“ Das hört man des Öfteren. Entscheidend für den Erfolg einer App ist aber nicht nur eine wirklich gute Idee, sondern die richtige Herangehensweise bei der Konzeption. Dabei gibt es Basics, die jeder Konzepter kennen sollte, und nützliche Tools, die einem den Weg zur App erleichtern.<span id="more-227593"></span></p>
<p>Ob Furzkissen-App oder die fünfundzwanzigste Taschenlampen-App, die Sinnhaftigkeit solcher Applikationen stellen nicht nur Entwickler, sondern mehr und mehr vor allem die Nutzer in Frage. Für jene, die ernsthafte Apps entwickeln, gilt: innovativ und neu, nutz- und gewinnbringend müssen sie sein. Bei über 300.000 Applikationen im iPhone App-Store machen Mehrwert, Nutzen genauso wie Usability den Erfolg künftiger Apps aus.</p>
<h2>Dasselbe Spiel, eine andere Liga</h2>
<p>Unabhängig von Idee und Plattform sind die Bedienbarkeit und damit die Akzeptanz der Nutzer entscheidend für den Erfolg einer App. Hierfür muss man sich von klassischen Webkonzepten lösen. Mobile Endgeräte stehen im Vergleich zu Desktop-Computern in einem völlig anderen Nutzungskontext. Wechselnde Lichtverhältnisse, akustische Beeinträchtigungen, Ablenkungen durch ein hektisches Umfeld sowie eine eventuell suboptimale Netzabdeckung sind da nur einige Faktoren, die man bei der Entwicklung mobiler Applikationen berücksichtigen muss. Aufgrund ihrer geringen Bildschirmgröße bieten Smartphones außerdem nur wenig Platz für Content und Bedienelemente. Diese veränderten Rahmenbedingungen diktieren die Anforderungen an das Konzept und die damit verbundene Usability einer mobilen Anwendung.</p>
<h2>Groovende Apps</h2>
<p>Setzt das Konzept auf bereits erlernte Interaktionsprinzipien und -elemente, mit denen der Nutzer durch sein jeweiliges Betriebssystem schon vertraut ist, findet er sich besser zurecht. Dadurch erleichtert man ihm den Einstieg schon ab der ersten Nutzung erheblich. Einen realen Mehrwert schafft das Einbeziehen von Funktionalitäten der Endgeräte. In der App-Gestaltung sollte man daher die gestenbasierte Steuerung auf Multi-Touch-Displays berücksichtigen.</p>
<p>Dazu zählen unter anderem doppeltes Antippen („Double-Tap“) oder Zoomen mit zwei Fingern („Pinching“). Die lagesensitive Steuerung ermöglicht dem Nutzer, sein Gerät vertikal oder horizontal zu halten, Inhalte passen sich entsprechend an. Ebenso birgt der Neigungssensor weitere ungeahnte Möglichkeiten. Die automatische Standortermittlung findet ihren Einsatz beim Auffinden von Personen, Orten oder Ereignissen in der Nähe.</p>
<h2>Jedes Pixel zählt</h2>
<p>
<figure id="attachment_229261" class="caption alignnone">
	<a href="http://t3n.de/magazin/idee-app-227593/absatz_spaltenlayout-2/" rel="attachment wp-att-229261"><img class="size-large wp-image-229261 " title="Absatz_SpaltenLayout" src="http://t3n.de/magazin/wp-content/uploads/2011/05/Absatz_SpaltenLayout-243x596.jpg" alt="Absatz SpaltenLayout" width="243" height="596" /></a>
	<figcaption>Single-Spalten-Layouts machen Inhalte scrollbar, sodass der Nutzer nicht zoomen muss.</figcaption>
</figure>
</p>
<p>Den geringen Platz richtig nutzen – eine Vorgabe, die durch die kleineren Bildschirmgrößen von mobilen Endgeräten eine Grundvoraussetzung für erfolgreiche Applikationen ist. Das heißt konkret, sich auf die essenziellen Funktionen zu konzentrieren und Inhalte zu reduzieren. Dabei kann der Einsatz eines Layouts mit nur einer Spalte helfen, das die gesamte Bildschirmbreite ausnutzt.</p>
<p>Obwohl Icons „small-screen-freundlich“ sind, da sie weniger Platz als Beschriftungen verbrauchen, ist es von entscheidender Bedeutung, dass die Nutzer diese auch verstehen. Um das Verständnis von Symbolen sicherzustellen, können kleine Textbeschreibungen unter dem Symbol stehen, speziell innerhalb einer Navigation. Dieser Kompromiss unterstützt unerfahrenere Nutzer, die mit dem Symbol weniger vertraut sind. Experten, die das Icon bereits kennen, werden dadurch jedoch nicht behindert. Ziel ist es, dass der Nutzer die App herunterlädt, öffnet und nutzt – ohne Erklärungen und ohne ein Herantasten. Applikationen für mobile Endgeräte müssen als „walk-up-and-use-system“ an den Markt gehen.</p>
<p><figure id="attachment_227595" class="caption aligncenter">
	<img title="Die Kombination von Symbol und Text ist gerade bei der Navigation ein Gestaltungsprinzip, das dem  Nutzer bereits bekannt ist." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_69fe61af2a54d215b7ce8987298abd17-596x120.jpg" alt="Die Kombination von Symbol und Text ist gerade bei der Navigation ein Gestaltungsprinzip, das dem  Nutzer bereits bekannt ist." width="596" height="120" />
	<figcaption>Die Kombination von Symbol und Text ist gerade bei der Navigation ein Gestaltungsprinzip, das dem Nutzer bereits bekannt ist.</figcaption>
</figure></p>
<h2>Finger sind keine Mauszeiger</h2>
<p>Konzepter müssen allerdings nicht nur eine Sichtbarkeit der Buttons und Links auf dem Touchscreen gewährleisten, sondern auch die Bedienung mit dem Finger optimal ermöglichen. Daher muss man bei der Konzeption die Bedienelemente in einer entsprechenden Größe und mit ausreichend Raum platzieren. Nur so minimiert man die Wahrscheinlichkeit einer falschen Berührung.</p>
<h2>Everything as simple as possible</h2>
<p>Auch die beste Tastatur eines Smartphones kann einer Computertastatur mit entsprechender Größe nicht das Wasser reichen. Anwender machen auf dem mobilen Endgerät weit mehr Fehler und sind langsamer beim Tippen. Daher sollte man Texteingaben innerhalb einer Applikation so häufig wie möglich vermeiden. Lösungen hierfür sind zum Beispiel, den Nutzern den Zugriff auf bereits gespeicherte Daten zu erlauben oder eine PIN statt eines Passworts zu verwenden. Eine innovative Form für den Input von Informationen besteht in der Verwendung von QR-Codes – sie sind nützlich und machen Spaß.</p>
<h2>Gib mir Feedback</h2>
<p>Direktes Feedback ist wichtiger als je zuvor. Nach einer Interaktion zwischen Nutzer und Applikation muss der Nutzer Feedback darüber bekommen, was gerade passiert beziehungsweise was bereits geschehen ist. Das fängt bei Ladevorgängen an und hört beim Tap auf eine Interaktionsfläche auf. Je nach mobilem Nutzungskontext ist die Internetanbindung nicht mit gleicher Qualität gewährleistet. Ein Ladekreisel unterstützt den User dabei zu verstehen, dass die Anwendung gerade im Hintergrund arbeitet. Die farbliche Veränderung bei Berührung einer Schaltfläche verdeutlicht, dass diese tatsächlich aktiviert wurde. Speziell bei Touchscreen-Geräten ist dieses Feedback von Bedeutung. Zusätzlich zur visuellen Rückmeldung eignen sich auch die gerätespezifischen Funktionalitäten, wie die Vibration. Diese Features sprechen gleich mehrere Sinne des Users an.</p>
<p><figure id="attachment_227596" class="caption aligncenter">
	<img title="Durch die farbliche Veränderung bei Berührung einer Schaltfläche wird verdeutlicht, dass diese tatsächlich aktiviert wurde." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_bea719fe22055a59e4529f477c2c5a9f-596x435.jpg" alt="Durch die farbliche Veränderung bei Berührung einer Schaltfläche wird verdeutlicht, dass diese tatsächlich aktiviert wurde." width="596" height="435" />
	<figcaption>Durch die farbliche Veränderung bei Berührung einer Schaltfläche wird verdeutlicht, dass diese tatsächlich aktiviert wurde.</figcaption>
</figure></p>
<h2>Nützliche Werkzeuge für erfolgreiche Konzepte</h2>
<p>Die Anforderungen der Zielgruppen sind das A und O für den Erfolg einer
Anwendung. Diverse Werkzeuge helfen dabei, sich den Anforderungen der
Nutzer anzunähern und diese gleichzeitig dem Kunden zu vermitteln. Der
Einsatz von Rollenmodellen (Personas) und Nutzungsszenarien (Use Cases)
unterstützen dabei, sich in den Nutzer hineinzuversetzen und ihn
greifbar zu machen. Für die Auswahl der konzeptionellen Tools gibt es kein Nonplusultra. Individuelles Eingehen auf Projekt und Auftraggeber ist unabdingbar. Die Auswahl ist abhängig von Abstraktionsfähigkeit und technischem sowie gestalterischem Background des Kunden. Ebenso ist der zeitliche Rahmen des Projekts ein Auswahlkriterium für die Art des zu liefernden konzeptionellen Ergebnisses.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/idee-app-227593/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSS leicht gemacht &#8211; wichtige Kniffe für mehr Übersicht</title>
		<link>http://t3n.de/magazin/css-leicht-gemacht-227553/</link>
		<comments>http://t3n.de/magazin/css-leicht-gemacht-227553/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 11:55:46 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=227553</guid>
		<description><![CDATA[Wer Webseiten baut, kommt an CSS nicht vorbei. Und dank breiter CSS3-Unterstützung der Browser bieten sich die Stylesheets zunehmend für komplexere Aufgaben an, etwa abgerundete Ecken oder Schattierungen. Mit wachsendem Einsatz nehmen aber auch Umfang und Komplexität der CSS-Dateien zu. Höchste Zeit also, die Wartung der Layouts mit Hilfsmitteln zu vereinfachen. &#160; Beim Bau einer [...]]]></description>
			<content:encoded><![CDATA[<p>Wer Webseiten baut, kommt an CSS nicht vorbei. Und dank breiter CSS3-Unterstützung der Browser bieten sich die Stylesheets zunehmend für komplexere Aufgaben an, etwa abgerundete Ecken oder Schattierungen. Mit wachsendem Einsatz nehmen aber auch Umfang und Komplexität der
CSS-Dateien zu. Höchste Zeit also, die Wartung der Layouts mit Hilfsmitteln zu vereinfachen.<span id="more-227553"></span></p>
<p>
<figure id="attachment_229277" class="caption alignnone">
	<img class="size-large wp-image-229277" title="iStock_000014840887Medium_7io_bearb" src="http://t3n.de/magazin/wp-content/uploads/2011/05/iStock_000014840887Medium_7io_bearb-596x366.jpg" alt="iStock 000014840887Medium 7io bearb" width="596" height="366" />
	<figcaption>(Bildnachweis: io7/iStock)</figcaption>
</figure>
</p>
<p>&nbsp;</p>
<p>Beim Bau einer CSS-Datei kommt es nicht selten vor, dass man für verschiedene Elemente ähnliche oder gar redundante Anweisungen vornimmt. Bestes Beispiel hierfür sind Farbangaben. Aber auch Angaben für Formatierungen, Abstände oder Größen weisen häufig Abhängigkeiten innerhalb einer oder mehrerer CSS-Dateien auf. Ein Programmierer würde hier wiederkehrende Elemente zentral definieren, Vorlagen verwenden und den eigentlichen CSS-Quellcode anschließend generieren lassen. Genau das ist der Ansatz von Syntactically Awesome Stylsheets (SASS) <a title="SASS" href="http://sass-lang.com/" >[1]</a>. CSS-Stylesheets werden um Möglichkeiten erweitert, die Zusammenhänge zwischen verschiedenen Angaben in Form einer eigenen „Sprache“ notieren.</p>
<p>Eines der Ziele bei der Entwicklung der nächsten TYPO3-Generation 5.x (Codename „Phoenix“) war es, wo möglich auf Grafiken zu verzichten und gestalterische Elemente durch die reine Verwendung von HTML und CSS abzubilden. Dies erleichtert dann auch die einfache und zentrale Anpassbarkeit. Entsprechend verwundert es wenig, dass sich die Entwickler entschieden, die CSS-Angaben mit Hilfe von SASS aus zentralen Layout-Definitionen zu generieren.</p>
<p>Bei SASS existieren zwei verschiedene Syntax-Varianten. Die klassische Syntax (Dateiendung .sass) verzichtet auf Klammern und setzt stattdessen auf Einrückungen zur Gliederung von Elementen. Die ab SASS3 unterstützte „SCSS“-Syntax („Sassy CSS“, dt.: freches CSS, Dateiendung .scss) hingegen setzt auf CSS3, verwendet also Klammern und erweitert CSS um zusätzliche Möglichkeiten. Innerhalb eines Projekts ist es auch möglich, SASS- und SCSS-Syntax zu mischen. Je Datei findet aber jeweils nur eine Syntax Anwendung. Im Folgenden liegt der Fokus auf der SCSS-Syntax.</p>
<h2>Erste Schritte</h2>
<p>Das Werkzeug zur Umwandlung von SCSS/SASS-Code in CSS-Code selbst ist in Ruby geschrieben. Aber keine Angst: Wer das Tool nicht im Kern erweitern, sondern einfach nur nutzen möchte, benötigt keine Ruby-Kenntnisse. Nach Installation des Ruby-Gems „haml“ per „gem install haml“ ist das SASS-Tool auch schon für den ersten Einsatz bereit. Wer ein HAML-Paket seiner Linux-Distribution nutzen möchte, sollte beachten, dass dies die SCSS-Syntax erst ab Version 3.0 unterstützt.</p>
<p>Mit „sass style.scss:style.css“ ist die Konvertierung einer einzelnen Datei möglich. Alternativ können hier auch Quell- und Zielverzeichnis angegeben werden, die dann rekursiv abgearbeitet werden. Mit „sass --watch style.scss:style.css“ ist es außerdem möglich, einen Live-Modus zu aktivieren, bei dem die Quelldateien auf Änderungen beobachtet und die Zieldateien automatisch neu generiert werden.</p>
<p>Wie die Ausgabe aussieht, bestimmt das „--style“-Attribut. Standardmäßig aktiv ist „nested“; Einrückungen also, die die CSS-Hierarchie leserlich darstellen. Alternativ lassen sich die Angaben über „compressed“ auf das Nötigste reduzieren oder mittels „compact“ auf eine Zeile komprimieren.</p>
<h2>Variablen</h2>
<p>Jede gültige CSS3-Datei ist automatisch auch eine gültige SCSS-Datei. Ein zu Beginn häufig verwendetes Beispiel ist die zentrale Definition von Farben und Größenangaben mit Hilfe von Variablen. Diese werden in der Form „$variablenname“ angegeben, gefolgt von einem Doppelpunkt sowie dem gewünschten Wert, der selbst eine gültige CSS-Angabe ist. Auch ist es möglich, einfache mathematische Konstrukte wie Additionen oder Multiplikationen zu nutzen. Für diverse andere Anwendungen stehen sogar Funktionen bereit, etwa zur Berechnung von Farbwerten.</p>
<div class="article_code_box"><span class="article_code_title">Variablen und Funktionen</span></p>
<pre>$dark-white: #f1f1f1;
$grey: lighten(#000000, 20%);
$light-grey: #9e9e9e;
$small-radius: 3px;
$mid-radius: 5px;

a.link-help {
	color: $light-grey;
}

div.button {
	width: 20px - 2*$small-radius;
}</pre>
<p><span class="article_code_subtitle">Listing 1</span></p>
</div>
<p>Wiederkehrende Angaben lassen sich auch per „mixin“ auslagern und dann über „include“ an verschiedenen Stellen nutzen. Dabei ist die Angabe von optionalen Parametern möglich – ganz im Stil programmierter Funktionen.</p>
<div class="article_code_box"><span class="article_code_title">Mixin und Include</span></p>
<pre>@mixin rounded-corners-middle-right {
	-moz-border-radius: 0 $mid-radius $mid-radius 0;
	-webkit-border-radius: $mid-radius;
}

@mixin spacing($margin: 5px) {
	margin-right: $margin;
}

.errorMessages {
	@include rounded-corners-middle;
	@include spacing(10px);
	border: 1px solid #000000;
}</pre>
<p><span class="article_code_subtitle">Listing 2</span></p>
</div>
<h2>Verschachteln</h2>
<p>Besonders hilfsreich ist die Verwendung von verschachtelten Angaben. Sie erleichtern den Überblick, geben den Definitionen klare Strukturen und ermöglichen auf einfache Weise beispielsweise die Umbenennung einer class-Angabe.</p>
<div class="article_code_box"><span class="article_code_title">Einrücken und verschachteln</span></p>
<pre>table.menu {
	background-color: blue;
	td.active {
		font-weight: bold;
		label {
			margin-left:10px;
		}
	}
}

div.headline {
	font: {
		weight: bold;
		size: 1.2em;
	}
}</pre>
<p><span class="article_code_subtitle">Listing 3</span></p>
</div>
<div class="article_code_box"><span class="article_code_title">Ergebnis in CSS</span></p>
<pre>table.menu { background-color: blue; }
table.menu td.active { font-weight: bold; }
table.menu td.active label { margin-left: 10px; }
div.headline { font-weight: bold; font-size: 1.2em; }</pre>
<p><span class="article_code_subtitle">Listing 4</span></p>
</div>
<h2>Vererben</h2>
<div class="article_code_box"><span class="article_code_title">Vererbung</span></p>
<pre>.important {
	font-weight:bold;
}
.headline {
	font-size:1.2em;
}
.importantErrorheadline {
	@extend .important;
	@extend .headline;
	color: red;
}</pre>
<p><span class="article_code_subtitle">Listing 5</span></p>
</div>
<p>Durch die Vererbung von einem oder mehreren Selektoren ist es möglich,
selbst komplizierte Abhängigkeiten einfach und strukturiert abzubilden.
Auch ist die Vererbung entlang einer Kette von Selektoren ist möglich.</p>
<div class="article_code_box"><span class="article_code_title">Ergebnis in CSS</span></p>
<pre>.important, .importantErrorheadline { font-weight: bold; }
.headline, .importantErrorheadline { font-size: 1.2em; }
.importantErrorheadline { color: red; }</pre>
<p><span class="article_code_subtitle">Listing 6</span></p>
</div>
<h2>Auslagern und Einbinden</h2>
<p>Wiederkehrende Werte und Definitionen werden bestenfalls bereits zu Beginn ausgelagert. Dies ermöglicht es, die im weiteren Verlauf eines Projekts üblicherweise stetig steigende Komplexität der CSS-Angaben auf ein überschaubares Maß zu reduzieren. Auch lassen sich so Module in verschiedenen CSS-Dateien zentral und einfach wiederverwenden. Dank mathematischer Ausdrücke und Funktionen lassen sich so Ursprungswerte wie die zu verwendende Bildschirmbreite zentral ändern und abhängige Werte automatisch neu berechnen.</p>
<div class="article_code_box"><span class="article_code_title">Einbinden</span></p>
<pre>@include „Dateiname“;</pre>
<p><span class="article_code_subtitle">Listing 7</span></p>
</div>
<p>Beginnt der Dateiname mit einem
Unterstrich, signalisiert dies SASS übrigens, dass die Datei nicht in eine
eigenständige CSS-Datei zu konvertieren ist. Sie wird stattdessen lediglich als Modul
innerhalb anderer Dateien genutzt.</p>
<h2>Fazit</h2>
<p>Die Möglichkeit beispielsweise Längen, Abstände und Farben zentral zu definieren erhöht die Übersichtlichkeit bereits enorm <a title="Video-Podcast zu SASS" href="http://bit.ly/fZoUO9" >[2]</a>. Verbunden mit mathematischen Operationen, Funktionen und wiederverwendbaren Blöcken wird es auf flexible Weise möglich, mit CSS-Angaben zu „programmieren“. Der Funktionsumfang lässt sich zudem durch andere Bibliotheken, etwa Compass <a title="Compass" href="http://compass-style.org/" >[3]</a>, erweitern – sie bringen fertige Mixins, Vorlagen und eine wachsende Community. Durch die Generierung von standard-konformem CSS3 lässt sich SASS/SCSS außerdem ohne Anpassung mit allen Browsern nutzen.</p>
<div class="article_author_box">
<p class="article_author_header"><span>Der Autor</span></p>
<div class="article_author_description"><img title="Stefan Neufeind" src="http://t3n.de/magazin/wp-content/uploads/authors/7aba6205c5f75c59b2cf4d71a2f89f16_thumb.jpg" alt="Stefan Neufeind" />Stefan Neufeind arbeitet als Experte für Webentwicklung und -administration bei der SpeedPartner GmbH in Neuss. Er ist Mitglied im TYPO3 Certification Team und engagiert sich in verschiedenen Open-Source-Projekten von PHP/PEAR bis hin zu OpenStreetMap. Außerdem ist er als Speaker auf Konferenzen zu Themen wie IPv6 und DNSSEC anzutreffen und als Autor für IT-Fachmagazine aktiv.</p>
<p style="clear: both;">
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/css-leicht-gemacht-227553/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Magento: Aus dem Shopsystem mehr Performance rausholen</title>
		<link>http://t3n.de/magazin/magento-tunen-227618/</link>
		<comments>http://t3n.de/magazin/magento-tunen-227618/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 10:40:22 +0000</pubDate>
		<dc:creator>t3n Redaktion</dc:creator>
				<category><![CDATA[TECHNOLOGIE]]></category>

		<guid isPermaLink="false">http://t3n.de/magazin/?p=227618</guid>
		<description><![CDATA[Wer einen Onlineshop plant, kommt an Magento kaum vorbei. Das Open-Source-System punktet vor allem mit Flexibilität. Doch die geht zu Lasten der Leistung. Vermeintlich, denn auch aus Magento lässt sich jede Menge Performance herausholen. Bequem vom eigenen Sofa aus zu bestellen, scheint Volkssport geworden zu sein. Doch ob Besucher eines Onlineshops verweilen und schließlich einkaufen [...]]]></description>
			<content:encoded><![CDATA[<p>Wer einen Onlineshop plant, kommt an Magento kaum vorbei. Das Open-Source-System punktet vor allem mit Flexibilität. Doch die geht zu Lasten der Leistung. Vermeintlich, denn auch aus Magento lässt sich jede Menge Performance herausholen.<span id="more-227618"></span></p>
<p>Bequem vom eigenen Sofa aus zu bestellen, scheint Volkssport geworden zu sein. Doch ob Besucher eines Onlineshops verweilen und schließlich einkaufen oder direkt wieder in den Weiten des Webs verschwinden, hängt von vielen Faktoren ab: Finden sie auf Anhieb, was sie gesucht haben? Erscheint der Shop vertrauenswürdig? Passen Preise für Produkte und Versand?</p>
<p>Hinzu kommt die Reaktionszeit der Seite, die einen großen Anteil am „Wohlfühlfaktor“ des Besuchers hat. Wenn der Nutzer den Eindruck hat, dass die Seite nur behäbig auf die Eingaben reagiert, macht das Surfen durch die Produkte des Shops nur wenig Spaß und der Einkauf wird bei Mitbewerbern fortgesetzt. Google wird deshalb in Zukunft die Ladegeschwindigkeit einer Seite stärker in seine Beurteilung innerhalb der Suche einbeziehen – ein weiterer Grund, ein Auge auf die Performance zu werfen.</p>
<h2>Flexibilität als Fluch und Segen</h2>
<p>Flexibilität galt bei Magento von Beginn an als Maxime. Über Module und Templates lässt sich das System sowohl funktional als auch optisch an fast alle Anforderungen und Ansprüche der Shopbetreiber anpassen. Nicht zuletzt dieser Flexibilität ist die hohe Beliebtheit Magentos zu verdanken.</p>
<p>Gleichzeitig erweist sich diese Flexibilität aber als größter Feind der Performance. Statt Prozesse, Daten und Layouts strikt festzulegen, bleibt dem Betreiber immer die Möglichkeit, Dinge anzupassen und zu erweitern. Dass das System hierdurch komplexere Routinen durchlaufen muss, ist die logische Konsequenz.</p>
<p>Bestes Beispiel hierfür ist das Entity-Attribute-Value-Pattern (EAV), das Magentos Datenmodelle hochgradig flexibel macht. Über das Backend können Betreiber Produkte frei mit beliebigen Attributen verschiedener Typen ausstatten. Die Besucher können dann Produkte anhand dieser Attribute vergleichen, filtern oder suchen.</p>
<p>Andererseits ist EAV sehr performancelastig. Im Gegensatz zu herkömmlichen Datenbankmodellen, bei denen die Eigenschaften eines Objekts in einzelnen Spalten einer flachen Tabelle gespeichert werden, teilt EAV die Daten in mehrere Tabellen auf: Entitätstypen wie Produkte, Kategorien oder Kunden werden zentral in der Tabelle eav_entity_type definiert. Attribute zu Produkten werden in eav_attribute spezifiziert und den jeweiligen Entitätstypen zugeordnet. Optionen für Auswahl-Attribute werden in eav_attribute_option, deren Labels in eav_attribute_option_value gespeichert. Die eigentlichen Daten der Produkte, Kategorien und sonstigen EAV-Objekte liegen aber in den Wertetabellen. Hierbei handelt es sich um eine Kopftabelle (beispielsweise catalog_product_entity) und bis zu neun datentypspezifische Tabellen für Integer, Texte, Datumswerte und andere.</p>
<p><figure id="attachment_227619" class="caption aligncenter">
	<img title="Ganze fünf Tabellen sind nötig, um das Entity-Attribute-Pattern abzubilden; die Werte selbst, die das EAV komplettieren, fehlen in der Abbildung aus Platzgründen." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_f1fb7c0bef45383cd00ab2914cc210fb-596x473.jpg" alt="Ganze fünf Tabellen sind nötig, um das Entity-Attribute-Pattern abzubilden; die Werte selbst, die das EAV komplettieren, fehlen in der Abbildung aus Platzgründen." width="596" height="473" />
	<figcaption>Ganze fünf Tabellen sind nötig, um das Entity-Attribute-Pattern abzubilden; die Werte selbst, die das EAV komplettieren, fehlen in der Abbildung aus Platzgründen.</figcaption>
</figure></p>
<p>Um nun ein Produkt vollständig aus der Datenbank zu lesen, muss zunächst bestimmt werden, welche Attribute diesem Produkt zugeordnet sind, um anschließend die jeweiligen Werte auslesen zu können. Hierfür sind mehrere Datenbankzugriffe über mehrere Tabellen notwendig, was mehr Zeit und Ressourcen in Anspruch nimmt als der Zugriff auf eine einzelne Tabelle.</p>
<p>Ein weiteres Beispiel sind die Module: Über XML-Konfigurationen lässt sich das Verhalten anderer Module anpassen, indem beispielsweise Klassen dynamisch ausgetauscht werden. Hierdurch wird der Instanzierungsprozess von Klassen jedoch deutlich gebremst. Noch verstärkt wird dieser Effekt durch die vier Codepools „lib“, „core“, „community“ und „local“, durch die die Ordnung und Update-Fähigkeit des Systems gewahrt bleiben soll. Wird eine bestimmte Klasse gesucht, probiert das System die vier Ordner rückwärts durch. Dadurch wird das Laden der Klassen in Magento paradoxerweise schneller, je mehr Klassen in „local“ oder „community“ überschrieben werden.</p>
<h2>Caching, Caching, Caching</h2>
<p>Um Flexibilität und Performance unter einen Hut zu bringen, beinhaltet Magento diverse Caching-Mechanismen. Hierbei wird ausgenutzt, dass die meisten Konfigurationseinstellungen zu Beginn eines Projekts stark variieren, zur eigentlichen Produktivphase jedoch überwiegend gleich bleiben.</p>
<p>Eine Übersicht über die Zustände der Caches findet man im Backend bei System, Cache Management. Während es für die Entwicklungsumgebung durchaus sinnvoll sein kann, die Caches zu deaktivieren, ist dies in der Produktivumgebung keine Option. Innerhalb des Caching-Moduls finden sich folgende Optionen:</p>
<ul>
<li>Konfiguration: Beinhaltet die Grundkonfiguration des Systems sowie die Konfiguration aller aktiven Module.</li>
<li>Layouts: Definition der Ausgabeblöcke sowie deren Positionen.</li>
<li>Block HTML-Ausgabe: Speichert die HTML-Ausgaben von Blöcken, wenn diese für Caching konfiguriert wurden.</li>
<li>Übersetzungen: Dieser Cache speichert die verschiedenen Übersetzungen zentral ab.</li>
<li>Kollektionsdaten: Bestimmte Listen werden in Magento immer wieder aufgerufen. Werden diese zwischengespeichert, kann wertvolle Zeit gespart werden.</li>
<li>EAV-Typen und -Attribute: Konfiguration der verschiedenen EAV-Elemente, sodass diese nicht permanent aus der Datenbank gelesen werden müssen.</li>
<li>Konfiguration der Webdienste: Vorrangig für die SOAP-API interessant; speichert öffentliche Methoden und Zugriffsrechte.</li>
</ul>
<p>Obschon überall zu Caching geraten wird, finden sich in der Praxis noch zu viele Magento-Shops mit (partiell) deaktiviertem Cache. Das ist zum Teil einer fehlenden Unterstützung durch Templates oder Erweiterungen von Drittanbietern geschuldet: Haben die Entwickler Caching bei der Programmierung nicht vorgesehen, beeinträchtigt dies unter Umständen die komplette Installation.</p>
<h2>Cache-Keys</h2>
<p>Ob Magento einen Block live generieren muss oder eine valide Version aus dem Cache beziehen kann, wird anhand so genannter Cache-Keys entschieden. Diese geben den aktuellen Zustand der Ausgabe wieder und werden vor der Ausgabe eines Blocks generiert.</p>
<p>Wird der aktuelle Zustand in einem gültigen Eintrag im Speicher gefunden, kann der dort hinterlegte Inhalt direkt ausgegeben werden, ohne weitere Programmlogik ausführen zu müssen. Wird der Block nicht im Speicher gefunden, erzeugt Magento die Blockausgabe und legt diese für die definierte Cache-Lebenszeit statisch ab. Ohne Cache-Informationen im Block kann das System die Blockausgaben nicht zwischenspeichern und erzeugt die Ausgaben bei jedem Zugriff dynamisch.</p>
<p>Die Definition der Cache-Angaben erfolgt in der Regel im
Magento-eigenen Platzhalterkonstruktor des Blocks (Template Method
Pattern).</p>
<div class="article_code_box"><span class="article_code_title">Definition der Cache-Header im Block</span></p>
<pre>class T3n_Example_Block_Example extends Mage_Core_Block_Template
{
	protected function _construct()
	{
		$this-&gt;addData(array(
			'cache_lifetime'	=&gt; 86400,
			'cache_tags'	=&gt; array(Mage_Catalog_Model_Product::CACHE_TAG)
		));
	}

	public function getCacheKeyInfo() {
		return array(
			'T3N_EXAMPLE',
			(int)Mage::app()-&gt;getStore()-&gt;isCurrentlySecure(),
			Mage::getDesign()-&gt;getPackageName(),
			Mage::getDesign()-&gt;getTheme('template')
		);
	}

}</pre>
<p><span class="article_code_subtitle">Listing 1</span></p>
</div>
<p>Der angegebene Wert in der Cache-Lifetime definiert den Zeitraum in Sekunden, für den der Cache gültig sein soll. Der Wert sollte mit Bedacht gewählt werden. Fällt er zu niedrig aus, wird der Block zu häufig dynamisch generiert. Ist er zu hoch, kommt es zu keiner Aktualisierung und die Informationen bleiben länger im Speicher als gewünscht. Im Beispiel wird eine Cache-Lebenszeit von einem Tag (in Sekunden; 60 x 60 x 24 = 86400) definiert.</p>
<p>Die Cache-Tags unterteilen die Informationen im Cache in verschiedene Kategorien. Diese Kategorien werden etwa verwendet, um bestimmte Bestandteile gezielt zu aktivieren, zu deaktivieren oder zu verwerfen. Genau das passiert auch beim Löschen eines Caches über das Magento-Backend.</p>
<p><figure id="attachment_227620" class="caption aligncenter">
	<img title="Im Backend lassen sich die einzelnen Caches überwachen und steuern." src="http://t3n.de/magazin/wp-content/uploads/2011/04/dms_160b12233d5779cf908fbd5f44bf36d8-596x177.jpg" alt="Im Backend lassen sich die einzelnen Caches überwachen und steuern." width="596" height="177" />
	<figcaption>Im Backend lassen sich die einzelnen Caches überwachen und steuern.</figcaption>
</figure></p>
<p>Dritter Bestandteil des Listings ist die Definition des Keys in der Methode getCacheKeyInfo. Der Cache-Key ist der eindeutige Bezeichner für eine im Cache hinterlegte Information. Die Werte des Cache-Keys sollten alle verschiedenen Zustände eines Blocks wiedergeben, die einzeln gespeichert werden. Erlaubt ein Block verschiedene Zustände, so darf es genauso viele unterschiedliche Cache-Keys für den aktuellen Block geben. Um Cache-Kollisionen mit anderen Blöcken zu vermeiden, wird als erster Teil meist der Identifikator des aktuellen Blocks verwendet. Weitere Komponenten sind häufig das Package und Theme sowie die Sprache.</p>
<h2>Cache-Backends</h2>
<p>Wie die Caching-Daten gespeichert werden, entscheidet die Wahl der Cache-Backends, welche in der Konfigurationsdatei app/etc/local.xml eingestellt werden.</p>
<div class="article_code_box"><span class="article_code_title">Beispiel einer Cache-Backend-Konfiguration</span></p>
<pre>&lt;config&gt;
	&lt;cache&gt;
		&lt;backend&gt;memcached&lt;/backend&gt;
		&lt;slow_backend&gt;database&lt;/slow_backend&gt;
		&lt;fast_backend&gt;memcached&lt;/fast_backend&gt;
		&lt;memcached&gt;
			&lt;servers&gt;
				&lt;server&gt;
					&lt;host&gt;192.168.0.1&lt;/host&gt;
					&lt;port&gt;11211&lt;/port&gt;
					&lt;persistent&gt;0&lt;/persistent&gt;
				&lt;/server&gt;
			&lt;/servers&gt;
		&lt;/memcached&gt;
	&lt;/cache&gt;
	[...]
&lt;/config&gt;</pre>
<p><span class="article_code_subtitle">Listing 2</span></p>
</div>
<p>In &lt;backend&gt; wird das Cache-Backend eingetragen, welches mit der Zwischenspeicherung beauftragt werden soll. Mögliche Werte sind memcached, apc, xcache, eaccelerator, sqlite, database und file. Wird kein Wert übergeben, nutzt Magento standardmäßig den dateibasierten Cache.</p>
<p>Die vier erstgenannten Cache-Backends sind arbeits­speicher­basiert und dementsprechend schnell; allerdings sind sie nicht persistent und unterstützen keine Cache-Tags. Sie werden deshalb im Rahmen des Two-Level-Cache-Backends mit einem langsameren, aber persistenten Speicher kombiniert. Dies geschieht über die Konfigurations-Tags &lt;slow_backend&gt; und &lt;fast_backend&gt;. Darüber hinaus werden dem memcached-Backend im Beispiel noch notwendige Serverinformationen übergeben.</p>
<p>Zur Verbesserung der Two-Level-Cache-Performance existiert ein Cache-Modul <a title="Cache-Modul" href="https://github.com/Flagbit/Magento-Cache" >[1]</a>, welches verhindert, dass Magento bei jedem Lesezugriff den schnellen Cache neu schreibt. Über das Modul kann zusätzlich das Cache-Backend Libmemcached aktiviert werden, welches in den Benchmarks deutlich besser abschneidet als Memcached <a title="Benchmark" href="http://bit.ly/j4AaAj" >[2]</a>.</p>
<p>Empfohlen wird für einzelne Webserver übrigens APC mit File-Cache. Werden mehrere Webserver verwendet, sollte das Libmemcached- mit dem Datenbank-Backend kombiniert werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://t3n.de/magazin/magento-tunen-227618/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

