<?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</title>
	<atom:link href="http://blog.root-of-all-evil.com/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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2012%2F01%2Fduration-to-execute-code-in-objectice-c%2F&amp;title=Duration%20to%20execute%20code%20in%20Objectice-C" id="wpa2a_2"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2012%2F01%2Fiphone-ipad-programming-ressources-list%2F&amp;title=Mac%20%2F%20iPhone%20%2F%20iPad%20programming%20ressources%20list" id="wpa2a_4"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></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>URL-Fingerprinting für optimales Cacheing</title>
		<link>http://blog.root-of-all-evil.com/2012/01/url-fingerprinting-fur-optimales-cacheing/</link>
		<comments>http://blog.root-of-all-evil.com/2012/01/url-fingerprinting-fur-optimales-cacheing/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 21:51:23 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=526</guid>
		<description><![CDATA[Mit Hilfe von URL-Fingerprinting ist es möglich, Dateien sehr lange zu cachen (für ein Jahr), jedoch auch gleichzeitig eine Änderung ohne Wartezeit zu publizieren. Was darunter genau zu verstehen ist und wie eine Implementierung aussehen könnte, zeigt dieser Artikel auf. &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2012/01/url-fingerprinting-fur-optimales-cacheing/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Mit Hilfe von URL-Fingerprinting ist es möglich, Dateien sehr lange zu cachen (für ein Jahr), jedoch auch gleichzeitig eine Änderung ohne Wartezeit zu publizieren. Was darunter genau zu verstehen ist und wie eine Implementierung aussehen könnte, zeigt dieser Artikel auf.</p>
<p><span id="more-526"></span>In der <a href="http://code.google.com/speed/page-speed/docs/using.html" target="_blank">Dokumentation des Tools Page Speed</a> von Google wird auf das <a href="http://code.google.com/speed/page-speed/docs/caching.html#LeverageBrowserCaching" target="_blank">Cacheverhalten von Webbrowsern</a> eingegangen. Es ist möglich durch senden von Headern eine Datei bis zu einem Jahr zu Cachen &#8211; was den Seitenaufbau signifikant beschleunigt. Theoretisch ist es auch möglich eine Datei länger als ein Jahr im Cache zu halten &#8211; dies verstösst jedoch gegen die RFC, es ist also nicht garantiert dass sich jede Client-Applikation daran hält, bzw. korrekt reagiert. Doch was genau ist jetzt URL-Fingerprinting.</p>
<h3>Definition URL-Fingerprinting</h3>
<p>Beim URL-Fingerprinting wird ein Fingerprint, eine alhphanumerische Zeichenkette in den Link integriert, meist als Präfix für die Datei. Beispiel:<strong><br />
</strong></p>
<p><strong>gewöhnliche URL:</strong> <em>images/thumb/logo.png</em></p>
<p><strong>URL mit <span style="color: #888888;">Fingerprint</span>:</strong> <em>images/thumb/<span style="color: #c0c0c0;">e4d909c290d0fb1ca068ffaddf22cbd0</span>logo.png<br />
</em></p>
<p>Doch wieso sollte man die URLs komplizierter machen, als diese in Realität sind?</p>
<h3>Warum URL-Fingerprinting</h3>
<p>Der Fingerprint ist imaginärer Bestandteil der URI zum Datenobjekt, das heißt, selbst wenn wir den Fingerprint ändern, erhalten wir &#8211; je nach Implementierung &#8211; ggf. auch das Datenobjekt, in diesem Fall das Bild. So ist es möglich dass folgende URIs alle auf die gleiche Datei verweisen:</p>
<ul>
<li><em>images/thumb/<span style="color: #c0c0c0;">e4d909c290d0fb1ca068ffaddf22cbd0</span>logo.png</em></li>
<li><em>images/thumb/<span style="color: #c0c0c0;">d41d8cd98f00b204e9800998ecf8427e</span>logo.png</em></li>
<li><em>images/thumb/<span style="color: #c0c0c0;">9e107d9d372bb6826bd81d3542a419d6</span>logo.png</em></li>
</ul>
<p>Der Vorteil ist nun, dass ich für die Datei logo.png festlegen kann, sie soll für ein Jahr im Browser gecached werden. Muss ich aber nach 5 Monaten eine Änderung machen, ändere ich einfach den Fingerprint: der Browser interpretiert die neue URI als unbekanntes, neues Objekt und lädt deshalb das Element herunter. Dadurch ist gewährleistet, dass ich meine Daten sehr lange Cachen und jederzeit eine Änderung erzwingen kann.</p>
<h3>Wann URL-Fingerprinting nutzen</h3>
<p>URL-Fingerprinting sollte immer dann benutzt werden, wenn absehbar ist, dass eine Datei lange nicht geändert wird. Der Mimetyp der Datei ist hierbei egal: die Methode kann auf CSS, Javascript, Bilder und/oder Binär-Dateien angewandt werden. Theoretisch kann jedes Objekt über URL-Fingerprinting angesprochen werden, jedoch macht dies URLs unleserlich und weniger komfortabel &#8211; deshalb ist es besser dies auf &#8220;nicht sichtbare URIs&#8221; wie die von Bildern, CSS/JS und Co zu verwenden.</p>
<h3>Was macht einen guten Fingerprint aus</h3>
<p>Ein Fingerprint sollte nur aus Zeichen bestehen, welche auch ohne Probleme in einer URL verwendet werden dürfen (Buchstaben und Zahlen). Auf Umlaute sollte genauso wie auf den / bzw. \ verzichtet werden, da dies zu Schwierigkeiten bei der Darstellung bzw. Pfadangabe führen kann. In der Praxis hat sich eingebürgert Fingerprints mit dem Aufbau [a-z0-9] zu verwenden, also Kleinbuchstaben und Zahlen.</p>
<p>Auch muss der Fingerprint eine gewisse Länge haben. Ein <a href="http://stackoverflow.com/questions/664729/firefox-cache-hash-key-generation-algorithm-bug">Bug im Firefox welcher zu Kollisionen mit Cachedateien</a> führt kann dadurch umgangen werden, dass sich die <strong>URL mindestens um acht Zeichen unterscheidet.</strong></p>
<p>Google setzt beim Google Kalender eine 128-Bit hexadezimalzahl ein (32 Stellen), um CSS-Dateien mit einem entsprechenden Fingerprint zu versehen:</p>
<div id="attachment_527" class="wp-caption aligncenter" style="width: 829px"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/urlfingerprintgcal-e1267992729532.jpg" rel="lightbox[526]"><img class="size-large wp-image-527" title="urlfingerprintgcal" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/03/urlfingerprintgcal-1024x168.jpg" alt="" width="819" height="134" /></a><p class="wp-caption-text">URL-Fingerprinting bei Google Kalender</p></div>
<h3 style="text-align: left;">Mögliche Implementierung von URL-Fingerprinting</h3>
<p style="text-align: left;">Der Fingerprint wird als imaginäres Verzeichnis in den Dateipfad eingeklingt</p>
<p style="text-align: left;">gewöhnliche URL: static/images/thumb/logo.png</p>
<p style="text-align: left;">URL mit Fingerprint: static/images/thumb/<em><span style="color: #888888;">9e107d9d372bb6826bd81d3542a419d6/</span>logo.png</em></p>
<p style="text-align: left;">Hier prüft eine Rewrite-Engine die URI auf den Aufbau static/&#8230;/&lt;fingerprint&gt;/logo.png und leidet auf static/&#8230;/logo.png weiter.</p>
<p style="text-align: left;">Realisiert werden kann dies z.B. unter Apache mit mod_rewrite.<br />
Weitere Informationen findet man hierzu unter <a href="http://www.modrewrite.de/" target="_blank">http://www.modrewrite.de/</a> und in der <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" target="_blank">offiziellen Dokumenation zu mod_rewrite.</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2012%2F01%2Furl-fingerprinting-fur-optimales-cacheing%2F&amp;title=URL-Fingerprinting%20f%C3%BCr%20optimales%20Cacheing" id="wpa2a_6"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2012/01/url-fingerprinting-fur-optimales-cacheing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probleme bei der Installation von Xcode 4</title>
		<link>http://blog.root-of-all-evil.com/2011/05/probleme-bei-der-installation-von-xcode-4/</link>
		<comments>http://blog.root-of-all-evil.com/2011/05/probleme-bei-der-installation-von-xcode-4/#comments</comments>
		<pubDate>Sun, 15 May 2011 12:46:05 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=862</guid>
		<description><![CDATA[XCode ist die IDE (Integrierte Entwicklungsumgebung) von Apple für Software. Bei der aktuellen Version kommt es zu Problemen bei der Installation. Wie diese Probleme behoben werden können und man eine fehlerhafte Version entfernt, beschreibt dieser Artikel. Allgemein Während Xcode 3 &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2011/05/probleme-bei-der-installation-von-xcode-4/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>XCode ist die IDE (Integrierte Entwicklungsumgebung) von Apple für Software. Bei der aktuellen Version kommt es zu Problemen bei der Installation. Wie diese Probleme behoben werden können und man eine fehlerhafte Version entfernt, beschreibt dieser Artikel.</p>
<p><span id="more-862"></span></p>
<h3>Allgemein</h3>
<p>Während Xcode 3 für die Allgemeinheit kostenlos war, schlägt die Version 4 mit €3,99 im App Store zu buche. Nur Entwickler welche für das <em>Apple Developer Program</em> registriert sind, können die Software weiterhin kostenlos laden.</p>
<h3>Download von xCode 4</h3>
<p>Das kostenpflichtige Image mit knapp 4GB benötigt je nach Verbindung mehrere Stunden bis es erfolgreich aus dem App Store geladen wurde. Danach befindet sich ein Icon Install Xcode in der Systembar, bzw. man findet dies über Spotlight.</p>
<div id="attachment_868" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-868" title="bewertungXcode" src="http://blog.root-of-all-evil.com/wp-content/uploads/2011/05/bewertungXcode-300x145.jpg" alt="" width="300" height="145" /><p class="wp-caption-text">Die Bewertungen werden besser - doch es gibt immer noch Probleme.</p></div>
<h3>Probleme bei xCode 4</h3>
<p>Startet man die Installation durch Install Xcode kann es zu folgenden Problemen kommen:</p>
<ul>
<li>Die Xcode Installationsroutine hängt /endet nicht</li>
<li>Die Xcode Installationsroutine führt nach der Installation keine Aufräumarbeiten aus</li>
</ul>
<p>Hintergrund ist wohl, dass Probleme mit dem Helper vorliegen, der mit der Sprachauswahl &#8220;Deutsch&#8221; im Betriebssystem nicht zurecht kommt. Mit etwas Glück kann beim Hängen die Installationsroutine einfach beendet werden, jedoch werden dann keine Aufräumarbeiten durchgeführt. Xcode selbst kann jedoch gestartet und normal genutzt werden.</p>
<p>Um diese Probleme zu umgehen hier die notwendigen Schritte.</p>
<h3>1. Fehlerhafte, unvollständige xCode 4 Installation entfernen/deinstallieren</h3>
<p>Um die bereits (ggf. auch nur teilweise) Installation von Xcode 4 wieder zu entfernen muss folgendes in der Konsole ausgeführt werden:</p>
<pre>sudo /Developer/Library/uninstall-devtools --mode=all</pre>
<p>Die Ausführung benötigte bei mir ca 45min. Danach ist die IDE und sonstige Spuren davon sauber entfernt.</p>
<h3>2. Xcode 4 problemfrei installieren</h3>
<p>Um Xcode 4 richtig zu installieren sollte die Installationsroutine direkt gestartet werden. Dafür sind folgende Schritte notwendig:</p>
<ol>
<li>Rechtsklick auf das Icon Install Xcode in der Systembar =&gt;Optionen =&gt; Im Finder anzeigen (sollte nun der Programme-Ordner sein)</li>
<li>Rechtsklick auf Install Xcode im Finder =&gt; Paketinhalt zeigen</li>
<li>Wechseln Sie nun in den Unterordner Contents =&gt; Resources</li>
<li>Starten Sie dort Xcode and iOS SDK.mpkg</li>
</ol>
<p>Der Installer von Xcode 4 wird direkt gestartet, die Installation sollte nun sauber durchlaufen. Beachten Sie dass die Installation mehrere Stunden beanspruchen kann (bei mir 3h). In dieser Zeit kann das System auf Grund von der Auslastung der Installationsroutine des öfteren nicht genutzt werden (teilweise reagiert die Maus nicht, Klicks werden erst Sekunden oder Minuten später ausgeführt).</p>
<div id="attachment_867" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-867" title="xcodeinstall" src="http://blog.root-of-all-evil.com/wp-content/uploads/2011/05/xcodeinstall-300x212.jpg" alt="" width="300" height="212" /><p class="wp-caption-text">Die Installation von xCode 4 kann mehrere Stunden beanspruchen.</p></div>
<p>Anschließend kann in Programme das Image Install Xcode gelöscht werden. Xcode 4 ist dann sauber installiert und kann ohne Einschränkung genutzt werden.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2011%2F05%2Fprobleme-bei-der-installation-von-xcode-4%2F&amp;title=Probleme%20bei%20der%20Installation%20von%20Xcode%204" id="wpa2a_8"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2011/05/probleme-bei-der-installation-von-xcode-4/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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2010%2F08%2Fmac-os-x-zur-webentwicklung-nutzen-schnell-und-einfach-apache-php-mysql-und-svn-einrichten%2F&amp;title=Mac%20OS%20X%20zur%20Webentwicklung%20nutzen%3A%20Schnell%20und%20einfach%20Apache%2C%20PHP%2C%20MySql%20und%20SVN%20einrichten." id="wpa2a_10"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></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[<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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2010%2F08%2Fbackup-your-files-using-tar-and-cronjobs-on-mac-os-x%2F&amp;title=Backup%20your%20files%20using%20tar%20and%20cronjobs%20on%20Mac%20OS%20X" id="wpa2a_12"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2010%2F08%2Fusing-webkit-andor-moz-styles-with-mootools%2F&amp;title=Using%20-webkit%20and%2For%20-moz%20Styles%20with%20mootools." id="wpa2a_14"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2010%2F05%2Fpunkte-in-google-mail-adressen%2F&amp;title=Punkte%20in%20Google-Mail-Adressen" id="wpa2a_16"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></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[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[<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>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.root-of-all-evil.com%2F2010%2F05%2Fphp-und-geolocation-lokalisierung-leicht-gemacht%2F&amp;title=PHP%20und%20Geolocation%20%26%238211%3B%20Lokalisierung%20leicht%20gemacht" id="wpa2a_18"><img src="http://blog.root-of-all-evil.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></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>
	</channel>
</rss>

