Vor einigen Stunden wurde die neue Version der MediaWiki Software freigegeben. In dem Release wurde die minimale benötigte PHP Version auf 5.3.2 angehoben. An Verbesserung sind die neue Diffanzeige, sowie Verbesserungen für Farbenblinde hinzugekommen. Des weiteren gibt es eine neue Spezialseite („Special:MostInterwikis“) sowie das neue Schlüsselwort „{{PAGEID}}“ welches die Seiten ID ermittelt. Neben den Verbesserungen sind auch einige neue Sprachen wie die Emilianische Sprache hinzugekommen. Die neue Version der MediaWiki kann unter http://www.mediawiki.org/wiki/MediaWiki/de bezogen werden.
Manchmal möchte man zu ein paar Audiodateien einen RSS Feed haben, z.B. für einen privaten Podcast. Natürlich kann man sich einen solchen Feed von Hand zusammenbauen, einfacher ist es mit diesem kleinen PHP Skript:
<?php
//Podcast Feed Script
//Copyright (c) 2012 by seeseekey <seeseekey@gmail.com>
//
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program. If not, see <http://www.gnu.org/licenses/>.
//Basis URL ermitteln
$baseURL="http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$baseURL=dirname($baseURL) . "/";
//XML Header setzen
header('Content-type: text/xml');
//RSS Datei zusammenbauen
$output = '<rss version="2.0">'."\n";
$output .= ' <channel>'."\n";
$output .= ' <title>seeseekey.net (privater Podcast)</title>'."\n";
$output .= ' <description>Ein privater Podcast von seeseekey.net</description>'."\n";
$output .= ' <link>http://seeseekey.net</link>'."\n";
$output .= ' <copyright>(c) 2012 by seeseekey</copyright>'."\n";
//Audio Dateien in RSS Feed einpflegen
$files = scandir('.');
foreach ($files as $file)
{
$pathparts = pathinfo($file);
if($pathparts['extension']!="mp3") continue;
$output .= ' <item>'."\n";
$output .= ' <title>'.$file.'</title>'."\n";
$output .= ' <enclosure url="'.$baseURL.$file.'" length="'.filesize($file).'" type="audio/mpeg"/>'."\n";
$output .= ' </item> '."\n";
};
//RSS Feed wieder schließen
$output .= ' </channel>'."\n";
$output .= '</rss>'."\n";
//RSS Feed ausgeben
echo($output);
?>
Dieses Skript ließt alle MP3 Dateien aus einem Ordner aus und baut daraus einen RSS Feed. Dieser kann dann in der Podcasting App der Wahl eingefügt werden, indem man die URL angibt so z.B. „http://example.org/podcast.php“. Das Skript selbst steht dabei unter der GPLv3 und lässt sich auch unter https://github.com/seeseekey/archive/blob/master/Web/podcast.php herunterladen.
Im Open Source Bereich gibt es ja durchaus einige Ticketsysteme, wie z.B. das Open Ticket Request System (OTRS). Problematisch an den meisten Open Source Ticketsystemen ist dabei der Umstand das diese meist nicht bei den Wald- und Wiesenprovidern laufen, da es dort meist nur PHP und MySQL gibt. OTRS z.B. benötigt Perl, andere Systeme benötigen Ruby. Auf der Suche nach einem System welches auf einem solchen LAMP System läuft, habe ich osTicket gefunden. Dabei handelt es sich um ein freies Ticketsystem unter GPL. Problematisch sehe ich bloß das letzte Release welches im Jahr 2010 aufgelegt wurden. Das System selbst ist unter http://osticket.com zu finden. Derzeit scheint es leider kein halbwegs aktuelles Open Source Ticketsystem (welches unter PHP und MySQL läuft) zu geben.
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Open_Ticket_Request_System
http://en.wikipedia.org/wiki/Comparison_of_ticket-tracking_systems
Um Piwik in die MediaWiki zu integrieren gibt es eine Extension die auf den „Piwik Integration“ hört. Das Problem dieser Extension ist das sie seit 2009 nicht mehr weiterentwickelt wurde. Bedingt dadurch funktioniert das ganze nicht mehr mit der aktuellen Media Wiki Version.
Abhilfe schafft hier die Extension „PCR GUI Inserts“ welche unter http://www.mediawiki.org/wiki/Extension:PCR_GUI_Inserts zu finden ist. Mit dieser Extension ist es möglich Code auf der MediaWiki einzubinden. Im Gegensatz zu anderen Verfahren, wie z.B. dem direkten editieren der Templatedateien funktioniert diese Lösung auch nach einem Update der MediaWiki Version weiter.
Für die Installation muss man dabei folgende Schritte befolgen:
- Extension herunterladen
- den entpackten Ordner in den „extensions“ Ordner der MediaWiki hochladen
- die „LocalSettings.php“ bearbeiten
Bei der Bearbeitung der „LocalSettings.php“ muss nur die Zeile:
require_once( "$IP/extensions/PCRGUIInserts/pcr_guii.php" );
an das Ende der Datei angefügt werden. Danach ist die „PCR GUI Inserts“ Erweiterung aktiv. Nun muss nur noch der Piwik Tracking Code eingebaut werden. Dazu gibt es in der entsprechenden Wiki ein schönes Beispiel:
$wgPCRguii_Inserts['SkinAfterBottomScripts']['on'] = true;
$wgPCRguii_Inserts['SkinAfterBottomScripts']['content'] = '<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://piwik.example.com/" : "http://piwik.example.com/");
document.write(unescape("%3Cscript src=\'" + pkBaseURL + "piwik.js\' type=\'text/javascript\'%3E%3C/script%3E"));
</script><script type="text/javascript">
try {
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 2);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}
</script><noscript><p><img src="http://piwik.example.com/piwik.php?idsite=2" style="border:0" alt="" /></p></noscript>';
Diese Zeilen werden dabei auch in die „LocalSettings.php“ geschrieben. Natürlich müssen die entsprechenden Domainnamen angepasst werden, sowie die passende Nummer für die zu trackende Webseite benutzt werden.
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Piwik
http://de.wikipedia.org/wiki/MediaWiki
Manchmal benötigt man eine MySQL Kommandozeile, hat aber kein „phpmyadmin“ zur Verfügung. Für einen solchen Fall wäre es schön wenn man eine kleine Anwendung hätte welche dieses Problem löst. Genau hier setzt die PHP Anwendung „Adminer“ an. Dabei handelt es sich sozusagen um eine „phpmyadmin“ Minimalversion.
Das schöne am Adminer ist das er nur aus einer Datei besteht und so unkompliziert „installiert“ werden kann. Zu finden ist das ganze unter http://www.adminer.org.
Wie Heise gestern berichtete (http://www.heise.de/newsticker/meldung/Gefahr-durch-offene-PHP-Luecke-1567433.html) gibt es eine wunderschöne Sicherheitslücke im Bezug auf CGI und PHP. So führt der Aufruf:
http://localhost/index.php?-s
dazu das der Quellcode der Webseite ausgegeben wird. Das ist natürlich unpraktisch wenn dort Konfigurationsvariablen enthalten z.B. die Zugangsdaten für eine Datenbankverbindung. Zur Lösung des Problems gibt es drei Varianten:
- PHP Version mit dem Bugfix einspielen
- Rewrite Anweisung in die .htaccess
- Wrapper welcher vor dem PHP-CGI aufgerufen wird
Die erste Variante scheidet aus, da der aktuelle Bugfix leicht umgangen werden kann. Die zweite Variante (einzutragen in eine „.htaccess“) sieht so aus:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|\- [NC]
RewriteRule .? - [F,L]
Die dritte Variante setzt einen Wrapper vor den eigentlich Aufruf und filtert die entsprechenden Anweisungen heraus. Dazu ändert man in der „httpd.conf“ die Zeile:
Action application/x-httpd-php /cgi-bin/php-cgi.exe
in
Action application/x-httpd-php /cgi-bin/php-cgi-wrapper.exe
und startet den Apache Server neu. Der Quelltext des Wrappers sieht dabei so aus:
#include <process.h>
#define PHP_ORIG "php-cgi.exe"
int main(int argc, char **argv)
{
if(argc>1) argv[1]=0;
_execv(PHP_ORIG, argv);
}
Das ganze kann hier auch als fertiges Visual Studio Projekt oder gleich als ausführbare Datei heruntergeladen werden.
Weitere Informationen gibt es unter:
http://www.kb.cert.org/vuls/id/520827
http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
http://www.heise.de/newsticker/meldung/PHP-patcht-schnell-aber-nicht-gruendlich-1567906.html
Manchmal ist es gewünscht das eine PHP Anwendung eine Datei an den Client sendet. Das könnte dann z.B. so aussehen:
header("Content-type: application/pdf");
header("Content-Length: " . strlen($tmp));
echo $tmp;
Diese Variante funktioniert im ersten Moment erst einmal ohne Probleme in allen Browsern. Zum Problem wird dies erst, wenn die Seite über HTTPS zu erreichen sein soll. In diesem Fall stürzt der Internet Explorer ohne Fehlermeldung ab. Der Trick hier ist es einen „Cache-Control“ Eintrag hinzuzufügen (welchen der Internet Explorer bei HTTPS anscheinend benötigt)
header("Cache-Control: maxage=1");
header("Pragma: public");
header("Content-type: application/pdf");
header("Content-Length: " . strlen($tmp));
echo $tmp;
Mit dieser Variante funktioniert das ganze dann auch im Internet Explorer unter HTTPS.
Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/773308/ie-https-generating-pdf-from-php-file-doesnt-work
Nach dem Update der MediaWiki Software auf die Version 1.18 bekam ich folgenden Fehler:
Fatal error: Cannot redeclare wfprofilein() (previously declared in /www/wiki/includes/profiler/Profiler.php:14) in /www/wiki/includes/ProfilerStub.php on line 25
Die Lösung des Problemes war ganz einfach. Irgendwie wurde der Profiler aktiviert. Dies äußerte sich darin das es im Hauptordner der Software eine Datei namens StartProfiler.php gab. Wenn man diese Datei entfernt, ist das Problem gelöst.
Weitere Informationen gibt es unter:
http://www.mediawiki.org/
Bei einer multilingualen Webapplikation welche in PHP geschrieben ist, kann man natürlich zur Übersetzung mit assoziativen Arrays arbeiten und dann je nach Sprache die richtige PHP Datei einbinden.
$lang['welcome'] = 'Willkommen auf dieser Webseite.'; $lang['maintenance'] = 'Die Webseite befindet sich in der Wartung.';
Das Problem an dieser Variante ist, das sie nicht wirklich gut zu pflegen ist. Schöner ist es das ganze mit gettext zu übersetzen, da man hier nur die po Dateien übersetzen muss, und man das nicht im Quelltext tun muss.
Das Problem an dieser Variante ist allerdings, das nicht auf jeden Webserver gettext vorhanden ist. Hier hilft das Paket php-gettext welches unter https://launchpad.net/php-gettext/ zu finden ist. Mit Hilfe dieses Paketes, kann man gettext nutzen ohne sich darum kümmern zu müssen ob es installiert ist. php-gettext wrappt das ganze und emuliert nicht vorhandene Funktionen.
Das ganze zu benutzen ist auch relativ einfach:
//gettext initialisieren
$locale = "de_DE"; //Sprache definieren
$domain = 'default'; //Domäne definieren
$encoding = 'UTF-8'; //Zeichenkodierung definieren
//include gettext
require_once('./ext/php-gettext/gettext.inc');
//Sprache setzen
T_setlocale(LC_MESSAGES, $locale);
//Pfad zu den Übersetzungen definieren
T_bindtextdomain($domain, './locale/');
//Zeichenkodierung setzen
T_bind_textdomain_codeset($domain, $encoding);
//Domäne setzen
T_textdomain($domain);
Nachdem dies getan ist, kann damit begonnen werden die Texte in der Anwendung zu übersetzen. Dabei wird aus einem:
echo 'Willkommen auf dieser Webseite.';
ein:
echo T_('Willkommen auf dieser Webseite.');
T_ ist dabei der Name der Übersetzungsfunktion welche von php-gettext bereitgestellt würden. Unter reinem gettext würde diese Funktion nur _ heißen. Nachdem man seinen Quelltext mit den entsprechenden Funktionen bestückt hat muss man diese Strings aus den PHP Dateien extrahieren. Da man das nicht von Hand machen möchte nutzen wir dazu folgendes kleines Skript:
#!/bin/sh #Schreibe alle PHP Dateien in eine Textdatei (find ./data -name "*.php" && find ./system -name "*.php") > update-translations.txt #Rufe xgettext auf um die pot Datei zu erzeugen xgettext -f update-translations.txt -kT_ngettext:1,2 -kT_ --language=PHP -o update-translations.pot
Mit dieser pot Datei kann mittels PoEdit (http://www.poedit.net/) eine po Datei erzeugt werden. Diese po Dateien können auch wieder mittels der pot Datei aktualisiert werden, falls später neue Strings dazu kommen oder verschwinden. Beim speichern generiert PoEdit aus der po Datei eine mo Datei, bei welcher es sich um die binäre Representation der po Datei handelt. Diese mo Datei wird von gettext letztendlich zur Übersetzung genutzt.
Weitere Informationen gibt es unter:
http://phpmagazin.de/itr/online_artikel/psecom,id,874,nodeid,62,_language,de.html
http://blog.medianetix.de/2008/12/ubersetzung-von-quelltexten-mit-gettext-und-poedit/
Manchmal ist es nötig das eine Ausgabe als UTF-8 gekennzeichnet wird. Dies geschieht mit dem sogenannten Byte Order Mark kurz BOM. In PHP kann man diese so vor einen String setzen:
echo "\xEF\xBB\xBF".$output;
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Byte_Order_Mark

