Werkzeugkasten 2011

Nils von phphatesme.com hatte eine tolle Idee: Warum schreiben wir nicht jährlich unsere Tools und Programme auf, die wir so verwenden und können uns dann im Rückblick über uns selbst freuen, was wir vor x Jahren doch alles für Steinwerkzeuge benutzt haben und dass es ja früher alles ja eh entweder viel besser war (wenn es mal wieder schlecht läuft) oder viel härter war (wenn dem Kollegen die Loorbeeren zu schnell zufallen).

Und weil ich das auch für eine gute Idee halte und Selbstironie nie verkehrt ist, mache ich da mit. Hier also die Tools, Programme, Helferlein die ich 2011 benutze, allerdings ohne spezielle Reihenfolge, dafür bin ich derzeit einfach zu faul.

Schwerpunkt dieses Jahr: PHP und MySQL

  • Zend Studio
    Meine IDE für PHP und alles, was damit einhergeht. Besonders den Debugger und den Profiler möchte ich nicht mehr missen. Die IDE kann alles, was ich täglich brauche und es gibt immer noch Dinge und Features, die ich noch entdecken kann. Dieses Jahr trübt ein kleiner (aber für mich umso schwerer wiegender) Encoding-Bug das Erlebnis, aber lt. Zend Support wird diesem im nächsten Release (wieder) gefixed.
    Einziger Zusatz ist die SVN Unterstützung von CollabNet; die standardmäßige SVN Unterstützung ist wirklich nicht so toll 😉
  • Zend Server (Community Edition)
    Apache, PHP und MySQL „out-of-the-box“ und absolut update-fähig auf Knopfdruck, so stelle ich mir einen modernen Webserver vor. Ebenso positiv: Die Administration via Webinterface. Kostenlos und als PHP 5.2 und PHP 5.3 Version, derzeit schwerpunktmäßig im Einsatz: PHP 5.2
  • SVN und Vercue (SVN Monitor)
    Ohne kommt man nicht mehr hin. Versionskontrollsysteme (VCS) sollten in keinem professionellen Umfeld fehlen und bei der Menge an verschiedenen Kundensystemen und -seiten brauche ich auch eine schnelle Übersicht über alle SVN Projekte auf dem Server (wer hat was wann eingecheckt in der Systray) und bekomme bei ganz wichtigen Projekten sogar eine Mail, sobald eine Änderung eingeht. Sehr nützliches Werkzeug. Derzeit beim Test von SubversionEdge, mal sehen…
  • FileZilla
    Irgendwie müssen die neuen Daten ja auf den Kundenserver, oder? Und die Auftritte der Neukunden müssen auch zu mir kommen. Filezilla macht das alles und zur Not sogar gleichzeitig auf mehreren Kundenservern. Dank Filterlisten, Serververwaltung und Warteschlange.
  • Outlook (ja, MS Office)
    Outlook hilft mir, meine Mails, meine Termine usw. zu organisieren, so dass ich den Kopf frei habe, mich um die Programmierprobleme zu kümmern. Ich weiß, es gibt andere Götter Mailprogramme, aber ich komme im „Buisness“ am besten mit Outlook klar.
  • Firefox mit Firebug
    Muss ich dazu noch irgendwas sagen?
  • Zend Toolbar
    Nützliches AddOn, für Firefox, für Chrome und IE
  • WebDeveloperTools
    Sehr nützliche Erweiterung für den Firefox.
  • Chrome, Opera, IE9
    Alle nennenswerten Browser zum testen der Seiten; ich favorisiere eigentlich keinen, aber Chrome läuft gefühlt am flüssigsten, gefolgt von IE9. Opera nehme ich nur zum testen.
  • devart MySQL Studio
    DAS Tool für MySQL und die erstellung an Analyse komplexer Querys. Irgendwann schreibe ich mal einen längeren Beitrag dazu. Auf jeden Fall solltet ihr euch das Programm mal ansehen, wenn ihr vorhabt, komplexe Querys zu erstellen oder vorhandene Querys zu optimieren. Die Express Version ist kostenlos zum reinschnuppern 😉
  • Notepad2
    So schnell wie das original, aber zusätzlich noch Sytax Coloring und Zeilennummern. Für schnelle Sachen („kannste-mal-eben-…“) super.
  • Notepad++
    Sollte mittlerweile auch jeder auf dem System haben, also keine weiteren Worte.
  • Sysinternals Suite (WSCC – Windows System Control Center)
    Aus der Sysinternals Suite nutze ich vor allem den Process Explorer und „autoruns“, das WSCC hält mir dabei alles up-to-date, ohne dass ich immer nachsehen muss.
  • VirtualBox
    Einmal Linux blau, einmal Windows 98, einmal MacOS in der Dose … Virtualisierung ist toll.
  • KeePass
    Passwörter sollte man gut wählen. Dabei werden die so komplex, dass die sich kein normaler Mensch merken kann. Aber dazu gibt es ja KeePass. Keine Angst vor 30-stelligen Kundenpasswörtern 😉
  • Screenpresso
    Klein, nützlich und im SysTray, so könnte man Screenpresso bei 99% seiner Zeit beschreiben. Das restliche Prozent hat es in sich. Screenshots kennt jeder, muss jeder ab und zu mal machen, der Druck zur „Druck“ Taste ist nicht weit … und dann? Bildbearbeitung auf (dauert gefühlte 2 Tassen Kaffee) nur um ein paar lästige kanten und den Desktop zu entfernen. Screenpresso nimmt nur einen Teil des Bildschirms auf. „Druck“ drücken, Bereich entweder auswählen (Programm-Box Wahl) oder per Bereichsauswahl markieren, LMT drücken und schon kann man den Screenshot sogar nochmal – grob – Nachbearbeiten und speichern. Wer oft Screenshots machen muss, der wird begeistert sein. 
  • Launchy
    Kennt jeder Windows User: Start-Programme und das große Suchen, wo denn nun der Shortcut ist. Den Desktop mit allen Verknüpfungen auf alle Programme voll zu pflastern kann es aber auch nicht sein. Mit Lanchy kein Thema, das Tool scannt das Programme Menü (und auch Verzeichnisse eurer Wahl) und legt einen Index an. Dann startet man das Tool per Tastatur-Shortcut (STRG+ALT+BACKSPACE bei mir) und gibt z.B. „wor“ ein und schon erscheint im Auswahlmenü „Word 2007“, einmal ENTER und das Programm startet. Launchy lernt sogar hinzu. Wenn du W7 eingibt und Word aus der Liste suchst, wird beim nächsten mal schon Word vorgeschlagen. Die restliche Zeit verbringt Launchy nur im RAM und taucht sonst nirgends auf.
  • iTunes 
    #Uuaaaa, und schon schreien wieder alle: Apple-Fanboy, ist was mit Windows… Nein, iTunes ist aus 2 Gründen drauf: SongBird schmiert mir ständig ab und ruiniert unter Windows7 mein Theme (will immer auf das sehr schnörkellose Theme wechseln) und zum anderen läuft es flüssig und spielt ab, was ich ihm serviere, vor allem Podcasts kommen automatisch. Einkaufen würde ich aber im Apple Store nicht 😉
    Ach ja: Falls irgendwann mal SongBird mit Windows7 Unterstützung da ist, bitte einen Hinweis an mich.
  • TweetDeck
    Zum Twittern und „Twitter-Übersicht-behalten“ reicht es mir völlig.
  • Windows7
    Kein konfigurieren, kein „apt-get irgendwas“, kein „sudo kramp config –install-doch-bitte-endlich“, kein „man warumgehtdasnicht“ … einfach problemlos arbeiten!
    Man merkt schon: Ich komme mit Windows einfach besser klar. Zum arbeiten ungeschlagen, der Rest ist gut für Webserver und Pinselschwinger 😉
  • Selenium
    Steht mit Absicht unten. Das Tool ist mir bekannt, habe es bisher aber nur selten eingesetzt, da der Suppport für moderne Firefox Versionen nicht da war. Mit der neuen 2.0 ist das Ding nun wieder in der Gegenwart und ich plane, es häufiger einzusetzen.
