<?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>ROAE-Blog &#187; Codeschnipsel</title>
	<atom:link href="http://blog.root-of-all-evil.com/category/codeschnipsel/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.root-of-all-evil.com</link>
	<description>Studium, Codeing und Gedachtes</description>
	<lastBuildDate>Mon, 30 Jan 2012 22:58:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Duration to execute code in Objectice-C</title>
		<link>http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/</link>
		<comments>http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 19:45:35 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=915</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/" title="Duration to execute code in Objectice-C"></a>This code snippet outputs the time which is needed to execute some code. - (void)someAction { // save current time CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); [self someAwesomeAlgorithm]; // print time difference to console // output Example: Took 0.000078 seconds. NSLog(@"Took %f &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/" title="Duration to execute code in Objectice-C"></a><p>This code snippet outputs the time which is needed to execute some code.</p>
<pre class="c" title="code">- (void)someAction {

  // save current time
  CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

  [self someAwesomeAlgorithm];

  // print time difference to console
  // output Example: Took 0.000078 seconds.
  NSLog(@"Took %f seconds.", (CFAbsoluteTimeGetCurrent()-startTime));
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2012/01/duration-to-execute-code-in-objectice-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac / iPhone / iPad programming ressources list</title>
		<link>http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/</link>
		<comments>http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 22:09:41 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=877</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/" title="Mac / iPhone / iPad programming ressources list"></a>I started to build apps for the iPhone. Here are some ressources which are useful to know. Tutorials Very good video tutorial about iPhone programming from Paul Hegarty (Stanford University) can be found under IPad and iPhone Application Development (SD) &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/" title="Mac / iPhone / iPad programming ressources list"></a><p>I started to build apps for the iPhone. Here are some ressources which are useful to know.</p>
<h1>Tutorials</h1>
<ul>
<li>Very good video tutorial about iPhone programming from Paul Hegarty (Stanford University) can be found under <a href="http://itunes.apple.com/de/itunes-u/ipad-iphone-application-development/id480479762" target="_blank">IPad and iPhone Application Development (SD)</a> on iTuns U.</li>
<li>Video tutorials from video2brain:</li>
<ul>
<li><a href="http://www.video2brain.com/en/products-193.htm#" target="_blank">Getting Started with iOS 5</a></li>
<li><a href="http://www.video2brain.com/en/products-86.htm#" target="_blank">iPhone and iOS Application Development Workshop</a></li>
<li><a href="http://www.video2brain.com/en/products-233.htm?r=1#" target="_blank">iPhone and iOS 5 Advanced App Development</a></li>
</ul>
<li><a href="http://developer.apple.com/videos/" target="_blank">http://developer.apple.com/videos/</a>, developer videos from Apple</li>
<li><a href="http://developer.apple.com/library/mac/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010215" target="_blank">http://developer.apple.com/library/mac/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/&#8230;,</a> XCode User Guide from Apple</li>
<li><a href="http://developer.apple.com/library/mac/#documentation/General/Conceptual/Mac101/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010611-CH1-SW1" target="_blank">http://developer.apple.com/library/mac/#documentation/General/Conceptual/Mac101/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010611-CH1-SW1</a>, Your first Mac APP from Apple</li>
<li><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/UsingScriptingBridge/UsingScriptingBridge.html" target="_blank">Scripting Bride Programming Guide</a>, interact with programs on your Mac (e.g. iTunes)</li>
</ul>
<h1>Code snippets</h1>
<ul>
<li><a href="http://blog.rzepus.pl/index.php/cocoa/traybar-status-bar-in-cocoa-nsstatusbar/" target="_blank">TrayBar – Status Bar in Cocoa (NSStatusBar)</a>, get programs into the traybar (Mac OS)</li>
<li><a href="http://stackoverflow.com/questions/412562/execute-a-terminal-command-from-a-cocoa-app" target="_blank">Execute a terminal command from a Cocoa app,</a> code from stackoverflow.com</li>
<li><a href="http://stackoverflow.com/questions/5033266/can-i-receive-a-callback-whenever-an-nspasteboard-is-written-to" target="_blank">Can I receive a callback whenever an NSPasteboard is written to?</a>, information from stackoverflow.com</li>
<li><a href="http://developer.apple.com/library/mac/#qa/qa1134/_index.html" target="_blank">Programmatically causing restart, shutdown and/or logout</a>, Mac OS X Developer Library</li>
<li><a href="http://developer.apple.com/library/mac/navigation/#section=Resource%20Types&amp;topic=Sample%20Code" target="_blank">List of sample code from Apple,</a> Mac OS X Developer Library</li>
</ul>
<h1><span style="line-height: 18px;">Communities</span></h1>
<div>
<ul>
<li><a href="http://www.osxentwicklerforum.de/" target="_blank">http://www.osxentwicklerforum.de/</a></li>
</ul>
</div>
<div></div>
<p>&nbsp;</p>
<p>List will be extended. If you know additional links, post them in the comments, I will add them.</p>
<p>Updates:</p>
<ul>
<li>2012-01-08: Added code snippets, video tutorials</li>
<li>2012-01-10: Added code snippets, communities</li>
<li>2012-01-14: Added code snippets, tutorials</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2012/01/iphone-ipad-programming-ressources-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X zur Webentwicklung nutzen: Schnell und einfach Apache, PHP, MySql und SVN einrichten.</title>
		<link>http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/</link>
		<comments>http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 10:20:06 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Erklärungen]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[entwickler]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=826</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/" title="Mac OS X zur Webentwicklung nutzen: Schnell und einfach Apache, PHP, MySql und SVN einrichten."></a>Unter Mac OS X entwickeln macht Spaß. Und das eigenen System einzurichten geht erstaunlich schnell, da Mac OS X bereits mit einem Apache 2.2 Webserver, PHP 5 und auch mit einem SVN Server ausgeliefert wird. Wie diese unkompliziert eingerichtet werden &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/" title="Mac OS X zur Webentwicklung nutzen: Schnell und einfach Apache, PHP, MySql und SVN einrichten."></a><p>Unter Mac OS X entwickeln macht Spaß. Und das eigenen System einzurichten geht erstaunlich schnell, da Mac OS X bereits mit einem Apache 2.2 Webserver, PHP 5 und auch mit einem SVN Server ausgeliefert wird. Wie diese unkompliziert eingerichtet werden können soll hier gezeigt werden.</p>
