<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">
	<channel>
		
		<title>Flo's Seite Blog</title>
		<link>http://flos-page.mine.nu/</link>
		<description>Blog auf Flo's Seite</description>
		<language>de</language>
		<image>
			<title>Flo's Seite Blog</title>
			<url>http://flos-page.mine.nu/typo3conf/ext/tt_news/ext_icon.gif</url>
			<link>http://flos-page.mine.nu/</link>
			<width>18</width>
			<height>16</height>
			<description>Blog auf Flo's Seite</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Sun, 31 Jul 2011 09:30:00 +0000</lastBuildDate>
		
		
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/FlosSeiteBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="flosseiteblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>48.243067</geo:lat><geo:long>16.383383</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><item>
			<title>Neues Handy</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/neues-handy.html</link>
			<description>Es war schon langsam an der Zeit mein altes, doch schon etwas in die Jahre gekommenes, Nokia N95 in den wohlverdienten Ruhestand zu schicken. Schließlich hat es mir fast 5 Jahre gute Dienste als Telefon und damit als ständiger Begleiter erwiesen. Doch gegen Ende konnte es weder mit der Leistung noch mit dem fehlenden Touchscreen und schon gar nicht mit der langsamen Internetverbindung im Vergleich zu anderen Smartphones mithalten. (Ganz zu schweigen von der fragwürdigen Entscheidung Nokias auf einmal sämtliche Bemühungen an dem Opensource-Betriebssystem MeeGo praktisch einzustellen und stattdessen auf den Smartphonebetriebssystem-Flop aus dem Hause Microsoft zu setzen... aber das ist wieder eine andere Geschichte. Inzwischen wurde ja das N9 mit MeeGo angekündigt, aber so wie es aussieht bleibt MeeGo als Smartphonebetriebssystem - zumindest von Nokia - DoA.)