So, ich hoffe, ich habe nichts vergessen.
Und wie sieht deine Entwickler-Werkzeugkiste für 2011 aus?

Fatal Error im neuen Zend Framework Projekt

Ich setze grad eine neues Zend Framework Projekt im Zend Studio auf, vergebe Namen und Ort, Zend Studio macht auch einiges und *plop* ein neues Projekt ist geboren.

Zend Server und hosts noch einstellen und ein kleiner Test im Browser sagt mir: „Ja, alles okay, Projekt kann starten!“

Aber schon nach den ersten paar Zeilen im index Controller gehts los:

Fatal error: Cannot redeclare class zend_loader. If this code worked without the Zend Optimizer+, please set zend_optimizerplus.dups_fix=1 in your php.ini in C:\zend\Apache2\htdocs\blahblah\library\Zend\Loader\PluginLoader.php on line 27

Nach langem Suchen: Die Lösung findet sich in der /public/index.php, dort diese Zeilen auskommentieren:

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));

Dann funktionieren auch wieder alle Aufrufe 😉

Method-Chaining in eigenen PHP-Projekten einsetzen

Klassen und Objekte kennt ja nun mittlerweile fast jeder, ein PHP-Framework wie ZendFramework oder CodeIgniter haben sich sicherlich auch schon viele zumindest mal angesehen … will ich hoffen. Nun, auch wenn man die Frameworks nicht direkt einsetzt, so kann man doch viel von ihnen lernen. Viele der Techniken, die in bekannten PHP-Frameworks eingesetzt werden, entstanden entweder aus dem großen Ästhetischen Faible, den nun mar jeder Entwickler hat oder schlicht aus Faulheit der Programmierer 😉