<p><span id="more-826"></span></p>
<h2>Apache Webserver unter Mac OS X starten</h2>
<p><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-28-um-19.03.55.png" rel="lightbox[826]"><img class="alignright size-thumbnail wp-image-828" title="Bildschirmfoto 2010-08-28 um 19.03.55" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-28-um-19.03.55-150x125.png" alt="" width="150" height="125" /></a>Den Apache Webserver zu starten geht erstaunlich einfach. Dazu kann entweder unter <em>Systemeinstellungen</em> &gt; <em>Freigaben</em> die so genannte Webfreigabe aktiviert werden. Ich empfehle, den Apache Server auf diesem Wege zu starten. Natürlich kann man im Terminal kann auch folgenden Befehl eingegeben, doch fehlt dann der entsprechende visuelle Status unter Systemeinstellungen.</p>
<pre>sudo httpd -k start</pre>
<p>Das so genannte htdocs Verzeichnis (das Verzeichnis, dass von außen über den Apache 2 Server angesprochen wird) findet sich standardmäßig unter <em>/Library/Webserver/Documents</em>.</p>
<h2>PHP 5 unter Mac OS X einrichten</h2>
<p><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-28-um-19.37.08.png" rel="lightbox[826]"><img class="alignright size-thumbnail wp-image-833" title="Bildschirmfoto 2010-08-28 um 19.37.08" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-28-um-19.37.08-150x89.png" alt="" width="150" height="89" /></a>Wer mit PHP 5 entwickeln möchte, der muss das entsprechende Apache Modul zunächst aktivieren. Dazu muss die <em>httpd.conf</em> Datei editiert werden. Sie findet sich unter <em>/etc/apache2</em>. Um auf die Systemverzeichnisse wie beispielsweise etc oder usr über den Finder zuzugreifen wählt man im Menu des Finders <em>Gehe zu</em> &gt; <em>Gehe zu Ordner</em>. Alternativ kann natürlich auch über das Terminal und cd Befehlen zu den entsprechenden Verzeichnissen navigiert werden.</p>
<p>In der <em>httpd.conf</em> Datei muss die Zeile 116</p>
<pre>LoadModule php5_module        libexec/apache2/libphp5.so</pre>
<p>entkommentiert werden. Wer möchte kann in Zeile 215 einstellen, dass .htaccess Dateien Parameter ändern können. Das ist für die reibungslose Funktion von mod_rewrite notwendig.</p>
<pre>&lt;Directory /Library/WebServer/Documents&gt;
  AllowOverride All
&lt;/Directory&gt;</pre>
<p>In Zeile 230 muss hinzugefügt werden, dass auch index.php Dateien als Directory Indexes erkannt werden:</p>
<pre>&lt;IfModule dir_module&gt;
  DirectoryIndex index.html index.php
&lt;/IfModule&gt;</pre>
<p>Zu guter letzt muss der Webserver neu gestartet werden. Dies kann über die Systemeinstellungen (siehe oben) oder mit folgendem Befehl geschehen:</p>
<pre>sudo httpd -k restart</pre>
<p>Um zu testen, ob PHP läuft kann eine index.php und folgendem Inhalt im htdocs Verzeichnis abgelegt werden. Mit http://localhost/index.php im Browser sollte eine Übersicht über das installierte PHP Modul erscheinen.</p>
<pre>&lt;?php phpinfo(); ?&gt;</pre>
<p>Um Default-Eigenschaften zu überschreiben (error reporting, max upload etc.) muss eine <em>php.ini</em> Datei unter <em>/etc/</em> angelegt werden. Meine php.ini enthält das Folgende:</p>
<pre>max_execution_time = 60
memory_limit = 256M
display_errors = On
post_max_size = 32M
upload_max_filesize = 32M
date.timezone = Europe/Berlin</pre>
<h2>MySQL unter Mac OS X einrichten</h2>
<p>Einen MySQL-Server unter Mac OS X einzurichten geht denkbar einfach. Hierfür gibt es fertige Installer, die über <a href="http://dev.mysql.com/downloads/mysql/" target="_blank">http://dev.mysql.com/downloads/mysql/</a> bezogen werden können. Zusätzlich kommt das MySQL Package mit einem Startup-Item. Wird es installiert, so startet MySQL bei jeden Systemstart automatisch. Installiert wird mysql unter <em>/usr/local/mysql</em>. Um MySQL manuell zu starten genügt folgender Befehl:</p>
<pre>sudo mysqld_safe</pre>
<p>Um einen unkomplizierten Umgang mit MySQL zu gewährleisten empfehle ich, das <em>/usr/local/mysql/bin</em> Verzeichnis zur $PATH hinzuzufügen. Tut man dies nicht, wird der mysql Befehl im Terminal nicht gefunden. Diese drei Schritte helfen:</p>
<p>1. Eine neue Datei <em>/etc/paths.d/mysql</em> erzeugen:</p>
<pre>sudo touch /etc/paths.d/mysql</pre>
<p>2. Die Datei bearbeiten und das MySQL bin Verzeichnis erstellen:</p>
<pre>sudo vim /etc/paths.d/mysql</pre>
<p>3. Den  MySQL-bin Pfad einfügen und speichern.</p>
<pre>/usr/local/mysql/bin</pre>
<p>Wer mit vim noch nicht gearbeitet hat:<em> i</em> drücken um in die Datei zu schreiben, den Pfad eingeben, <em>ESC</em> drücken und dann <em>:wq</em> eingeben und mit <em>Enter</em> bestätigen. Nach einem Neustart sind alle im <em>/usr/local/mysql/bin</em> Verzeichnis befindenden Programme auffindbar.</p>
<p>Achtung: Anfangs besitzt der MySQL root Account kein Passwort! Zur einfachen Verwaltung empfehle ich <a href="http://www.phpmyadmin.net/home_page/downloads.php" target="_blank">phpmyadmin</a> &#8211; ein WebGUI.</p>
<h2>Einen SVN Server unter Mac OS X einrichten</h2>
<p>SVN wird bereits mit Mac OS X ausgeliefert. Damit der SVN Server auch von außen ansprechbar ist muss in erster Linie der Apache Webserver konfiguriert werden. Ich verwalte meine SVN Repositories im Ordner <em>/usr/local/svn/</em>. Um die Repositories von außen ansprechbar zu machen muss eine Datei namens <em>svn.conf</em> im Ordner <em>/etc/apache2</em>/other angelegt werden. Sie besitzt folgenden Inhalt:</p>
<pre>LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /usr/local/svn
&lt;/Location&gt;</pre>
<p>Nachdem Apache neu gestartet wurde sind die Repositories in <em>/usr/local/svn/</em> unter <em>http://localhost/svn</em> ansprechbar. Beim Anlegen eines neuen Repositories namens foo mit</p>
<pre>sudo svnadmin create /usr/local/svn/foo</pre>
<p>Muss darauf geachtet werden, dass Apache und das SVN Modul auch darauf zugreifen können. Dazu ändern wir zuvor den Besitzer der Dateien in www um:</p>
<pre>sudo chown -R www:www /usr/local/svn</pre>
<p>Damit ist SVN bereits fertig eingerichtet. Ich empfehle die Absicherung des SVN Verzeichnisses. Dazu muss zunächst eine htpasswd Datei erzeugt werden:</p>
<pre>htpasswd -cm /etc/apache2/svn.auth benutzername</pre>
<p>Die svn.conf Datei muss um folgendes erweitert werden:</p>
<pre>LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /usr/local/svn
  AuthType Basic
  AuthName "Subversion Login"
  AuthUserFile /etc/apache2/svn.auth
  Require valid-user
