<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xml:lang="de">
 
<title>Christian's Blog</title>
<author>
<name>Christian Ahmer</name>
</author>
<id>http://www.christian-ahmer.de/</id>
<link rel="self" type="application/atom+xml" href="http://www.christian-ahmer.de/atom.xml" />
<updated>2011-04-04T21:04:27+02:00</updated>
<generator>Christian's Blogsystem</generator><entry>
    <title>Wieviel Atommüll erzeuge ich im Jahr?</title>
    <id>http://blog.christian-ahmer.de/atommuell-pro-jahr</id>
    <published>2011-04-04T20:58:36+02:00</published>
    <updated>2011-04-04T21:04:27+02:00</updated>
    <link href="http://blog.christian-ahmer.de/atommuell-pro-jahr"/>
    <content type="html"><![CDATA[<p>Zugegeben, bislang hat es mich gar nicht recht geschert - ich dachte  bislang immer, gut wir verbauchen ja eh alle irgendwie <strong>Strom aus  Atomkraftwerken</strong> und man kann ja sowieso kaum was dagegen machen<br /> Aber dieses Denken ist falsch - man kann sehr wohl etwas dagegen tun.<br />Zun&auml;chst aber sollte man erst einmal ein gewisses Bild von seinem Stromverbrauch haben.</p>
<p>Nachdem ich mich nun doch einmal umgesehen habe, <strong>wieviel Strom ich so im Jahr verbrauche</strong>, von wem ich diesen Strom wirklich beziehe, wieviel es mich kostet und was f&uuml;r Schadstoffe (und damit auch<strong> radioaktiver Abfall</strong>) dabei anfallen, habe ich nun doch ein recht genaues Bild:</p>
<p>Ich zahle an meinen Stromversorger hier in Hameln, die <strong>GWS Stadtwerke Hameln GmbH</strong> etwa 70 Euro im Monat, da man uns wohl etwas h&ouml;her eingesch&auml;tzt hat, als das was wir wirklich verbrauchen.<br />70 Euro das sind 7000 Cent. Eine Kilowattstunde Strom kostet hier in unserem Tarif 23,56 Cent.<br />7000 / 23,56 = 297 Kilowattstunden pro Monat (von der GWS gesch&auml;tzt). Sagen wir also etwa 300, damit l&auml;sst sich besser rechnen.<br />Das Ganze mal 12, damit sind wir dann bei etwa 3600 kw/h pro Jahr.</p>
<p>Laut einer Erhebung einer Stromvergleichsseite aus dem Internet (www.stromauskunft.de) werden durch die Produktion des Stroms pro Kilowattstunde 0,60mg radioaktiver Abfall erzeugt.<br />Damit bin ich mit meiner Wohnung bei 3600 * 0,6 / 1000 = <strong>2,16 Gramm pro Jahr</strong>.</p>
<p>2,16 Gramm pro Jahr klingt nicht nach viel, aber wenn man nun das Ganze mal 80 Millionen B&uuml;rger in Deutschland rechnet: 2,16 * 80000000 dann ist man schon bei <strong>173 Tonnen</strong> pro Jahr.</p>
<p>Und das nur f&uuml;r den Strom den ich in meiner Wohnung verbrauche. Der Strombedarf f&uuml;r die Herstellung von Dingen und Verbrauchsg&uuml;tern die man sich so kauft ist da noch gar nicht eingerechnet.<br />Der Atomm&uuml;ll der in Deutschland so j&auml;hrlich anf&auml;llt soll &uuml;brigens bei <strong>knapp 500</strong> Tonnen liegen. Da sieht man, was so von der Industrie noch zus&auml;tzlich f&uuml;r Opfer gefordert werden.<br /><br />In den USA sollen es &uuml;brigens insgesamt <strong>2000 Tonnen</strong> radioaktive Abf&auml;lle pro Jahr sein.<br /><br />Ich wei&szlig; ja nicht, aber anbetracht der Tatsache, dass das was wir Endlager nennen, definitv keine Endlager sein k&ouml;nnen, da f&uuml;r die Dauer die radioaktives Material strahlt, einfach von Niemandem abgesch&auml;tzt werden kann, was mit einem sogenannten Endlager mit der Zeit passiert, gibt es nur eine L&ouml;sung: Wir sollten aufh&ouml;ren atomaren M&uuml;ll &uuml;berhaupt zu produzieren.<br /><br />Selbst wenn es f&uuml;r uns alle im einzelnen als auch f&uuml;r die Gesellschaft an sich viel teuerer kommen sollte mit Wind bzw. Solarstrom, so ist das Risiko das uns erwartet, wenn wir nicht aufh&ouml;ren mit dem Atomm&uuml;ll genau das was uns am teuersten &uuml;berhaupt kommen k&ouml;nnte: Das Ende der Zivilisation - man kann das gerade an Fukushima sehr gut sehen.<br />Strahlend saubere Meere und strahlend sauberes Grundwasser k&ouml;nnte in Zukunft mehr als nur eine Floskel sein.</p>
<p>Ich bin zwar damit nix besseres (und will das auch gar nicht sein) als andere Leute, aber ich werde mir trotzdem einen <strong>anderen Stromanbieter</strong> suchen.</p>]]></content>
    </entry>
    <entry>
    <title>Jailbreak Ipod Touch</title>
    <id>http://blog.christian-ahmer.de/jailbreak-ipod-touch</id>
    <published>2011-02-26T22:46:33+01:00</published>
    <updated>2011-02-26T22:46:34+01:00</updated>
    <link href="http://blog.christian-ahmer.de/jailbreak-ipod-touch"/>
    <content type="html"><![CDATA[<p>Ich habe einmal das Experiment gewagt, einen iPod Touch zu jailbreaken. Es war einfach spannend, zu sehen, wie man den Funktionsumfang seines iPod Touch durch einen simplen Jailbreak erweitern konnte.<br /><br /><strong>Jailbreak iPod Touch</strong></p>
<p>Und so funktionierts:<br />Man sucht via Google nach dem englischen Wort f&uuml;r schwarzen Regen, und in ganz beachtlichem Leetspeak und l&auml;dt sich von der gefundenen .com Domain die entsprechende exe Datei herunter.</p>
<p>Unter Windows l&auml;sst sich das Ganze dann bei via USB angeschlossenem iPod Touch jailbreaken - dauert ein paar Sekunden, aber lohnt sich - denkt man zumindest zun&auml;chst. Man kann ja dann zwischen verschiedenen Paketmanagern wie z.B. Cydia oder Rock w&auml;hlen und installiert sich dann alle m&ouml;glichen zus&auml;tzlichen Programme wie z.B. FTP Server, Datenbanken, Webserver und diversen anderen Kram, den man eigentlich sonst nur auf Servern oder zumindest Desktop Rechnern findet.<br /><br />Jailbreak iPod Touch - das ist eine tolle Sache, wie das so funktioniert, aber sinnvoll?<br />Sinnvoll ist ein Jailbreak nicht unbedingt. Aber f&uuml;r den 08/15 Benutzer macht das alles nicht viel Sinn. Der <strong>Jailbreak f&uuml;r iPod</strong> hat n&auml;mlich zum einen den Nachteil, dass man den iPod immer in der N&auml;he einer Ladestation / eines PCs haben sollte, denn da es nur ein tethered Jailbreak ist, muss man die Firmware des iPod Touch wieder neu jailbreaken, wenn der Akku einmal komplett entleert war und er sich deswegen herunterf&auml;hrt. Das ist eine sehr nervige Sache, aber bei neueren Jailbreaks f&auml;llt diese Limitierung evtl. weg.</p>
<p>Viele denken <strong><a class="aw-ti-resultsPanel-details">ipod touch jailbreak</a></strong><a class="aw-ti-resultsPanel-details"> - klasse!<br />Aber was viele eben vor dem ersten Versuch nicht beachten, ist, dass der iPod Touch</a></p>
<p>a) f&uuml;r solche Dinge nicht gemacht ist, da er nur wenig RAM hat<br />b) Apple beim n&auml;chsten Firmware Upgrade den Jailbreak via Itunes wieder vom Ger&auml;t wischt - will man dann wieder den ipod Touch Jailbreak durchf&uuml;hren, muss man erst mal auf die Hacker warten, bis die eine neue Version des Jailbreaks rausgebracht haben.<br />c) Viele der Programme zwar kostenlos und halbwegs n&uuml;tzlich sind, zum Beispiel das Terminal (bash) - aber wer arbeitet ernsthaft den halben Tag auf einem iPod Touch mit einer Notbehelfstastatur? Wohl kaum ein ernsthafter Anwender. Zum mal zeigen ist das sicher lustig, aber effektiv damit arbeiten tut da sicher kaum wer damit.</p>
<p><strong>iPod Touch Jailbreak</strong> - Nein danke!</p>]]></content>
    </entry>
    <entry>
    <title>Unter Windows ext2 / ext3 / ext4 Partitionen lesen</title>
    <id>http://blog.christian-ahmer.de/unter-windows-ext2-/-ext3-/-ext4-partitionen-lesen</id>
    <published>2011-02-16T18:47:18+01:00</published>
    <updated>2011-02-16T18:47:18+01:00</updated>
    <link href="http://blog.christian-ahmer.de/unter-windows-ext2-/-ext3-/-ext4-partitionen-lesen"/>
    <content type="html"><![CDATA[<p>Wenn man Linux und Windows benutzt, dann verwendet man h&auml;ufig auch <strong>ext2</strong>, <strong>ext3</strong> oder gar <strong>ext4 Partitionen</strong>.<br />In der Vergangenheit war es nicht m&ouml;glich diese <strong>Dateisysteme unter Windows</strong> zu lesen.<br /><br />Auch heute noch gibt es da einige Schwierigkeiten.<br />Aber zumindest lesen kann man die Dateisysteme - wenn auch noch nicht richtig schreiben.<br /><br />Das Programm&nbsp;<a href="http://sourceforge.net/projects/ext2read/">http://sourceforge.net/projects/ext2read/</a>&nbsp;kann man verwenden, um von den genannten Dateisystemen zu lesen. So kann man etwa eine portable Partition mit ext4 auch unter Windows &ouml;ffnen.<br /><br />Das Schreiben auf <strong>ext3 / ext4</strong> ist derzeit noch nicht m&ouml;glich, wird aber m&ouml;glicherweise auch irgendwann funktionieren.<br /><br />Es existieren zwar auch L&ouml;sungen via Virtualbox, in denen man z.B. eine Partition via Rawdisk in Virtualbox einem Linux Gastsystem zug&auml;nglich machen kann und dann von dort aus wieder f&uuml;r den Windows Host freigeben kann, aber diese L&ouml;sungen funktionieren leider auch nicht immer. Mit der neuen 4er Version von Virtualbox wollte das partout nicht klappen.<br /><br />Immerhin ist die <strong>ext2read</strong> L&ouml;sung aber brauchbar, um unter Windows ext2 / ext3 oder ext4 Partitionen zu lesen.<br />So muss man seine Daten wenigstens nicht auf eine <strong>NTFS Partition</strong> schreiben, welche ja zumindest in der Vergangenheit nicht einfach unter Linux gelesen werden konnten.<br /><br />Tjaja, Heterogenit&auml;t mit Betriebssystem kann manchmal ein paar Probleme mit sich bringen ;-)</p>]]></content>
    </entry>
    <entry>
    <title>Auf www.facebook.com anmelden</title>
    <id>http://blog.christian-ahmer.de/auf-www-facebook-com-anmelden</id>
    <published>2011-02-14T23:22:15+01:00</published>
    <updated>2011-02-14T23:22:15+01:00</updated>
    <link href="http://blog.christian-ahmer.de/auf-www-facebook-com-anmelden"/>
    <content type="html"><![CDATA[<p>Hin und wieder m&ouml;chte man sich ja auf <strong>www.facebook.com anmelden</strong>.<br />Das kann man tun, um hin und wieder den <strong>Chat bei Facebook</strong> zu verwenden, um sich mit seinen Freunden auszutauschen, oder evtl. die eine oder andere <strong>facebook fanpage</strong> zu besuchen.</p>
<p>Ohne Account kann man da leider nicht viel ausrichten, daher sollte man sich so einen Facebook Account anlegen und dann im Browser &uuml;ber die Adressleiste auf www.facebook.com anmelden.</p>
<p>Und so besorgt man sich einen <em>Facebook Account</em>:<br />Einfach http://www.facebook.com/ im Browser aufrufen.<br />Dann das kleine Formular auf der rechten Bildschirmseite ausf&uuml;llen und dann die E-Mail best&auml;tigen, welche einen zur Best&auml;tigung auffordert.</p>
<p>Schon kann man sich mit seiner E-Mail Adresse und seinem gew&auml;hlten Passwort jederzeit auf Facebook einloggen.<br />Damit hat man nat&uuml;rlich auch Zugriff auf <strong>Facebook Apps</strong> usw. Einen Besuch bei Facebook und Co sollte man &uuml;brigens ins Auge fassen, wenn man einmal wieder ein paar verloren geglaubte Bekannte wiederfinden m&ouml;chte. Man mag es n&auml;mlich kaum glauben, wie viele Menschen auf Facebook einen Account haben.<br /><br />Und wer nicht mehr mag, kann ja im Grunde auch jederzeit seinen <strong>Facebook Account l&ouml;schen</strong>.</p>]]></content>
    </entry>
    <entry>
    <title>Synaptics Touchpad am Laptop unter Gentoo - Klicken via Touchpad</title>
    <id>http://blog.christian-ahmer.de/synaptics-touchpad-laptop-unter-gentoo---klicken-via-touchpad</id>
    <published>2011-01-31T21:54:31+01:00</published>
    <updated>2011-02-14T23:09:53+01:00</updated>
    <link href="http://blog.christian-ahmer.de/synaptics-touchpad-laptop-unter-gentoo---klicken-via-touchpad"/>
    <content type="html"><![CDATA[<p>Wenn man unter Gentoo die linke Maustaste via Synaptics Touchpad simulieren will, kann man aufw&auml;ndig mit fdi Dateien herumhantieren, oder man macht es sich einfacher:</p>
<p>Wenn der synaptics Treiber aus dem Paket x11-drivers/xf86-input-synaptics installiert ist, dann steht das Programm synclient bereits.<br />Man kann also in einer beliebigen Autostart Methode der jeweiligen Desktopumgebung einfach folgendes automatisch einmal ausf&uuml;hren lassen:</p>
<pre>synclient TapButton1=1</pre>
<p>Und schon kann man bequem via Synaptic Touchpad klicken, doppelklicken und auch ziehen, wie mit einer Maus.</p>]]></content>
    </entry>
    <entry>
    <title>Synaptics Touchpad am Laptop Klick unter Opensuse 11.3 aktivieren</title>
    <id>http://blog.christian-ahmer.de/synaptics-touchpad-laptop-klick-unter-opensuse-11.3-aktivieren</id>
    <published>2011-01-29T11:08:50+01:00</published>
    <updated>2011-02-14T23:09:39+01:00</updated>
    <link href="http://blog.christian-ahmer.de/synaptics-touchpad-laptop-klick-unter-opensuse-11.3-aktivieren"/>
    <content type="html"><![CDATA[<p>Opensuse ist eine recht feine Distribution die f&uuml;r den Einsatz auf dem Notebook sehr gut geeignet ist. Was einen aber anfangs auf dem einen oder anderen Notebook mit Synaptics Touchpad st&ouml;ren k&ouml;nnte, ist die Tatsache, dass der Mausklick mit doppeltem Anschlag auf das Touchpad nicht funktioniert.Man muss also standardm&auml;&szlig;ig die Buttons unter dem Touchpad verwenden. Suboptimal!</p>
<p>Um den Klick dennoch zu aktivieren, kann man entweder direkt die xorg.conf bearbeiten (Schnee von gestern) oder gleich die richtigen Einstellungen via Frontend vornehmen.<br />Dazu einfach wie folgt vorgehen:</p>
<p>1) Via <strong>systemsettings</strong> die Systemeinstellungen aufrufen (KDE).<br />2) Dort im Reiter <strong>Erweitert </strong>die <strong>Diensteverwaltung</strong> aufrufen.<br />3) Im Feld <strong>KDE-Dienste beim Start</strong> schauen, dass der Dienst <strong>Synaptiks</strong> aktiviert ist. Damit wird der <strong>Synaptics Touchpad</strong> Hilfsdienst gestartet.<br />4) Dann noch die richtigen Einstellungen beim Touchpad vornehmen. Zur&uuml;ck und den Reiter <strong>Allgemein </strong>ausw&auml;hlen, dort dann auf das Feld <strong>Systemverwaltung</strong> wechseln und den Bereich <strong>Tastatur &amp; Maus</strong> ausw&auml;hlen.<br />5) Hier dann auf <strong>Touchpad</strong> gehen und den Bereich <strong>Touchpad-Konfiguration</strong> w&auml;hlen und dort dann den Reiter <strong>Tapping</strong> w&auml;hlen. Dann bei dem Select Feld mit dem Titel <strong>Antippen mit einem Finger</strong> die Option <strong>Linke Maustaste</strong> einstellen. Dann noch unten rechts auf Anwenden klicken um die &Auml;nderung zu &uuml;bernehmen.</p>
<p>Fertig!</p>]]></content>
    </entry>
    <entry>
    <title>Beteigeuze-2-sonnen</title>
    <id>http://blog.christian-ahmer.de/beteigeuze-2-sonnen</id>
    <published>2011-01-23T22:07:52+01:00</published>
    <updated>2011-01-23T22:13:59+01:00</updated>
    <link href="http://blog.christian-ahmer.de/beteigeuze-2-sonnen"/>
    <content type="html"><![CDATA[<p>Beteigeuze, das ist ein Stern im Sternbild Orion, der wohl vor einiger Zeit in einer Supernova explodiert sein muss.<br />Und das Licht dieser Explosion soll uns angeblich bald erreichen, wom&ouml;glich innerhalb der n&auml;chsten 2 Jahre.</p>
<p>Das bedeutet aber m&ouml;glicherweise nicht den Weltuntergang, wie viele das wom&ouml;glich schon wieder prophezeien m&ouml;gen, sondern vielmehr, dass wir f&uuml;r ein paar Wochen 2 Sonnen haben k&ouml;nnten, welche rund um die Uhr die Erde anstrahlen.<br />Mit anderen Worten: Da ist erst mal nichts mehr mit Nachthimmel, sondern es wird immer sch&ouml;n Tag sein.<br />Beteigeuze sei dank!<br /><br />Schaun wir mal, die Supernova darf kommen!&nbsp;</p>
<p>Toll - ich freu mich drauf! ;-)</p>
<p>P.S.<br />Wird wohl nichts werden, liebe Presse!<br /><a href="http://www.scienceblogs.de/astrodicticum-simplex/2010/06/beteigeuze-und-die-supernova-warum-die-welt-schon-wieder-nicht-untergeht.php">http://www.scienceblogs.de/astrodicticum-simplex/2010/06/beteigeuze-und-die-supernova-warum-die-welt-schon-wieder-nicht-untergeht.php</a>&nbsp;</p>]]></content>
    </entry>
    <entry>
    <title>Linux ->Programm auf bestimmtem CPU Kern ausführen</title>
    <id>http://blog.christian-ahmer.de/linux-programm-auf-bestimmtem-cpu-kern-ausfuehren</id>
    <published>2011-01-02T23:43:09+01:00</published>
    <updated>2011-01-02T23:47:55+01:00</updated>
    <link href="http://blog.christian-ahmer.de/linux-programm-auf-bestimmtem-cpu-kern-ausfuehren"/>
    <content type="html"><![CDATA[<p>Manchmal hat man das Problem eine Software auszuf&uuml;hren, welche sich, aus welchen Gr&uuml;nden auch immer, nicht mit mehreren CPU Kernen versteht. Um nun auf einem Multicore Prozessor diese Software trotzdem ausf&uuml;hren zu k&ouml;nnen, gibt es die Utilities vom sogenannten Paket schedtool.<br />Unter Gentoo findet man das unter sys-process/schedtool. Es bietet einige Tools wie taskset, chrt und ionice. F&uuml;r diese Zwecke reicht aber das Tool taskset aus.<br /><br />Einfach</p>
<pre>emerge schedtool</pre>
<p>und dann kann man schon loslegen.</p>
<p>Ein einfaches</p>
<pre>taskset -c &lt;kern&gt; PROGRAMM</pre>
<p><br /> hilft hier weiter.<br /><br />Will man z.B. glxgears nur auf dem ersten Kern laufen lassen, reicht ein einfaches</p>
<pre>taskset -c 0 glxgears.<br /></pre>
<p>&nbsp;</p>]]></content>
    </entry>
    <entry>
    <title>JackAudioDriver::ProcessAsync: read error, skip cycle</title>
    <id>http://blog.christian-ahmer.de/jackaudiodriver--processasync--read-error-skip-cycle</id>
    <published>2011-01-02T22:57:19+01:00</published>
    <updated>2011-01-02T22:59:32+01:00</updated>
    <link href="http://blog.christian-ahmer.de/jackaudiodriver--processasync--read-error-skip-cycle"/>
    <content type="html"><![CDATA[<p>Als alter Hase bzgl. Musikerzeugung unter Linux bin ich seit dem Upgrade meines PC daheim doch etwas verzweifelt gewesen. Ich konnte seitdem machen was ich wollte, immer wenn ich jackd gestartet habe, gab es nur folgenden Fehler:<br /><br /><strong>JackAudioDriver::ProcessAsync: read error, skip cycle</strong></p>
<p>Der Fehler lies sich nur vertreiben, indem ich jackd mit der Option -P auf playback only gestellt habe, was aber an sich recht witzlos ist, wenn ich doch auch aufnehmen m&ouml;chte.<br />Wie sich herausstelle, ist der Onboard Soundchip auf meinem Asrock Board (NVIDIA HD Audio) wohl so konfiguriert, dass Aufnahme nur m&ouml;glich ist, wenn auch entsprechend ein Klinkenstecker im Mikrofoneingang steckt. Macht ja sonst an sich auch nur wenig Sinn.<br /><br />Aber im Fall von jackd verhinderte dies das korrekte Starten des Soundservers.<br />Ich habe also in der Zwischenzeit unz&auml;hlige Male eine andere Version vom jack-audio-connection-kit installiert, habe diverse Blogeintr&auml;ge usw. studiert und mich durch allerlei Howtos gebissen, nur um festzustellen, dass ich einfach nur einen Klinkenstecker in den Mikrofoneingang stecken musste.<br /><br />Das h&auml;tte ich auch einfacher haben k&ouml;nnen.<br />Den Fehler "JackAudioDriver::ProcessAsync: read error, skip cycle" inkl. "alsa_driver_xrun_recovery" kann ich nun aber endg&uuml;ltig als gel&ouml;st markieren. Damit kann ich nun wieder gl&uuml;cklich Musik machen!</p>
<p>&nbsp;</p>]]></content>
    </entry>
    <entry>
    <title>AddDefaultCharset und unterschiedliche Zeichensätze</title>
    <id>http://blog.christian-ahmer.de/adddefaultcharset-und-unterschiedliche-zeichensaetze</id>
    <published>2010-12-13T22:02:28+01:00</published>
    <updated>2010-12-13T22:09:48+01:00</updated>
    <link href="http://blog.christian-ahmer.de/adddefaultcharset-und-unterschiedliche-zeichensaetze"/>
    <content type="html"><![CDATA[<p>Um nur bestimmte Dateien auf einem Webhosting mit unterschiedlichen Kodierungen (Charsets) auszuliefern, kann man sich der Apache Direktive AddDefaultCharset im Zusammenhang mit FilesMatch bedienen.</p>
<p>Man kann einen ganz normalen erweiterten regul&auml;ren Ausdruck dazu verwenden, um nur bestimmte Dateien mit einer speziellen Kodierung auszuliefern.<br /><br />Das kann man sich z.B. zunutze machen, wenn man eine Webseite hat, auf der unterschiedliche Seiten mit voneinander verschiedenen Charsets (Zeichens&auml;tzen) ausgeliefert werden sollen.</p>
<p>Beispiel: Eine Webseite hat folgende html Dateien:</p>
<p>seite-bla.html (iso-8859-15)<br />seite-blubb.html (iso-8859-15)<br />seite-blubb2.html (iso-8859-15)<br />seite-irgendwas-1.html (utf-8)<br />seite-irgendwas-2.html (utf-8)<br />seite-irgendwas-3.html (utf-8)</p>
<p>Da HTML Seiten keine Header senden k&ouml;nnen, w&uuml;rden die Seiten in der Standardkodierung des Webservers ausgeliefert werden, was aber zu problemen f&uuml;hrt.<br />Ist die Standardkodierung z.B auf iso-8859-15 gesetzt, werden die Sonderzeichen auf den Seiten in utf-8 falsch angezeigt und andersrum genauso.</p>
<p>Wir wollen die AddDefaultCharset Direktive in der zum Apache Webserver geh&ouml;rigen .htaccess nutzen, um ein paar Dateien nach einem bestimmten Dateimuster in UTF-8 auszugeben, w&auml;hrend die Standardkodierung (z.B. iso-8859-15) f&uuml;r die restlichen Seiten verwendet wird:</p>
<pre><strong>&lt;FilesMatch "^seite-irgendwas-.*\.html$"&gt;</strong><br /><strong>AddDefaultCharset UTF-8</strong><br /><strong>&lt;/FilesMatch&gt;</strong></pre>
<p>Mit obigem Muster werden alle Seiten, welche mit <strong>seite-irgendwas-</strong> beginnen und mit <strong>.html</strong> enden, in UTF-8 Charset ausgeliefert.<br /><br />Man sieht, die FilesMatch und AddDefaultCharset Anweisungen lassen sich prima kombinieren, um statische Webseiten ohne Hilfe von PHP mit dem richtigen Zeichensatz zum Browser zu senden. Damit kann man garantieren, dass die Sonderzeichen f&uuml;r die entsprechenden Charsets auch korrekt ausgegeben werden.</p>
<p>&nbsp;</p>]]></content>
    </entry>
    <entry>
    <title>Samba Freigabe in KDE bei Kubuntu 10.10 -> Fehler Could not find module kcmfileshare</title>
    <id>http://blog.christian-ahmer.de/samba-freigabe-in-kde-bei-kubuntu-10.10--fehler-could-not-find-module-kcmfileshare</id>
    <published>2010-12-05T20:57:15+01:00</published>
    <updated>2010-12-05T20:57:52+01:00</updated>
    <link href="http://blog.christian-ahmer.de/samba-freigabe-in-kde-bei-kubuntu-10.10--fehler-could-not-find-module-kcmfileshare"/>
    <content type="html"><![CDATA[<p>Es gibt hin und wieder das Verlangen, auch unter einem Linux eine Windows Freigabe zu erstellen, um z.B. ein paar Dateien hin und her zu kopieren.</p>
<p>Unter Kubuntu 10.10 gibt das leider nach kurzer Diagnose immer den folgenden Fehler, wenn man den Dateimanager Dolphin in der Konsole startet:</p>
<pre><strong>Could not find module ' "kcmfileshare"</strong></pre>
<p>Dieses Problem bedeutet, dass KDE hier ein paar Programme fehlen, um die Dateifreigabe durchzuf&uuml;hren.<br /><br />L&ouml;sen kann man das einfach, indem man folgende Pakete nachinstalliert:</p>
<pre><strong>sudo apt-get install kdenetwork-filesharing libsmbclient samba samba smbclient<br /></strong></pre>
<p>Nun Dolphin noch einmal neu starten und schon Kann man Dateifreigaben wunderbar verwenden.<br />Nur komisch, dass kdenetwork-filesharing nicht schon von Haus aus installiert wird.</p>]]></content>
    </entry>
    <entry>
    <title>MP4 Videos in FLV Videos via ffmpeg umwandeln</title>
    <id>http://blog.christian-ahmer.de/mp4-videos-in-flv-umwandeln-ffmpeg</id>
    <published>2010-11-27T13:15:52+01:00</published>
    <updated>2010-11-27T13:15:52+01:00</updated>
    <link href="http://blog.christian-ahmer.de/mp4-videos-in-flv-umwandeln-ffmpeg"/>
    <content type="html"><![CDATA[<p>F&uuml;r Flash Player gibt es oftmals die Bedingung, dass das Video, was man dort einbinden m&ouml;chte, unbedingt im FLV Format sein muss.<br />Nun hat man leider nur eine sch&ouml;ne mpeg-4 Datei, aber die will der Flash Player nicht annehmen (obwohl das technisch sehr wohl in Flash geht).<br /><br />Man muss das Video also von MP4 in FLV umwandeln.<br />Unter Linux kein Problem, wenn auf dem System die entsprechenden Codecs installiert sind.<br /><br />Einfach folgendes Eingeben, und man sollte ein qualitativ halbwegs brauchbares FLV bekommen (input.mp4 ist hier das Quellvideo im MP4 Format und output.flv ist das FLV Video:</p>
<div class="rcmBody">
<pre>ffmpeg -i input.mp4 -acodec libmp3lame -ar 44100 -ab 128k -vcodec flv -b 900k output.flv</pre>
<p>Die Bitrate f&uuml;rs Video kann man sicher noch etwas h&ouml;her w&auml;hlen.<br />Besser w&auml;re es eh, mp4 zu verwenden. FLV ist qualitativ nicht der beste Codec und mpeg4 ist um Welten besser. H264 sei da nat&uuml;rlich auch ans Herz gelegt.</p>
</div>]]></content>
    </entry>
    <entry>
    <title>Captchas auslesen via OCR Software</title>
    <id>http://blog.christian-ahmer.de/captchas-auslesen-tesseract-ocr-spam</id>
    <published>2010-11-27T13:07:21+01:00</published>
    <updated>2010-11-27T13:09:03+01:00</updated>
    <link href="http://blog.christian-ahmer.de/captchas-auslesen-tesseract-ocr-spam"/>
    <content type="html"><![CDATA[<p>Im Internet ist es ja seit vielen vielen Jahren ein echtes Problem mit Formularen in Webanwendungen und Webseiten.<br />Bots lesen die Captchas automatisiert aus und man ist gezwungen, andere Wege zu gehen, teilweise Fragen mit passenden Antworten dem Besucher zu pr&auml;sentieren oder auch extensiv Javascript basierte L&ouml;sungen zu verwenden, damit die meisten Bots einfach ausgeschlossen werden k&ouml;nnen.<br /><br />Sch&ouml;n und gut, aber wie funktioniert so ein automatisches Auslesen einer Zahlen / Buchstaben Kombination &uuml;berhaupt? Unter Linux / Ubuntu ist es ganz leicht:</p>
<p>Zun&auml;chst einmal speichert man sich einmal ein Bildchen heraus, welches man geknackt haben m&ouml;chte. Ich nenne es hier einfach einmal <strong>captcha.png</strong>. Dieses Captcha ist ein buntes Bildchen mit zahlen und Buchstaben, welche der normale Anwender entziffern muss, wenn er das Formular absenden m&ouml;chte.<br /><br />Um das Bild auszulesen, muss man sich eine Software installieren, das frei verf&uuml;gbare tesseract tut da einen sehr guten Job beim auslesen von Captchas.<br />Unter Ubuntu kann man es einfach so installieren:</p>
<pre>sudo apt-get install tesseract-ocr</pre>
<p>Folgende Schritte m&uuml;ssen nun nur noch gemacht werden:<br />1) Das Bild in ein Graustufen TIFF wandeln (etwa via GIMP oder automatisiert via convert aus dem ImageMagick Paket).<br />2) Tesseract auf das Bild loslassen:</p>
<pre>tessseract captcha.tif loesung.txt<br /></pre>
<p>In loesung.txt steht dann das Wort. Simpel, aber klappt sehr oft ohne nennenswerte Probleme und automatisieren l&auml;sst sich sowas auch mehr als trivial.<br /><br />Bots, die sich solcher Tricks bedienen, kann man nur mit sehr verzerrten (und daher auch f&uuml;r den Menschen schwerer l&ouml;sbaren) Buchstaben / Zahlenkombinationen, Javascript oder anderen Tricks eins auswischen.<br /><br />Ich verwende auf meiner Seite hier f&uuml;r die Kommentarfunktion &uuml;brigens eine Mischung aus Javascript und Figlets,<br />Mehr &uuml;ber Figlets hier: <a href="http://www.figlet.org/" target="_blank">http://www.figlet.org/</a></p>]]></content>
    </entry>
    <entry>
    <title>Download via SSH fortsetzen / resume</title>
    <id>http://blog.christian-ahmer.de/ssh-transfer-resume-fortsetzen</id>
    <published>2010-11-26T21:35:06+01:00</published>
    <updated>2010-11-26T21:35:08+01:00</updated>
    <link href="http://blog.christian-ahmer.de/ssh-transfer-resume-fortsetzen"/>
    <content type="html"><![CDATA[<p>Manchmal hat man gr&ouml;&szlig;ere Dateien, z.B. ein Backup via SSH zu transportieren.<br />Hat man nun eine unstabile Verbindung, z.B. WLAN oder bricht auf einmal die Internetverbindung einfach ab,so &auml;rgert man sich, dass in SSH von Haus aus kein resume m&ouml;glich ist, man kann den begonnen Download also leider nicht einfach fortsetzen.<br />Pech bei gr&ouml;&szlig;eren Dateien....<br /><br />Moment, man kann doch:<br />Die L&ouml;sung lautet rsync. Man verwendet einfach rsync, dieses kennt n&auml;mlich einen resume Modus und damit kann man bereits begonnene Dateidownloads oder auch uploads einfach dort fortsetzen, wo man man aufgeh&ouml;rt hat, oder unterbrochen wurde.<br /><br />Die Syntax lautet wie folgt:</p>
<pre>rsync --partial --progress user@server:/pfad_remote pfad_lokal</pre>
<p>So kann man sich unter Umst&auml;nden eine Menge Zeit sparen ;-)</p>]]></content>
    </entry>
    <entry>
    <title>Googleearth unter Ubuntu 10.10 -> Google Earth has caught signal 11.</title>
    <id>http://blog.christian-ahmer.de/googleearth-ubuntu-signal-11</id>
    <published>2010-11-26T21:16:00+01:00</published>
    <updated>2010-11-26T21:17:06+01:00</updated>
    <link href="http://blog.christian-ahmer.de/googleearth-ubuntu-signal-11"/>
    <content type="html"><![CDATA[<p>Gerade eben habe ich einmal wieder googleearth installiert - oder besser wollte es einfach mal installieren unter Kubuntu 10.10 (Maverick). Um das zu erreichen musste ich zun&auml;chst googleearth-package installieren.</p>
<pre>sudo apt-get install  googleearth-package</pre>
<p>Dann muss man ein aktuelles Paket noch zusammenbauen lassen, was etwas dauert:</p>
<pre>make-googleearth-package</pre>
<p>Soweit so gut. Ein erneutes Ausf&uuml;hren des Programms f&uuml;hrte dazu, dass nach 2 Sekunden das Programm mit folgender Meldung abst&uuml;rzte:</p>
<p>Google Earth has caught signal 11.</p>
<p>Autsch... was war los? Naja, googleearth ist einfach gestorben. Warum?<br />Nun, offenbar gibt es einen Bug in der Linuxversion.<br /><br />L&ouml;sung:<br />Einfach beim Start in dem kleinen Fenster den <strong>Haken bei "Tipps beim Programmstart" deaktivieren</strong> und auf schliessen dr&uuml;cken. Und voil&aacute;: googleearth startet, ohne weitere Probleme.</p>
<p>Mein System &uuml;brigens:<br />Kubuntu 10.10 mit freiem Radeon Treiber und aktiviertem DRI und brauchbarem GLX.</p>]]></content>
    </entry>
    <entry>
    <title>Die perfekte Linux Distribution gibt es nicht</title>
    <id>http://blog.christian-ahmer.de/linux-distribution-perfekt-optimal</id>
    <published>2010-11-24T21:47:53+01:00</published>
    <updated>2010-11-24T21:47:53+01:00</updated>
    <link href="http://blog.christian-ahmer.de/linux-distribution-perfekt-optimal"/>
    <content type="html"><![CDATA[<p>Meiner Meinung nach ist irgendwas faul im Linuxland. M&ouml;glicherweise auch mit mir - ich wei&szlig; es nicht genau.<br />Jedenfalls habe ich es dieser Tage nicht leicht, die perfekt auf mich zugeschnittene Linux Distribution zu finden.<br /><br />Eigentlich habe ich ja derzeit privat Kubuntu im Einsatz, aber Ubuntu und seine Derivate sind ja immer so zusammengestellt, dass man es ja jedem recht macht. Jeder Treiber wird f&uuml;r alles und jeden installiert und dann funktioniert zwar alles irgendwie, aber wenn man einmal dran drehen m&ouml;chte an den Einstellungen, dann ist alles doch nicht mehr ganz so einfach, wie es bei Linux Distributionen ist, welche nach herk&ouml;mmlicher Art das Editieren der Einstellungen via /etc/&lt;fillmeout&gt; Konfigurationsfile erlauben.<br />Zugegeben, ist ja auch nicht jedermanns Sache - aber bisweilen ist es gar nicht schlecht, wenn man an einigen Dingen so drehen kann wie man m&ouml;chte - man ist ja schlie&szlig;lich nicht unter Windows...<br />Leider jedoch scheint der Zug in diese Richtung zu fahren, sieht man doch z.B. f&uuml;r die WLAN Netzwerkkonfiguration unter Ubuntu von Haus aus nur die M&ouml;glichkeit, dessen Einstellungen wie auch f&uuml;r LAN oder VPN &uuml;ber das Netzwerkmanager Applet zu t&auml;tigen (egal ob Ubuntu oder Kubuntu). Dieses Frontend setzt im Hintergrund auf den Netzwerkmanager.<br /><br />Warum kann man nicht einfach wie bei z.B Gentoo oder Arch Linux die entsprechenden Pakete &uuml;ber das Paketsystem installieren und einfach nur z.B. wpa_supplicant f&uuml;r seine Netzwerkkarte verwenden? Dann kann man das Netzwerk auch schon starten, bevor die grafische Desktopumgebung geladen ist... aber nein, es muss ja unbedingt erst nach den Start der Desktopumgebung mit den Netzwerk verbunden werden.<br /><br />Und warum ist der rt73usb Treiber f&uuml;r meinen D-Link DWL-G122 USB WLAN Stick einfach so bl&ouml;de, dass man nach ein paar Minuten surfen immer wieder probleme mit der Namensaufl&ouml;sung bekommt - im Ernst, man kann sich irgendwann einfach drauf einstellen, dass man pl&ouml;tzlich keine Seiten mehr aufmachen kann, oder diese erst mit einer Verz&ouml;gerung von 10 - 120 Sekunden ge&ouml;ffnet werden... bei einer 32MBit Internetverbindung, die unter Windows ohne Probleme l&auml;uft. Ist ja l&auml;cherlich.<br /><br />Nicht falsch verstehen, ich verwende Privat ausschlie&szlig;lich Windows zum Arbeiten, aber so macht Arbeiten nicht unbedingt so sehr viel Spa&szlig;.</p>
<p>Andere Distributionen sind auch nicht viel besser - Fedora z.B. in der aktuellen Version 14 schafft es nicht einmal, das man fglrx darunter installieren kann. Stattdessen gibt es nur noch einen schwarzen Bildschirm.<br /><br />Warum setzen so viele Distributionen auf einmal auf Grub2 als Bootloader? Den vern&uuml;nftig zu konfigurieren ist eine Aufgabe f&uuml;r ein abendf&uuml;llendes Programm.<br /><br />Warum ist Debian Squeeze so riesig, dass man es auf sage und schreibe 7-8 DVDs packen muss?</p>
<p>Und warum wurde Novell gerade von einem Konsortium gekauft, welchem zum Teil Microsoft angeh&ouml;rt?</p>
<p>Warum ist X11 neuerdings out und Gallium3D total in, und warum bringt das trotzdem weniger Frames als ein propriet&auml;rer Binary Blob wie fglrx? Und warum funkioniert dieser wiederum nicht gescheit mit compiz?<br /><br />Es ist zum verr&uuml;ckt werden.</p>
<p>Vielleicht habe ich auch schon resigniert und bleibe einfach bei Kubuntu.</p>]]></content>
    </entry>
    <entry>
    <title>Directory Index im Apache setzen</title>
    <id>http://blog.christian-ahmer.de/directory-index-im-apache-setzen</id>
    <published>2010-09-19T00:04:01+02:00</published>
    <updated>2010-09-19T00:04:01+02:00</updated>
    <link href="http://blog.christian-ahmer.de/directory-index-im-apache-setzen"/>
    <content type="html"><![CDATA[<p>Im Apache Webserver gibt es eine Menge Direktiven.<br />Welche  ben&ouml;tigt man, denn eigentlich konkret, wenn man als Standarddokument  nicht z.B. index.php auslliefern m&ouml;chte, sondern z.B. index.html oder  bla.txt?<br />Einfach entweder direkt in der Apache Hauptkonfiguration  oder in der jeweiligen .htaccess folgendes reinschreiben, wenn man  bla.txt standardm&auml;&szlig;ig servieren m&ouml;chte:</p>
<pre>DirectoryIndex bla.txt</pre>
<p>Die Datei muss sich nat&uuml;rlich in demselben Verzeichnis befinden wo sich auch die .htaccess befindet.</p>]]></content>
    </entry>
    <entry>
    <title>Php AJAX Steuerung</title>
    <id>http://blog.christian-ahmer.de/php-ajax-steuerung</id>
    <published>2010-09-18T23:52:18+02:00</published>
    <updated>2010-09-18T23:58:22+02:00</updated>
    <link href="http://blog.christian-ahmer.de/php-ajax-steuerung"/>
    <content type="html"><![CDATA[<p>Wenn man langwierige Abl&auml;ufe via PHP steuern m&ouml;chte, ist es sinnvoll, nicht ewig lange Skriptaufrufe zu verursachen. Es kann n&auml;mlich auf Seiten PHP / Apache zu Timeouts kommen, bei sehr lange offen gelassenen Verbindungen / Skriptaufrufen.<br /><br />Besser ist es, AJAX zu verwenden, um einen langen Ablauf, als Beispiel sei einmal fiktiv ein Newsletterversand genannt. Angenommen, man hat 20000 Empf&auml;nger f&uuml;r einen Newsletter, so macht es wenig Sinn, ein PHP Skript so lange laufen zu lassen, bis alle Empf&auml;nger beschickt sind.<br />Man hat da n&auml;mlich kaum Einflu&szlig;m&ouml;glichkeiten, um den Ablauf brauchbar zu steuern, z.B. zu pausieren, oder gar zu stoppen / weiter auszuf&uuml;hren.<br />Besser ist es, wenn man sich f&uuml;r eine Newsletterfunktionalit&auml;t AJAX bedient. Es reicht ja, wenn man z.B. die ersten 50 Empf&auml;nger beschickt und dann wenn diese 50 Empf&auml;nger beschickt sind, von PHP aus ein OK an das Javascript sendet, um dann den Versand f&uuml;r die n&auml;chsten 50 Empf&auml;nger via JS anzust&ouml;&szlig;t. Usw. bis irgendwann alle 20000 Empf&auml;nger bedient wurden.<br />Das macht nat&uuml;rlich summa summarum 400 AJAX Requests, aber daf&uuml;r hat der Nutzer die M&ouml;glichkeit, jederzeit das Skript ordentlich anzuhalten.<br /><br />Eine Methode so etwas zu relisieren, will ich hier einmal anhand einer einfachen PHP Beispieldatei Schemenhaft demonstrieren, hier wird sich einfach in der PHP Session ein aktueller Zustand gemerkt, und immer wenn der User einen Button dr&uuml;ckt, dann erh&ouml;ht sich via AJAX Aufruf ein Z&auml;hler in der PHP Session. Bis irgendwann ein Limit erreicht ist. Das w&auml;re z.B. das Ende der Liste der Empf&auml;nger an die versendet werden muss.<br />Nat&uuml;rlich m&uuml;sste man das Skript so ab&auml;ndern, dass das Javascript automatisch nachdem eine Antwort jeweils nach 50 versendeten Mails gekommen ist, wieder den Versand der n&auml;chsten 50 anst&ouml;&szlig;t, es sei denn, der Nutzer hat z.B. einen Pause Button gedr&uuml;ckt o.&auml;.<br /><br />Im folgenden sind hier PHP blau, Javascript rot und HTML gr&uuml;n dargestellt:<br /><br /><br /></p>
<pre><span style="color: blue;">&lt;?php<br />session_start();<br /><br />if($_POST){<br />&nbsp;&nbsp;&nbsp; if(!isset($_SESSION['cnt']))<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $_SESSION['cnt']=1;<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $_SESSION['cnt']++;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if($_SESSION['cnt'] &gt;= 5)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo 'Hier ist dann Ende!';<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $_SESSION['cnt'];<br />&nbsp;&nbsp;&nbsp; die();<br />}<br />else {<br />?&gt;<br /></span><span style="color: green;">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;Ajaxtest&lt;/title&gt;<br /></span><span style="color: red;">&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;<br /><br />&lt;script type="text/javascript"&gt;<br />function getIt(){<br />&nbsp;&nbsp;&nbsp; $.post('http://localhost/tests/ajax/',{val: 'hello'}&nbsp; , function(data) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(data);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //$('.result').html(data);<br />&nbsp;&nbsp;&nbsp; });<br />}<br /><br />$(document).ready(function() {<br />&nbsp;&nbsp;&nbsp; // Binden an Klick auf Button<br />&nbsp;&nbsp;&nbsp; $('#getmore').click(function() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; getIt();<br />&nbsp;&nbsp;&nbsp; });<br />});<br /><br />&lt;/script&gt;<br /></span><span style="color: green;">&lt;/head&gt;<br />&lt;body&gt;<br />Hier kommt was bei Klick:&lt;br /&gt;<br />&lt;div class="result"&gt;&lt;/div&gt;<br />&lt;input type="button" id="getmore" name="getmore" value="Klick mich!" /&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br /></span><span style="color: blue;">&lt;?php <br />}?&gt;<br /></span></pre>]]></content>
    </entry>
    <entry>
    <title>Tab Grep</title>
    <id>http://blog.christian-ahmer.de/tab-grep</id>
    <published>2010-09-18T14:12:20+02:00</published>
    <updated>2010-09-18T14:12:50+02:00</updated>
    <link href="http://blog.christian-ahmer.de/tab-grep"/>
    <content type="html"><![CDATA[<p>Wenn man auf der Shell die Aufgabe l&ouml;sen m&ouml;chte, via grep nach Tabulatoren in den einzelnen Zeilen zu suchen, kann man z.B. eine der folgenden drei L&ouml;sungen verwenden:</p>
<ol>
<li>Grep via Option "-P" in den PCRE (perl compatible regular expressions) Modus umschalten, dann kann man wie gewohnt nach "\t" suchen:<br />grep -P "\t"</li>
<li>Einfach ein Tab kopieren und &uuml;ber die Zwischenablage via copy&amp;paste in den Suchausdruck einf&uuml;gen:<br />grep "&nbsp;&nbsp;&nbsp; "</li>
<li>Oder auf der Shell ein Tabulator direkt erzeugen, indem man zuerst &lt;Steuerung-v&gt; bzw. &lt;ctrl-v&gt;dr&uuml;ckt, dieses dann losl&auml;sst und dann schnell &lt;TAB&gt; dr&uuml;ckt, damit hat man ebenfalls einen Tabulator im Suchausdruck:<br />grep "&nbsp;&nbsp;&nbsp; "</li>
</ol>
<p>&nbsp;</p>
<p>Achtung!<br />Die Option -P gibt es bei GNU grep, wie es in vielen Linux Distributionen mitgeliefert wird. Ob man mit dieser Option ebenfalls via grep -P auch bei anderen grep Implementationen suchen kann, h&auml;ngt nat&uuml;rlich jeweils von der verwendeten grep Variante ab.</p>]]></content>
    </entry>
    <entry>
    <title>PHP HTTP Header unterbinden</title>
    <id>http://blog.christian-ahmer.de/php-http-header-unterbinden</id>
    <published>2010-09-07T23:13:28+02:00</published>
    <updated>2010-09-07T23:13:28+02:00</updated>
    <link href="http://blog.christian-ahmer.de/php-http-header-unterbinden"/>
    <content type="html"><![CDATA[<p>Als Serverbetreiber m&ouml;chte man ja nicht jederzeit jedem und allen st&auml;ndig verraten, was man auf seinem Server so einsetzt - dies kann schliesslich manchmal eine Sicherheitsl&uuml;cke bedeuten.<br /><br />Also macht es Sinn, die PHP Konfiguration so abzu&auml;ndern, dass eben aus den HTTP Headern nicht mehr sofort ersichtlich ist, ob die Seite, die gerade angezeigt wird, von PHP generiert wird, oder nicht.<br /><br />Und das geht, indem man einfach z.B. via nano die php.ini in der folgenden Zeile so ab&auml;ndert:<br /><br /></p>
<pre>expose_php = Off</pre>
<p>&nbsp;</p>
<p>Nat&uuml;rlich ist das keine richtige Sicherheitsl&uuml;cke, wenn man den Wert auf 'On' stehen l&auml;sst, aber es macht evtl. doch dem einen oder anderen Skript Kiddie den Einbruchsversuch leichter und kann daher ruhig abgedreht werden.</p>]]></content>
    </entry>
    <entry>
    <title>Piwik Geolocalization Plugin GeoIP für Regionen installieren</title>
    <id>http://blog.christian-ahmer.de/piwik-geolocalization-plugin-geoip-fuer-regionen-installieren</id>
    <published>2010-08-31T00:33:52+02:00</published>
    <updated>2010-09-05T13:46:47+02:00</updated>
    <link href="http://blog.christian-ahmer.de/piwik-geolocalization-plugin-geoip-fuer-regionen-installieren"/>
    <content type="html"><![CDATA[<p>Man kann ja von Google Analytics halten was man m&ouml;chte, es ist definitiv eine sehr gute Statistikl&ouml;sung f&uuml;r lau. Aber in Punkte Datenschutz ist es definitiv nach wie vor Katastrophal - man kann zwar einstellen, dass man die Daten grunds&auml;tzlich nicht ver&auml;u&szlig;ern m&ouml;chte, aber hilft das wirklich? Kann man das selbst wirklich beweisen? Nein, das k&ouml;nnte nur Google.<br /><br />Aus diesem Grund habe ich mich entschlossen, dem frei verf&uuml;gbaren (da open source) Web Analytiktool Piwik eine Chance zu geben. <br />Nun l&auml;uft es seit eingen Tagen und ich bin sehr zufrieden, zwar ist der Mehraufwand gegeben, sprich man muss den Dienst auf seinem eigenen Server laufen lassen und Piwik dort etwa als Vhost im Apache laufen lassen, das ganze etwas konfigurieren und nat&uuml;rlich den Statistik-Javascript Schnipsel im Body der Seite verankern, damit die Statistik auch getriggert werden kann.<br /><br />Was mich bislang aber gest&ouml;rt hat, ist die Tatsache, dass man per default die Besucher bislang nur bis auf das Land nachverfolgen kann, aber keine Regionen bzw. St&auml;dte m&ouml;glich sind.<br />Dem kann man aber abhelfen, wenn man folgende Schritte unternimmt (ich bin hier im folgenden via ssh auf meinem Rootserver eingeloggt):</p>
<p>Auf dem Server (hier Debian) die Entwicklungspakete f&uuml;r den Apache installieren, falls noch kein which Befehl namens apxs2 existiert, einfach testen via</p>
<pre>which apxs2</pre>
<p>Zum installieren reicht in der Regel</p>
<pre>apt-get install apache2-threaded-dev</pre>
<p>Wenn apxs2 nun verf&uuml;gbar ist, sollte man sich das Modul mod_geoip installieren, um eine bessere Performance zu erreichen. Achtung: mod_geoip ben&ouml;tigt zwingend vorher eine aktuelle Version von GeoIP. Diese bekommt man hier: http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.6.tar.gz.<br />Via</p>
<pre>tar xvzf GeoIP-1.4.6.tar.gz</pre>
<p>auspacken und in dem Verzeichnis</p>
<pre>./configure</pre>
<p>gefolgt von</p>
<pre>make</pre>
<p>eingeben. Wenn das Programm erfolgreich kompiliert wurde, dann einfach via</p>
<pre>make install</pre>
<p>installieren.<br />Nun kann man in das Verzeichnis von mod_geoip wechseln und dort folgendes ausf&uuml;hren:</p>
<pre>apxs2 -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c</pre>
<p>In der Konfiguration des VHosts sollte man nun noch mod_geoip aktivieren:<br />Dazu reichen folgende zus&auml;tzliche Einstellungen:</p>
<pre>&lt;IfModule mod_geoip.c&gt;<br />	GeoIPEnable On<br />	GeoIPDBFile /var/www/piwik/plugins/GeoIP/libs/GeoLiteCity.dat<br />&lt;/IfModule&gt;<br /></pre>
<p>Nun sollte man den Apache Webserver neustarten, damit die Einstellungen greifen - das Modul sollte danach geladen sein:</p>
<pre>/etc/init.d/apache2 restart</pre>
<p>Piwik GeoIP Plugin herunterladen: http://dev.piwik.org/trac/attachment/ticket/45/GeoIP.zip?format=raw und im Piwik Verzeichnis unter /plugins auspacken, so dass man ein Verzeichnis namens {piwik_root}/plugins/GeoIP erh&auml;lt.<br />In dem GeoIP Verzeichnis muss unter /libs nun noch die Datenbank f&uuml;r IP&lt;-&gt;St&auml;dtezuordnungen gelegt werden, diese ist ein einfaches .dat File, welches man unter http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz herunterladen kann. Dieses kann man z.B. via wget laden und via gunzip GeoLiteCity.dat.gz direkt entpacken. Ggf. sollte man noch die Dateizugriffsrechte anpassen.<br /><br />Nun muss man nur noch wie gewohnt die Piwik Web Analytics Seite aufrufen und unter Einstellungen-&gt;Plugins das Plugin GeoIP aktivieren.<br />Gegebenenfalls kommt nun noch eine kleine Seite, die einem mitteilt, dass die Datenbank upgedated werden muss, das sollte man unbedingt machen.<br />Damit werden alle zuk&uuml;nftigen Besuche auf den via Piwik erfassten Seiten den entsprechenden St&auml;dten zugeordnet und man wei&szlig; wieder, woher die Leute kommen, die die eigenen Seiten besuchen.<br /><br />Eine Sache noch:<br />Damit auch die bisherigen Besuche entsprechend St&auml;dten zugeordnet werden, gibt es ein kleines Skript, welches man am besten auf der Kommandozeile auf dem Server kurz aufruft:<br />Es nennt sich geoipUpdateRows.php und man findet es unter plugins/GeoIP/misc/geoipUpdateRows.php.<br /><br />Einfach aufrufen:</p>
<pre>php geoipUpdateRows.php</pre>
<p>Und schon werden auch bisherige Besuche St&auml;dten zugeordnet.<br /><br />Viel Spa&szlig; beim Erfassen von Webstatistiken via Piwik!</p>]]></content>
    </entry>
    <entry>
    <title>Geokoordinaten zu einem Ort mit PHP und Google Maps herausfinden</title>
    <id>http://blog.christian-ahmer.de/geokoordinaten-zu-einem-ort-mit-php-und-google-maps-herausfinden</id>
    <published>2010-08-29T02:35:53+02:00</published>
    <updated>2010-08-29T00:35:53+02:00</updated>
    <link href="http://blog.christian-ahmer.de/geokoordinaten-zu-einem-ort-mit-php-und-google-maps-herausfinden"/>
    <content type="html"><![CDATA[<p>Hier ist eine brauchbare Funktion f&uuml;r die Geokodierung. Mithilfe dieser kann man sehr einfach Google Maps nutzen, um einfach und umkompliziert Geokoordinaten zu bestimmten Orten auf der Weltkarte zu erhalten:<br /><br /></p>
<pre>function getGeoPoint($ort)<br />{<br />&nbsp;&nbsp;&nbsp; // Diese Funktion besorgt weltweit zu einem per String angegebenen Ort<br />&nbsp;&nbsp;&nbsp; //die Geokoordinaten via Google Maps</pre>
<pre>&nbsp;&nbsp;&nbsp; $input = urlencode($ort);<br />&nbsp;&nbsp;&nbsp; $address = "http://maps.google.com/maps/geo?q=$input&amp;output=csv";<br />&nbsp;&nbsp;&nbsp; $point = file_get_contents($address);<br />&nbsp;&nbsp;&nbsp; $point = explode(",", $point);<br />&nbsp;&nbsp;&nbsp; $point = array($point[2], $point[3]);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if (!empty($point))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $point;<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />}</pre>
<p>Die Funktion an sich ist problemlos funktional und kann benutzt werden, wenn einem vorhandene Schnittstellen oder auch Google Maps API Klassen zuviel sind und man nur einmal eben eine Funktion ben&ouml;tigt, um schnell an Geokoordinaten zu gelangen.<br /><br />Wenn ein Ort gefunden wird, so wird ein Array zur&uuml;ckgegeben, welches den L&auml;ngen und den Breitengrad beinhaltet.</p>]]></content>
    </entry>
    <entry>
    <title>Geburtsdaten MySQL</title>
    <id>http://blog.christian-ahmer.de/geburtsdaten-mysql/</id>
    <published>2010-08-26T20:40:06+02:00</published>
    <updated>2010-08-27T17:23:26+02:00</updated>
    <link href="http://blog.christian-ahmer.de/geburtsdaten-mysql/"/>
    <content type="html"><![CDATA[<p>F&uuml;r eine kleine Anwendung, wo es darum geht, die n&auml;chsten Geburtstage  herauszufinden, habe ich einmal einige halbwegs interessante MySQL  Queries gefunden. Um in MySQL relativ zum jeweils aktuellen, also heutigen  Datum die bereits vergangenen Geburtstage bzw. die noch ausstehenden  Geburtstage herauszufinden, kann man folgende Queries verwenden, wenn  man davon ausgeht, dass die Datumsspalte der Datenbank nach folgendem  Schema aufgebaut ist: JAHR-MONAT-TAG also z.B. 2000-01-21 falls Jemand  am 21.Januar 2000 geboren wurde.</p>
<p>F&uuml;r bereits vergangene Geburtstage in MySQL:</p>
<pre>SELECT *<br />FROM personen WHERE<br />CONCAT(Year(CURDATE()),'-',SUBSTR(geburtsdatum,6,2),'-',SUBSTR(geburtsdatum,9,2))<br />&lt; NOW()<br />ORDER BY CONCAT(SUBSTR(geburtsdatum,6,2),SUBSTR(geburtsdatum,9,2)) ASC</pre>
<p>F&uuml;r noch ausstehende, also noch kommende Geburtstage:</p>
<pre>SELECT id,vorname,nachname,geburtsdatum<br />FROM personen WHERE<br />CONCAT(Year(CURDATE()),'-',SUBSTR(geburtsdatum,6,2),'-',SUBSTR(geburtsdatum,9,2))<br />&gt;= NOW()<br />ORDER BY CONCAT(SUBSTR(geburtsdatum,6,2),SUBSTR(geburtsdatum,9,2)) ASC</pre>]]></content>
    </entry>
    <entry>
    <title>Queue file size limit exceeded</title>
    <id>http://blog.christian-ahmer.de/queue-file-size-limit-exceeded</id>
    <published>2010-08-26T20:55:14+02:00</published>
    <updated>2010-08-26T18:55:14+02:00</updated>
    <link href="http://blog.christian-ahmer.de/queue-file-size-limit-exceeded"/>
    <content type="html"><![CDATA[<p>Wer diese Meldung einmal als Postfix Betreiber bekommt, hat in der  Regel eine Mail erhalten, die zu gro&szlig; war und die deshalb vom Postfix  Mailsystem abgelehnt wurde.<br /> Mails werden immer nur akzeptiert, wenn  sie von der Gr&ouml;&szlig;e her unterhalb eines bestimmten Limits bleiben. Wenn  nun Jemand ein paar Photos als Anhang schickt, dann kann da heutzutage  schon einiges zusammenkommen und locker &uuml;ber das Limit gehen.</p>
<p>Um dem abzuhelfen, muss man Postfix ein wenig bearbeiten, genauer  gesagt man &ouml;ffnet (auf Debian basierenden Servern) einfach die Datei  /etc/postfix/main.cf, z.B. via dem Texteditor nano:</p>
<p>&nbsp;</p>
<pre>nano  /etc/postfix/main.cf</pre>
<p>Nun &auml;ndert man die Zeile, welche die Einstellung f&uuml;r die maximale  Mailgr&ouml;&szlig;e beinhaltet, oder f&uuml;gt sie der Konfigurationsdatei einfach  irgendwo hinzu (f&uuml;r max. 100MB pro Mail):</p>
<pre>...<br />message_size_limit = message_size_limit = 102400000<br />...</pre>
<p>und speichert die Datei.</p>
<p>Standardm&auml;&szlig;ig ist die Einstellung auf 10 MB festgesetzt, also auf ca 10240000 Bytes.<br />In meinem obigen Beispiel &auml;ndere ich somit den Wert auf das Zehnfache.<br />message_size_limit = message_size_limit = 102400000 l&auml;sst somit einzelne Mails mit bis zu 100 MB zu.</p>]]></content>
    </entry>
    <entry>
    <title>Conditional Comments: saubere Korrekturen für IEs</title>
    <id>http://blog.christian-ahmer.de/conditional-comments-css-ie</id>
    <published>2010-08-26T20:39:06+02:00</published>
    <updated>2010-08-26T18:39:06+02:00</updated>
    <link href="http://blog.christian-ahmer.de/conditional-comments-css-ie"/>
    <content type="html"><![CDATA[<p><span class="comment">Normalerweise baut man eine Webseite zuerst  sauber in einem Browser, der sich am besten an die allgemeinen Standards  des W3C h&auml;lt auf.</span><span class="comment">Ein guter Browser f&uuml;r so  etwas ist z.B. der Mozilla Firefox. Im Laufe der Fertigstellung einer  Website muss man dann oftmals &uuml;ber den Tellerrand schauen und pr&uuml;fen,  wie die einzelnen Templates und Layouts in den anderen popul&auml;ren  Browsern arbeiten.</span><span class="comment">Schaut alles &uuml;berall gut  aus, dann ist das umso besser, aber falls einmal bestimmte Dinge eben  nicht wollen, dann muss man speziell korrigieren.<br /><br />Meistens f&auml;llt  so etwas leider beim Internet Explorer (besonders Version 6.0) auf, da  dieser Browser von Haus aus leider viele Fehler hat, sehr alt ist, aber  eben auf vielen PCs derzeit noch l&auml;uft - man geht weltweit von ca 10-20%  aller internetf&auml;higen PCs aus.</span></p>
<p><span class="comment">Um nun f&uuml;r Microsofts Lieblinge die gew&uuml;nschten Detailkorrekturen hinzuzuf&uuml;gen, kann man sich mehrerer M&ouml;glichkeiten bedienen.<br /></span></p>
<ul>
<li><span class="comment">1) Unterschiedliche Layouts f&uuml;r Unterschiedliche Browser basteln - schlecht.</span></li>
<li><span class="comment">2) Ausnahmen im Server Side Script einbauen - extrem schlecht.</span></li>
<li><span class="comment">3) CSS Ausnahmen f&uuml;r bestimmte Layouts in extra Stylesheet einbauen via Conditional Comments - prima!</span></li>
</ul>
<p><span class="comment">Man macht also ein paar CSS Korrekturen f&uuml;r den IE6, den IE7, IE8 oder auch alle auf einmal, indem man wie folgt vorgeht:<br /><br />Im Kopfteil der gew&uuml;nschten Websitelayouts einfach folgendes reinschreiben:<br /></span></p>
<p>&nbsp;</p>
<pre><span class="comment">&lt;!--[if IE 6]&gt;<br /></span><span class="comment">&lt;link rel="stylesheet" type="text/css" href="ie6.css" /&gt;<br />&lt;![endif]--&gt;<br /><br /></span></pre>
<p>Das bewirkt, dass nur im Internet Explorer 6 dieses Stylesheet  eingebunden wird. Alle anderen Browser ignorieren diese Conditional  Comments einfach. F&uuml;r sie steht dann dort nichts anderes als ein  einfacher Kommentar im HTML.<br />Man kann aber auch z.B. CSS f&uuml;r alle Browser die neuer als Version 6 sind einbinden:</p>
<pre><br /><pre><span class="comment">&lt;!--[if gt IE 6]&gt;<br /></span><span class="comment">&lt;link rel="stylesheet" type="text/css" href="ie.css" /&gt;<br />&lt;![endif]--&gt;</span></pre>
<br /></pre>
<p>Oder auch kleiner als Version 8:</p>
<pre><pre><span class="comment">&lt;!--[if lt IE 8]&gt;<br /></span><span class="comment">&lt;link rel="stylesheet" type="text/css" href="ie.css" /&gt;<br />&lt;![endif]--&gt;</span></pre>
<br /></pre>
<p>Oder generell checken, ob es ein Internet Explorer ist:</p>
<pre><br /><pre><span class="comment">&lt;!--[if IE]&gt;<br /></span><span class="comment">&lt;link rel="stylesheet" type="text/css" href="ie.css" /&gt;<br />&lt;![endif]--&gt;</span></pre>
<br /></pre>
<p>Das sch&ouml;ne an dieser L&ouml;sung ist, dass es einfach unheimlich gut  wartbar ist. Man teilt nicht das normale CSS File in Extra Klassen auf  und l&auml;sst es damit f&uuml;r diverse Internet Explorer Versionen zu  gigantischer Gr&ouml;&szlig;e anwachsen, sondern l&auml;dt einfach zuerst das Standard  CSS File und l&auml;dt nur bei den IE Browsern etwaige Anpassungen je nach  Version in einem extra CSS File nach.<br />Und das Wichtigste: Es ist eine L&ouml;sung, die dann auch im Validator fehlerfrei durchl&auml;uft, es bleibt valides (X)HTML.</p>]]></content>
    </entry>
    <entry>
    <title>H264 FLV Videos mit ffmpeg erstellen</title>
    <id>http://blog.christian-ahmer.de/h264-flv-videos-erstellen-ffmpeg</id>
    <published>2010-08-26T20:33:39+02:00</published>
    <updated>2010-08-26T18:33:39+02:00</updated>
    <link href="http://blog.christian-ahmer.de/h264-flv-videos-erstellen-ffmpeg"/>
    <content type="html"><![CDATA[<p>Um relativ einfach hochqualitative FLV Videos in H264 Codec zu erstellen, kann man sich ffmpeg bedienen.<br />Folgende  Kommandozeile erstellt aus einem 40 sek&uuml;ndigen 1024x768 Pixel gro&szlig;en  Quellvideo in OGV Format (9,5MB) ein qualitativ recht gleichwertiges  Video in H264 Format, welches dann nur noch etwa halb so gro&szlig; ist und  bequem via Flash Video Player im Browser gestreamt werden kann:</p>
<pre>ffmpeg -i quellvideo.ogv -r 20 -acodec libfaac -ab 128k -vcodec libx264 -vpre hq \<br />-crf 22 -threads 0 zielvideo.mp4</pre>
<p>Das Ganze dauert auf einem AMD Phenom 9650 Quadcore System ca 45 Sekunden.</p>
<p><strong>Die Parameter bedeuten folgendes:</strong></p>
<p>-i : Das Quellvideo, welches umgewandelt werden soll<br />-r 20 : 20 Bilder pro Sekunde<br />-acodec libfaac : Der Audio Codec FAAC (<strong>Freeware Advanced Audio Coder</strong>) wird verwendet, die Qualit&auml;t ist generell h&ouml;her als bei MP3<br />-ab 128k : 128 Kilobit werden max pro Sekunde f&uuml;r den Audiostream gew&uuml;nscht<br />-vcodec libx264 : &Auml;quivalenter Codec zu H264 (freie Implementierung) wird gew&auml;hlt<br />-vpre hq : Hohe Qualit&auml;t ist gew&uuml;nscht, um Unsch&auml;rfen in bestimmten Situationen zu vermeiden<br />-  crf 22 : Der Constant Rate Factor wird auf 22 gesetzt, ist ein guter  Ausgangswert. CRF wird verwendet, damit der Codec sich sehr gut an die  jeweilige Bildsitutation anpassen kann. Damit bekommt man oftmals  kleinere Videos mit besserem Bild als bei anderen Modi<br />- threads 0 :  Es werden so viele gleichzeitige parallele Threads gestartet so dass sie  perfekt auf die zum im System steckenden Prozessor passen. Man kann ist  also viel schneller mit der Videokonvertierung fertig, wenn man mehrere  Kerne / Prozessoren im PC oder Server hat.<br />zum Schluss gibt man noch den Dateinamen f&uuml;r das Zielvideo an und das wars - einfach Enter dr&uuml;cken und warten ;-)</p>
<p><strong>Anmerkung:</strong><br />Das Umwandeln funktioniert nat&uuml;rlich  nur, wenn man ffmpeg mit x264 Unterst&uuml;tzung kompiliert hat. x264 ist  nicht gleich bei jeder Distribution von Haus aus mit dabei. Bei Gentoo  reicht ein</p>
<pre>USE="x264" emerge ffmpeg</pre>]]></content>
    </entry>
    <entry>
    <title>Dateisystem Platzverbrauch unter Linux anzeigen</title>
    <id>http://blog.christian-ahmer.de/du-dateisystem-platzverbrauch-unter-linux</id>
    <published>2010-08-26T20:31:26+02:00</published>
    <updated>2010-08-26T18:31:26+02:00</updated>
    <link href="http://blog.christian-ahmer.de/du-dateisystem-platzverbrauch-unter-linux"/>
    <content type="html"><![CDATA[<p>Unter Linux gibt es eine Methode in der man, besonders auf SSDs,  nat&uuml;rlich auch auf herk&ouml;mmlichen Festplatten und beliebigen anderen  Ger&auml;ten mit Dateisystemen ganz schnell die Verzeichnisse findet, die am  meisten Platz verbrauchen:</p>
<pre>du --max-depth=1 -l | sort -n</pre>
<p>du steht f&uuml;r disk usage und zeigt standardm&auml;&szlig;ig eine Liste aller Verzeichnisse und deren Platzverbrauch.<br />--max-depth=1 steht f&uuml;r 'nur die oberste Dateiebene anzeigen'.<br />Man  kann den Parameter nat&uuml;rlich auch beliebig &auml;ndern, oder auch weglassen,  dann wird der Platzverbrauch wirklich aller Dateien anzeigt.</p>
<p>Wie auch immer, zum Schlu&szlig; wird die Ausgabe noch an das Kommando sort  -n gepiped, damit wird numerisch sortiert vom kleinsten bis gr&ouml;&szlig;ten  Verzeichnis und man hat damit ganz zum Schlu&szlig; das Verzeichnis, welches  am meisten Platz verbraucht.</p>
<p>sehr praktisch.</p>]]></content>
    </entry>
    <entry>
    <title>HTTPS (SSL) und Apache</title>
    <id>http://blog.christian-ahmer.de/https-ssl-und-apache</id>
    <published>2010-08-26T20:30:00+02:00</published>
    <updated>2010-08-26T18:30:00+02:00</updated>
    <link href="http://blog.christian-ahmer.de/https-ssl-und-apache"/>
    <content type="html"><![CDATA[<p>Recht einfach kann man seinen Apache Webserver um ein selbstsigniertes SSL Zertifikat erweitern.<br />Das  ist ist sehr sinnvoll, wenn man abgesicherte Verbindungen auf seinem  Webhost laufen lassen m&ouml;chte, dienlich z.B. f&uuml;r einen eigenen  Webmaildienst.<br /><br />Um z.B. die Adresse www.meinedomain.de via SSL  verschl&uuml;sselt &uuml;ber Port 443 und abrufbereit unter  https://www.meinedomain.de zug&auml;nglich zu machen, bedarf es folgenden  Schritten (hier unter Debian):</p>
<p>1) Zertifikat und Schl&uuml;ssel erstellen:</p>
<pre>mkdir /etc/apache2/ssl<br />cd /etc/apache2/ssl<br />openssl genrsa -out meinedomain.de.key 1024<br />openssl req -new -key meinedomain.de.key -out meinedomain.de.csr<br />openssl x509 -req -days 365 -in meinedomain.de.csr \<br />-signkey meinedomain.de.key -out meinedomain.de.crt<br /></pre>
<p>2) Falls noch nicht geschehen, SSL aktivieren:</p>
<pre>a2enmod ssl</pre>
<p>3) Apache Konfiguration bearbeiten:</p>
<pre>&lt;VirtualHost *:443&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerAdmin&nbsp; ich[at]meinedomain[dot]de<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentRoot /var/www/meinwebordner<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerName webmail.meinedomain.de<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #SSL einschalten, Keys angeben<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSLEngine On<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSLCipherSuite HIGH:MEDIUM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSLCertificateFile&nbsp;&nbsp;&nbsp; /etc/apache2/ssl/meinedomain.de.crt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSLCertificateKeyFile /etc/apache2/ssl/meinedomain.de.key<br />&lt;/VirtualHost&gt;<br /></pre>
<p>4) Apache Webserver neu starten</p>
<pre>/etc/init.d/apache2 restart</pre>
<p>5) Fertig! Nun kann man die Webseite (hier ein Webmail) im Browser via https://webmail.meinedomain.de aufrufen.</p>
<p>Man sieht: Selbstsignierte Zertifikate f&uuml;r HTTPS bzw. SSL via Apache sind gar kein so gro&szlig;es Kunstst&uuml;ck.</p>
<p>Hinweis:<br />Betreibt man eine kommerzielle Website, so sollte man  sich auf keinen Fall ein eigenes Zertifikat, sondern ein offizielles  besorgen, sonst m&uuml;ssen die Besucher in ihrem Browser das Zertifikat  immer erst erlauben, was keinen seri&ouml;sen Eindruck macht, aber f&uuml;r  Privatnutzer ist das eine recht brauchbare M&ouml;glichkeit, unliebsame  Mitlauscher via HTTPS&nbsp; / SSL auszusperren.</p>]]></content>
    </entry>
    <entry>
    <title>MySQL absichern</title>
    <id>http://blog.christian-ahmer.de/mysql-absichern</id>
    <published>2010-08-26T20:28:33+02:00</published>
    <updated>2010-08-26T18:28:33+02:00</updated>
    <link href="http://blog.christian-ahmer.de/mysql-absichern"/>
    <content type="html"><![CDATA[<p>Es gibt ein paar Dinge, die man als Betreiber einer Website in Verbindung mit einer Datenbank wie MySQL beachten sollte.</p>
<p>Das wichtigste ist: <strong>Die Datenbankverbindung nicht mit dem root User herstellen.</strong><br />Selbst  wenn man noch so bedacht darauf ist, entsprechend zu validieren und zu  escapen, um SQL Injection abzuwehren, sollte man trotz alledem vor allem  die Datenbankverbindung nicht &uuml;ber den Root User initiieren.<br />Denn  sollte es doch einmal ein fieser Hacker schaffen, die Site zu knacken  und sich Zugriff zur Datenbank zu verschaffen, dann kann er &uuml;ber die  Datenbank standardm&auml;&szlig;ig als root Benutzer alles tun - das kann so weit  gehen, dass er sogar beliebige Dateien in Systemordnern des ver&auml;ndern  kann, gesch&uuml;tzte Daten stehlen kann und auch den Server komplett l&ouml;schen  kann. Ein einmal so gehacktes System ist nicht mehr zu gebrauchen und  muss neu aufgesetzt werden.</p>
<p>Immer wieder lese ich im Internet von Leuten, denen so etwas  tats&auml;chlich schon passiert ist. Das Thema ist aktueller als man denkt.<br />Viele  Hobbyprogrammierer meinen heute, es sei so einfach sich selbst eine  Homepage zu basteln, am besten noch mit einem kleinen CMS dabei - aber  an richtige Sicherheit denken sehr viele leider eben nicht.<br />Sicherheit  f&auml;ngt aber schon bei der Systemkonfiguration an. Und genau da kann man  viel rausholen, wenn man Zugriff nur als unprivilegierter zul&auml;sst und  nicht aus bequemlichkeit alles &uuml;ber den root User laufen l&auml;sst.</p>
<p>Lange Rede, so geht's:</p>
<p>1) In der Konsole als root in mysql einloggen (statt pw bitte das richtige Passwort f&uuml;r den root User eingeben):</p>
<p>&nbsp;</p>
<pre>mysql -uroot -ppw</pre>
<p>&nbsp;</p>
<p>2) Neuen Benutzer in mysql anlegen und ben&ouml;tigte Rechte zu allen Tabellen der Datenbank 'Datenbankname' geben.</p>
<p>&nbsp;</p>
<pre><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">CREATE USER 'benutzer'@'localhost' IDENTIFIED BY 'einpw';<br /><br />GRANT SELECT ,<br />INSERT ,<br />UPDATE ,<br />DELETE ,<br />INDEX ,</span><span class="syntax_alpha syntax_alpha_reservedWord">ALTER ON Datenbankname.* TO 'benutzer'@'localhost'<br />IDENTIFIED BY 'einpw'<br />WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0<br />MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;</span></span></pre>
<p>&nbsp;</p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">Das  wichtige hierbei ist, dem User nur eben gerade so viel Berechtigungen  zu geben, wie er max. brauchen wird. Soll er keine Datenbanken droppen  oder erstellen d&uuml;rfen, so bekommt er eben auch diese Rechte nicht via  GRANT erlaubt.<br />Und vor allem sollte der User die mysql Datenbank  nicht sehen d&uuml;rfen. Generell sollte der User kein Zugriff zu Datenbanken  bekommen, die ihn nichts angehen.</span></span></p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord"><strong>Wichtiges zu PhpMyAdmin:</strong><br />MySQL  kann man bequem via PhpMyAdmin verwalten, das ist ein sehr gutes, wenn  nicht sogar das beste Verwaltungstool f&uuml;r diese Datenbank. Das sollte  man aber bitte nur auf dem Entwicklersystem tun und nicht auf dem Live  Server.<br />Auf Live Servern empfiehlt es sich, mysql nur via localhost  anzusprechen und keinen Remotezugriff auf die DB zu erlauben um einfach  Risiken zu minimieren.</span></span></p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">In  der Konfiguration von mysql kann man einstellen, dass der Port 3306,  welcher standardm&auml;&szlig;ig nach au&szlig;en offen ist, nur via localhost erreichbar  ist.<br />Dazu schreibt man (je nach Betriebssystem) in der /etc/mysql/my.cnf:</span></span></p>
<p>&nbsp;</p>
<pre><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">bind-address = 127.0.0.1</span></span></pre>
<p>&nbsp;</p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">Nach einem Neustart der Datenbank sollte auf der &ouml;ffentlichen IP des Servers der Port 3306 nicht mehr ge&ouml;ffnet sein.</span></span></p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">&Uuml;berpr&uuml;fen kann man das z.B. mit dem Portscanner Tool nmap:</span></span></p>
<p>&nbsp;</p>
<pre><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">nmap 192.168.0.10 (bitte ersetzen durch jeweilige IP)</span></span></pre>
<p>&nbsp;</p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">Ist der Port offen, erscheint etwa so etwas in der Ausgabe:</span></span></p>
<p>&nbsp;</p>
<pre><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">PORT&nbsp;&nbsp;&nbsp;&nbsp; STATE SERVICE<br />80/tcp&nbsp;&nbsp; open&nbsp; http<br />443/tcp&nbsp; open&nbsp; https<br />3306/tcp open&nbsp; mysql<br /></span></span></pre>
<p>&nbsp;</p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">Ist er geschlossen, w&uuml;rde das so aussehen:</span></span></p>
<p>&nbsp;</p>
<pre><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">PORT&nbsp;&nbsp;&nbsp;&nbsp; STATE SERVICE<br />80/tcp&nbsp;&nbsp; open&nbsp; http<br />443/tcp&nbsp; open&nbsp; https<br /><br /></span></span></pre>
<p>&nbsp;</p>
<p>Wenn man diese Punkte beachtet, dann sollte der Server zumindest  hinsichtlich der Datenbank weniger Gefahr laufen, gekapert zu werden.</p>
<p><strong>Datenbankwartung:</strong><br />Die weitere Wartung der Datenbanken sollte idealerweise abgesichert funktionieren. Da gibt es mehrere M&ouml;glichkeiten:<br />Die besten zwei will ich kurz nennen:</p>
<p>1) PhpMyAdmin via https:// Verbindung (wenn es unbedingt PhpMyAdmin auf dem Live Server sein muss)</p>
<p>2) Verbindung via SSH Sitzung. Daten Im / Export direkt auf der Kommandozeile via mysql oder mysqldump.<br />Diese  Methode ist zwar nicht ganz so luxuri&ouml;s, ist aber Methode 1  vorzuziehen, da man hier auch mit sehr gro&szlig;en Datenbanken arbeiten kann,  ohne dass man Angst haben muss, dass mitten im Import PhpMyAdmin  abst&uuml;rzt, weil eine &uuml;bergro&szlig;e Datenbank verwendet wurde, welche sich  nicht via PHP vollst&auml;ndig hochladen l&auml;sst.</p>]]></content>
    </entry>
    <entry>
    <title>MySQL Charset Einstellungen via Query herausfinden</title>
    <id>http://blog.christian-ahmer.de/mysql-charset-einstellungen-via-query-herausfinden</id>
    <published>2010-08-26T20:26:13+02:00</published>
    <updated>2010-08-26T18:26:13+02:00</updated>
    <link href="http://blog.christian-ahmer.de/mysql-charset-einstellungen-via-query-herausfinden"/>
    <content type="html"><![CDATA[<p>Um einfach mal so eben im Skript schon wissen zu k&ouml;nnen, welche  Einstellungen hinsichtlich des verwendeten Zeichensatzes bestehen (wenn  man sich nicht sicher ist, je nach Server), kann man einfach via SELECT  Abfragen die sogenannten <strong>globalen Variablen</strong> von MySQL befragen.</p>
<pre>SELECT @@global.character_set_database<br />SELECT @@global.character_set_client<br />SELECT @@global.character_set_connection<br /></pre>
<p>Das f&uuml;hrt dann im Idealfall zu dem Ergebnis, dass <span style="text-decoration: underline;">alle 3 Einstellungen utf8</span> zur&uuml;ckliefern.</p>
<p>&nbsp;</p>
<p>Im eben genannten Ideallfall hat man, wenn man UTF8 verwendet, die  MySQL Datenbank von Grund aus komplett auf eben UTF8 eingestellt -  Datenbankintern, in den Tabellen als auch in der Default Verbindung  (Default Connection Charset).</p>
<p>Ist das einmal nicht der Fall, kann es je nach CMS zu h&auml;&szlig;lichen  Randerscheinungen kommen, wie z.B. falschen Zeichen in der DB, wenn man  einmal via PhpMyAdmin reinschaut. Oder man spielt Dumps einer Datenbank  lokal ein und freut sich &uuml;ber kaputte Umlaute, oder beim Mails versenden  wei&szlig; man auf einmal gar nicht mehr welche Kodierung die jeweils  verwendeten Zeichen denn nun wirklich haben. Mehrmaliges hin oder  herkodieren von latin auf utf8 und andersrum f&uuml;hrt immer nur zu kaputten  Zeichen und am Ende ist man fast verzweifelt.</p>
<p>Wenn man denn nicht doch noch festgestellt h&auml;tte, dass die Anwendung  oder auch das gerade verwendete CMS Standardm&auml;&szlig;ig gar kein Connection  Charset einstellt und damit als Fallback die Standardeinstellung der  MySQL Datenbank hergenommen wird.</p>
<p>Da merkt man dann sehr schnell, dass offenbar Multibyte-Zeichen  (utf8) &uuml;ber eine Latin1 Verbindung in eine Multibyte Datenbank  geschrieben wurden.<br />Im CMS selber kann es sein, dass das gar nicht  auff&auml;llt, aber wenn man die Daten sp&auml;ter selbst einmal anzapfen m&ouml;chte,  sei es &uuml;ber Module oder externe Anwendungen, dann kommt man irgendwann  in die sogenannte Zeichensatz H&ouml;lle und findet sich nicht mehr zurecht.</p>
<p><strong>Also ein Tipp:</strong><br />Vom Start weg bei allen  Anwendungen und Webseiten mit DB Backend immer vom Start weg alles  sorgf&auml;ltig pr&uuml;fen. PHP Einstellungen, korrekte UTF8 Header Richtung  Browser senden und vor allem die Datenbanken inkl. der  Verbindungseinstellungen immer durchweg auf UTF8 stellen. Damit sollten  dann keine Probleme mehr auftreten.<br /><br />Und wenn man einmal einen  anderen Zeichensatz als UTF8 ben&ouml;tigt, dann kann man immer noch via  utf8_decode in einfachere Formate parsen.</p>]]></content>
    </entry>
    <entry>
    <title>Foreach Schleife in Php, Ruby, Python, Bash, JQuery und Actionscript3</title>
    <id>http://blog.christian-ahmer.de/foreach-php-ruby-python-bash-jquery-as3</id>
    <published>2010-08-26T20:18:16+02:00</published>
    <updated>2010-08-26T18:19:51+02:00</updated>
    <link href="http://blog.christian-ahmer.de/foreach-php-ruby-python-bash-jquery-as3"/>
    <content type="html"><![CDATA[<p>Wenn man viel mit PHP arbeitet und gern bequeme Methoden verwendet, dann lernt man Methoden wie <strong>foreach</strong>() wirklich zu sch&auml;tzen.<br />Damit man sich bei der t&auml;glichen Arbeit in allerhand Skriptsprachen mit einer <strong>foreach</strong> Schleife behelfen kann, habe ich hier einmal funktionierende Varianten f&uuml;r PHP, Ruby, Python, BASH, <strong>Actionscript</strong> und jQuery als Beispiele notiert. jQuery wurde deswegen ausgew&auml;hlt,  weil ich diese Bibliothek h&auml;ufig ben&ouml;tige und sie browser&uuml;bergreifend  ihre ganzen Goodies ausspielen kann, kombiniert mit nach wie vor  brauchbarer Dateigr&ouml;&szlig;e.</p>
<p>in PHP:<br />-------</p>
<pre>$data = array(1,2,3);</pre>
<pre><strong>foreach</strong>($data as $d)</pre>
<pre>&nbsp;&nbsp;&nbsp; echo $d;</pre>
<p><br />in jQuery: (crossbrowserf&auml;hig):<br />------------------------------</p>
<pre>data = new Array(1,2,3);</pre>
<pre>$.each(data, function() {</pre>
<pre>&nbsp;&nbsp;&nbsp; $('body').append(String(this));<br />});</pre>
<p><br />in Ruby:<br />--------</p>
<pre>data = Array[1,2,3]</pre>
<pre>data.each do |d|</pre>
<pre>&nbsp;&nbsp;&nbsp; print d</pre>
<pre>end</pre>
<p><br />in Python:<br />----------</p>
<pre>data = [1,2,3]</pre>
<pre>for d in data:</pre>
<pre>&nbsp;&nbsp;&nbsp; print d</pre>
<p><br />in BASH:<br />--------</p>
<pre>data=(1 2 3)</pre>
<pre>echo ${data[*]}</pre>
<p><br />in Actionscript3 (Flash):<br />-------------------------</p>
<pre>var data:Array = new Array(1,2,3);</pre>
<pre>for(var d:String in data) // loops through the items in the array</pre>
<pre>&nbsp;&nbsp;&nbsp; trace(d);<br /><br /><br /></pre>
<p>Die Implementierungen sind bewusst recht knapp gehalten und sollen nur als Anhaltepunkte dienen.</p>]]></content>
    </entry>
    <entry>
    <title>APC - Der PHP Turbolader</title>
    <id>http://blog.christian-ahmer.de/apc-der-php-turbolader</id>
    <published>2010-01-07T17:37:05+01:00</published>
    <updated>2010-08-26T17:38:42+02:00</updated>
    <link href="http://blog.christian-ahmer.de/apc-der-php-turbolader"/>
    <content type="html"><![CDATA[<p>Soeben habe ich den APC Bytecode Cache auf dem Server aktiviert und es macht einen gewaltigen Unterschied in der Serverperformance.<br />Von vorher durchschnittlich &gt;700ms Antwortzeit kommt die Seite nun auf durschnittlich &lt; 300ms.<br />Ist schon ein geh&ouml;riger Turbo, den man innerhalb von 5 Minuten ohne gro&szlig;en Aufwand und Kosten zuschalten kann.<br /><br />Dem Silverstripe CMS scheint es jedenfalls gut zu bekommen.<br /><br /><strong>Update:</strong><br />Auch auf dem Test-Quadcore System daheim kann ein Turbo von ca. 50% vermerkt werden.<br />Diese Webseite ben&ouml;tigt ohne zugeschalteten APC ca. 240 ms bis sie generiert wird.<br /><br /></p>
<pre>Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:   228  240  13.7    239     300
Waiting:      228  240  13.7    239     300
Total:        228  240  13.7    239     301</pre>
<p><br /><br />Mit APC sind es nun ~126ms.<br /><br /></p>
<pre>Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:   119  126   3.5    126     132
Waiting:      119  126   3.5    126     132
Total:        119  126   3.5    126     133</pre>
<p><br /><br />Man sollte bedenken, dass damit die Optimierungsphase gerade erst begonnen hat. Schliesslich kann man auch noch vern&uuml;nftigen Seitencache realisieren, was die Geschwindigkeit erst so richtig erh&ouml;hen w&uuml;rde. Aber immerhin ist das hier nur eine Seite mit eher wenig gleichzeitigen Besuchern, daher reicht die Geschwindigkeit zur Zeit sowieso mehr als aus.</p>
<p>&nbsp;</p>]]></content>
    </entry>
    <entry>
    <title>PHP 5.2.12 und max_file_uploads</title>
    <id>http://blog.christian-ahmer.de/php-5-2-12-und-max-file-uploads</id>
    <published>2010-01-11T17:21:01+01:00</published>
    <updated>2010-08-26T17:21:30+02:00</updated>
    <link href="http://blog.christian-ahmer.de/php-5-2-12-und-max-file-uploads"/>
    <content type="html"><![CDATA[<p>K&uuml;rzlich durfte ich an einem, urspr&uuml;nglich nicht von mir stammenden Projekt, welches auf Basis des Zend Frameworks in Version 1.7.2 l&auml;uft, feststellen, dass die Applikation nicht mehr funktionierte, wenn man bestimmte Formularfelder absenden wollte.<br /><br />Der Grund liegt darin, dass die Applikation damals auf einer wesentlich &auml;lteren PHP Version aufgebaut wurde und das Zend Framework welches benutzt wird, ebenfalls ein gutes Jahr alt ist.<br />Der urspr&uuml;ngliche Programmierer hat die Formularfelder so aufgebaut, dass man bis zu 12 Dateien pro einfachem Formularupload reinstellen konnte.<br />Das bedeutet: Bei Formularen, welche 2 Dateiuploads hatten, wo man dynamisch mehrere Dateien hinzuf&uuml;gen konnte, gab es also bereits 24 gleichzeitige m&ouml;gliche Uploads.<br /><br />Nun wo allerdings auf dem aktuellen Server PHP 5.2.12 installiert wurde, konnte das nicht mehr funktionieren, da die Standardeinstellung von PHP via <strong>max_file_uploads</strong> genau 20 max. gleichzeitige Uploads zul&auml;sst.<br />Allerdings hat es recht lang gedauert, herauszufinden, was da schief lief, da ich nicht der Serveradmin war und von der PHP Aktualisierung gar nicht richtig im Bilde war und zu erst Fehler in meinem Code oder im Framework vermutete, da der Zend -&gt; File -&gt; Transfer -&gt; Adapter keine Uploads mehr entgegennehmen konnte sondern einfach crashte und als Fehler angab, keine Dateien zu finden - womit er ja im Grunde auch nicht unrecht hatte, da PHP den Zugriff auf die Dateien scheinbar erst gar nicht zu lies, da max_file_uploads ja &uuml;berschritten wurde.<br /><br />Zum Gl&uuml;ck konnte der Fehler aber noch zeitig gefunden werden, so dass die Applikation nun wieder wie gewohnt auf der neuen PHP Version l&auml;uft.<br /><br /><strong>Achtung:</strong><br />Die Einstellung kann dzt. nur direkt in der php.ini ge&auml;ndert werden, Versuche via Apache Konfiguration oder .htaccess sind dzt. nicht erlaubt.<br />Kommentar eines Entwicklers dazu: "This might open a can of worms". Ein Schelm, wer b&ouml;ses dabei denkt.</p>]]></content>
    </entry>
    <entry>
    <title>Google Keyword Rankchecker</title>
    <id>http://blog.christian-ahmer.de/google-keyword-rankchecker</id>
    <published>2010-02-01T12:37:03+01:00</published>
    <updated>2010-08-26T17:13:23+02:00</updated>
    <link href="http://blog.christian-ahmer.de/google-keyword-rankchecker"/>
    <content type="html"><![CDATA[<p>Gestern habe ich einmal daran gedacht, wie ein ehemaliger Arbeitgeber von mir ein intern recht n&uuml;tzliches Tool geschrieben hat, welches es einem erm&ouml;glicht, den Pagerank von bestimmten Seiten aus der Googlesuche zu extrahieren.<br />So etwas wollte ich auch haben und habe es schlicht einfach einmal in 3 Stunden umgesetzt. Mein eigener Rankchecker allerdings kommt mit nur 30 Zeilen Code aus und nutzt extensiv jQuery, denn er l&auml;uft weitgehend im Browser selbst.<br />Er hat ein Suchfeld, welches man mit gew&uuml;nschten Keywords f&uuml;ttern kann und ein weiteres Feld, in dem man die Seite angeben kann, dessen Rank im Google Suchergebnis gecheckt werden soll.<br /><br />Kleinere Unregelm&auml;&szlig;igkeiten k&ouml;nnen zustandekommen, da Google nicht bei jeder Suche die gleichen Ergebnisse rauswirft, da Seiteneffekte wie der Google Dance oder versteckte Werbung seitens Google (z.B. f&uuml;r Google Books) die Ergebnisse minimal verf&auml;lschen k&ouml;nnen.<br />Im Grunde funktioniert die Suche aber schon f&uuml;r die 3 Stunden Aufwand hervorragend gut und findet aus den ersten 100 Suchergebnissen die Treffer der gew&auml;hlten Homepage zuverl&auml;ssig heraus. Und das genauso schnell, wie eine durchschnittliche Googlesuche dauert - einen Bruchteil einer Sekunde.<br /><br />Hier ist ein Video davon zu sehen. Der Google Keyword Rankchecker V.01 in Aktion.</p>]]></content>
    </entry>
    <entry>
    <title>HipHop currently only supports 64-bit machines</title>
    <id>http://blog.christian-ahmer.de/hiphop-currently-only-supports-64-bit-machines</id>
    <published>2010-04-11T12:37:03+02:00</published>
    <updated>2010-08-26T17:12:48+02:00</updated>
    <link href="http://blog.christian-ahmer.de/hiphop-currently-only-supports-64-bit-machines"/>
    <content type="html"><![CDATA[<p>Ich selbst bin eigentlich eher der Freund handgemachter Musik und so kommt es, das mir Facebook's vielversprechendes Projekt "HipHop" schon vom Namen nicht gef&auml;llt.<br />Aber ok, der Nutzen von "HipHop" scheint sehr gro&szlig; zu sein, kann man doch mit dessen Hilfe PHP Skripte in C++ Programme verwandeln (via g++). Klingt gut, und ich war neugierig und wollte das einmal ausprobieren.<br /><br />So machte ich mich daran, den Code auszuchecken und wollte gerade alle weiteren Schritte ausf&uuml;hren, als....<br /><br /></p>
<pre>git clone git://github.com/facebook/hiphop-php.git<br />cd hiphop-php/<br />git submodule init<br />git submodule update<br />export HPHP_HOME=`pwd`<br />export HPHP_LIB=`pwd`/bin<br />cmake .
</pre>
<p><br /><br />Was ich dann zu lesen bekam, sollte mir wieder einmal vor Augen f&uuml;hren, dass die Zeit f&uuml;r so etwas wohl noch nicht 100%ig gekommen ist.<br /><strong>HipHop currently only supports 64-bit machines</strong> stand da in gro&szlig;en Lettern.<br /><br />Aber nur daf&uuml;r werde ich mein Ubuntu Lucid (x86er Version), welches hier prima seinen Dienst verrichtet, garantiert nicht durch eine 64 Bit Variante ersetzen.<br />Ich habe meine Gr&uuml;nde, warum ich hier noch keine 64 Bit Variante fahre.<br /><br />Schade, dass man auf der Ank&uuml;ndigungsseite oder gar auf der &Uuml;bersichtsseite im Wiki kein Wort dar&uuml;ber verliert, dass die Version nur auf 64 Bit Architekturen l&auml;uft. Na gut, hier steht es dann doch, aber ich hatte zun&auml;chst keine Lust, das alles zu lesen.<br /><br />An alle Abenteurer da draussen: <strong>HipHop l&auml;uft noch nicht auf 32 Bit Architekturen. Wo immer ihr das ausprobieren wollt, es geht nur mit 64 Bit OS.</strong><br /><br />Eventuell setze ich in Zukunft eine kleine VM auf und probiere das Prozedere dann dort noch einmal, um ein paar Benchmarks zu machen.</p>
<p>&nbsp;</p>]]></content>
    </entry>
    </feed>