Egal, eines der – wie ich finde – tollen Features in vielen Frameworks ist die Möglichkeit, mehrere Funktionen eines Objektes hintereinander aufrufen zu können, ja, es sieht schon fast wie ein normaler Satz aus, was dann im Editor steht und seinen Dienst verrichtet. Diese Möglichkeit der sog. “Fluent Interfaces” nennt man “Method-Chaining” (und wieder im Bullshot-Bingo gewonnen, *strike*).

Kleines Beispiel, kennen wir alle, unsere Basisklasse:

class Base1 {
function macheEins() {
// some magic here
}
function macheZwei($parameter) {
// more magic here
}
}

Das ganze rufe ich nun auf:

$myBaseClass = new Base1();
$result1 = $myBaseClass->macheEins();
$result2 = $myBaseClass->macheZwei($result1);

Was passiert? Das Ergebnis des Aufrufs von “macheEins” ist der Parameter für “macheZwei”. Das ganze sieht strukturiert aus und ist lesbar, was also soll man besser machen können? Nein! Bitte jetzt nicht sagen, man könne doch sowas machen:

$myBaseClass = new Base1();
$result2 = $myBaseClass->macheZwei($myBaseClass->macheEins());

Sicher, es funktioniert, aber: NEIN! Macht das nicht! Warum? Ganz einfach: Debugge das mal, viel Spaß. Denn wenn man erst einmal mit so einem falschen Verhalten anfängt, dann verschachteln sich schnell auch mal 5 oder 8 Funktionen ineinander und finde dann mal den Fehler, viel Spaß! Also: Ganz klares “So nicht!”.

Aber wie dann?

Zunächst müssen uns im klaren sein, was die Klasse macht. Offenbar braucht “macheZwei” ein Ergebnis einer Berechnung einer anderen Funktion der Klasse. Dieses Ergebnis könnte man doch genauso innerhalb der Klasse speichern und dann benutzen.

class Base2 {
private $valueHolder;
function macheEins() {
$this->valueHolder = someMagic;
return $this->valueHolder;
}
function macheZwei() {
return $this->valueHolder * someMoreMagic;
}
}

Schon erfüllt die Klasse auch die Anforderungen, aber … so richtig “fluent” will das ganze nicht werden, obwohl ja nun im Aufruf von “macheZwei” der Übergabeparameter fehlt. Was nun? Und wie sieht denn so ein “Fluent Interface” mit “Method-Chaining” nun aus? Der Aufruf sähe in unserem Beispiel in etwa so aus:

$myBaseClass = new BaseFluent();
$result2 = $myBaseClass->macheEins()->macheZwei();

Aber unsere derzeitige Klasse unterstützt das nicht! Wie bekommen wir unsere Klasse nun “Fluent”?

Nun, dazu müssen wir diese massiv umbauen. Der größte Umbau ist, dass die einzelnen Methoden nicht mehr direkt die Ergebnisse liefern, sondern “nur” das Objekt selbst zurückgeben … und darin liegt auch schon der ganze Trick. Den Methodenaufruf kann ich immer nur auf einem Objekt machen. Eine Methode, die mir einen Basisdatentypen zurück liefert, kann ich dafür nicht gebrauchen, da ich auf diesem Basistypen (int, String, array, …) keine weiteren Methoden meiner Klasse aufrufen kann.