Kurz gesagt: ein neues Telefon musste her, und das sollte nach Möglichkeit vor Features nur so strotzen. Nach dem von Nokia - eigentlich meiner ersten Wahl - in naher Zukunft nichts brauchbares zu erwarten war, und deren Smartphones ja allgemein nicht sehr berühmt sind, fiel mein Blick ziemlich rasch auf die Android-Sparte. Dabei traf es sich, wie der Zufall so wollte, zeitlich gerade so, dass bald das zweite "Google-Phone" - das Google Nexus S von Samsung - erscheinen würde.
Mein Versuch, das Handy über Amazon zu bestellen, war zunächst nicht von Erfolg gekrönt, also habe ich es mir in einem kleineren Einzelhandelsbetrieb bestellt (und natürlich den vollen Preis bezahlt - im Gegensatz zu der Strategie sich das Handy von einem Netzbetreiber sponsern zu lassen, und dafür die nächsten drei Jahre den betreffenden Netzbetreiber über exorbitante Grundgebühren zu finanzieren). Dazu noch ein passender Smartphonetarif mit unlimitiertem Datenvolumen und alles war perfekt.
An dem Nexus S von Google gibt es nur kaum irgendetwas auszusetzen. Maximal vielleicht der integrierte Speicher, der sich nicht über SD-Karte erweitern lässt (aber mit 16 GB durchaus nicht zu klein gewählt ist), oder unter Umständen die Kamera, welche "nur" 5 Megapixel hat. Ansonsten ist es sicherlich ein Spitzengerät. Durch die "pure Google" Philosophie des Gerätes lässt sich der Bootloader in wenigen Handgriffen über das Android SDK entsperren, und in weiterer Folge einfach ein alternatives ROM Image aufspielen. Dazu braucht man den Clockwork Mod als Recovery System installiert, und über den kann dann das gewünschte System einfach von der Speicherkarte auf das Gerät geladen werden. Momentan verwende ich den Cyanogen Mod, welcher sicherlich einer der populärsten Alternativ-Android ROMs ist.
Damit hat man auch root-Zugriff auf das nun "leicht" modifizierte System und kann sich Anwendungen installieren, von denen Benutzer anderer Smartphonehersteller vielleicht nur zu träumen wagen. Darunter su, ssh, busybox, einen Webeblocker, das Qt Framework, Firefox und wem das noch nicht reicht, der kann sich ja mit dem Android NDK nach belieben weitere native Anwendungen bauen und installieren. Die von Google mitgelieferten Apps wie Maps, Kalender, Gmail, Youtube und der Reader sind ganz praktisch - besonders die integrierte turn-by-turn Navigation in Maps - und lassen sich auch noch mit weiteren Bausteinen aus dem Google Sortiment aufstocken (z.B. Google+, Google Sky Map, Google Goggles, Street View usw.). Wem das noch immer nicht reicht, dem stehen abertausende Apps im Market zur verfügung - sowohl gratis als auch zum Kauf.
Der vorinstallierte Musikplayer hat mein Herz, bereits durch die Fähigkeit OGG Vorbis Dateien abspielen zu können, erobert und mit einem "richtigen" IMAP E-Mail Programm  wie K9 Mail im Zusammenspiel mit IRC, SMS und dem kompletten Internet ist auch das Bedürfnis nach Kommunikation ausreichend befriedigt.Ergänzt wird das Übermaß an Features durch die problemlose automatische Synchronisation der wichtigsten Daten mit dem Google Account und die uneingeschränkte Möglichkeit der Internetfreigabe durch Tethering über USB und als WLAN Access Point.
Die Akkulaufzeit ist mit etwa zwei Tagen bei durchschnittlicher Verwendung ganz akzeptabel, und für ein Smartphone nichts erschreckendes.
Es bleibt mit der ganzen Fülle an Möglichkeiten nur abzuwarten, was Android 4 (alias "Ice Cream Sandwich") an Neuerungen bringt. In der zwischenzeit: nicht vergessen regelmäßig ein Backup zu machen! ;-)</description>
			<content:encoded><![CDATA[<p class="bodytext">Es war schon langsam an der Zeit mein altes, doch schon etwas in die Jahre gekommenes, <a href="https://secure.wikimedia.org/wikipedia/de/wiki/Nokia_Nseries#Nokia_N95" title="Opens external link in new window" target="_blank" class="external-link-new-window">Nokia N95</a> in den wohlverdienten Ruhestand zu schicken. Schließlich hat es mir fast 5 Jahre gute Dienste als Telefon und damit als ständiger Begleiter erwiesen. Doch gegen Ende konnte es weder mit der Leistung noch mit dem fehlenden Touchscreen und schon gar nicht mit der langsamen Internetverbindung im Vergleich zu anderen Smartphones mithalten. (Ganz zu schweigen von der fragwürdigen Entscheidung Nokias auf einmal sämtliche Bemühungen an dem Opensource-Betriebssystem MeeGo praktisch einzustellen und stattdessen auf den Smartphonebetriebssystem-Flop aus dem Hause Microsoft zu setzen... aber das ist wieder eine andere Geschichte. Inzwischen wurde ja das <a href="http://europe.nokia.com/find-products/devices/nokia-n9" title="Opens external link in new window" target="_blank" class="external-link-new-window">N9 mit MeeGo</a> angekündigt, aber so wie es aussieht bleibt MeeGo als Smartphonebetriebssystem - zumindest von Nokia - DoA.)
</p>
<p class="bodytext"><img style="float: right; padding-bottom: 10px; padding-left: 10px;" src="http://flos-page.mine.nu/uploads/RTEmagicC_google-nexus-s.png.png" height="181" width="220" alt="" />Kurz gesagt: ein neues Telefon musste her, und das sollte nach Möglichkeit vor Features nur so strotzen. Nach dem von Nokia - eigentlich meiner ersten Wahl - in naher Zukunft nichts brauchbares zu erwarten war, und deren Smartphones ja allgemein nicht sehr berühmt sind, fiel mein Blick ziemlich rasch auf die Android-Sparte. Dabei traf es sich, wie der Zufall so wollte, zeitlich gerade so, dass bald das zweite &quot;Google-Phone&quot; - das <a href="http://www.google.at/nexus/" title="Opens external link in new window" target="_blank" class="external-link-new-window">Google Nexus S</a> von Samsung - erscheinen würde.
</p>
<p class="bodytext">Mein Versuch, das Handy über Amazon zu bestellen, war zunächst nicht von Erfolg gekrönt, also habe ich es mir in einem kleineren Einzelhandelsbetrieb bestellt (und natürlich den vollen Preis bezahlt - im Gegensatz zu der Strategie sich das Handy von einem Netzbetreiber sponsern zu lassen, und dafür die nächsten drei Jahre den betreffenden Netzbetreiber über exorbitante Grundgebühren zu finanzieren). Dazu noch ein passender Smartphonetarif mit unlimitiertem Datenvolumen und alles war perfekt.
</p>
<p class="bodytext">An dem Nexus S von Google gibt es nur kaum irgendetwas auszusetzen. Maximal vielleicht der integrierte Speicher, der sich nicht über SD-Karte erweitern lässt (aber mit 16 GB durchaus nicht zu klein gewählt ist), oder unter Umständen die Kamera, welche &quot;nur&quot; 5 Megapixel hat. Ansonsten ist es sicherlich ein Spitzengerät. Durch die &quot;pure Google&quot; Philosophie des Gerätes lässt sich der Bootloader in wenigen Handgriffen über das <a href="http://developer.android.com/sdk/index.html" title="Opens external link in new window" target="_blank" class="external-link-new-window">Android SDK</a> entsperren, und in weiterer Folge einfach ein alternatives ROM Image aufspielen. Dazu braucht man den <a href="http://www.clockworkmod.com/" title="Opens external link in new window" target="_blank" class="external-link-new-window">Clockwork Mod</a> als Recovery System installiert, und über den kann dann das gewünschte System <a href="http://wiki.cyanogenmod.com/wiki/Nexus_S" title="Opens external link in new window" target="_blank" class="external-link-new-window">einfach von der Speicherkarte auf das Gerät geladen werden</a>. Momentan verwende ich den <a href="http://www.cyanogenmod.com/" title="Opens external link in new window" target="_blank" class="external-link-new-window">Cyanogen Mod</a>, welcher sicherlich einer der populärsten Alternativ-Android ROMs ist.
</p>
<p class="bodytext">Damit hat man auch root-Zugriff auf das nun &quot;leicht&quot; modifizierte System und kann sich Anwendungen installieren, von denen Benutzer anderer Smartphonehersteller vielleicht nur zu träumen wagen. Darunter <a href="https://market.android.com/details?id=com.noshufou.android.su&amp;hl=de" title="Opens external link in new window" target="_blank" class="external-link-new-window">su</a>, <a href="https://market.android.com/details?id=org.connectbot" title="Opens external link in new window" target="_blank" class="external-link-new-window">ssh</a>, <a href="https://market.android.com/details?id=stericson.busybox" title="Opens external link in new window" target="_blank" class="external-link-new-window">busybox</a>, <a href="https://market.android.com/details?id=com.bigtincan.android.adfree" title="Opens external link in new window" target="_blank" class="external-link-new-window">einen Webeblocker</a>, <a href="https://market.android.com/details?id=eu.licentia.necessitas.ministro" title="Opens external link in new window" target="_blank" class="external-link-new-window">das Qt Framework</a>, <a href="https://market.android.com/details?id=org.mozilla.firefox" title="Opens external link in new window" target="_blank" class="external-link-new-window">Firefox</a> und wem das noch nicht reicht, der kann sich ja mit dem Android NDK nach belieben weitere native Anwendungen bauen und installieren. Die von Google mitgelieferten Apps wie Maps, Kalender, Gmail, Youtube und der Reader sind ganz praktisch - besonders die integrierte turn-by-turn Navigation in Maps - und lassen sich auch noch mit weiteren Bausteinen aus dem Google Sortiment aufstocken (z.B. Google+, Google Sky Map, Google Goggles, Street View usw.). Wem das noch immer nicht reicht, dem stehen abertausende Apps im Market zur verfügung - sowohl gratis als auch zum Kauf.
</p>
<p class="bodytext">Der vorinstallierte Musikplayer hat mein Herz, bereits durch die Fähigkeit OGG Vorbis Dateien abspielen zu können, erobert und mit einem &quot;richtigen&quot; IMAP E-Mail Programm&nbsp; wie <a href="https://market.android.com/details?id=com.fsck.k9" title="Opens external link in new window" target="_blank" class="external-link-new-window">K9 Mail</a> im Zusammenspiel mit <a href="https://market.android.com/details?id=net.andchat" title="Opens external link in new window" target="_blank" class="external-link-new-window">IRC</a>, SMS und dem kompletten Internet ist auch das Bedürfnis nach Kommunikation ausreichend befriedigt.<br />Ergänzt wird das Übermaß an Features durch die problemlose automatische Synchronisation der wichtigsten Daten mit dem Google Account und die uneingeschränkte Möglichkeit der Internetfreigabe durch Tethering über USB und als WLAN Access Point.
</p>
<p class="bodytext">Die Akkulaufzeit ist mit etwa zwei Tagen bei durchschnittlicher Verwendung ganz akzeptabel, und für ein Smartphone nichts erschreckendes.
</p>
<p class="bodytext">Es bleibt mit der ganzen Fülle an Möglichkeiten nur abzuwarten, was Android 4 (alias &quot;Ice Cream Sandwich&quot;) an Neuerungen bringt. In der zwischenzeit: nicht vergessen regelmäßig ein Backup zu machen! ;-)</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/bFPb4Kvkmyw" height="1" width="1"/>]]></content:encoded>
			<category>Android</category>
			
			
			<pubDate>Sun, 31 Jul 2011 09:30:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Performance mit PHP und MySQL</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/performance-mit-php-und-mysql.html</link>
			<description>Nicht alle Webseiten im Internet sind so glücklich und laufen auf Servern mit Mehrkernprozessoren und schier unbegrenztem RAM. Meine eigene Seite etwa, läuft auf einem ausgemusterten Desktop PC mit 1,3 GHz CPU und 512 MB RAM. Das bekommt man auch schnell zu Spüren, verwendet man ein ressourcenhungriges CMS wie Typo3. Da kann es unter Umständen mehrere Sekunden dauern, bis Seiten, die nicht im Cache liegen, fertig geparst und beim Browser sind. Für "das Internet" fast schon eine völlig unakzeptable Antwortzeit. Dagegen kann man aber etwas tun, wenn man root-Zugriff auf den Server hat und ein wenig Linux-fu mitbringt
PHP beschleunigen
Im Internet findet man zur Geschwindigkeitsoptimierung von PHP Scripten mehrere op-code Caches, die mehr oder weniger das geparste, maschinenlesbare PHP Script zum schnelleren Zugriff zwischenspeichern, damit nicht bei jedem Seitenaufruf neu geparst werden muss. Mein Favourit ist APC, da dieses als Pecl Package verfügbar ist und somit einfach als PHP Modul ohne weitere Abhängigkeiten kompiliert und eingebunden werden kann. Auch soll es in der kommenden PHP Version 6.0 als ein fixer Bestandteil von PHP integriert werden.
Um APC zu installieren setze ich hier für die Anleitung Apache2 und PHP5 aus dem Paketmanager voraus (alle Pakete beziehen sich auf Debian/Ubuntu). Zunächst benötigt man die Quellpakete von PHP und Apache, sowie die standard Build-Tools und PHP PEAR
apt-get install build-essential php5-dev apache2-threaded-dev php-pear
Als nächstes erzeugen wir einen zusätzlichen Link auf das Apache Extension Tool Binary, um einen bekannten Fehler zu umgehen.
ln -s /usr/bin/apxs2 /usr/bin/apxs
Ist das geschehen kann die Installation von APC starten. Mit folgendem Kommando sollte der Prozess einfach durchlaufen.
pecl install apc
Nun muss die Extension noch in die Datei /etc/apache2/php.ini eingetragen werden. Dazu sucht man darin nach folgendem Abschnitt
;;;;;;;;;;;;;;;;;;;;;;; Dynamic Extensions ;;;;;;;;;;;;;;;;;;;;;;;
Dort muss man folgende Zeile eintragen
extension=apc.so
Außerdem, falls noch nicht vorhanden, wird ein eigener Bereich für die APC Konfiguration am Ende der php.ini angelegt, wo man die spezifischen Einstellungen vornehmen kann. Eine genaue Beschreibung der verschiedenen Parameter gibt es unter http://php.net/manual/de/apc.configuration.php
[APC]apc.enabled=1apc.shm_segments=1apc.optimization=0apc.shm_size=128apc.ttl=7200apc.user_ttl=7200apc.num_files_hint=1024apc.enable_cli=0apc.rfc1867=1
Im Anschluss muss Apache neu gestartet werden
/etc/init.d/apache2 restart
Mit folgendem, kurzem Script kann getestet werden, ob die Erweiterung wie erwartet funktioniert
&lt;?php$bar = 'BAR';apc_store('foo', $bar);var_dump(apc_fetch('foo'));?&gt;
MySQL Queries cachen
Es bringt die schnellste Scriptsprache nichts, wenn ewig auf die Kommunikation mit der Datenbank gewartet werden muss. Natürlich werden Abfragen schneller ausgeführt, sind etwa die Indizes einer Tabelle bereits im Hauptspeicher vorhanden - immer vorausgesetzt, der Server hat ausreichend RAM. Daraus lässt sich ableiten: je mehr RAM auf einem Datenbank-Server umso besser. Eine Möglichkeit MySQL weiter zu beschleunigen, ohne gleich neue Hardware zu besorgen, ist den Query Cache zu aktivieren. Dadurch werden, je nach Konfiguration, alle oder nur manche SELECT Abfragen zwischengespeichert und bei einem erneuten Aufruf folglich schneller ausgeführt.
Verbindet man sich mit root beim MySQL Server, kann man mit der folgenden Abfrage überprüfen, ob es nicht vielleicht schon aktiviert ist, bzw. sobald es aktiviert ist, erhält man damit einen kurzen Überblick zum momentanen Status.
mysql&gt; SHOW VARIABLES LIKE '%cache&amp;';
Wird als "query_cache_size" der Wert 0 angezeigt, ist dieses noch nicht eingeschaltet. Dies erledigt man, indem man in der /etc/mysql/my.cnf die folgenden Zeilen einträgt bzw. auskommentiert.
query_cache_limit = 16Mquery_cache_size  = 128Mquery_cache_type  = 1
Dabei gilt das Cache Limit für die größe einer Query, die gecached werden kann, die Cache Size legt die gesamtgröße des Caches fest und der Cache Type "1" aktiviert das Cache standardmäßig für alle Queries. Würde man den Type auf "2" setzen, wäre der Cache nur für Queries aktiv, die "SQL_CACHE" im Statement enthalten. Damit könnte man gezielt nur einzelne Queries cachen.
Nun muss natürlich noch der MySQL Server neu gestartet werden. Mit der vorherigen Abfrage zum Status des Caches müssten wir jetzt beobachten können, wie sich bei Verwendung der Datenbank langsam das Cache füllt. Dabei ist es interessant, das Verhältnis zwischen Cache Hits und Cache Inserts zu betrachten. Dieser Faktor gibt Auskunft darüber, wie effektiv das Cache genutzt wird.
Natürlich können Queries, die gewisse Funktionen wie etwa UUID oder CURRENT_TIMESTAMP verwedenden oder Prepared Statements nicht gecached werden.
Eine sehr gute Einführung in die Thematik und auch ein paar wichtige Dinge, die es bei der Verwendung vom Query Cache zu beachten gibt, findet man unter http://www.docplanet.org/mysql/mysql-query-cache-in-depth/ und http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/
Für alle, die noch immer nicht zufrieden mit der Geschwindigkeit oder dem Funktionsumfang des eingebauten MySQL Query Caches sind, soll memcached ans Herz gelegt sein. Dieser wird zwischen Webserver und Datenbank gehängt, und übernimmt das Cachen der Datenbankabfragen. Für Setups, die auf mehrere Server verteilt sind, kann man Datenbank- und Webserver auch voneinander trennen und memcached auf dem Webserver laufen lassen, oder man richtet für memcached gleich eigene Server mit haufenweise RAM ein. Man hört, es soll ausgesprochen schnell und flexibel sein, damit zu arbeiten, und dadurch vor allem für größere Projekte geeignet sein.</description>
			<content:encoded><![CDATA[<p class="bodytext">Nicht alle Webseiten im Internet sind so glücklich und laufen auf Servern mit Mehrkernprozessoren und schier unbegrenztem RAM. Meine eigene Seite etwa, läuft auf einem ausgemusterten Desktop PC mit 1,3 GHz CPU und 512 MB RAM. Das bekommt man auch schnell zu Spüren, verwendet man ein ressourcenhungriges CMS wie Typo3. Da kann es unter Umständen mehrere Sekunden dauern, bis Seiten, die nicht im Cache liegen, fertig geparst und beim Browser sind. Für &quot;das Internet&quot; fast schon eine völlig unakzeptable Antwortzeit. Dagegen kann man aber etwas tun, wenn man root-Zugriff auf den Server hat und ein wenig Linux-fu mitbringt
</p>
<p class="bodytext"><b>PHP beschleunigen</b>
</p>
<p class="bodytext">Im Internet findet man zur Geschwindigkeitsoptimierung von PHP Scripten mehrere op-code Caches, die mehr oder weniger das geparste, maschinenlesbare PHP Script zum schnelleren Zugriff zwischenspeichern, damit nicht bei jedem Seitenaufruf neu geparst werden muss. Mein Favourit ist APC, da dieses als Pecl Package verfügbar ist und somit einfach als PHP Modul ohne weitere Abhängigkeiten kompiliert und eingebunden werden kann. Auch soll es in der kommenden PHP Version 6.0 als ein fixer Bestandteil von PHP integriert werden.
</p>
<p class="bodytext">Um APC zu installieren setze ich hier für die Anleitung Apache2 und PHP5 aus dem Paketmanager voraus (alle Pakete beziehen sich auf Debian/Ubuntu). Zunächst benötigt man die Quellpakete von PHP und Apache, sowie die standard Build-Tools und PHP PEAR
</p>
<p class="code">apt-get install build-essential php5-dev apache2-threaded-dev php-pear</p>
<p class="bodytext">Als nächstes erzeugen wir einen zusätzlichen Link auf das Apache Extension Tool Binary, um einen bekannten Fehler zu umgehen.
</p>
<p class="code">ln -s /usr/bin/apxs2 /usr/bin/apxs</p>
<p class="bodytext">Ist das geschehen kann die Installation von APC starten. Mit folgendem Kommando sollte der Prozess einfach durchlaufen.
</p>
<p class="code">pecl install apc</p>
<p class="bodytext">Nun muss die Extension noch in die Datei /etc/apache2/php.ini eingetragen werden. Dazu sucht man darin nach folgendem Abschnitt
</p>
<p class="code">;;;;;;;;;;;;;;;;;;;;;;<br />; Dynamic Extensions ;<br />;;;;;;;;;;;;;;;;;;;;;;</p>
<p class="bodytext">Dort muss man folgende Zeile eintragen
</p>
<p class="code">extension=apc.so</p>
<p class="bodytext">Außerdem, falls noch nicht vorhanden, wird ein eigener Bereich für die APC Konfiguration am Ende der php.ini angelegt, wo man die spezifischen Einstellungen vornehmen kann. Eine genaue Beschreibung der verschiedenen Parameter gibt es unter <a href="http://apc.configuration.php" target="_blank">http://php.net/manual/de/apc.configuration.php</a>
</p>
<p class="code">[APC]<br />apc.enabled=1<br />apc.shm_segments=1<br />apc.optimization=0<br />apc.shm_size=128<br />apc.ttl=7200<br />apc.user_ttl=7200<br />apc.num_files_hint=1024<br />apc.enable_cli=0<br />apc.rfc1867=1</p>
<p class="bodytext">Im Anschluss muss Apache neu gestartet werden
</p>
<p class="code">/etc/init.d/apache2 restart</p>
<p class="bodytext">Mit folgendem, kurzem Script kann getestet werden, ob die Erweiterung wie erwartet funktioniert
</p>
<p class="code">&lt;?php<br />$bar = 'BAR';<br />apc_store('foo', $bar);<br />var_dump(apc_fetch('foo'));<br />?&gt;</p>
<p class="bodytext"><b>MySQL Queries cachen</b>
</p>
<p class="bodytext">Es bringt die schnellste Scriptsprache nichts, wenn ewig auf die Kommunikation mit der Datenbank gewartet werden muss. Natürlich werden Abfragen schneller ausgeführt, sind etwa die Indizes einer Tabelle bereits im Hauptspeicher vorhanden - immer vorausgesetzt, der Server hat ausreichend RAM. Daraus lässt sich ableiten: je mehr RAM auf einem Datenbank-Server umso besser. Eine Möglichkeit MySQL weiter zu beschleunigen, ohne gleich neue Hardware zu besorgen, ist den Query Cache zu aktivieren. Dadurch werden, je nach Konfiguration, alle oder nur manche SELECT Abfragen zwischengespeichert und bei einem erneuten Aufruf folglich schneller ausgeführt.
</p>
<p class="bodytext">Verbindet man sich mit root beim MySQL Server, kann man mit der folgenden Abfrage überprüfen, ob es nicht vielleicht schon aktiviert ist, bzw. sobald es aktiviert ist, erhält man damit einen kurzen Überblick zum momentanen Status.
</p>
<p class="code">mysql&gt; SHOW VARIABLES LIKE '%cache&amp;';</p>
<p class="bodytext">Wird als &quot;query_cache_size&quot; der Wert 0 angezeigt, ist dieses noch nicht eingeschaltet. Dies erledigt man, indem man in der /etc/mysql/my.cnf die folgenden Zeilen einträgt bzw. auskommentiert.
</p>
<p class="code">query_cache_limit = 16M<br />query_cache_size&nbsp; = 128M<br />query_cache_type&nbsp; = 1</p>
<p class="bodytext">Dabei gilt das Cache Limit für die größe einer Query, die gecached werden kann, die Cache Size legt die gesamtgröße des Caches fest und der Cache Type &quot;1&quot; aktiviert das Cache standardmäßig für alle Queries. Würde man den Type auf &quot;2&quot; setzen, wäre der Cache nur für Queries aktiv, die &quot;SQL_CACHE&quot; im Statement enthalten. Damit könnte man gezielt nur einzelne Queries cachen.
</p>
<p class="bodytext">Nun muss natürlich noch der MySQL Server neu gestartet werden. Mit der vorherigen Abfrage zum Status des Caches müssten wir jetzt beobachten können, wie sich bei Verwendung der Datenbank langsam das Cache füllt. Dabei ist es interessant, das Verhältnis zwischen Cache Hits und Cache Inserts zu betrachten. Dieser Faktor gibt Auskunft darüber, wie effektiv das Cache genutzt wird.
</p>
<p class="bodytext">Natürlich können Queries, die gewisse Funktionen wie etwa UUID oder CURRENT_TIMESTAMP verwedenden oder Prepared Statements nicht gecached werden.
</p>
<p class="bodytext">Eine sehr gute Einführung in die Thematik und auch ein paar wichtige Dinge, die es bei der Verwendung vom Query Cache zu beachten gibt, findet man unter <a href="http://www.docplanet.org/mysql/mysql-query-cache-in-depth/" target="_blank">http://www.docplanet.org/mysql/mysql-query-cache-in-depth/</a> und <a href="http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/" target="_blank">http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/</a>
</p>
<p class="bodytext">Für alle, die noch immer nicht zufrieden mit der Geschwindigkeit oder dem Funktionsumfang des eingebauten MySQL Query Caches sind, soll memcached ans Herz gelegt sein. Dieser wird zwischen Webserver und Datenbank gehängt, und übernimmt das Cachen der Datenbankabfragen. Für Setups, die auf mehrere Server verteilt sind, kann man Datenbank- und Webserver auch voneinander trennen und memcached auf dem Webserver laufen lassen, oder man richtet für memcached gleich eigene Server mit haufenweise RAM ein. Man hört, es soll ausgesprochen schnell und flexibel sein, damit zu arbeiten, und dadurch vor allem für größere Projekte geeignet sein.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/gi0s3kM6HyA" height="1" width="1"/>]]></content:encoded>
			<category>Internet</category>
			
			
			<pubDate>Thu, 10 Feb 2011 17:37:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Typo3, Extbase und Ajax</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/typo3-extbase-und-ajax.html</link>
			<description>Mit dem neuen Extension-Framework für Typo3 ist es inzwischen viel einfacher und seit der letzten Version auch wesentlich stabiler (und "zukunftssicherer") geworden, Erweiterungen für Typo3 zu schreiben. Die Kombination aus Extbase und Fluid erweist sich als durchaus brauchbar und bietet einen völlig anderen Ansatz zur Pluginentwicklung. 
Wer allerdings heutzutage nicht asynchron mit dem Server kommuniziert ist ja fast schon von Gestern. :-) Fast ausnahmslos alle modernen Web-Applikationen nutzen Ajax, weshalb ich es gerne sehen würde, wenn diese Form der Kommunikation mit Extbase besser dokumentiert wäre. Denn nicht nur ist es für einen Einsteiger eine Hürde, sondern auch für Entwickler, die sich mit Typo3 schon länger beschäftigen, ist dies ein unnötiger Stolperstein.
Zunächst muss ein eigener Page Type für Ajax Requests spezifiziert werden, mit dem sämtlicher Output auf das wesentliche, nämlich die Ajax Antwort, reduziert wird und um zu verhindern, dass Typo3 die Ausgabe nachträglich abändert. Dazu muss folgendes in das TS Setup eingetragen werden.
tmp.ajaxConf = PAGEtmp.ajaxConf {  typeNum = 1249058000  config {    disableAllHeaderCode = 1    xhtml_cleaning = 0    admPanel = 0  }}my_plugin_page &lt; tmp.ajaxConfmy_plugin_page {  typeNum = 1296727024  10 &lt; tt_content.list.20.myplugin_pi1}
Der erste Block sorgt dafür, dass keine zusätzliche Ausgabe erzeugt wird und die Ausgabe nicht verändert wird (etwa durch das Admin Panel). Im weiten Block wird die Konfiguration einem TS Objekt zugewiesen und dem Plugin zugeordnet. Hier sollte man als typeNum beispielsweise den aktuellen Timestamp verwenden. Was auch immer man an dieser Stelle tatsächlich verwendet, wird dann bei den Ajax Requests der Wert für den Parameter "type". Den tatsächlichen Pfad zum tt_content Eintrag für das eigene Plugin findet man am einfachsten über den TS Objekt-Browser unter "Template".Damit sollte man zumindest schon mal die Voraussetzung für Ajax mit Extbase geschaffen haben.
Nun muss man eine entsprechende Aktion in einem Controller schreiben, die etwas zurückliefert, womit JavaScript etwas anfangen kann. In meinem Beispiel wird für einen User eine neue Adresse angelegt und die Seite bekommt vom Server eine Antwort in JSON.
/** * add a new adress to a user * @param Tx_MyExt_Domain_Model_Address */public function addAdressAction(Tx_MyExt_Domain_Model_Address $addr) {  if( isset($this-&gt;user) ) {    $this-&gt;user-&gt;addAddress($addr);    $addr-&gt;setUser($this-user);    // persist manually to get the new id of the inserted record    $pM = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');    $pM-&gt;persistAll();    // now we can respond with something useful    return json_encode(array(      'status'  =&gt; 'OK',      'newId'   =&gt; $addr-&gt;getUid(),      'country' =&gt; $addr-&gt;getCountry(),    ));  }  return json_encode(array(    'status'  =&gt; 'ERROR',    'message' =&gt; 'You are not allowed to do this',  ));}
Jetzt kann der Server schon mal Antworten, fehlt nur noch der Teil auf der Clientseite, mit dem die Action aufgerufen wird und die Antwort entsprechend verarbeitet werden kann.
Ich verwende dazu vorzugsweise jQuery. Die URL, die aufgerufen werden soll, wird generiert, und dann in einem inline &lt;script&gt; Teil an das Javascript zur Verwendung übergeben. Von dort aus kann dann der Ajax Request gestartet und anschließend verarbeitet werden.
&lt;script type="text/javascript"&gt;var addr = &lt;f:uri.action action="addAddress" controller="MyController" arguments="{type: 1296727024}" /&gt;// onsubmitvar form = $('form');$.post(addr, form.serialize(), function(response) {    var data = $.parseJSON(response);    // do something useful with the response});&lt;/script&gt;&lt;f:form method="post" action="addAddress" controller="MyController" name="address" object="{address}"&gt;...&lt;/f:form&gt;
Damit sind alle Bausteine, die man braucht um Ajax mit Typo3 und Extbase zu verwenden beschrieben. Mit diesen grundlegenden Bausteinen kann jetzt losgelegt werden eigene coole neue Plugins für Typo3 zu schreiben ;-)</description>
			<content:encoded><![CDATA[<p class="bodytext">Mit dem neuen Extension-Framework für Typo3 ist es inzwischen viel einfacher und seit der letzten Version auch wesentlich&nbsp;stabiler (und &quot;zukunftssicherer&quot;) geworden, Erweiterungen für Typo3&nbsp;zu schreiben. Die Kombination aus Extbase und Fluid erweist sich als durchaus brauchbar und bietet einen völlig anderen Ansatz zur Pluginentwicklung.&nbsp;
</p>
<p class="bodytext">Wer allerdings heutzutage nicht asynchron mit dem Server kommuniziert ist ja&nbsp;fast schon von Gestern. :-) Fast ausnahmslos alle modernen Web-Applikationen nutzen Ajax, weshalb ich es&nbsp;gerne sehen würde, wenn diese Form der Kommunikation mit Extbase besser dokumentiert wäre. Denn nicht nur ist es für einen Einsteiger eine Hürde, sondern&nbsp;auch für&nbsp;Entwickler, die sich mit Typo3 schon länger beschäftigen, ist dies ein unnötiger Stolperstein.
</p>
<p class="bodytext">Zunächst muss ein eigener Page Type für Ajax Requests spezifiziert werden, mit dem sämtlicher Output auf das wesentliche, nämlich die Ajax Antwort, reduziert wird und um zu verhindern, dass Typo3 die Ausgabe nachträglich abändert.&nbsp;Dazu muss folgendes in das TS Setup eingetragen werden.
</p>
<p class="code">tmp.ajaxConf = PAGE<br />tmp.ajaxConf {<br />&nbsp;&nbsp;typeNum = 1249058000<br />&nbsp;&nbsp;config {<br />&nbsp;&nbsp; &nbsp;disableAllHeaderCode = 1<br />&nbsp;&nbsp; &nbsp;xhtml_cleaning = 0<br />&nbsp;&nbsp; &nbsp;admPanel = 0<br />&nbsp;&nbsp;}<br />}<br /><br />my_plugin_page &lt; tmp.ajaxConf<br />my_plugin_page {<br /><span style="white-space: pre;">&nbsp;&nbsp;typeNum =&nbsp;</span>1296727024<b><br />&nbsp;&nbsp;</b>10 &lt; tt_content.list.20.myplugin_pi1<b><br />}</b></p>
<p class="bodytext">Der erste Block sorgt dafür, dass keine zusätzliche Ausgabe erzeugt wird und die Ausgabe nicht verändert wird (etwa durch das Admin Panel). Im weiten Block wird die Konfiguration einem TS&nbsp;Objekt zugewiesen und dem Plugin zugeordnet. Hier sollte man als typeNum beispielsweise den aktuellen Timestamp verwenden. Was auch immer man an dieser Stelle&nbsp;tatsächlich verwendet, wird dann bei den Ajax Requests der Wert für den Parameter &quot;type&quot;.&nbsp;Den tatsächlichen Pfad zum tt_content Eintrag für das eigene Plugin findet man am einfachsten über den TS&nbsp;Objekt-Browser unter &quot;Template&quot;.<br />Damit sollte man zumindest schon mal die Voraussetzung für Ajax mit Extbase geschaffen haben.
</p>
<p class="bodytext">Nun muss man eine entsprechende Aktion in einem Controller schreiben, die etwas zurückliefert, womit JavaScript etwas anfangen kann. In meinem Beispiel wird für einen User eine neue Adresse angelegt und die Seite bekommt vom Server eine Antwort in JSON.
</p>
<p class="code">/**<br />&nbsp;* add a new adress to a user<br />&nbsp;* @param Tx_MyExt_Domain_Model_Address<br />&nbsp;*/<br />public function addAdressAction(Tx_MyExt_Domain_Model_Address $addr) {<br />&nbsp;&nbsp;if( isset($this-&gt;user) ) {<br />&nbsp;&nbsp; &nbsp;$this-&gt;user-&gt;addAddress($addr);<br />&nbsp;&nbsp; &nbsp;$addr-&gt;setUser($this-user);<br /><br />&nbsp;&nbsp; &nbsp;// persist manually to get the new id of the inserted record<br />&nbsp;&nbsp; &nbsp;$pM = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');<br /><span style="white-space: pre;"><span style="white-space: normal;">&nbsp;&nbsp; &nbsp;$pM-&gt;persistAll();<br /><br />&nbsp;&nbsp; &nbsp;// now we can respond with something useful<br />&nbsp;&nbsp; &nbsp;return json_encode(array(<br />&nbsp;&nbsp; &nbsp; &nbsp;'status' &nbsp;=&gt; 'OK',<br />&nbsp;&nbsp; &nbsp; &nbsp;'newId' &nbsp; =&gt; $addr-&gt;getUid(),<br />&nbsp;&nbsp; &nbsp; &nbsp;'country' =&gt; $addr-&gt;getCountry(),<br /></span></span>&nbsp;&nbsp; &nbsp;));<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return json_encode(array(<br />&nbsp;&nbsp; &nbsp;'status' &nbsp;=&gt; 'ERROR',<br />&nbsp;&nbsp; &nbsp;'message' =&gt; 'You are not allowed to do this',<br />&nbsp;&nbsp;));<br />}</p>
<p class="bodytext">Jetzt kann der Server schon mal Antworten, fehlt nur noch der Teil auf der Clientseite, mit dem die Action aufgerufen wird und die Antwort entsprechend verarbeitet werden kann.
</p>
<p class="bodytext">Ich verwende dazu vorzugsweise jQuery. Die URL, die aufgerufen werden soll, wird generiert, und dann in einem inline &lt;script&gt; Teil an das Javascript zur Verwendung übergeben. Von dort aus kann dann der Ajax Request gestartet und anschließend verarbeitet werden.
</p>
<p class="code">&lt;script type=&quot;text/javascript&quot;&gt;<br />var addr = &lt;f:uri.action action=&quot;addAddress&quot; controller=&quot;MyController&quot; arguments=&quot;{type: <span style="white-space: pre;"></span>1296727024<b></b>}&quot; /&gt;<br /><br />// onsubmit<br />var form = $('form');<br />$.post(addr, form.serialize(), function(response) {<br />&nbsp;&nbsp;&nbsp; var data = $.parseJSON(response);<br />&nbsp;&nbsp;&nbsp; // do something useful with the response<br />});<br />&lt;/script&gt;<br /><br />&lt;f:form method=&quot;post&quot; action=&quot;addAddress&quot; controller=&quot;MyController&quot; name=&quot;address&quot; object=&quot;{address}&quot;&gt;<br />...<br />&lt;/f:form&gt;</p>
<p class="bodytext">Damit sind alle Bausteine, die man braucht um Ajax mit Typo3 und Extbase zu verwenden beschrieben. Mit diesen grundlegenden Bausteinen kann jetzt losgelegt werden eigene coole neue Plugins für Typo3 zu schreiben ;-)</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/g68n6B03cug" height="1" width="1"/>]]></content:encoded>
			<category>Typo3</category>
			
			
			<pubDate>Sun, 30 Jan 2011 00:00:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Projektverwaltung mit Redmine</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/projektverwaltung-mit-redmine.html</link>
			<description>In meinem Fach ist es immer Praktisch, wenn man für Projekte, bei denen Code geschrieben wird, irgendeine Form von Versionsverwaltung verwendet. Damit bewahrt man den Überblick, wenn auf mehreren Rechnern gearbeitet wird und im Falle des Falles kann man auf eine frühere Version zurückgreifen und damit getrost alten Code löschen, anstatt ihn auszukommentieren und ewig mitzuschleifen.
Hat man es dann auch noch mit Kunden zu tun, die in den Gestaltungsprozess eingebunden werden müssen, jedoch nicht die Arbeiterschaft mit ihren E-Mails quälen sollen, bleibt fast nur mehr der Griff zu einem Ticketsystem. Dieses soll natürlich auch noch Problemlos mit der zuvor erwähnten Versionsverwaltung zusammenspielen können.
Ich konnte mich, nach ein wenig Recherche im Internet, schnell für das in Ruby on Rails geschriebene Redmine begeistern. Es bringt alles mit, was man sich für ein Softwareprojekt nur vorstellen kann: angefangen bei einem Wiki über Bug/Feature Tracker bis hin zur Gantt-Darstellung der Aktivitäten. Dabei ist die Installation auf einem Debian Server denkbar einfach.
Zunächst benötigt man Ruby in Version 1.8.6 oder 1.8.7 - die Installation erfolgt einfach mittels
apt-get install ruby
Dann sollte man die Abhängigkeiten für die Installation von redmine erfüllen. Hierzu müssen die Ruby Gems installiert werden:
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgztar xvf rubygems-1.3.5.tgzcd rubygems-1.3.5ruby setup.rbgem update --system
Und dann können noch die einzelnen Gems installiert werden.
gem install rails -v=2.3.5gem install rack -v=1.0.1gem install i18n -v=0.4.2gem install mysql
Jetzt soll der MySQL-Benutzer und die Datenbank für Redmine angelegt werden. Am einfachsten kann man das mit phpMyAdmin erledigen, falls das nicht zur Verfügung steht, können die MySQL Kommandos in der Installationsanleitung verwendet werden. 
Nun können wir uns endlich Redmine selbst widmen. Zunächst lädt man das Archiv mit den Daten herunter und entpackt sie in dem gewünschten Verzeichnis.
wget http://rubyforge.org/frs/download.php/73900/redmine-1.1.0.tar.gztar xvf redmine-1.1.0.tar.gzcd redmine-1.1.0
Den zuvor mit MySQL erstellten Zugang trägt man in die Konfigurationsdatei im Ordner config/database.yml ein (dazu einfach die database.yml.example kopieren und umbenennen).
production:  adapter: mysql  database: redmineDbName  host: localhost  username: redmineDbUser  password: redmineDbPassword
Natürlich müssen hier die zuvor erstellten Daten zu Datenbank, Username und Passwort eingetragen werden. Im Redmine-Verzeichnis führt man nun den Befehl zum Generieren eines Session Store Secrets aus. Anschließend kann die Datenbank befüllt werden.
rake generate_session_storeRAILS_ENV=production rake db:migrateRAILS_ENV=production rake redmine:load_default_data
Der letzte Befehl fügt Standardeinträge in die Datenbank ein. Damit muss man nicht alles von Grund auf einrichten. Wer dies nicht will, kann das also auch auslassen. Nun müssen noch die richtigen Verzeichnisberechtigungen gesetzt und ein Ordner für Plugin-Dateien angelegt werden.
mkdir tmp public/plugin_assetssudo chown -R www-data:www-data files log tmp public/plugin_assetssudo chmod -R 755 files log  tmp public/plugin_assets
Sind alle Schritte erledigt, kann die Redmine-Installation zum ersten Mal getestet werden.
ruby script/server webrick -e production
Ab jetzt kann man im Browser die Adresse http://localhost:3000/ aufrufen und sich mit Benutzer: adminPasswort: adminin der Instanz von Redmine anmelden.
Weitere Konfigurationsanleitungen wie etwa die Einrichtung des E-Mail Versands oder die Verwendung von Redmine über Apache finden sich auf der Projektseite unter HowTos.</description>
			<content:encoded><![CDATA[<p class="bodytext">In meinem Fach ist es immer Praktisch, wenn man für Projekte, bei denen Code geschrieben wird, irgendeine Form von Versionsverwaltung verwendet. Damit bewahrt man den Überblick, wenn auf mehreren Rechnern gearbeitet wird und im Falle des Falles kann man auf eine frühere Version zurückgreifen und damit getrost alten Code löschen, anstatt ihn auszukommentieren und ewig mitzuschleifen.
</p>
<p class="bodytext">Hat man es dann auch noch mit Kunden zu tun, die in den Gestaltungsprozess eingebunden werden müssen, jedoch nicht die Arbeiterschaft mit ihren E-Mails quälen&nbsp;sollen, bleibt fast nur mehr der Griff zu einem Ticketsystem. Dieses soll natürlich auch noch Problemlos mit der zuvor erwähnten Versionsverwaltung zusammenspielen können.
</p>
<p class="bodytext"><img style="float: right; padding-bottom: 15px; padding-left: 15px;" title="Redmine" src="http://flos-page.mine.nu/uploads/RTEmagicC_redmine.png.png" width="116" height="41" alt="" />Ich konnte mich, nach ein wenig Recherche im Internet, schnell für das in Ruby on Rails geschriebene <a href="http://www.redmine.org/" target="_blank" class="external-link-new-window">Redmine</a> begeistern. Es bringt alles mit, was man sich für ein Softwareprojekt nur vorstellen kann: angefangen bei einem Wiki über Bug/Feature Tracker bis hin zur Gantt-Darstellung der Aktivitäten. Dabei ist die <a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall" target="_blank" class="external-link-new-window">Installation</a> auf einem Debian Server denkbar einfach.
</p>
<p class="bodytext">Zunächst benötigt man Ruby in Version 1.8.6 oder 1.8.7 - die Installation erfolgt einfach mittels
</p>
<p class="code">apt-get install ruby</p>
<p class="bodytext">Dann sollte man die Abhängigkeiten für die Installation von redmine erfüllen. Hierzu müssen die Ruby Gems installiert werden:
</p>
<p class="code">wget <a href="http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz" target="_blank">rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz</a><br /><br />tar xvf rubygems-1.3.5.tgz<br /><br />cd rubygems-1.3.5<br /><br />ruby setup.rb<br /><br />gem update --system</p>
<p class="bodytext">Und dann können noch die einzelnen Gems installiert werden.
</p>
<p class="code">gem install rails -v=2.3.5<br /><br />gem install rack -v=1.0.1<br /><br />gem install i18n -v=0.4.2<br /><br />gem install mysql</p>
<p class="bodytext">Jetzt soll der MySQL-Benutzer und die Datenbank für Redmine angelegt werden. Am einfachsten kann man das mit phpMyAdmin erledigen, falls das nicht zur Verfügung steht, können die MySQL Kommandos in der <a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Installation" target="_blank" class="external-link-new-window">Installationsanleitung</a> verwendet werden. 
</p>
<p class="bodytext">Nun können wir uns endlich Redmine selbst widmen. Zunächst lädt man das Archiv mit den Daten herunter und entpackt sie in dem gewünschten Verzeichnis.
</p>
<p class="code">wget <a href="http://rubyforge.org/frs/download.php/73900/redmine-1.1.0.tar.gz" target="_blank">rubyforge.org/frs/download.php/73900/redmine-1.1.0.tar.gz</a><br /><br />tar xvf redmine-1.1.0.tar.gz<br /><br />cd redmine-1.1.0</p>
<p class="bodytext">Den zuvor mit MySQL erstellten Zugang trägt man in die Konfigurationsdatei im Ordner config/database.yml ein (dazu einfach die database.yml.example kopieren und umbenennen).
</p>
<p class="code">production:<br />&nbsp; adapter: mysql<br />&nbsp; database: redmineDbName<br />&nbsp; host: localhost<br />&nbsp; username: redmineDbUser<br />&nbsp; password: redmineDbPassword</p>
<p class="bodytext">Natürlich müssen hier die zuvor erstellten Daten zu Datenbank, Username und Passwort eingetragen werden. Im Redmine-Verzeichnis führt man nun den Befehl zum Generieren eines Session Store Secrets aus. Anschließend kann die Datenbank befüllt werden.
</p>
<p class="code">rake generate_session_store<br /><br />RAILS_ENV=production rake db:migrate<br /><br />RAILS_ENV=production rake redmine:load_default_data</p>
<p class="bodytext">Der letzte Befehl fügt Standardeinträge in die Datenbank ein. Damit muss man nicht alles von Grund auf einrichten. Wer dies nicht will, kann das also auch auslassen. <br />Nun müssen noch die richtigen Verzeichnisberechtigungen gesetzt und ein Ordner für Plugin-Dateien angelegt werden.
</p>
<p class="code">mkdir tmp public/plugin_assets<br /><br />sudo chown -R www-data:www-data files log tmp public/plugin_assets<br /><br />sudo chmod -R 755 files log&nbsp; tmp public/plugin_assets</p>
<p class="bodytext">Sind alle Schritte erledigt, kann die Redmine-Installation zum ersten Mal getestet werden.
</p>
<p class="code">ruby script/server webrick -e production</p>
<p class="bodytext">Ab jetzt kann man im Browser die Adresse <a href="http://localhost:3000/" target="_blank" class="external-link-new-window">http://localhost:3000/</a> aufrufen und sich mit <br />Benutzer: admin<br />Passwort: admin<br />in der Instanz von Redmine anmelden.
</p>
<p class="bodytext">Weitere Konfigurationsanleitungen wie etwa die Einrichtung des E-Mail Versands oder die Verwendung von Redmine über Apache finden sich auf der <a href="http://www.redmine.org/projects/redmine/wiki/HowTos" target="_blank" class="external-link-new-window">Projektseite unter HowTos</a>.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/w0WFQro3RtY" height="1" width="1"/>]]></content:encoded>
			<category>Programmieren</category>
			
			
			<pubDate>Sun, 16 Jan 2011 00:00:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Loginmeldung per E-Mail</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/loginmeldung-per-e-mail.html</link>
			<description>Ich bin ja schon seit einigen Jahren stolzer Abonnent des Linux Magazins und immer wieder freue ich mich über die guten Artikel und Tips in den Heften. In den Ausgaben 07/10 und 08/10 wurde diesmal aber ganz nebenbei ein Bash-Einzeiler gebracht, den ich so praktisch gefunden habe, dass ich ihn jetzt auf all den Linux-PCs eingebunden habe, die unter meiner Administration stehen.
# sends an email upon loginecho -e "Login of `whoami` on `hostname` `date`\n`who`" | mail -s "Login of `whoami` on `hostname` `who | awk '{print $5}'`" email@adresse.org
(Zuerst erwähnt in Ausgabe 07/10, dann "verschönert" durch einen Leserbrief in 08/10.) Diese wenigen aneinandergehängten Befehle tun nichts anderes, als eine E-Mail an eine beliebige Adresse zu versenden, mit den Informationen zum momentan angemeldeten Benutzer. Trägt man das in eine Systemweite Include-Datei wie /etc/profile oder /etc/bash.bashrc ein, wird das Schnipsel zum Login ausgeführt, und der (zugegebenermaße, leicht paranoide) Administrator erfährt sofort, wenn sich jemand anmeldet.
Das kann natürlich auf Systemen, die hoch frequentiert sind, leicht zu einer Spam-artigen E-Mail-Schleuder werden, jedoch bietet es etwa für Server, auf denen sich eigentlich niemand fremder einloggen soll, ein gewisses Gefühl der Sicherheit immer zu wissen wenn sich jemand anmeldet.</description>
			<content:encoded><![CDATA[<p class="bodytext">Ich bin ja schon seit einigen Jahren stolzer Abonnent des Linux Magazins und immer wieder freue ich mich über die guten Artikel und Tips in den Heften. In den Ausgaben 07/10 und 08/10 wurde diesmal aber ganz nebenbei ein Bash-Einzeiler gebracht, den ich so praktisch gefunden habe, dass ich ihn jetzt auf all den Linux-PCs eingebunden habe, die unter meiner Administration stehen.
</p>
<p class="code"># sends an email upon login<br />echo -e &quot;Login of `whoami` on `hostname` `date`\n`who`&quot; | mail -s &quot;Login of `whoami` on `hostname` `who | awk '{print $5}'`&quot; email@adresse.org</p>
<p class="bodytext">(Zuerst erwähnt in Ausgabe 07/10, dann &quot;verschönert&quot; durch einen Leserbrief in 08/10.) Diese wenigen aneinandergehängten Befehle tun nichts anderes, als eine E-Mail an eine beliebige Adresse zu versenden, mit den Informationen zum momentan angemeldeten Benutzer. Trägt man das in eine Systemweite Include-Datei wie /etc/profile oder /etc/bash.bashrc ein, wird das Schnipsel zum Login ausgeführt, und der (zugegebenermaße, leicht paranoide) Administrator erfährt sofort, wenn sich jemand anmeldet.
</p>
<p class="bodytext">Das kann natürlich auf Systemen, die hoch frequentiert sind, leicht zu einer Spam-artigen E-Mail-Schleuder werden, jedoch bietet es etwa für Server, auf denen sich eigentlich niemand fremder einloggen soll, ein gewisses Gefühl der Sicherheit immer zu wissen wenn sich jemand anmeldet.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/iccdqsXgsCI" height="1" width="1"/>]]></content:encoded>
			<category>Linux</category>
			
			
			<pubDate>Sat, 30 Oct 2010 00:00:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Kubuntu 10.10</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/kubuntu-1010.html</link>
			<description>Endlich ist sie da, die neue Version meiner bevorzugten, auf Debian-basierenden, KDE-verwendenden Distribution: Kubuntu 10.10

Neu ist unter Anderem, dass sowohl die Desktop als auch die Netbook Variante zusammen auf einem ISO Abbild zur Verfügung stehen. Des Weiteren gab es grobe Usability-Verbesserungen beim grafischen Installer und bei KPackageKit, dem bevorzugten Softwaretool unter Kubuntu. Der Standardbrowser ist jetzt der auf WebKit basierende Rekonq, Konqueror und ein Installer für Firefox stehen nach wie vor zur Verfügung. Dieses Release wartet auch mit einer neuen Schriftart für das User Interface auf.
Für die Netbook-User bestimmt interessant ist das neue Hauptmenü für Programme, welches sich jetzt anstatt in einer eigenen Menüleiste ganz oben links in der Kontrollleiste als Menü öffnen lässt. Dieses viel-gewünschte Detail spart weiteren Platz auf dem Bildschrim, der bei Netbooks und ähnlichen Mobilgeräten sowieso knapp ist. Erstmalig gibt es auch als Technology Preview die Mobilversion der Plasma-Oberfläche, die in erster Linie für Smartphones mit Touch-Interface gedacht ist.
Zusammen mit allen anderen Verbesserungen, die auch im Hardwarebereich vor allem unter der Haube stattgefunden haben, ist dies sicher ein sehr gutes, aktuelles und empfehlenswertes Linux.</description>
			<content:encoded><![CDATA[<p class="bodytext">Endlich ist sie da, die neue Version meiner bevorzugten, auf&nbsp;Debian-basierenden, KDE-verwendenden Distribution: Kubuntu 10.10
</p>
<p class="bodytext"><a href="http://www.kubuntu.org/news/10.10-release" target="_blank" class="external-link-new-window"><img src="http://flos-page.mine.nu/uploads/RTEmagicC_kubuntu-10.10-banner.png.png" height="150" width="300" alt="" /></a>
</p>
<p class="bodytext">Neu ist unter Anderem, dass sowohl die Desktop als auch die Netbook Variante zusammen auf einem ISO Abbild zur Verfügung stehen. Des Weiteren gab es grobe Usability-Verbesserungen beim grafischen Installer und bei KPackageKit, dem bevorzugten Softwaretool unter Kubuntu. Der Standardbrowser ist jetzt der auf WebKit basierende Rekonq, Konqueror und ein Installer für Firefox stehen nach wie vor zur Verfügung. Dieses Release wartet auch mit einer neuen Schriftart für das User Interface auf.
</p>
<p class="bodytext">Für die Netbook-User bestimmt interessant ist das neue Hauptmenü für Programme, welches sich jetzt anstatt in einer eigenen Menüleiste ganz oben links in der Kontrollleiste als Menü öffnen lässt. Dieses viel-gewünschte Detail spart weiteren Platz auf dem Bildschrim, der bei Netbooks und ähnlichen Mobilgeräten sowieso knapp ist. Erstmalig gibt es auch als Technology Preview die Mobilversion der Plasma-Oberfläche, die in erster Linie für Smartphones mit Touch-Interface gedacht ist.
</p>
<p class="bodytext">Zusammen mit allen anderen Verbesserungen, die auch im Hardwarebereich vor allem unter der Haube stattgefunden haben, ist dies sicher ein sehr gutes, aktuelles und empfehlenswertes Linux.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/_zZlXFbgMhI" height="1" width="1"/>]]></content:encoded>
			<category>Linux</category>
			
			
			<pubDate>Sun, 10 Oct 2010 16:44:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Stylesheets für Mobile Browser</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/stylesheets-fuer-mobile-browser.html</link>
			<description>Es ist nicht einfach, immer mit allen Trends im Internet mitzuhalten und über jede Neuigkeit bescheid zu wissen. Was aber an niemandem vorübergegangen sein sollte, ist der definitive Trend zu Mobilgeräten, mit denen häufig und gern Zeit im Internet verbracht wird. War das vor 5 Jahren noch eher die Ausnahme - weil langsam und teuer - ist das Surfen vom Smartphone aus für viele bereits zur Gewohnheit geworden.
Nun kann es aber vorkommen, dass Webbrowser auf diesen Geräten nicht immer alles so darstellen, wie es eigentlich gedacht ist. Und solange wir noch keine weit verbreitete Version von Firefox für Mobilgeräte haben, wird das auch noch einige Zeit ein Problem bleiben. Aber nicht nur die richtige Darstellung ist ein Faktor für mobiles Browsen, auch der begrenzte Platz am Bildschirm stellt oft ein Hindernis dar.
Nun gibt es mehrere Möglichkeiten, auf Mobilgeräte optimierte Versionen einer Webseite anzubieten, die wie immer nur in Kombination zum Erfolg führen.
In CSS 2.1 werden die sogenannten Meda Types spezifiziert. Diese erlauben es, spezifischen Geräten eigene Stylesheets zuzuordnen. Beispielsweise spricht der Typ 'screen' auf normale Bildschirme und ähnliches an, während 'handheld' in der Theorie für kleinere Geräte wie Smartphones und Handys gedacht ist. Es gibt auch noch andere Media Types, etwa für die Darstellung bei einer Projektion oder für textbasierte Konsolen. Das ist zwar alles schön und gut, jedoch beachten viele Browser auf Mobilgeräten die vor Kurzem auf dem Markt gekommen sind, den Typ 'handheld' nicht, sondern verwenden die für die "richtigen" Browser gedachten 'screen' Stylesheets. Mit Opera Mini beispielsweise lässt sich dieses Verhalten im Menü festlegen, aber etwa beim iPhone oder einem Samsung Galaxy kann man nicht einmal wenn man es wollte etwas dagegen unternehmen.
Jetzt könnte man natürlich eine JavaScript-basierte Lösung entwickeln, oder serverseitig anhand des vom Browser mitgesendeten User Agent String eine Unterscheidung vornehmen und immer nur die zutreffenden Stylesheets ausliefern. Das ist sicher sinnvoll, aber es lässt sich auch durch eine weitere, neuere Methode ergänzen.
CSS 3 Media Queries lautet hier das Stichwort. Dies ist eine Erweiterung des Media Types aus CSS 2.1 welche es erlaubt, verschiedene Bedingungen abzufragen, und anhand dessen zu entscheiden, welches Stylesheet verwendet werden soll. Darunter fallen z.B. Breite, Höhe, Orientierung des Gerätes, Auflösung, Verfügbarkeit von Farben und Seitenverhältnis. Einige Beispiele finden sich auf den Seiten des w3c und hier gibt es einen sehr ausführlichen Artikel zu dem Thema. Diese Methode funktioniert natürlich nur mit Browsern, die diesen Teil von CSS 3 bereits unterstützen und ist daher vorerst nur als Ergänzung sinnvoll, hat aber einiges an Potential und findet mit ziemlicher Sicherheit in Zukunft weitere Verbreitung.</description>
			<content:encoded><![CDATA[<p class="bodytext">Es ist nicht einfach, immer mit allen Trends im Internet mitzuhalten und über jede Neuigkeit bescheid zu wissen. Was aber an niemandem vorübergegangen sein sollte, ist der definitive Trend zu Mobilgeräten, mit denen häufig und gern Zeit im Internet verbracht wird. War das vor 5 Jahren noch eher die Ausnahme - weil langsam und teuer - ist das Surfen vom Smartphone aus für viele bereits zur Gewohnheit geworden.
</p>
<p class="bodytext">Nun kann es aber vorkommen, dass Webbrowser auf diesen Geräten nicht immer alles so darstellen, wie es eigentlich&nbsp;gedacht ist. Und solange wir noch keine weit verbreitete Version von Firefox für Mobilgeräte haben, wird das auch noch einige Zeit ein Problem bleiben. Aber nicht nur die richtige Darstellung ist ein Faktor für mobiles Browsen, auch der begrenzte Platz am Bildschirm stellt oft ein Hindernis dar.
</p>
<p class="bodytext">Nun gibt es mehrere Möglichkeiten, auf Mobilgeräte optimierte Versionen einer Webseite anzubieten, die wie immer nur in Kombination zum Erfolg führen.
</p>
<p class="bodytext">In <a href="http://www.w3.org/TR/CSS2/media.html" target="_blank" class="external-link-new-window">CSS 2.1</a> werden die sogenannten Meda Types spezifiziert. Diese erlauben es, spezifischen Geräten eigene Stylesheets zuzuordnen. Beispielsweise spricht der Typ 'screen' auf normale Bildschirme und ähnliches an, während 'handheld' in der Theorie für kleinere Geräte wie Smartphones und Handys gedacht ist. Es gibt auch noch andere Media Types, etwa für die Darstellung bei einer&nbsp;Projektion oder für textbasierte&nbsp;Konsolen. Das ist zwar alles schön und gut, jedoch beachten viele Browser auf Mobilgeräten die vor Kurzem auf dem Markt gekommen sind, den Typ 'handheld' nicht, sondern verwenden die für die &quot;richtigen&quot; Browser gedachten 'screen' Stylesheets. Mit Opera Mini beispielsweise lässt sich dieses Verhalten im Menü festlegen, aber etwa beim iPhone oder einem Samsung Galaxy kann man nicht einmal wenn man es wollte etwas&nbsp;dagegen unternehmen.
</p>
<p class="bodytext">Jetzt könnte man natürlich eine JavaScript-basierte Lösung entwickeln, oder serverseitig anhand des vom Browser mitgesendeten User Agent String eine Unterscheidung vornehmen und immer nur die zutreffenden Stylesheets ausliefern. Das ist sicher sinnvoll, aber es lässt sich auch durch eine weitere, neuere Methode ergänzen.
</p>
<p class="bodytext"><a href="http://www.w3.org/TR/css3-mediaqueries/" target="_blank" class="external-link-new-window">CSS 3 Media Queries</a> lautet hier das Stichwort. Dies ist eine Erweiterung des Media Types aus CSS 2.1 welche es erlaubt, verschiedene Bedingungen abzufragen, und anhand dessen zu entscheiden, welches Stylesheet verwendet werden soll. Darunter fallen z.B.&nbsp;Breite, Höhe, Orientierung des Gerätes, Auflösung, Verfügbarkeit von Farben und Seitenverhältnis. Einige Beispiele finden sich auf den Seiten des <a href="http://www.w3.org/TR/css3-mediaqueries/#media1" target="_blank" class="external-link-new-window">w3c</a> und <a href="http://www.alistapart.com/articles/return-of-the-mobile-stylesheet" target="_blank" class="external-link-new-window">hier</a> gibt es einen sehr ausführlichen Artikel zu dem Thema.&nbsp;Diese Methode funktioniert natürlich nur mit Browsern, die diesen Teil von CSS 3 bereits unterstützen und ist daher vorerst nur als Ergänzung sinnvoll, hat aber einiges an Potential und findet mit ziemlicher Sicherheit in Zukunft weitere Verbreitung.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/0ZJkDR-2Jxw" height="1" width="1"/>]]></content:encoded>
			<category>Webdesign</category>
			
			
			<pubDate>Thu, 30 Sep 2010 00:00:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Typo3 und indexed_search</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/typo3-und-indexed-search.html</link>
			<description>Typo3 bringt von Haus aus eine exzellente Suchmaschine mit, die nur noch über den Extension Manager aktiviert werden muss. Die Indizierung der Inhalte erfolgt nicht über die Datenbank, sonder während des Seitenaufbaus über das Cache. Mit indexed_search und ein paar zusätzlichen Programmen auf Server-Seite lassen sich auch PDFs, DOCs und andere Dateiformate durchsuchen, und wenn man es wünscht, können sogar externe Seiten in den Index aufgenommen werden.
Unter Erweiterungen &gt; Erweiterungen installieren in der Kategorie Front-End Plugins muss "Indexed Search Engine" installiert werden. Während der Installation wird das Manual als Abhängigkeit mitinstalliert. Will man die Suche auf Deutsch haben, muss im Anschluss auch noch die Übersetzung von Erweiterungen &gt; Übersetzungen installiert werden. Lädt man jetzt das Backend neu, so fällt im Menü unter dem Punkt Adminwerkzeuge der neue Eintrag Indexierung auf. Hier kann man sehen wie viele Seiten bereits im Index vorhanden sind und des Weiteren auch welche Seiten mit welchen Parametern aufgerufen worden sind. Unter Web &gt; Info gibt es auch zwei neue Einträge, die einerseits alle Begriffe einer Seite auflisten, mit der sie im Index steht und auch alle Suchbegriffe, die im Suchfeld verwendet wurden um zu suchen.
Bisher werden die Seite allerdings noch nicht indiziert. Erst muss dafür im Template Setup folgendes eingetragen werden. (Detaillierte Konfigurationsoptionen, die über das reine Aktivieren der Suche hinaus gehen, entnimmt man dem Manual.)
# Indexed Searchconfig.index_externals = 1 # Dokumente indizierenpage.config.index_enable = 1 # Seiten indizieren
Am Besten erstellt man für die Suche eine eigene Seite. Auf dieser kann man dann das Suchformular einfügen. Dieses befindet sich in Neuen Seiteninhalt &gt; Allgemeines Plugin &gt; Erweiterung: Indexsuche. Wünscht man ein Suchformular auf jeder Seite, kann ich nur empfehlen das so zu lösen, wie es im neuen Introduction Package von Typo3 gelöst ist. Es wird ein einfaches Input Feld erzeugt, welches auf die Seite mit der Suche weiterleitet und den Suchbegriff übergibt. (TS Setup:)
# Create the searchbox in TypoScript, so we can easily include in on every pagelib.searchbox = COA# Make the searchbox remember the search term on the search result page[globalVar = TSFE:id = 168]lib.searchbox = COA_INT[global]lib.searchbox {  stdWrap.prefixComment = 2 | lib.searchbox  10 = TEXT  10.typolink.parameter = {$plugin.tx_indexedsearch.searchpageID}  10.typolink.returnLast = url  10.wrap = &lt;form action="|" method="post" id="indexedsearch"&gt;&lt;fieldset&gt;  20 = COA  20 {    10 = TEXT    10.data = GP : tx_indexedsearch |sword    10.htmlSpecialChars = 1     10.wrap = &lt;input name="tx_indexedsearch[sword]" value="|" id="inputText" type="text" /&gt;    20 = COA    20 {      10 = TEXT      10.value = &lt;input type="image" src="{$filepaths.templates}images/bg_searchButton.png" id="inputButton" alt="Search" title="Search" /&gt;      20 = TEXT      20.value = &lt;input type="hidden" name="tx_indexedsearch[sections]" value="0" /&gt;      30 = TEXT      30.value = &lt;input name="tx_indexedsearch[submit_button]" value="Search" type="hidden" /&gt;    }  }    wrap = |&lt;/fieldset&gt;&lt;/form&gt;}  
Nun kann man im Template an der Stelle, wo das Suchfeld erscheinen soll, einfach lib.searchbox zuweisen: 
page.10.marks.SEARCH &lt; lib.searchbox
Will man den Bereich einschränken, der auf den Seiten durchsucht wird (etwa um Menüs oder Footer mit immer gleichem Inhalt von der Suche auszunehmen), können spezielle HTML Kommentare in das Seitentemplate eingefügt werden. Die Suche beachtet dann nur den Inhalt, der zwischen diesen Kommentaren steht:
&lt;!--TYPO3SEARCH_begin--&gt;Inhalt, der durchsucht werden soll&lt;!--TYPO3SEARCH_end--&gt;
Wichtig zu beachten ist, dass nur Seiten in den Index aufgenommen werden, auf denen das Typo3 Frontend Cache aktiviert ist. Also auch wenn beispielsweise tt_news verwendet wird, muss für dieses Plugin das Cache aktiviert werden.Eine globale Einstellung, die den no_cache Parameter deaktiviert und somit jede Seite unabhängig von etwaigen Einstellungen cachen lässt, befindet sich im Installer unter All Configuration: [FE][disableNoCacheParameter]Bevor man allerdings diese Einstellung setzt, sollte man den Beschreibungstext lesen, und für sich selbst herausfinden, ob das so für die betreffende Seite sinnvoll ist. Mir hat es geholfen, da bei einem Projekt mit tt_news die Einzelansich nicht gecached (und damit nicht indiziert) wurde, die falsch konfigurierte Option aber nirgends zu finden war...</description>
			<content:encoded><![CDATA[<p class="bodytext">Typo3 bringt von Haus aus eine exzellente&nbsp;Suchmaschine mit, die nur noch über den Extension Manager aktiviert werden&nbsp;muss. Die Indizierung der Inhalte erfolgt nicht über die Datenbank, sonder während des Seitenaufbaus über das Cache. Mit indexed_search und ein paar zusätzlichen Programmen auf Server-Seite lassen sich auch PDFs, DOCs und andere Dateiformate durchsuchen, und wenn man es wünscht, können sogar externe Seiten in den Index aufgenommen werden.
</p>
<p class="bodytext">Unter <i>Erweiterungen</i> &gt; <i>Erweiterungen installieren</i> in der Kategorie <i>Front-End Plugins</i> muss &quot;Indexed Search Engine&quot; installiert werden. Während der Installation wird das Manual als Abhängigkeit mitinstalliert. Will man die Suche auf Deutsch haben, muss im Anschluss auch noch die Übersetzung von <i>Erweiterungen</i> &gt; <i>Übersetzungen</i> installiert werden. Lädt man jetzt das Backend neu, so fällt im Menü&nbsp;unter dem Punkt <i>Adminwerkzeuge</i> der neue Eintrag <i>Indexierung</i> auf. Hier kann man sehen wie viele Seiten bereits im Index vorhanden sind und des Weiteren auch welche Seiten mit welchen Parametern aufgerufen worden sind. Unter <i>Web</i> &gt; <i>Info</i> gibt es auch zwei neue Einträge, die einerseits alle Begriffe einer Seite auflisten, mit der sie im Index steht&nbsp;und auch alle Suchbegriffe, die im Suchfeld verwendet wurden um zu suchen.
</p>
<p class="bodytext">Bisher werden die Seite allerdings noch nicht indiziert. Erst muss dafür im Template Setup folgendes eingetragen werden. (Detaillierte Konfigurationsoptionen, die über das reine Aktivieren der Suche hinaus gehen,&nbsp;entnimmt man dem Manual.)
</p>
<p class="code"># Indexed Search<br />config.index_externals = 1 # Dokumente indizieren<br />page.config.index_enable&nbsp;= 1 # Seiten indizieren</p>
<p class="bodytext">Am Besten erstellt man für die Suche eine eigene Seite. Auf dieser kann man dann das Suchformular einfügen. Dieses befindet sich in&nbsp;<i>Neuen Seiteninhalt &gt; Allgemeines Plugin &gt; Erweiterung: Indexsuche. </i>Wünscht man ein Suchformular auf jeder Seite, kann ich nur empfehlen das so zu lösen, wie es im neuen&nbsp;Introduction Package von Typo3 gelöst ist. Es wird ein einfaches Input Feld erzeugt, welches auf die Seite mit der Suche weiterleitet und den Suchbegriff übergibt. (TS Setup:)
</p>
<p class="code"># Create the searchbox in TypoScript, so we can easily include in on every page<br />lib.searchbox = COA<br /><br /># Make the searchbox remember the search term on the search result page<br />[globalVar = TSFE:id = 168]<br />lib.searchbox = COA_INT<br />[global]<br /><br />lib.searchbox {<br />&nbsp;&nbsp;stdWrap.prefixComment = 2 | lib.searchbox<br />&nbsp;&nbsp;10 = TEXT<br />&nbsp;&nbsp;10.typolink.parameter = {$plugin.tx_indexedsearch.searchpageID}<br />&nbsp;&nbsp;10.typolink.returnLast = url<br />&nbsp;&nbsp;10.wrap = &lt;form action=&quot;|&quot; method=&quot;post&quot; id=&quot;indexedsearch&quot;&gt;&lt;fieldset&gt;<br />&nbsp;&nbsp;20 = COA<br />&nbsp;&nbsp;20 {<br />&nbsp; &nbsp;&nbsp;10 = TEXT<br />&nbsp; &nbsp;&nbsp;10.data = GP : tx_indexedsearch |sword<br />&nbsp; &nbsp;&nbsp;10.htmlSpecialChars = 1 <br />&nbsp; &nbsp;&nbsp;10.wrap = &lt;input name=&quot;tx_indexedsearch[sword]&quot; value=&quot;|&quot; id=&quot;inputText&quot; type=&quot;text&quot; /&gt;<br />&nbsp; &nbsp;&nbsp;20 = COA<br />&nbsp; &nbsp;&nbsp;20 {<br />&nbsp; &nbsp; &nbsp;&nbsp;10 = TEXT<br />&nbsp; &nbsp; &nbsp;&nbsp;10.value = &lt;input type=&quot;image&quot; src=&quot;{$filepaths.templates}images/bg_searchButton.png&quot; id=&quot;inputButton&quot; alt=&quot;Search&quot; title=&quot;Search&quot; /&gt;<br />&nbsp; &nbsp; &nbsp;&nbsp;20 = TEXT<br />&nbsp; &nbsp; &nbsp;&nbsp;20.value = &lt;input type=&quot;hidden&quot; name=&quot;tx_indexedsearch[sections]&quot; value=&quot;0&quot; /&gt;<br />&nbsp; &nbsp; &nbsp;&nbsp;30 = TEXT<br />&nbsp; &nbsp; &nbsp;&nbsp;30.value = &lt;input name=&quot;tx_indexedsearch[submit_button]&quot; value=&quot;Search&quot; type=&quot;hidden&quot; /&gt;<br />&nbsp; &nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;wrap = |&lt;/fieldset&gt;&lt;/form&gt;<br />}<br />&nbsp;&nbsp;</p>
<p class="bodytext">Nun kann man im Template an der Stelle, wo das Suchfeld erscheinen soll, einfach lib.searchbox zuweisen:&nbsp;
</p>
<p class="code">page.10.marks.SEARCH&nbsp;&lt; lib.searchbox</p>
<p class="bodytext">Will man den Bereich einschränken, der auf den Seiten durchsucht wird (etwa um Menüs oder Footer mit immer gleichem Inhalt von der Suche auszunehmen), können spezielle HTML Kommentare in das Seitentemplate eingefügt werden. Die Suche beachtet dann nur den Inhalt, der zwischen diesen Kommentaren steht:
</p>
<p class="code">&lt;!--TYPO3SEARCH_begin--&gt;<br />Inhalt, der durchsucht werden soll<br />&lt;!--TYPO3SEARCH_end--&gt;</p>
<p class="bodytext">Wichtig zu beachten ist, dass nur Seiten in den Index aufgenommen werden, auf denen das Typo3 Frontend&nbsp;Cache aktiviert ist. Also auch wenn beispielsweise tt_news verwendet wird, muss für dieses Plugin das Cache aktiviert werden.<br />Eine globale Einstellung, die den no_cache Parameter deaktiviert und somit jede Seite unabhängig von etwaigen Einstellungen&nbsp;cachen lässt, befindet sich im Installer unter <i>All Configuration: </i>[FE][disableNoCacheParameter]<br />Bevor man allerdings diese Einstellung setzt, sollte man den Beschreibungstext lesen, und für sich selbst herausfinden, ob das so für die betreffende Seite&nbsp;sinnvoll ist. Mir hat es geholfen, da bei einem Projekt mit tt_news die Einzelansich nicht gecached (und damit nicht&nbsp;indiziert) wurde, die falsch konfigurierte&nbsp;Option aber nirgends zu finden war...</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/2_s-TltpAmE" height="1" width="1"/>]]></content:encoded>
			<category>Typo3</category>
			
			
			<pubDate>Tue, 31 Aug 2010 00:00:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Timtab - es rührt sich wieder was</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/timtab-es-ruehrt-sich-wieder-was.html</link>
			<description>Unlängst passierte etwas, was ich schon länger nicht mehr beobachten konnte: von der Timtab Mailingliste kam Post herein. Als langjähriger Typo3 und Timtab User freute es mich zu hören, dass sich einige Leute der Berliner Usergroup der Extension angenommen haben und diese nun zu einer Version 1.0 weiterentwickeln wollen.
Es wurde auch schon langsam notwendig, denn durch das Update der tt_news Extension auf Version 3.x haben sich die Eingabefelder im Backend verändert, wodurch beim Umstellen von einem Newseintrag auf einen Blogeintrag manche Felder plötzlich verschwanden. Auch konnte die Extension ve_guestbook - eigentlich als Gästebuch gedacht, jedoch für die Kommentare im Blog genutzt -  mit ihren nur limitierten Möglichkeiten zur Spam-Bekämpfung kaum mehr mit einem modernen Blog mithalten.
Dank der neuen Timtab Version, die man sich momentan noch aus dem SVN Repository holen muss, gehören diese Probleme der Vergangenheit an. Timtab wurde an die Backend-Struktur der neuen Version von tt_news angepasst und anstatt ve_guestbook wird jetzt auf die Extension 'comments' gesetzt, die vom Design her schon darauf ausgelegt ist, für andere Extensions Kommentare zu liefern. Die alten Kommentare lassen sich auch ganz einfach mit einer anderen Extension 'vegb2cmnt' migrieren. (Nach getaner Arbeit kann man diese einfach wieder entfernen.) 
Das einzige, wobei man etwas aufpassen muss und was noch etwas handarbeit erfordert, sind einige wenige Template-Tags, die sich geändert haben. Aber hier hilft einem schnell die neue Dokumentation. Es ist auch kein Problem, das vorhandene ve_guestbook Template an die comments Extension anzupassen. Dafür kann man auch gleich ein captcha, wie es etwa die Extension 'sr_freecap' liefert, verwenden. Dies wird einfach beim Einfügen des Datensatzes auf der Seite ausgewählt. (Details werden ausführlich in der Dokumentation von comments erläutert.)
Man kann nur hoffen, dass weiterhin so gute Arbeit geleistet wird, und dass wird bald eine Timtab Version 1.0 im TER sehen werden.</description>
			<content:encoded><![CDATA[<p class="bodytext">Unlängst passierte etwas, was ich schon länger nicht mehr beobachten konnte: von der Timtab Mailingliste kam Post herein. Als langjähriger Typo3 und Timtab User freute es mich zu hören, dass sich einige Leute der Berliner Usergroup der Extension angenommen haben und diese nun zu einer Version 1.0 weiterentwickeln wollen.
</p>
<p class="bodytext">Es wurde auch schon langsam notwendig, denn durch das Update der tt_news Extension auf Version 3.x haben sich die Eingabefelder im Backend verändert, wodurch beim Umstellen von einem Newseintrag auf einen Blogeintrag manche Felder plötzlich verschwanden. Auch konnte die Extension ve_guestbook - eigentlich als Gästebuch gedacht, jedoch für die Kommentare im Blog genutzt -  mit ihren nur limitierten Möglichkeiten zur Spam-Bekämpfung kaum mehr mit einem modernen Blog mithalten.
</p>
<p class="bodytext">Dank der neuen Timtab Version, die man sich momentan noch aus dem <a href="http://forge.typo3.org/projects/extension-timtab/repository/show/branches/v_1_0" target="_blank" class="external-link-new-window">SVN Repository</a> holen muss, gehören diese Probleme der Vergangenheit an. Timtab wurde an die Backend-Struktur der neuen Version von tt_news angepasst und anstatt ve_guestbook wird jetzt auf die Extension '<a href="http://typo3.org/extensions/repository/view/comments/current/" target="_blank" class="external-link-new-window">comments</a>' gesetzt, die vom Design her schon darauf ausgelegt ist, für andere Extensions Kommentare zu liefern. Die alten Kommentare lassen sich auch ganz einfach mit einer anderen Extension '<a href="http://www.typo3extensions.org/index.php?title=vegb2cmnt" target="_blank" class="external-link-new-window">vegb2cmnt</a>' migrieren. (Nach getaner Arbeit kann man diese einfach wieder entfernen.) 
</p>
<p class="bodytext">Das einzige, wobei man etwas aufpassen muss und was noch etwas handarbeit erfordert, sind einige wenige Template-Tags, die sich geändert haben. Aber hier hilft einem schnell die neue Dokumentation. Es ist auch kein Problem, das vorhandene ve_guestbook Template an die comments Extension anzupassen. Dafür kann man auch gleich ein captcha, wie es etwa die Extension '<a href="http://typo3.org/extensions/repository/view/sr_freecap/current/" target="_blank" class="external-link-new-window">sr_freecap</a>' liefert, verwenden. Dies wird einfach beim Einfügen des Datensatzes auf der Seite ausgewählt. (Details werden ausführlich in der Dokumentation von comments erläutert.)
</p>
<p class="bodytext">Man kann nur hoffen, dass weiterhin so gute Arbeit geleistet wird, und dass wird bald eine Timtab Version 1.0 im TER sehen werden.</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/ecNEOQO_vCY" height="1" width="1"/>]]></content:encoded>
			<category>Typo3</category>
			
			
			<pubDate>Fri, 23 Jul 2010 11:24:00 +0000</pubDate>
			
		</item>
		
		<item>
			<title>Extension-Entwicklung mit Typo3 und Extbase/Fluid</title>
			<link>http://flos-page.mine.nu/no_cache/blog/blogeintrag/article/extension-entwicklung-mit-typo3-und-extbasefluid.html</link>
			<description>Seit der Typo3 Version 4.3 werden standardmäßig die Extensions 'extbase' und 'fluid' als systemweite Erweiterungen mitgeliefert. Diese sollen es den Autoren von Typo3 Erweiterungen erlauben, ihre Arbeit möglichst einfach auf die zukünftige Typo3 Version 5.x zu portieren. Typo3 v5 (Codename "Phoenix") wird auf dem neuen FLOW3 Framework basieren, welches eigens für die neue Typo3 Version  geschrieben wurde und grundlegende Änderungen in der Herangehensweise mit sich führt.
"FLOW3 brings new concepts to the PHP world.  Domain-Driven Design, Dependency Injection and Aspect-Oriented  Programming are some of them. And besides some great  features we offer a new view on the "how" of software development. It's about efficiency. It's about the beauty of  code. And it's a lot of fun."
Um sich diese neuen Konzepte schon jetzt in Typo3 Extensions zu Nutze machen  zu können und sich auf die neue Umgebung vorbereiten zu können (und weil 'Neu' einfach cool ist), gibt es besagte Erweiterungen 'extbase' und 'fluid'. Extbase stellt quasi  das Interface zwischen Typo3 und der Flow3 API dar. Es erlaubt dem Programmierer seine Erweiterungen auf die "neue" Art zu schreiben und im "alten" Typo3 zu verwenden, als seien es normale Extensions. Und da man für ein neues Framework auch eine neue Art braucht Templates zu schreiben, übernimmt diesen Teil Fluid. Mit Fluid werden HTML-ähnliche Templates erstellt, die mit Fluid-spezifischen Tags versehen werden. Diese werden von ViewHelpern gerendert. Damit ist jetzt ein für alle Mal die Ansicht von der Logik dahinter getrennt.
Möchte man das ganze einmal ausprobieren, gibt es bereits die Extension 'blog_example', die mit Extbase und Fluid geschrieben wurde. Diese implementiert einen einfachen Blog; mit Posts, Kommentaren und was nicht sonst noch. Besonders interessant ist in dieser Beispiel-Extension die neue Verzeichnisstruktur zu beobachten, welche nicht nur Model, View und Controller beinhaltet, sondern auch gleich alle Resourcen wie Stylesheets, Konfiguration und Bilder eingeplant hat.  
Es gibt auch bereits eine Extension, die einfach ein Gerüst zum Weiterarbeiten mit Extbase bereitstellt. 'efempty' enthält nur einen Controller mit einer Action und ein View und kann sonst gar nichts. (Wahrscheinlich war da jemand zu Faul jedes Mal die Verzeichnisstruktur anzulegen und die Dateien zu schreiben ;-) )
Momentan noch in Arbeit ist ein Kickstarter für Extensions mit Extbase/Fluid. Meines Wissens wird dieser gerade auf ExtJS umgeschrieben, um im Backend eine einheitliche JavaScript Bibliothek zu verwenden, aber für erste Versuche kann man bereits die Version im trunk des Repositorys auf Typo3 Forge verwenden. Hierzu modelliert man die Struktur der Extension per Drag&amp;Drop, ähnlich einem UML Klassendiagramm, aus dem der Kickstarter dann den entsprechenden Code erzeugt. Die aktuelle Version verhält sich zwar nicht immer ganz brav, aber wenn man bereit ist auf die Suche nach Fehlern zu gehen, erspart er einem immerhin das anlegen der Files der Extension.
Für alle weiteren Experimente mit Extbase und Fluid sei die Dokumentation sowohl auf Typo3 Forge als auch die von Flow3 zu empfehlen. Vom Typo3 Sponsor mittwald.de gibt es sogar ein Walk-Through zur Erstellung einer Extension mit ausführlichen Erklärungen zu den neuen Konzepten und einer Referenz zu Fluid. Auch das Wiki von Typo3 enthält schon einige gute Informationen zur Thematik, will aber noch dringend erweitert werden *hint*.
</description>
			<content:encoded><![CDATA[<p class="bodytext">Seit der Typo3 Version 4.3 werden standardmäßig die Extensions 'extbase' und 'fluid' als systemweite Erweiterungen mitgeliefert. Diese sollen es den Autoren von Typo3 Erweiterungen erlauben, ihre Arbeit möglichst einfach auf die zukünftige Typo3 Version 5.x zu portieren. Typo3 v5 (Codename &quot;Phoenix&quot;) wird auf dem neuen <a href="http://flow3.typo3.org/" target="_blank" class="external-link-new-window">FLOW3 Framework</a> basieren, welches eigens für die neue Typo3 Version  geschrieben wurde und grundlegende Änderungen in der Herangehensweise mit sich führt.
</p>
<p class="quote">&quot;FLOW3 brings new concepts to the PHP world.  Domain-Driven Design, Dependency Injection and Aspect-Oriented  Programming are some of them. And besides some <a href="http://flow3.typo3.org/about/features/" target="_blank" class="linkInt">great  features</a> we offer <a href="http://flow3.typo3.org/about/principles/" target="_blank" class="linkInt">a new view</a> on the &quot;how&quot; of software development. It's about efficiency. <br /><br />It's about the beauty of  code. And it's a lot of fun.&quot;</p>
<p class="bodytext">Um sich diese neuen Konzepte schon jetzt in Typo3 Extensions zu Nutze machen  zu können und sich auf die neue Umgebung vorbereiten zu können (und weil 'Neu' einfach cool ist), gibt es besagte Erweiterungen 'extbase' und 'fluid'. Extbase stellt quasi  das Interface zwischen Typo3 und der Flow3 API dar. Es erlaubt dem Programmierer seine Erweiterungen auf die &quot;neue&quot; Art zu schreiben und im &quot;alten&quot; Typo3 zu verwenden, als seien es normale Extensions. Und da man für ein neues Framework auch eine neue Art braucht Templates zu schreiben, übernimmt diesen Teil Fluid. Mit Fluid werden HTML-ähnliche Templates erstellt, die mit Fluid-spezifischen Tags versehen werden. Diese werden von ViewHelpern gerendert. Damit ist jetzt ein für alle Mal die Ansicht von der Logik dahinter getrennt.
</p>
<p class="bodytext">Möchte man das ganze einmal ausprobieren, gibt es bereits die Extension '<a href="http://typo3.org/extensions/repository/view/blog_example/current/" target="_blank" class="external-link-new-window">blog_example</a>', die mit Extbase und Fluid geschrieben wurde. Diese implementiert einen einfachen Blog; mit Posts, Kommentaren und was nicht sonst noch. Besonders interessant ist in dieser Beispiel-Extension die neue Verzeichnisstruktur zu beobachten, welche nicht nur Model, View und Controller beinhaltet, sondern auch gleich alle Resourcen wie Stylesheets, Konfiguration und Bilder eingeplant hat.  
</p>
<p class="bodytext">Es gibt auch bereits eine Extension, die einfach ein Gerüst zum Weiterarbeiten mit Extbase bereitstellt. '<a href="http://typo3.org/extensions/repository/view/efempty/current/" target="_blank" class="external-link-new-window">efempty</a>' enthält nur einen Controller mit einer Action und ein View und kann sonst gar nichts. (Wahrscheinlich war da jemand zu Faul jedes Mal die Verzeichnisstruktur anzulegen und die Dateien zu schreiben ;-) )
</p>
<p class="bodytext">Momentan noch in Arbeit ist ein <a href="http://forge.typo3.org/projects/show/extension-extbase_kickstarter" target="_blank" class="external-link-new-window">Kickstarter für Extensions mit Extbase/Fluid</a>. Meines Wissens wird dieser gerade auf ExtJS umgeschrieben, um im Backend eine einheitliche JavaScript Bibliothek zu verwenden, aber für erste Versuche kann man bereits die Version im trunk des Repositorys auf Typo3 Forge verwenden. Hierzu modelliert man die Struktur der Extension per Drag&amp;Drop, ähnlich einem UML Klassendiagramm, aus dem der Kickstarter dann den entsprechenden Code erzeugt. Die aktuelle Version verhält sich zwar nicht immer ganz brav, aber wenn man bereit ist auf die Suche nach Fehlern zu gehen, erspart er einem immerhin das anlegen der Files der Extension.
</p>
<p class="bodytext">Für alle weiteren Experimente mit Extbase und Fluid sei die Dokumentation sowohl auf <a href="http://forge.typo3.org/projects/typo3v4-mvc/wiki/Documentation" target="_blank" class="external-link-new-window">Typo3 Forge</a> als auch die von <a href="http://flow3.typo3.org/documentation/manuals/" target="_blank" class="external-link-new-window">Flow3</a> zu empfehlen. Vom Typo3 Sponsor mittwald.de gibt es sogar ein <a href="http://www.mittwald.de/extbase-dokumentation/" target="_blank" class="external-link-new-window">Walk-Through zur Erstellung einer Extension</a> mit ausführlichen Erklärungen zu den neuen Konzepten und einer Referenz zu Fluid. Auch das <a href="http://wiki.typo3.org/index.php/Category:Topic/extbase" target="_blank" class="external-link-new-window">Wiki von Typo3</a> enthält schon einige gute Informationen zur Thematik, will aber noch dringend erweitert werden *hint*.
</p>
<p class="bodytext">&nbsp;</p><img src="http://feeds.feedburner.com/~r/FlosSeiteBlog/~4/wFJxcHMSxpQ" height="1" width="1"/>]]></content:encoded>
			<category>Typo3</category>
			
			
			<pubDate>Mon, 12 Jul 2010 21:49:00 +0000</pubDate>
			
		</item>
		
	</channel>
</rss>

