<?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>nerdpress.org</title>
	<atom:link href="http://nerdpress.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://nerdpress.org</link>
	<description>$just-&#62;another( nerdpress::weblog );</description>
	<lastBuildDate>Thu, 05 Aug 2010 14:52:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Asus N82j, U80, UL30 Series; Touchpad auschalten unter Ubuntu 10.04</title>
		<link>http://nerdpress.org/2010/08/05/asus-n82j-u80-ul30-series-touchpad-auschalten-unter-ubuntu-10-04/</link>
		<comments>http://nerdpress.org/2010/08/05/asus-n82j-u80-ul30-series-touchpad-auschalten-unter-ubuntu-10-04/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 14:51:03 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[Admin]]></category>
		<category><![CDATA[Diverses]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1077</guid>
		<description><![CDATA[Das für mich als Merkhilfe und eventuell Suchende: Wer sein Touchpad unter Ubuntu via Hotkey abschalten möchte und im Besitz eines neueren Asus-Notebooks ist, wird hier endlich fündig: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/418282 (für mich hat folgender Workaround zuverlässig funktioniert):

This problem is also valid for the ASUS UL30A. The touchpad is seen as an &#8220;ImPS/2 Logitech Wheel Mouse&#8221;. See [...]]]></description>
			<content:encoded><![CDATA[<p>Das für mich als Merkhilfe und eventuell Suchende: Wer sein Touchpad unter Ubuntu via Hotkey abschalten möchte und im Besitz eines neueren Asus-Notebooks ist, wird hier endlich fündig: <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/418282">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/418282</a> (für mich hat folgender Workaround zuverlässig funktioniert):</p>
<blockquote><p>
This problem is also valid for the ASUS UL30A. The touchpad is seen as an &#8220;ImPS/2 Logitech Wheel Mouse&#8221;. See in dmesg and by the command &#8220;xinput list&#8221;. I am using Ubuntu 9.10.</p>
<p>To disable the touchpad the following command can be used:</p>
<p>   xinput set-int-prop &#8220;ImPS/2 Logitech Wheel Mouse&#8221; &#8220;Device Enabled&#8221; 8 0</p>
<p>To enable use:</p>
<p>   xinput set-int-prop &#8220;ImPS/2 Logitech Wheel Mouse&#8221; &#8220;Device Enabled&#8221; 8 1</p>
<p>To make the <Fn>F9 working I did the following:</p>
<p>1. As the <Fn>F9 does not generate a keycode but an acpi event you cannot assign just a keycode to a script. So I first checked the generated event hotkey code using:<br />
   sudo acpi_listen<br />
and pressed <Fn>F9. This gives 0000006b as event hotkey code.<br />
2. In /etc/acpi/events there is an asus-touchpad event file. This is using the wrong code so I changed it.<br />
3. The script /etc/acpi/assus-touchpad.sh is not correct for this touchpad so I changed it (see attached script)<br />
4. Now send the acpid a SIGHUP signal (or reboot) and the <Fn>F9 button toggles your touchpad an or off.</p></blockquote>
<p>Danach kann man via FN + F9 wieder wie gewohnt das Touchpad an- und abschalten.</p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/08/05/asus-n82j-u80-ul30-series-touchpad-auschalten-unter-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grouping &amp; Sorting in MongoDB</title>
		<link>http://nerdpress.org/2010/07/24/grouping-sorting-in-mongodb/</link>
		<comments>http://nerdpress.org/2010/07/24/grouping-sorting-in-mongodb/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 10:45:21 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1073</guid>
		<description><![CDATA[Will man mit PHP und MongoDB soetwas wie &#8220;SQL Aggregate Functions&#8221; umsetzen muss man sich etwas verbiegen.
MongoDb hat zwar eine group() function, die in etwa SQLs GROUP BY entspricht, allerdings kann man dies nicht kombinieren mit SORT oder LIMIT bzw den sort() und limit() Funktionen, da diese keinen Cursor zurückgibt sondern direkt ein Array.
Will man [...]]]></description>
			<content:encoded><![CDATA[<p>Will man mit PHP und MongoDB soetwas wie &#8220;<strong>SQL Aggregate Functions</strong>&#8221; umsetzen muss man sich etwas verbiegen.</p>
<p>MongoDb hat zwar eine <a href="http://www.php.net/manual/de/mongocollection.group.php">group()</a> function, die in etwa SQLs <em>GROUP BY</em> entspricht, allerdings kann man dies nicht kombinieren mit <em>SORT</em> oder <em>LIMIT</em> bzw den <a href="http://www.php.net/manual/de/mongocursor.sort.php">sort()</a> und <a href="http://www.php.net/manual/de/mongocursor.limit.php">limit()</a> Funktionen, da diese keinen Cursor zurückgibt sondern direkt ein Array.</p>
<p>Will man also sortieren und limitieren muss man sich des Map / Reduce features von MongoDB bedienen.</p>
<p><span id="more-1073"></span></p>
<p>Ein Query wie folgt:</p>
<pre class="brush: sql;">
SELECT referer.URL, count(*) AS cnt
FROM `referer`
GROUP BY referer.URL
ORDER BY cnt ASC LIMIT 25
</pre>
<p>&#8230;wird dann über <a href="http://www.php.net/manual/de/mongodb.command.php">Command()</a> so umgesetzt:</p>
<pre class="brush: php;">
$map = new MongoCode(&quot;function() { emit(this.url,1); }&quot;);
$reduce = new MongoCode(&quot;function(k, vals) { &quot;.
			&quot;var sum = 0;&quot;.
			&quot;for (var i in vals) {&quot;.
			&quot;sum += vals[i];&quot;.
			&quot;}&quot;.
			&quot;return sum; }&quot;);
$r = $this-&gt;db_handler-&gt;command(array(
		    	&quot;mapreduce&quot; =&gt; &quot;referer&quot;,
		    	&quot;map&quot; =&gt; $map,
		    	&quot;reduce&quot; =&gt; $reduce));
$r = $this-&gt;db_handler-&gt;selectCollection($r['result'])-&gt;find();
$r-&gt;sort(array('value' =&gt; -1));
$r-&gt;limit(25);
$data = array();
foreach ($r as $ref) {
	$data[$ref['_id']] = $ref['value'];
}
return $data;
</pre>
<p>In die Reduce Funktion kann man sämtliche Abfrage-Logik packen, was es zu einem ziemlich mächtigem Konstrukt macht.<br />
Hat man sich einmal dran gewöhnt, lässt sich eine Menge damit anstellen. </p>
<p>Danke auch an diesen <a href="http://kylebanker.com/blog/2009/12/mongodb-map-reduce-basics/">Blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/07/24/grouping-sorting-in-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sqlite VACUUM</title>
		<link>http://nerdpress.org/2010/06/23/sqlite-vacuum/</link>
		<comments>http://nerdpress.org/2010/06/23/sqlite-vacuum/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:20:14 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[Sqlite]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1070</guid>
		<description><![CDATA[Mal ein kleines Zauberwort für Zwischendurch:
VACUUM;
Dieses Kommando räumt eine Sqlite Datenbank auf, killt unnötige Leerzeichen und defragmentiert den Datenbank File.
In meinem Fall war die DB nach dem löschen einer relativ großen Table immer noch auf ca 20MB, das hat mich doch stutzig gemacht und zu diesem Kommando geführt.
Nachdem ich es ausgeführt hatte, war der File [...]]]></description>
			<content:encoded><![CDATA[<p>Mal ein kleines Zauberwort für Zwischendurch:<br />
<strong><a href="http://www.sqlite.org/lang_vacuum.html">VACUUM</a>;</strong></p>
<p>Dieses Kommando räumt eine Sqlite Datenbank auf, killt unnötige Leerzeichen und defragmentiert den Datenbank File.</p>
<p>In meinem Fall war die DB nach dem löschen einer relativ großen Table immer noch auf ca 20MB, das hat mich doch stutzig gemacht und zu diesem Kommando geführt.<br />
Nachdem ich es ausgeführt hatte, war der File dann tatsächlich auf 2MB geschrumpft!</p>
<p>Sollte man vielleicht nicht im laufendem Betrieb machen und als nächstes schau ich mir dann <a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum">AUTO_VACUUM</a> an.</p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/23/sqlite-vacuum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweak Ubuntu</title>
		<link>http://nerdpress.org/2010/06/16/teak-ubuntu/</link>
		<comments>http://nerdpress.org/2010/06/16/teak-ubuntu/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 07:14:18 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[Diverses]]></category>
		<category><![CDATA[Einstellungen]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Tweak]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Ubuntu Tweak]]></category>
		<category><![CDATA[Werkzeug]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1061</guid>
		<description><![CDATA[Mit Ubuntu Tweak (http://ubuntu-tweak.com/): 
Ubuntu Tweak ist eine Anwendung, die die Konfiguration von Ubuntu für jeden einfacher machen soll.

Ubuntu Teak ist das Ubuntu-Äquivalent für die guten, alten PowerToys/PowerTools, die bereits ab und für Windows-XP (*spit*) existieren und es dem Administrator ermöglichen, weitergehende Einstellungen des Betriebssystems, die normalerweise in Konfigurationsdateien oder teils weit verstreuten Mini-Programmen vorgenommen [...]]]></description>
			<content:encoded><![CDATA[<p>Mit Ubuntu Tweak (<a href="http://ubuntu-tweak.com/">http://ubuntu-tweak.com/</a>): </p>
<blockquote><p>Ubuntu Tweak ist eine Anwendung, die die Konfiguration von Ubuntu für jeden einfacher machen soll.</p></blockquote>
<p><span id="more-1061"></span><br />
Ubuntu Teak ist das Ubuntu-Äquivalent für die guten, alten PowerToys/PowerTools, die bereits ab und für Windows-XP (*spit*) existieren und es dem Administrator ermöglichen, weitergehende Einstellungen des Betriebssystems, die normalerweise in Konfigurationsdateien oder teils weit verstreuten Mini-Programmen vorgenommen werden, zentral und bequem zu tätigen. </p>
<p>Warum es so etwas auch für Ubuntu geben muss? Ist doch klar, ein Betriebssystem, das <a href="http://de.wikipedia.org/wiki/D%C3%BCmmster_anzunehmender_User">DAU</a>s adressiert, braucht auch DAU-Werkzeuge mit ordentlicher Bedienoberfläche. </p>
<p>Ich konnte mit dem Tool bspw. unglaublich einfach meine Benutzer-Ordner verschieben bzw. zurücksetzen, nachdem mein Desktop-Ordner nach irgend einem nicht mehr rekonstruierbaren, missglückten Bash-Kommando meinerseits auf /home/~user anstatt auf /home/~user/Desktop zeigte. </p>
<p>Da lacht natürlich der Linux-Guru drüber und editiert schnell mal ~/.config/user-dirs.dirs mit seinem Wie-Ei.</p>
<p>Nachtrag:<br />
Mit Ubuntu Tweak ist es auch bequem möglich, die Fensterleisten-Knöpfe in der neuesten Ubuntu-Version wieder nach rechts zu verschieben.</p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/16/teak-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cheat-Sheets für alle(s)</title>
		<link>http://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/</link>
		<comments>http://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 13:26:01 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[Diverses]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[Cheat-Sheet]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Referenz]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1052</guid>
		<description><![CDATA[Diesem Mann ist sicher nie langweilig: http://www.addedbytes.com/cheat-sheets/. Hinter diesem Link verbergen sich Cheat Sheets zum Selber-Ausdrucken für alles Denkbare. 
]]></description>
			<content:encoded><![CDATA[<p>Diesem Mann ist sicher nie langweilig: <a href="http://www.addedbytes.com/cheat-sheets/">http://www.addedbytes.com/cheat-sheets/</a>. Hinter diesem Link verbergen sich Cheat Sheets zum Selber-Ausdrucken für alles Denkbare. </p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/13/cheat-sheets-fur-alles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker</title>
		<link>http://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/</link>
		<comments>http://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 11:28:23 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Long Poll]]></category>
		<category><![CDATA[Push]]></category>
		<category><![CDATA[Threads]]></category>
		<category><![CDATA[WebWorker]]></category>
		<category><![CDATA[Worker]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1037</guid>
		<description><![CDATA[Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. 

Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. [...]]]></description>
			<content:encoded><![CDATA[<p>Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. </p>
<p><span id="more-1037"></span></p>
<p>Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. Und auch hier kommt man nicht herum, den Server zu tweaken oder gleich einen zweiten aufzusetzen, der ausschließlich auf Polls oder Long-Polls trainiert ist.</p>
<p>Gerade in der PHP-Welt ist es nicht einfach, einen üblichen LAMP-Stack soweit zu bringen, dass so etwas auch unter Last funktioniert &#8211; Java ist da wie immer weiter und bietet mit <a href="http://java.sun.com/products/jms/">JMS</a> ein einheitliches Interface &#8211; da gibt es Software für den gewöhnlichen Servletcontainer, im Anwendungsserver muss das laut Spezifikation sogar im Lieferumfang enthalten sein.</p>
<p>Möchte man trotzdem mit &#8220;Bordmitteln&#8221; mal schnell eine Chatbox aufsetzen, führt Longpolling + Ajax eigentlich schnell zu einem akzeptablen Ergebnis &#8211; nichts für Millionen konkurrierende Zugriffe, aber immerhin eine nette Spielerei für zwischendurch. Wäre da nicht ständiges Warten auf die Response, das sich nach einiger Zeit einerseits mit einer merklichen Ruckelorgie bemerkbar macht oder gar den Mauszeiger in eine ewiglich drehende Sanduhr verwandelt.</p>
<h4>HTML 5 to the rescue&#8230;</h4>
<p>HTML 5 kann sogenannte Dedicated Worker &#8211; &#8220;echte&#8221; Workerthreads auf Betriebssystemebene, die man mit einer Zeile spawnen kann.</p>
<pre class="brush: jscript;">
new Worker('meinScript.js')
</pre>
<p>Innerhalb eines Threads kann man lang laufende Rechenoperationen im Hintergrund verstecken &#8211; warum also nicht auch einen Ajax-Request? Allerdings haben diese Threads einen Nachteil: Aus Sicherheitsgründen laufen sie in einem klar abgegrenzten Scope, in dem sozusagen nichts vorhanden ist. Auch keine Referenz auf das document-Object der Elternseite. Das stoppt die meisten Javascript-Bibliotheken, wie bspw. JQuery. Man muss sich also mit Bordmitteln begnügen.</p>
<p>Eine Methode, die einen Worker initialisiert, könnte so aussehen:</p>
<pre class="brush: jscript;">
    _initializeLongPoll: function()
    {
      var messenger = this;

      var worker = new Worker('my-ajax-worker.js');
        worker.onmessage = function(event)
        {
          var json = jQuery.parseJSON(event.data);

          // NEUE CHAT-NACHRICHT ERZEUGEN
          messenger.$_list.append($('&lt;li class=&quot;messenger-list-item&quot;&gt;'
            + '&lt;strong class=&quot;messenger-list-item-author&quot;&gt;' + json.author + '&lt;/strong&gt;'
            + '&lt;span class=&quot;messenger-list-item-message&quot;&gt;' + json.text + '&lt;/span&gt;&lt;/li&gt;'));
        };
    }
</pre>
<p>&#8220;my-ajax-worker.js&#8221; ist ausschließlich für den Ajax-Request zuständig. Hier wird ein dynamisches Javascript in einem Symfony-Projekt generiert:</p>
<pre class="brush: jscript;">

    var onLoad = function()
    {
      var output = httpRequest.responseText;
      if (output) {

        // DELEGIERT DIE RESPONSE ZURÜCK.
        postMessage(output.trim());

        // ERZEUGE NEUEN XmlHttpRequest
        httpRequest = initRequest();
      }
    };

    // WIR SPAREN UND DEN X-BROWSER XmlHttpRequest-KRAM
    var httpRequest = initRequest();
</pre>
<p>Details zum serverseitigen Script möchte ich an dieser Stelle vernachlässigen, im Grunde funktioniert es folgendermaßen: Es arbeitet so lange, bis eine Änderung festzustellen ist. Erst bei Änderung wird die Response an den Client ausgeliefert (darum heißt es &#8220;Long-Polling&#8221;, weil ein Request ganz schön lange dauern kann):</p>
<pre class="brush: java;">
while(true)
{
  if(newData())
  {
    return getNewData()
  }
  sleep(5);
}
</pre>
<p>Der Kram funktioniert natürlich nur in HTML5-Browsern, die das Worker-Objekt unterstützen. Dazu zählen Firefox 3.6, Google Chrome und natürlich Safari. Ob Opera es beherrscht, weiß ich nicht, ob der IE 8 es beherrscht, bezweifle ich. Aber wie gesagt: Es ist nur eine Spielerei und keine produktiv geeignete Anwendung. Demnächst schau ich mir auch mal die WebSocket API an&#8230;</p>
<h4>Known Issues</h4>
<p>Vorsicht mit <a href="http://php.net/manual/de/function.session-start.php">session_start()</a> und konkurrierenden (asynchronen) HTTP-Zugriffen. Im User-Sessionscope wird der Apache immer auf das Schließen einer Session warten, bis er dem nächsten Request erlaubt, die Session wieder &#8220;aufzunehmen&#8221;. Und im Normalfall dauert eine User-Session genau so lange wie die Request-Lifetime. Das führt dazu, dass bei 4 gleichzeitig abgefeuerten XmlHttpRequests diese trotzdem als Stack nach dem FIFO-Prinzip abgehandelt werden. Man verliert somit den Vorteil der Asynchronität. Es ist also zwingend erforderlich, die Session bereits vor dem Long-Poll-Loop abzuschließen (durch den Aufruf von <a href="http://php.net/manual/en/function.session-write-close.php">session_write_close()</a>;</p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Datei-Endungen im Vork Framework</title>
		<link>http://nerdpress.org/2010/06/10/vork-framework-change-filetype-dateityp/</link>
		<comments>http://nerdpress.org/2010/06/10/vork-framework-change-filetype-dateityp/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 07:36:13 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[vork]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1028</guid>
		<description><![CDATA[Von Haus aus kommen im Vork Framework alle MVC Dateien ohne Endung daher.
Wer das ändern möchte kann folgende Dinge tun:
in der Klasse config in der Datei .config folgendes einfügen:

public $fileExtension = '.php';

dann erwartet vork im MVC Ordner Dateien mit der Endung .php.
Um alle Dateien umzubenennen braucht man eigentlich nur Windows Vista, eine präzise Maus und [...]]]></description>
			<content:encoded><![CDATA[<p>Von Haus aus kommen im <a href="http://vork.us">Vork Framework</a> alle MVC Dateien ohne Endung daher.<br />
Wer das ändern möchte kann folgende Dinge tun:</p>
<p>in der Klasse config in der Datei .config folgendes einfügen:</p>
<pre class="brush: php;">
public $fileExtension = '.php';
</pre>
<p>dann erwartet vork im MVC Ordner Dateien mit der Endung .php.<br />
Um alle Dateien umzubenennen braucht man eigentlich nur Windows Vista, eine präzise Maus und etwas Geduld.<br />
oder folgende Zeile:</p>
<pre class="brush: bash;">
find /myVorkFolder/mvc -type f -exec mv '{}' '{}'.php \;
</pre>
<p><span id="more-1028"></span><br />
Vork ist auf jeden Fall schnell und hat direkt einen Wrapper für PHP-MongoDB mit an Bord.<br />
Wie man Vork auschliesslich mit Mongo nutzen kann steht <a href="http://vork.us/install#otherdatabases">hier</a>:</p>
<pre class="brush: php;">
If you are exclusively using MongoDB as your database (and not using an RDBMS in conjunction) then
uncomment the last line in the dbConnect() method
self::$modelObjects = array('mongo');
and comment out lines
self::$db = new $db(...)
and
self::$modelObjects[] = 'mongo';
as well as the last line in the .config file:
require '.config-rdbms';
</pre>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/10/vork-framework-change-filetype-dateityp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_Log pseudo logrotate</title>
		<link>http://nerdpress.org/2010/06/08/zend_log-pseudo-logrotate/</link>
		<comments>http://nerdpress.org/2010/06/08/zend_log-pseudo-logrotate/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:29:32 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1025</guid>
		<description><![CDATA[Manchmal wachsen einem die Logfiles ja über den Kopf und drohen den Server zu sprengen.
Dann muss man aufräumen, weithin als logrotation bekannt. Unter Linux gibt es ja das praktische logrotate Programm, welches man für seine zwecke vielfältig konfigurieren kann.
Es gibt dann aber auch Fälle wo man dies nicht benutzen will/kann, zB weil man auf shared [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal wachsen einem die Logfiles ja über den Kopf und drohen den Server zu sprengen.<br />
Dann muss man aufräumen, weithin als logrotation bekannt. Unter Linux gibt es ja das praktische <a href="http://www.linuxconfig.org/Logrotate">logrotate</a> Programm, welches man für seine zwecke vielfältig konfigurieren kann.</p>
<p>Es gibt dann aber auch Fälle wo man dies nicht benutzen will/kann, zB weil man auf shared hosting ist oder man eine Tool ausliefern will, welches selbst aufräumen soll.</p>
<p>Zend_Log bietet zZt leider keine Log Rotation mit an, also muss man es selber machen:</p>
<p>In meinem Fall will ich die Logfiles ca eine Woche vorhalten, das sollte reichen um Problemen auf die Spur zu kommen.<br />
Zudem werde ich die tagesweise stückeln, da diese in einem Backend angezeigt werden sollen.<br />
Dafür nenne ich die Logfiles so:</p>
<pre class="brush: php;">
define('SYNC_LOG','sync.'.date('N').'.log.txt');
</pre>
<p>Also mit numerischem Wochentag im Namen.</p>
<p><span id="more-1025"></span></p>
<p>Die Pseudo Logrotation bedeutet in meinem Fall, alle LogFiles, die älter als die Woche sind, werden neu geschrieben, also der Inhalt nicht angehangen.</p>
<p>Dazu wird die Zend_Log_Writer Klasse extendet:</p>
<pre class="brush: php;">
class MyZend_Log_Rotated_File extends Zend_Log_Writer_Stream{
	function __construct($file) {
		parent::__construct($file,self::rotator($file));
	}
	static function rotator($file) {
		$mode = 'w+';
		if (file_exists($file)) {
			$ft = filemtime($file);
			$yt = mktime(0, 0, 0, date('m'), date('d')-1, date('Y'));
			if($ft &gt; $yt){
				$mode = 'a';
			}
		}
		return $mode;
	}
}
</pre>
<p>Jetzt wird bei jeder Instanzierung geprüft ob der File zu alt ist und der Öffne-Modus dementsprechend gesetzt und der Parent Klasse, also dem Zend_Log_Writer übergeben.</p>
<p>So wird es dann aufgerufen:</p>
<pre class="brush: php;">
$logger = new Zend_Log();
$writer = new MyZend_Log_Rotated_File(LOGDIR.SYNC_LOG);
$logger-&gt;addWriter($writer);
$logger-&gt;log('log was!');
</pre>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/08/zend_log-pseudo-logrotate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>mongomongomongomongo</title>
		<link>http://nerdpress.org/2010/06/04/mongomongomongomongo/</link>
		<comments>http://nerdpress.org/2010/06/04/mongomongomongomongo/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 21:27:28 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[spidermonkey]]></category>
		<category><![CDATA[WTFs]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1018</guid>
		<description><![CDATA[Man wird möglicherweise ein bisschen nervös, aber auch schlauer:
http://www.parleys.com/#st=5&#038;sl=4&#038;id=1864
Und Doctrine macht auch in Sachen Mongo, hab ich gerade gesehen.
http://www.doctrine-project.org/projects/mongodb_odm

Wer&#8217;s noch nicht gesehen hat, muss(!) auch mal dieses online shell tutorial auf http://www.mongodb.org anschauen. 
]]></description>
			<content:encoded><![CDATA[<p>Man wird möglicherweise ein bisschen nervös, aber auch schlauer:<br />
<a href="http://www.parleys.com/#st=5&#038;sl=4&#038;id=1864">http://www.parleys.com/#st=5&#038;sl=4&#038;id=1864</a></p>
<p>Und Doctrine macht auch in Sachen Mongo, hab ich gerade gesehen.<br />
<a href="http://www.doctrine-project.org/projects/mongodb_odm">http://www.doctrine-project.org/projects/mongodb_odm</a><br />
<span id="more-1018"></span></p>
<p>Wer&#8217;s noch nicht gesehen hat, muss(!) auch mal dieses online shell tutorial auf <a href="http://www.mongodb.org">http://www.mongodb.org</a> anschauen. </p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/06/04/mongomongomongomongo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SlickMap CSS &#8211; visuelle Sitemaps in HTML / CSS</title>
		<link>http://nerdpress.org/2010/05/30/slickmap-css-visuelle-sitemaps-in-html-css/</link>
		<comments>http://nerdpress.org/2010/05/30/slickmap-css-visuelle-sitemaps-in-html-css/#comments</comments>
		<pubDate>Sun, 30 May 2010 12:46:41 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[visual]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1015</guid>
		<description><![CDATA[visuelle Sitemaps in XHTML / CSS.
Ein Stylesheet um unordered Lists als Sitemap darzustellen.
http://astuteo.com/slickmap/
http://astuteo.com/slickmap/demo
]]></description>
			<content:encoded><![CDATA[<p>visuelle Sitemaps in XHTML / CSS.<br />
Ein Stylesheet um unordered Lists als Sitemap darzustellen.</p>
<p><a href="http://astuteo.com/slickmap/">http://astuteo.com/slickmap/</a><br />
<a href="http://astuteo.com/slickmap/demo">http://astuteo.com/slickmap/demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/05/30/slickmap-css-visuelle-sitemaps-in-html-css/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