Nehmen wir mal an, im letzten Code stünde statt “new BaseFluent” ein “new Base2”. Dann würde der Aufruf:

$result2 = $myBaseClass->macheEins()->macheZwei();

folgendes bedeuten: Rufe die Methode “macheEins” auf dem Objekt “myBaseClass” auf, diese gibt den Datentyp von valueHolder zurück (nehmen wir mal an, es wäre ein integer mit dem rein zufälligen Wert 42), rufe dann auf dem Objekt 42 die Methode “macheZwei” auf … *meep* Fehlermeldung, “42” ist kein Objekt, hat daher generell keine Methoden und erst recht keine spezielle Methode mit dem Namen “macheZwei” also Fehler und Script Abbruch.

Der Trick besteht nun darin, dass die Methoden des Objektes nicht mehr die eigentlichen Ergebnisse zurückgeben, sondern das Objekt der Klasse selbst; darauf darf man ja dann auch wieder Methoden derselben Klasse aufrufen, also bauen wir flugs die Klasse um:

class BaseFluent {
private $valueHolder;
function macheEins() {
$this->valueHolder = someMagic;
return $this;
}
function macheZwei() {
$this->valueHolder *= someMoreMagic;
return $this;
}
function getValueHolder() {
return $this->valueHolder;
}
}

Man erkennt nun, wohin die Reise geht. Getter und Setter werden implementiert, um die Daten zu holen, die Methoden geben uns $this zurück, worauf wir weiterhin Klassenmethoden aufrufen können und wir haben nun unser “Fluent Interface” für “Method-Chaining” in PHP realisiert; war doch gar nicht schwer und hat auch gar nicht weh getan, oder?

In der freien Wildbahn trefft ihr auf diese Art des Codens übrigens ganz stark beim ZendFramework an, bei CodeIgniter geht es wohl auch, denke ich (ich mache mich da erst seit kurzem fit und bitte alle CI-Fans, meine Unwissenheit zu entschuldigen). Es macht aber auch Spaß, dass bei eigenen Klassen umzusetzen, die sowieso umgearbeitet werden sollen. Sieht einfach viel übersichtlicher aus. Und noch ein Tipp: Mehr als zwei Verkettungen sollten untereinander stehen, also so:


$myBaseClass->macheEins()
->macheZwei()
->macheDrei()
->undNochMehr();

Viel Erfolg damit …

10 Regeln für Entwickler