&lt;/Location&gt;</pre>
<p>Die Repositories sind jetzt unter http://localhost/svn erreichbar. Zur einfachen Verwaltung empfehle ich <a href="http://www.websvn.info/download/" target="_blank">WebSVN</a> &#8211; ein WebGUI.</p>
<p><strong>Update:</strong> Sollte der Apache Server mit der obigen svn Konfiguration nicht mehr starten, muss darauf geachtet werden, dass die Apache Module <em>mod_dav.so</em> und <em>mod_dav_fs.so</em> auch geladen werden. Danke an Alexander für diesen Tip.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/08/mac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setting up SVN on Mac OS X &#8211; Quick &amp; Easy</title>
		<link>http://blog.root-of-all-evil.com/2010/08/setting-up-svn-on-mac-os-x-quick-easy/</link>
		<comments>http://blog.root-of-all-evil.com/2010/08/setting-up-svn-on-mac-os-x-quick-easy/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 16:48:22 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Erklärungen]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[setup]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[svn server]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=822</guid>
		<description><![CDATA[You'll find quite a lot of guides showing you how to install an svn server on your Mac OS X machine. But most of them don't tell you, that Mac OS X ships with a fully functional svn system. This is how you configure it.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/08/setting-up-svn-on-mac-os-x-quick-easy/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/setting-up-svn-on-mac-os-x-quick-easy/" title="Setting up SVN on Mac OS X - Quick &amp; Easy"></a><p>You&#8217;ll find quite a lot of guides showing you how to install an svn server on your Mac OS X machine. But most of them don&#8217;t tell you, that Mac OS X ships with a fully functional svn system. This is how you configure it.</p>
<p><span id="more-822"></span>Start of by opening Terminal and creating a new folder holding your future svn repositories:</p>
<pre>sudo mkdir /usr/local/svn</pre>
<p>Make sure you change the folder&#8217;s owner to &#8220;www&#8221; in order to make it accesable through apache:</p>
<pre>sudo chown -R www:www /usr/local/svn</pre>
<p>Now create a new repository:</p>
<pre>sudo svnserve create /user/local/svn/foo</pre>
<p>where foo is your repository&#8217;s name.</p>
<p>Make sure, apache is running by checking your system preferences and enabling <em>web sharing</em>.</p>
<p><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-26-um-18.42.30.png" rel="lightbox[822]"><img class="aligncenter size-medium wp-image-823" title="Bildschirmfoto 2010-08-26 um 18.42.30" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-26-um-18.42.30-300x132.png" alt="" width="300" height="132" /></a>Now create a new file named <em>svn.conf</em> and place it in <em>/etc/apache2/other</em>. Type the following into the file:</p>
<pre>LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /usr/local/svn
&lt;/Location&gt;</pre>
<p>Restart apache by typing</p>
<pre>sudo apachectl graceful</pre>
<p>into your terminal. And you&#8217;re ready and set. Access your repository through <em>http://localhost/svn</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/08/setting-up-svn-on-mac-os-x-quick-easy/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Backup your files using tar and cronjobs on Mac OS X</title>
		<link>http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/</link>
		<comments>http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 14:22:04 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Erklärungen]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[os x]]></category>
		<category><![CDATA[sh]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=818</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/" title="Backup your files using tar and cronjobs on Mac OS X"></a>Mac OS X comes with a huge amount of useful stuff. You just need to find and use them. Here is a walkthrough showing you how to set up an automatically backup-system on Mac OS X. There are several ways &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/" title="Backup your files using tar and cronjobs on Mac OS X"></a><p>Mac OS X comes with a huge amount of useful stuff. You just need to find and use them. Here is a walkthrough showing you how to set up an automatically backup-system on Mac OS X.</p>
<p>There are several ways to backup your files and probably the best way to do it would be to use rsync. It allows you to backup your files onto a remote machine. But probably this is a bit to heavy for the task you most probably want to achieve: Backup a folder on your local harddrive on a regular basis.</p>
<p><span id="more-818"></span>First, create a new file called backupFiles.sh in a folder of your choice. I place sh scripts in /User/myusername/Documents/scripts.</p>
<p>Open it in you favourite editor and type:</p>
<pre># Remove the oldest backup file.
rm –f /Library/WebServer/backups/backup.2.tgz

# Rename the old backup files
mv –f /Library/WebServer/backups/backup.1.tgz /Library/WebServer/backups/backup.2.tgz
mv –f /Library/WebServer/backups/backup.0.tgz /Library/WebServer/backups/backup.1.tgz

# create a new backup file.
tar –czf /Library/WebServer/backups/backup.0.tgz /Library/WebServer/Documents/*</pre>
<p>Replace the directories to the directories of your choice. Note: The directory paths have to be absolute paths.</p>
<p>The above script will create a new compressed backup file named backup.0.tgz of my htdocs directory located at /Library/WebServer/Documents. A total of three backups will be found in /Library/WebServer/backups/, where backup.0.tgz is the latest and backup.2.tgz the oldest one.</p>
<p>To set up a new so called cronjob (a command that will be excecutet on a defined, regulare basis) open up your terminal and type:</p>
<pre>crontab –e</pre>
<p>This will open up your crontab file in your default editor. Probably vim. If you have no crontab file, it will simply create a new empty one.</p>
<p>After pressing <strong>i</strong> to insert into vim, type:</p>
<pre>#min hour mday month wday command
0 3 * * 6 sh /Users/myusername/Documents/scripts/backupFiles.sh</pre>
<p>Replace the file path with the path of your custom backup script. Press ESC to stop inserting and type :wq to write and quit vim. A new cronjob has been defined. It will be run at 3 am every Saturday.</p>
<p>You can define the time you want the script to be excecuted like this:</p>
<pre>Minute Hour DayOfTheMonth Month Weekday (0 = Sunday, 6 = Saturday) Command</pre>
<p>A few examples:</p>
<p>Daily excecution at 3:15 am</p>
<pre>15 3 * * * command</pre>
<p>Weekly excecution at 6:30 pm every Saturday</p>
<pre>30 18 * * 6 command</pre>
<p>Monthly excecution at midnight on the first day of the month:</p>
<pre>0 0 1 * * command</pre>
<p>Use */10 to define the excecution every 10 minutes:</p>
<pre>*/10 * * * * command</pre>
<p>Hope this helped you backup your files.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/08/backup-your-files-using-tar-and-cronjobs-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using -webkit and/or -moz Styles with mootools.</title>
		<link>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/</link>
		<comments>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:57:17 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[Fx]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[moz]]></category>
		<category><![CDATA[property]]></category>
		<category><![CDATA[setStyle]]></category>
		<category><![CDATA[styles]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=808</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/" title="Using -webkit and/or -moz Styles with mootools."></a>In order to use -webkit and/or -moz style CSS3 attributes such as &#8216;-webkit-transform&#8217; or &#8216;-moz-rounded-border&#8217; to generate rounded borders, transformations etc. you have to extend the mootools Element.Styles hash. Doing this enables you to use the Element.setStyle() method. You can &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/" title="Using -webkit and/or -moz Styles with mootools."></a><p>In order to use -webkit and/or -moz style CSS3 attributes such as &#8216;-webkit-transform&#8217; or &#8216;-moz-rounded-border&#8217; to generate rounded borders, transformations etc. you have to extend the mootools Element.Styles hash. Doing this enables you to use the Element.setStyle() method. You can even use the whole mootools effects library and tween -webkit and/or -moz styles.</p>
<pre class="JavaScript" title="code">Element.Styles.extend({
	WebkitTransform: 'rotateX(@deg)'
});</pre>
<p>The styles property-name has to be given camelCases. Thus &#8216;-webkit-transform&#8217; has to be given as &#8216;WebkitTransform&#8217;. Specify how the property has to be set by defining a string like &#8216;rotateX(@deg)&#8217; and leaving the @ to be replaced by the value you set the css property to.</p>
<p>Read on for an example.<span id="more-808"></span></p>
<pre class="JavaScript" title="code">Element.Styles.extend({
	WebkitTransform: 'rotateX(@deg)' // @ will get replaced by the value you pass over
});

window.addEvent('domready', function() {
	$('button').addEvent('click', function() {
		var swingAnimation = new Fx.Tween($('contentBox'), {
			property: '-webkit-transform',
			duration: 2000,
			transition: Fx.Transitions.Elastic.easeOut
		});
		swingAnimation.start(60, 0);
	});
});</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/08/using-webkit-andor-moz-styles-with-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Punkte in Google-Mail-Adressen</title>
		<link>http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/</link>
		<comments>http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/#comments</comments>
		<pubDate>Tue, 18 May 2010 18:09:29 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Erklärungen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=797</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/" title="Punkte in Google-Mail-Adressen"></a>Registriert man bei Google Mail eine E-Mailadresse &#8211; z.B. dasIstEineEMailAdresse@googlemail.com &#8211; so wird der komplette Benutzername unabhängig von Groß-/Kleinschreibung und Punkten (.) interpretiert: registriert man die E-Mail-Adresse dasIstEineEMailAdresse@googlemail.com, so hat man automatisch auch folgende weitere Adressen das.ist.eine.emailadresse@googlemail.com oder das.istEineEmailAdresse@googlemail.com etc. &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/" title="Punkte in Google-Mail-Adressen"></a><p>Registriert man bei Google Mail eine E-Mailadresse &#8211; z.B. dasIstEineEMailAdresse@googlemail.com &#8211; so wird der komplette Benutzername unabhängig von Groß-/Kleinschreibung und Punkten (.) interpretiert: registriert man die E-Mail-Adresse dasIstEineEMailAdresse@googlemail.com, <strong>so hat man automatisch auch folgende weitere Adressen</strong> das.ist.eine.emailadresse@googlemail.com oder das.istEineEmailAdresse@googlemail.com etc.</p>
<p>Welche <strong>Vorteile sich für den Benutzer</strong> und welche <strong>Nachteile für einen Webmaster</strong> sich hierdurch ergeben soll hier kurz aufgezeigt werden.</p>
<p><span id="more-797"></span></p>
<h2>Vorteile für den Benutzer</h2>
<p>Durch unterschiedliche E-Mail-Adressen, welche aber alle zu einem Postfach führen, gibt es für den Benutzer eine Reihe von Vorteilen.</p>
<h3>Organisation/Kategorisierungen</h3>
<p>Der Benutzer kann die E-Mails besser organisieren bzw. kategorisieren. Beispielsweise wird für alle <strong>Newsletter die E-Mail-Adresse m.ax.mueller@googlemail.com</strong> verwendet, für den <strong>privaten Kontakt max.mueller@googlemail.com.</strong> Mit Hilfe der <strong>Filtereinstellungen bei Google-Mail</strong> können dann alle Newsletter unabhängig vom Absender mit einem Label versehen und aus dem Posteingang verschoben werden &#8211; so findet man im Posteingang dann wirklich nur die &#8220;wichtigen&#8221; E-Mails.</p>
<p><img class="aligncenter size-medium wp-image-804" title="Filter-Einstellungen bei Google-Mail" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/screen-capture-300x60.jpg" alt="" width="300" height="60" /></p>
<h3>Privatsphäre</h3>
<p>Manche Plattformen bieten die Möglichkeit über eine E-Mail-Adresse zu prüfen ob ein User angemeldet ist (z.B. Facebook). Dies ist nicht von jedem User gewünscht. Hier bietet sich dann mit einer Google-Mail-Adresse die Möglichkeit seine <strong>E-Mail-Adresse auf der Plattform z.B. auf max.m.u.e.l.l.e.r@googlemail.com zu ändern.</strong> Sucht ein User nach max.mueller@googlemail.com so wird er nicht fündig werden &#8211; und trotzdem muss man nicht eine weitere E-Mail-Adresse registrieren.</p>
<h2>Nachteile für den Webmaster</h2>
<p>Natürlich ergeben Sie durch dieses Feature auch Nachteile. Oft wird die <strong>E-Mail-Adresse als primary Key</strong> verwendet um so Mehrfachanmeldungen oder Nutzungen schnell und einfach zu unterbinden. Dies wird genutzt unter anderem bei:</p>
<ul>
<li>Serialversand<br />
Das Produkt X darf 14 Tage mit der Serial Y getestet werden. Wird danach versucht erneut eine Serial anzufordern, schlägt das für die benutzte Adresse fehl</li>
<li>Unterbinden von Mehrfachregistrierung<br />
Es soll verhindert werden dass sich ein Benutzer mehrfach registriert &#8211; unabhängig ob das Verhalten gewollt oder ungewollt ist. Sei es auf Community-Seiten oder auch finanziell orientierten Homepages wie Online-Shops.</li>
</ul>
<p>Natürlich gibt es neben der &#8220;Google-Mail-Problematik&#8221; auch noch andere Möglichkeiten wie Wegwerf-E-Mail-Adressen, Automatische Erstellung von E-Mail-Konten, oder sogar der Besitz einer (E-Mail-)Domain (ich@meineDomain.de, ich1@meineDomain.de, &#8230;). Wir wollen uns aber hier nur mit Google-Mail beschäftigen.</p>
<p>Eine Möglichkeit das Problem zu umgehen ist der folgende einfache Algorithmus:</p>
<ol>
<li>Prüfe ob Google-Mail-Adresse</li>
<li>Wenn Ja entferne im Benutzername alle Punkte</li>
<li>Speichere E-Mail-Adresse</li>
</ol>
<p>Wenn nun geprüft werden soll, ob ein Account schon eine E-Mail-Adresse verwendet, wird auf diese der Algorithmus angewandt, und dann z.B. die Datenbank nach der Mail-Adresse durchsucht. Bleibt die Suche erfolglos, darf sich der User registrieren, wenn nicht, ist der User wohl mit einer ähnliche Adresse bereits registriert und sollte darauf hingewiesen werden. <strong>Wichtig ist hierbei, dass der Datenbestand, in dem die Mail-Adresse gesucht wird, bereits die &#8220;gesäuberte Adressen&#8221; besitzt.</strong></p>
<p><span style="text-decoration: underline;"><span style="color: #ff0000;">Hinweis:</span></span> Bei Google-Mail sind gmail.com und googlemail.com möglich. Dies wird vom Script entsprechend beachtet und alle Adressen auf gmail.com umgeschrieben.<strong><br />
</strong></p>
<p>Die Implementierung könnte in PHP z.B. gefolgt aussehen:</p>
<pre class="php" title="code">/**
 * Cleans an e-mail-address (especially Google-Mail-adresses) to avoid duplicates.
 * @param String $emailStr e-mail-address
 */
function clean_email($emailStr) {
	$emailStr = strtolower ($emailStr);
	$tokens = preg_split ("/@/", $emailStr);

	if ($tokens [1] == "gmail.com" || $tokens [1] == "googlemail.com") {
		return str_replace (".", "", $tokens [0]) . "@googlemail.com";
	} else {
		return $emailStr;
	}
}</pre>
<p>Ein Aufruf von</p>
<pre class="php" title="code">echo clean_email("m.a.x.MUELLE.R@gmail.com") . "&lt;br/&gt;";
echo clean_email("m.a.x.MUELLE.R@googlemail.com") . "&lt;br/&gt;";
echo clean_email("max.mueller@web.de");</pre>
<p>hat dann entsprechende folgende Ausgabe:</p>
<pre>maxmueller@googlemail.com
maxmueller@googlemail.com
max.mueller@web.de</pre>
<h2>Epilog</h2>
<p>Nicht immer wenn sich ein User versucht nochmal zu registrieren ist dies beabsichtigt. Ggf. hat der User schlicht vergessen dass er auf einer Seite registriert ist, oder kann sich nicht mehr einloggen, weil er seine Logindaten nicht mehr kennt. Deshalb sollte immer eine entsprechende Meldung ausgegeben werden wie z.B. &#8220;Es ist bereits ein User mit dieser E-Mail-Adresse registriert. Haben Sie Ihr Passwort vergessen?&#8221; mit entsprechenden Link zu einer Seite, wo ein neues Passwort beantragt werden kann.</p>
<p>Auch ist bei Prüfung auf Google-Mail-Adressen und Wegwerf-Adressen natürlich nicht vor einer Mehrfachregistrierung geschützt. Sicher ist das nur über das kostenpflichtige und  zeitaufwendige Postident-Verfahren &#8211; was jedoch im Internet an der Praxis scheitert.</p>
<p><strong>Weitere Informationen:</strong></p>
<ul>
<li><a href="http://mail.google.com/support/bin/answer.py?hl=de&amp;answer=10313">Google Mail-Hilfe &#8211; Empfangen von E-Mail-Nachrichten anderer Personen</a></li>
<li><a href="http://bspamfree.org/">bspamfree.org &#8211; Wegwerf-E-Mail-Adressen</a></li>
<li><a href="http://de.wikipedia.org/wiki/Postident">Wikipedia &#8211; Postident</a></li>
<li><a href="http://www.deutschepost.de/dpag?xmlFile=1015469">Deutsche Post &#8211; Identitätsprüfung</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/05/punkte-in-google-mail-adressen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP und Geolocation &#8211; Lokalisierung leicht gemacht</title>
		<link>http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/</link>
		<comments>http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/#comments</comments>
		<pubDate>Sun, 09 May 2010 17:39:03 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[geocity]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[maxmind]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=700</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/" title="PHP und Geolocation - Lokalisierung leicht gemacht"></a>Ein Besuch auf www.regnets.in zeigt kurz und knapp die aktuelle Wetterlage für den Standort des Besuchers an. Ermöglicht wird das über Geolocation anhand der IP-Adresse des Benutzers. Natürlich kann der Benutzer auch andere Städte abfragen: www.regnets.in/Hamburg oder www.regnets.in/Berlin. Geolocation lässt &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/" title="PHP und Geolocation - Lokalisierung leicht gemacht"></a><p>Ein Besuch auf <a href="http://www.regnets.in" target="_blank">www.regnets.in</a> zeigt kurz und knapp die aktuelle Wetterlage für den Standort des Besuchers an. Ermöglicht wird das über Geolocation anhand der IP-Adresse des Benutzers. Natürlich kann der Benutzer auch andere Städte abfragen: <a href="http://www.regnets.in/Hamburg" target="_blank">www.regnets.in/Hamburg</a> oder <a href="http://www.regnets.in/Berlin" target="_blank">www.regnets.in/Berlin</a>.</p>
<p>Geolocation lässt sich beispielsweise mit (kostenlosen) <a href="http://www.maxmind.com/app/geolitecity" target="_blank">GeoLite City von MaxMind</a> sehr einfach in PHP-Projekte integrieren. Mit nur wenigen Dateien und wenigen Zeilen Code lässt sich so der Standort des Besuchers relativ genau (für Deutschland mit<a href="http://www.maxmind.com/app/geolite_city_accuracy" target="_blank"> 71% Trefferquote</a>) bestimmen.<span id="more-700"></span></p>
<p>Die benötigten Dateien&#8230;</p>
<ul>
<li>geoip.inc</li>
<li>geoipcity.inc</li>
<li>geoipregionvars.php</li>
<li>GeoLiteCity.dat &#8211; die eigentliche Datenbank</li>
</ul>
<p>&#8230; lassen sich<a href="http://geolite.maxmind.com/download/geoip/api/php/" target="_blank"> hier herunterladen</a>.</p>
<p>Folgender PHP Code liefert die Geolocation des Besuchers:</p>
<pre class="php" title="code">include("geoipcity.inc");
include("geoipregionvars.php");

function getCity() {

	$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);
	$record = geoip_record_by_addr($gi, $_SERVER['REMOTE_ADDR']);
	geoip_close($gi);

	return $record-&gt;city;
}</pre>
<p>Das $record-Objekt enthält aber auch noch andere, interessante Daten:</p>
<pre class="php" title="code">print $record-&gt;country_code . " " . $record-&gt;country_code3 . " " . $record-&gt;country_name . "\n";
print $record-&gt;region . " " . $GEOIP_REGION_NAME[$record-&gt;country_code][$record-&gt;region] . "\n";
print $record-&gt;city . "\n";
print $record-&gt;postal_code . "\n";
print $record-&gt;latitude . "\n";
print $record-&gt;longitude . "\n";
print $record-&gt;metro_code . "\n";
print $record-&gt;area_code . "\n";
</pre>
<p>Fragen, Anregungen? Dafür sind die Kommentare da!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/05/php-und-geolocation-lokalisierung-leicht-gemacht/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Favelizer &#8211; ein 16&#215;16 Pixel Frequenz Spectrum</title>
		<link>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/</link>
		<comments>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:18:34 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[audio tag]]></category>
		<category><![CDATA[equalizer]]></category>
		<category><![CDATA[frequency]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[processing.js]]></category>
		<category><![CDATA[spectrum]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=776</guid>
		<description><![CDATA[Favelizer - ein 16 x 16 Pixel Frequenz Spectrum in der Browseradresszeile! Mit HTML 5 kommt auch das neue audio Element. Es erlaubt das Abspielen von Audiodateien direkt im Browser. Eine kleine Gruppe Entwickler bei Mozilla bemühen sich auch um eine Audio API, die das Abfragen und Manipulieren der Audioelemente ermöglichen kann. Noch gilt die API als experimentel, soll aber in zukünftige Firefox Versionen zu finden sein.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/" title="Favelizer - ein 16x16 Pixel Frequenz Spectrum"></a><p>Mit HTML 5 kommt auch das neue &lt;audio&gt; Element. Es erlaubt das abspielen von Audiodateien direkt im Browser. Eine kleine Gruppe Entwickler bei Mozilla bemühen sich auch um eine Audio API, die das Abfragen und Manipulieren der Audioelemente ermöglichen kann. Noch gilt die API als experimentel, soll aber in zukünftige Firefox Versionen zu finden sein.</p>
<p>Was für Möglichkeiten sich mit dieser API ergeben zeigen <a href="http://vocamus.net/dave/?p=1074" target="_blank">zahlreiche eindrucksvolle Beispiele</a>. Hier ist eines meiner Experimente:<br />
<span id="more-776"></span><br />
Favelizer &#8211; ein 16 x 16 Pixel Frequenz Spectrum in der Browseradresszeile:</p>
<p><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/favelizer.jpg" rel="lightbox[776]"><img class="aligncenter size-medium wp-image-777" title="favelizer" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/favelizer-300x137.jpg" alt="" width="300" height="137" /></a>Eine Live-Vorschau findet sich hier: <a title="Favelizer" href="http://labs.daslaboratorium.de/favelizer" target="_blank">http://labs.daslaboratorium.de/favelizer</a></p>
<p>Wer sich die gepatchte Firefox-Beta nicht herunterladen möchte, kann den Favelizer auch hier in Aktion ansehen (leider ohne Sound):</p>
<p><object width="680" height="520"><param name="movie" value="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/Favelizer.swf"><param name="quality" value="high"><param name="bgcolor" value="#FF6633"><embed src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/05/Favelizer.swf" quality="high" type="application/x-shockwave-flash" width="680" height="520"></embed></object></p>
<h3>So funktionierts:</h3>
<p>Das Audio-Element erhält ein onaudiowritten Attribut, mit dem wir beim Abspielen der Musik fortlaufend eine beliebige Javascript Funktion aufrufen können:</p>
<pre class="html" title="code">&lt;audio src="datei.ogg" controls="true" onaudiowritten="update(event);"&gt;</pre>
<p>Mit dem übergebenen event-Objekt können wir auf die Audio-Signale zugreifen:</p>
<pre class="JavaScript" title="code">function update(event) {
     signal   = event.mozFrameBuffer;
     spectrum = event.mozSpectrum;
 }
</pre>
<p>Um das Favicon dynamisch und möglichst schnell erzeugen zu können, greife ich auf processing.js zurück. Das ist wesentlich einfacher als beispielsweise mit</p>
<pre class="JavaScript" title="code">ctx = $('frame').getContext('2d');
ctx.fillStyle = '#000';
ctx.fillRect(1, 1, 1, 16);</pre>
<p>Pixel für Pixel einzeln zu färben.</p>
<p><a href="http://processingjs.org/" target="_blank">Processing.js</a> ist eine durch Javascript verwirklichte eigene Programmiersprache und gleicht in seinem Aufbau Java. Processing.js nutzt das html5 canvas object und ermöglicht beeindruckende Graphikdarstellungen im Browser &#8211; ganz ohne Flash.</p>
<p>Mit einem bisschen Mathematik lässt sich so ganz einfach ein Frequenz Spectrum auf 16 x 16 Pixel bringen:</p>
<pre class="Java" title="code">void draw() {
    background(0);
    strokeWeight(1.0);

    if (spectrum.length &gt; 0) {
        for (int i = 0; i &lt;= 16; i++) {
            var j         = i + 30 * spectrum.item(i * 4);
            var log       = -1 * Math.log(1 / j);
            var magnitude = 16 - spectrum.item(i * 4) * 256 * log;
            stroke(0, 255, 0);
            line(i, 16, i, 16 - magnitude);
        }
    }
}</pre>
<p>Das Favicon brauchen wir dann nur noch in regelmäßigen Abständen auszutauschen:</p>
<pre class="JavaScript" title="code">window.setInterval(function() {
    var icon = $('icon');
    var newIcon = icon.cloneNode(true);
    newIcon.setAttribute('href', ctx.canvas.toDataURL());
    icon.parentNode.replaceChild(newIcon, icon);
 }, 60);
</pre>
<p>Es lohnt sich auf jeden Fall ein Blick in den Sourcecode: <a title="Favelizer" href="http://labs.daslaboratorium.de/favelizer" target="_blank">http://labs.daslaboratorium.de/favelizer</a></p>
<h3>Es stockt bei mir!?</h3>
<p>Das liegt daran, dass wir zum Austausch der einzelnen Favicon-Frames ein neues Objekt erstellen und damit das alte Icon auswechseln müssen. Da häuft sich natürlich einiges an Datenmüll (alte, nicht mehr verwendete Objekte) an, der aufwendig beseitigt werden muss. Der sg. Garbage-Collector verschluckt sich. Eine schnelle Lösung habe ich im Moment leider noch nicht parat.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/05/favelizer-ein-16-x-16-pixel-frequenz-spectrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 WebSocket &#8211; Fullduplex Verbindungen mit JavaScript</title>
		<link>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/</link>
		<comments>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 13:02:30 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[pywebsocket]]></category>
		<category><![CDATA[Websocket]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=752</guid>
		<description><![CDATA[Das WebSocket Interface erlaubt den Aufbau einer bestehenden, fullduplex Verbindung über das WebSocket Protokoll und lässt sich erstaunlich einfach mit JavaScript in die eigenen Webanwendungen implementieren.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/" title="HTML5 WebSocket - Fullduplex Verbindungen mit JavaScript"></a><p>Das »Web2.0« mit seiner neuen (alten) Technologie Ajax macht viele Webseiten zu komplexen Programmen. Webseiten können zur Laufzeit verändert und mit dynamischen Inhalten gefüttert werden. Doch Ajax ist nicht unbedingt geeignet für jede Webanwendung, da es immer noch zwei Verbindungen benötigt: Einen Up-Stream für die GET- oder POST-Anfrage und einen Downstream für die Response.</p>
<p>Wer beispielsweise schon einmal mit Google Wave gespielt hat, wird merken, dass eingegebene Zeichen (mit sehr kurzer Verzögerung) auf dem Bildschirm des Gesprächspartners erscheinen. Wer so etwas mit Ajax verwirklichen will muss trickreich mit so genannten long live HTTP GET Requests spielen (<a title="Google I/O Wave uses long live HTTP GET Requests" href="http://code.google.com/intl/fr-FR/events/io/2009/sessions/GoogleWavePoweredByGWT.html" target="_blank">siehe diese Google Wave Präsentation</a>, Minute 11:00). Doch Abhilfe naht: das HTML5 WebSocket Interface findet sich bereits in den erstsen Web-Browsers implementiert. Auch der neue <a href="http://dev.w3.org/html5/websockets/" target="_blank">Editor&#8217;s Draft der WebSocketAPI</a> von gestern (15. April 2010) sieht vielversprechend aus.</p>
<p><span id="more-752"></span>Das WebSocket Interface erlaubt den Aufbau einer bestehenden, fullduplex Verbindung über das WebSocket Protokoll und lässt sich erstaunlich einfach mit JavaScript in die eigenen Webanwendungen implementieren. Es besitzt einen Constructor</p>
<pre class="JavaScript" title="code">WebSocket(url [, protocol])</pre>
<p>mit den Parameter URL (String) und dem optionalen Parameter protocoll (String).</p>
<p>Das WebSocket Interface besitzt die folgenden Attribute:</p>
<pre>readonly String URL
readonly unsigned short readyState
    0 = Connecting
    1 = Open
    2 = Closing
    3 = Closed
readonly unsigned long bufferedAmount</pre>
<p>Das WebSocket Interface besitzt zudem die folgenden Funktionen:</p>
<pre>boolean send(String data)
void close()</pre>
<p>Außerdem besitzt das Interface folgende Events:</p>
<pre>onopen
onmessage
onerror
onclose</pre>
<p>Eine typische und rudimentäre Implementierung könnte demnach so aussehen:</p>
<pre class="JavaScript" title="code">var mySocket = new WebSocket('ws://domain.com:80');
mySocket.onopen = function() {
    setInterval(function() {
        mySocket.send('Hello');
    }, 50);
}</pre>
<p>Wir erstellen demnach ein WebSocket Objekt und senden alle 50ms eine Nachricht an den Empfänger auf Port 80. Hier können bereits Probleme auftreten: Was wenn die Verbindung des ausführenden Rechners nicht ausreicht um alle 50ms eine Nachricht zu versenden? Hierfür nehmen wir das Attribut bufferedAmount zur Hilfe. bufferedAmount ist nur dann gleich 0, wenn keine Daten mehr in der Warteschlange zum Versenden sind. Unsere überarbeitete Implementierung:</p>
<pre class="JavaScript" title="code">var mySocket = new WebSocket('ws://domain.com:80');
mySocket.onopen = function() {
    setInterval(function() {
        if(mySocket.bufferedAmount == 0) {
            mySocket.send('Hello');
        }
    }, 50);
}
</pre>
<p>Empfangene Daten können wir mit dem onmessage Event verarbeiten:</p>
<pre class="JavaScript" title="code">mySocket.onmessage = function(data) {
    document.getElementById('Output').appendChild(
        document.createTextNode(data)
    );
}
</pre>
<p>Hier zeigen wir die Daten im Browserfenster an. Fehler können wir mit dem error Event abfangen. Das Auslösen des error Events muss nicht zwangsläufig bedeuten, dass die Verbindung abgebrochen ist, kann es aber:</p>
<pre class="JavaScript" title="code">mySocket.onerror = function(error) {
    alert('error');
    if(mySocket.readyState != 1) {
        document.getElementById('Output').appendChild(
            document.createTextNode("Ein Fehler ist aufgetreten.")
        );
    }
}
</pre>
<p>Um Daten mit einem Server auszutauschen benötigen wir einen Server, der das WebSocket-Protokoll unterstützt. Für die ersten Experimente eignet sich zum Beispiel <a href="http://code.google.com/p/pywebsocket/" target="_blank">pywebsocket</a>. Es kann sowohl als Apache-Modul oder auch als Stand-Alone-Server betrieben werden.</p>
<p>Im Moment unterstützen meines Wissens leider nur Google Chrome und Safari WebSocket. Firefox wird es in nicht alzu ferner Zukunft implementieren. <a href="http://bloga.jp/ws/jq/conn/wsdemo2.htm" target="_blank">Eine Chat-Demo unter Verwendung von WebSockets findet sich hier</a>.</p>
<p>Anregungen? Hierfür sind die Kommentare da.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/04/html5-websocket-fullduplex-verbindungen-uber-javascript-und-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