Es gibt viele „Regeln“ zum Programmieren, viele „Goldene Regeln“; das hier sind meine.

  1. Glaube nicht, wisse!
    Glauben heißt, nicht zu wissen. Sei kein Gläubiger, sei ein Wissender! Hebe dich von der Schar derer ab, die nur Oberflächliches kennen, jene, die nur auswendig lernen, was in den „xyz for dummies“ Büchern steht. Du bist anders, du bist smart: Du verstehst, was da steht!
     
  2. „Know your Enemy“
    ”Kenne deinen Feind”; lerne Sachen, die du hasst; verdamme nicht einfach Dinge, die neu oder anders sind: Lerne Sie, verstehe, warum diese Dinge so sind, warum ein Autor das auf diese Weise gelöst hat und wieso nicht anders. Verinnerliche neues, sei bereit für die Änderung, wiege alle Optionen ab: Und dann nimm die am besten passende!
     
  3. Notepad? Benutz eine IDE!
    Benutze eine IDE; Lerne die Features “deiner” IDE kennen und nutze diese Gnadenlos aus! Verstehe, dass jeder „seine“ IDE braucht und das keine IDE wirklich besser ist als eine andere: Es kommt nur auf den Entwickler an, der den Code schreibt!
     
  4. Benutze Standards
    Standards wurden von schlauen Menschen entwickelt, damit diese auch mit Code zurecht kommen, den weniger schlaue Hacker schrieben; du benutzt deinen eigenen Standard nicht, weil du ein guter Entwickler bist; Du benutzt deinen eigenen Stil, weil du die Standards bisher nicht verstanden hast! (siehe 1,2)
     
  5. Object to go
    Klassen erleichtern dir das Leben: Sie lösen eine Aufgabe und das machen Sie effizient; ist die Klasse gut, macht Sie das sogar auf einer abstrakten Ebene und du kannst die Klasse nicht nur für dieses Problem einsetzen, sondern für alle ähnlichen Probleme. Aus (1) erkennst du, wie toll das ist, du nimmst die Klasse mit und bist fast am Ziel. Klassen und Objekte sind dein Freund: Benutze Sie auch!
      
  6. Kommentiere weise
    Kommentiere deine Funktionen, deine Klassen, eine extrem schwer zu verstehende Stelle im Code oder eine Stelle, in der du mal von der internen Norm abweichen musstest; Kommentiere nichts triviales; Kommentiere keine Kommentare -> das ist Code, kein Chat!
     
  7. Hacke nicht, komponiere
    Programmier kann jeder, wahrhaft entwickeln ist eine Kunst. Die richtige Wahl der Werkzeuge, das Arrangement der Funktionen, die Sitzordnung des Frameworks, die kurze Ruhe vor dem Beginn des Deployments … Du programmierst nicht, du komponierst Code und diese Kunst kann keiner Würdigen … außer ein anderer Codeponist.
     
  8. Bleib auf dem Teppich
    Ja, du bist der tollste Coder der Welt, aber keiner nimmt es zur Kenntnis? Liegt daran, dass keiner deinen Code lesen kann. Lesbarkeit ist wichtig, vor allem für dich selbst. Lies dich mal nach 12 Monaten und 4 Zwischenprojekten wieder in deinen „hochoptimierten“, „perfekten“ und „commentless“ Code ein … und dann weißt du, dass du (3),(4),(5) und (6) nicht verstanden hast. Sechs, setzen … Anfänger!
     
  9. Teile und herrsche
    Wussten schon die Römer, nur du weisst es wieder nicht. Teile dein Wissen, denn wenn du nicht fähig bist zu lehren, dann hast du es nicht richtig verstanden (siehe 1 und 2). Bringe dein Team auf deinen Wissenstand und messe dich regelmäßig mit stärkeren, mit schlaueren, mit „Wissenden“ … denn nur im direkten „Code-Wettkampf“, sei es nun mündlich oder als Code-Kata, kannst du erst über dich hinaus wachsen, deine Schwächen erkennen (und die hast du, glaube mir) und damit erst bist du in der Lage, dich zu verbessern. Wisse, dass du nichts weist; Plato wusste das auch … und du lernst das auch noch vom Kollegen nebenan!
     
  10. Don’t Panic
    Die wichtigste Regel und ich hoffe, ich muss dazu nichts mehr sagen!
Dies sind meine Regeln,
es gibt viele Regeln, aber diese sind meine…
Wie sehen deine aus???

ISO 3166 Code für eine Benutzereingaben finden … mit dem Zend Framework

Stichwort Benutzer-Regisitrierung mit Angabe des Landes: Der User gibt ein „Deutschland“, ist ja auch okay so, aber eure Anwendung (oder eine Drittanwendung) braucht den ISO Code dazu. Und was ist mit Schweiz oder einem Land wie Mexico?

Was nun? Eine lange Tabelle pflegen, womöglich noch selber? Das geht heute viel einfacher, zumindest, wenn man das Zend Framework benutzt:


$locale = new Zend_Locale('DE');
$list = $locale->getTranslationList('territory', 'de_de');
$filterlist = array_search('Deutschland', $list);
echo $filterlist;

Der Trick ist nun, dass wir uns eine Liste aller Länder mit den Codes ausgeben lassen, diese Liste ist in der Sprache, in der die Besucher auch die Daten eingeben (hier Deutsch). Nun suchen wir mit array_search() einfach den richtigen Wert raus (oder reagieren mit einem Fehler auf nicht gefunden, das ist hier nicht mit drin).

Die Ausgabe lautet richtigigerweise DE.

JSONP mit jQuery

JSON Daten mit jQuery zu senden sollte ja kein Problem mehr sein.

Allerdings: Möchte ich die Daten nicht an „mich“ selbst, sondern an eine andere Domain senden, dann funktioniert das nicht mit jQuery.post(), da JSON unter die „Single Domain“ Policy fällt … die ja auch eine sinnvolle Einrichtung ist.

Allerdings wird es in Zeiten immer engerer Vernetzung mitunter nötig, Daten vom Kundenserver A beim Dienstleister B abzufragen. Dazu braucht man dann JSONP – JSON mit Padding.

Wie bereits erwähnt, unterstützt jQuery.post() das ganze nicht, hauptsächlich darum, weil es nur JSON, HTML, XML oder Script verarbeitet (siehe Doku) … leider 🙁

Doch jQuery’s AJAX Funktionen bieten ja auch die jQuery.ajax()-Methode selbst an, die wir beliebig konfigurieren können.

Heraus kommt dann solch ein Konstrukt, welches in der Lage ist, die JSON Daten auch an andere Domains zu senden. Leider werden diese nicht im „reinen“ JSON Format gesendet, sondern als „data“ Parameter in JSON Format … das Serverscript sollte da etwas tolerant sein 😉

myJSONObject sollte natürlich vorher korrekt initialisiert worden sein.


$.ajax({
type: 'POST',
url: 'http://example.com/subfolder/script.php',
contentType : 'application/x-www-form-urlencoded',
data: {data: JSON.stringify(myJSONObject)},
success: function(data){
console.log('succ');
console.log(data);
},
dataType: 'jsonp'
});

Viel Erfolg damit 😉

Offtopic: Verbesserungsvorchlag zur Erhöhung der Reichweite von Elektroautos

Offtopic: Was mir schon länger im Kopf rumgeht, ist eine Idee von mir, die die Reichweite von Elektroautos erhöhen könnte – und ich möchte bitte gesagt bekommen: „Du Sascha, deine Idee ist schmarrn, weil …“.

Also, die Idee: So ein Elektroauto bewegt sich ja und dafür ist in aller Regel ja in irgendeiner Form eine Welle verantwortlich. Überhaupt bewegen sich an so einem Auto im allgemeinen eine Menge Sachen. Mich interessieren nun nur die Teile, die rotieren, also Wellen usw.

Legt man nun um die Wellen einen elektrischen Generator (schematische Darstellung) in der Form, dass man die Induktionsspulen an einer Hülle an der Karosserie befestigt und die Rotoren um die Welle – so wird die Welle zur Antriebsachse – dann sollte diese Konstruktion Strom erzeugen. Diesen Strom kann man nun nutzen, um die Batterie wieder aufzuladen, solange das Auto fährt. Befestigt man mehrere dieser Generatoren um die verschiedenen Achsen, und berücksichtigt man, dass man eine ausgewogene Balance zwischen Brems- und Stromerzeugungswirkung herausfinden muss, dann dürfte sich die Reichweite dieses E-Cars wohl signifikant erhöhen … ich kann nicht sagen, um welchen Faktor, aber es sollte schon spürbar mehr Reichweite „drin“ sein, als wie es derzeit ist.

Und nun, wie schon gesagt, möchte ich bitte, dass mit einer Erklärt, warum das nicht. Sollte sich ein Autohersteller finden, der das einbaut, dann bitte ich, dass ich das Auto mal sehen/fahren darf.

Verbesserte Suche in Chromes Omnibar einschalten

Wer wie in Firefox gern verschiedene Suchwörter eintippt, um dann auf die richtige URL zu kommen, der ist bei Chrome schwer enttäuscht, dass das bisher nicht ging. Eine Suche wie „frame zend man de“ zeigt zum Beispiel auf die de-Seite des Zend Frameworks, ähnliche Suchen führe ich täglich mehrere dutzend mal durch; „da war doch letztens so eine Seite, da ging es um x und y und irgendwas mit z … aha, eintrag 3“.

Das geht aber auch mit Chrome und zwar so (danke an @skaverat für den Tip):

  • Chrome 11 öffnen; ggf. vorher updaten
  • about:flags eingeben
  • ziemlich weit unten „Besseren Abgleich mit dem Omnibox-Verlauf ermöglichen“ aktivieren
  • Chrome neu starten
  • keywords wie in Firefox eingeben

Nun fehlt mir nur noch ein nativer Firebug in Chrome und ich schmeiße Firefox weit weg 😉

Datenbankverbindung beim Zend Framework auf UTF-8 umstellen

Bei verwendung des Zend Frameworks und dessen application.ini ist es sehr leicht, den gewünschten Zeichensatz einzustellen, damit sowas nicht passiert: 40,8�C

Ulrich hat da schon 2009 einen Artikel drüber geschrieben, an dieser Stelle nochmal: Danke!

Hier die Lösung: In eure application.ini tragt ihr einfach den entsprechenden charset-parameter ein:

resources.db.params.charset  = utf8

Und schon habt ihr “saubere” Ergebnisse: 40,8°C