Peter Rehm's Blog

apple,development,life & more

Nächtlicher Spaß mit PEAR::Services_Google

Mit 2 Kommentaren

ich hab was cooles entdeckt :-)

CODE:
require("Services_Google/Google.php");

$key='FxrFp55QFHJv0ccvxxxxxxxxxxxxxxxxxxx';
$test=new Services_Google($key);

echo $test->spellingSuggestion(utf8_encode('tippfheler'));


Das ist eine tolle Funktion bei der man auf die "Vorschlags"-Funktion von
Google zurückgreifen kann. Man braucht nur einen Google Key, aber
den bekommt man dann einfach so.

Man kann bis zu 1000 Anfragen / Tag über die API machen.

Viel Spaß!

Geschrieben von Peter Rehm

22.11.2006 um 23:28:46

Tags für diesen Artikel: , ,

UTF-8 in Webapplikationen

Mit 3 Kommentaren

Um mein CMS auch in bulgarisch betreiben zu können, musste ich mich nun mit UTF-8 beschäftigen.

Die Erfahrungen will ich hier nun kundtun.

Es ist vielleicht noch keine perfekte Lösung, aber Sie tut erstmal Ihren Dienst.

Allgemeines

Zum ersten muss dem Browser gesagt werden, welches Charset verwendet werden soll, nämlich UTF-8.
Dies ist vor allem dann ein Problem wenn der Browser das selbst festlegt, kann man böse Überraschungen
erhalten.

CODE:
<meta http-equiv="content-type" content="application/xhtml+xml;charset=utf-8" />


Dies sollte überall eingebunden werden. Man kann auch in der Css festlegen, welche Zeichensatz
verwendet werden soll, dies habe ich bisher aber noch nicht benötigt :-)

CODE:
@charset "utf-8";


Praktisch ist vor allem im Umgang mit PHP, die Anwendung von header()

CODE:
header('content-type: text/html; charset=utf-8');


Man kann dies auch in der php.ini spezifizieren, sofern man Zugriff darauf hat. (default_mimetype & default_charset)

Damit der Besucher der Website auch in allen Formularen UTF-8 eingeben kann sollte man
accept-charset in den FORM-Kopf mit aufnehmen.

CODE:
<form accept-charset="utf-8" method=…


Der Vollständigkeit halber auch noch die Einbindung in XML

CODE:
<?xml version="1.0" encoding="utf-8"?>


PHP

All diese Einstellungen machen es möglich, dass UTF eingegeben und ausgegeben werden kann.
Die meisten die das verwenden haben allerdings eine Datenbank im Hintergrund, und schon da kann
es komplizierter werden. Als erstes benötigen wir eine Funktion, die überprüft ob ein String bereits
UTF-8 ist:

CODE:
/**
* Checks if String is UTF-8 Encoded
* @param string $string string to check
* @return boolean
*/
function is_utf8($string) 
{
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}


Dies ist nach der Vorgabe von W3.
Somit kann nun schoneinmal festgestellt werden ob der String utf8 ist.

Nun noch eine Funktion, die UTF8 encodiert. Achtung, die Funktion benötigt is_utf8()

CODE:
/**
* Encodes String to UTF8
* @param string $string
* @return string
*/
function cms_utf8_encode($string)
{
if(is_utf8($string))
{
return $string;
} else {
if(function_exists('mb_convert_encoding'))
{
return mb_convert_encoding($string,'utf-8');
} else {
return utf8_encode($string);
}
}
}


Hier wird der String encodiert, bevor er z.B. in die Datenbank geschrieben wird.

Datenbank

Ich habe mich auch mit dem Thema UTF-8 und Datenbank auseinandergesetzt. Dabei muss man folgendes Wissen:
UTF-8 kostet mehr als z.B. der latin1 Zeichensatz, da mehr Speicherplatz verwendet wird. Sogar 3x soviel :-)
Daher habe ich mich dazu entschlossen, da in der regel die wenigsten Zeichen in meinem System in Unicode gespeichert werden sollen, den latin1 Zeichensatz zu lassen.

Ich encodiere nur UTF-8 und leg das eben dann so ab. Funktioniert wunderbar, und ich hoffe das gibt keine Probleme.

In dem zug auch eine sehr detaillierte Beschreibung zu dem Thema von Kris Köhntopp.

Geschrieben von Peter Rehm

18.11.2006 um 14:05:13

Tags für diesen Artikel: , , , ,

PHP4 & PHP5 auf einem MacBook Pro

Ohne Kommentare

So mal wieder bin ich mit dem ganzen Installationszirkus beschäftigt.
Nun will ich wieder beide PHP Versionen Parallel zueinander laufen lassen.

PHP4 muss man sich Compilen, oder man kann auf die mit OSX ausgelieferte
Version zurückgreifen. Dies werde ich in diesem Fall tun.

In der http.conf muss nur PHP4 aktiviert werden. Nachdem dies getan ist,
kopieren wir die Konfigurationsdatei.

CODE:
sudo cp /etc/httpd/httpd.conf /etc/httpd/httpd.php4.conf 


Nun installieren wir gleich PHP5. Die Packages dazu findet
Ihr bei

CODE:
http://www.entropy.ch/software/macosx/php/


In der Regel ist Apache 1.3 vorinstalliert.


Nachdem PHP5 installiert ist kopieren wir die Config erneut

CODE:
sudo cp /etc/httpd/httpd.conf /etc/httpd/httpd.php5.conf 


Nun kommt das Script das für den Wechsel zuständig ist:

CODE:
#!/bin/bash
if [[ "$1" == 5 || "$1" == 4 ]]; then 
VERSION=$1; 
else 
echo -n "Please choose between PHP4 and PHP5 (4/5)"; 
echo -e "";
fi 

if [ "$VERSION" == 4 ]; then 
sudo cp /etc/httpd/httpd.php4.conf /etc/httpd/httpd.conf;
echo "config updated to php4 - restarting Apache graceful.."; 
sudo apachectl graceful; 

elif [ "$VERSION" == 5 ]; then 
sudo cp /etc/httpd/httpd.php5.conf /etc/httpd/httpd.conf; 
echo "config updated to php5 - restarting Apache graceful.."; 
sudo apachectl graceful; 
fi


Das Skript habe ich hier auch schonmal geposted, aber in diesem Zuge nochmals...

Einfach das Skript speichern, und dann wie folgt ausführen:

CODE:
./changephp 4

Dann wird die PHP4 Config kopiert und der Apache neugestartet.
Das Gleiche geht auch in die andere Richtung.

Geschrieben von Peter Rehm

06.11.2006 um 20:04:10

Tags für diesen Artikel: , , ,

Stress Tests für Webentwickler

Mit 1 Kommentar

Immer wieder macht sich ein Webentwickler gedanken, wie seine Webanwendung sich wohl unter Last verhält. Dies kann man nachstellen:

Im folgenden möchte ich kurz die Tools auflisten die man dazu verwenden kann:



Vielleicht kann ich demnächst Erfahrungsberichte dazu abgeben wenn ich die Zeit gefunden habe die Tools mal zu testen.

Geschrieben von Peter Rehm

19.09.2006 um 21:02:48

Abgelegt in Verschiedenes

Tags für diesen Artikel: , ,

[PHP] String als Zipfile

Mit 2 Kommentaren

Wie oft habe ich bereits einen String in ein komprimiertes File schreiben wollen, das vollautomatisiert und zum Download für den User. Allerdings eignet sich dazu das gzip format nicht da die meisten Benutzer mit Windows arbeiten und man ein zusätzliches Tool installieren.

Daher benötigt man das PEAR Module Archive_Zip das hervorragend Zip Dateien erstellen kann. Allerdings benötige ich das Zip File nicht direkt, da ich das File nach dem Download nicht mehr benötige da es veraltet sein könnte. Daher habe ich mir eine Funktion gebaut, die auf Archive_Zip aufbaut, mit der ich das Problem erledigen kann.

Die Funktion stringtozip erstellt temporär das Archiv mit den gewünschten Dateinamen, und löscht danach alles wieder, um nur den String zurückzuliefern.

Aber sehet selbst!

CODE:
/**
* function to create an zip file from an string
* @param string $string content of the file
* @param string $filename name of the file includes the content
* @param string $zipdescription description in the zipfile
* @param string $tmpfolder path for the temporary files with an ending /
*/
function stringToZip($string,$filename,$zipdescription,$tmpfolder)
{
global $cfg;
$rand=rand();

if(!class_exists('Archive_Zip'))
{
// module archive_zip is not existing
return false;
}

if(!is_writable($tmpfolder))
{
// directory is not writeable
return false;
}

if(!file_exists($tmpfolder.$filename))
{
$int_filename=$tmpfolder.$filename;
} else {
$int_filename=$tmpfolder.$filename.'-'.$rand;
}

$fhandler=fopen($int_filename,'a');
fwrite($fhandler,$string);
fclose($fhandler);

$zipHandler=new Archive_Zip($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');
$zipHandler->create($int_filename,array('remove_all_path'=>true));

// unlink the file containing the string
unlink($int_filename);

// store the data and delete the temp file
$data=file($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');
unlink($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');

return join("\n",$data);
}


Viel Spaß!

Geschrieben von Peter Rehm

15.09.2006 um 16:17:50

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: ,

Multi List Drag & Drop - Part 2!

Mit 1 Kommentar

Mich hat es mal wieder gepackt, und ich hab das Multi List Package upgedated.
Wofür ein Urlaub doch gut ist :-)

Ich will es kurz und schmerzlos machen, hier findet ihr den alten Beitrag, mit allen wichtigen Informationen.

Allerdings ist das Package flexibler geworden, nachdem ich gedacht habe man sollte die Listen einfach erwitern können. Zusätzlich habe ich die addLoadEvent unterstützung eingebaut.

Update: Es gibt mal wieder eine erweiterung. Ab jetzt kann man die Class komfortabel selber erweitern und muss sich um die Updates nicht mehr sorgen. Man erzeugt eine angepasste Klasse die die sajax Klasse erweitert. In dieser Klasse werden alle Einstellungen getätigt, und man kann die update_db Funktion überschreiben, mit welcher die Daten geschrieben werden.

download - demo and simple documentation

Viel Spaß!

Geschrieben von Peter Rehm

01.09.2006 um 19:43:35

Abgelegt in Verschiedenes

Tags für diesen Artikel: , , ,

Mod Rewrite und die Sonderzeichen

Ohne Kommentare

Wer viel mit Mod Rewrite arbeitet hat meist mit einem Problem zu tun.

Namen, die Sonderzeichen enthalten, können zu Fehlern führen. Eine kleine Funktion kann dabei helfen, da ich nicht auf die umfangreichere Version zurückgreifen wollte, auf die mich Sebastian aufmerksam gemacht hat, Translit.
CODE:
<?php
/**
*    Clean Name prepares an String to be used in the mod rewrite
*    @param string $string string to clean
*    @return string clean string
*    @access public
*/
function cleanName($string)
{
$search=array('é','á','ó','í','ñ','Ä','ä','Ö','ö','Ü','ü','ß',' ','-','/');
$replace=array('e','a','o','í','n','Ae','ae','Oe','oe','Ue','ue','ss','','','_');
return str_replace($search,$replace,$string);
}
echo cleanName('Diäsüsß ißt éiñ Tásót');
?>


Diese Funktion ha bisher in den meisten kleinen Anwendungen gereicht, allerdings kann es gut sein dass man diese noch um ein paar Sonderzeichen erweitern muss.

Über ein Feedback würde ich mich freuen.

Geschrieben von Peter Rehm

16.08.2006 um 23:14:15

Abgelegt in Verschiedenes

Tags für diesen Artikel: , ,

Xdebug zum Performancetest in PHP

Ohne Kommentare

Es ist während der Entwicklung immer interessant zu sehen wie performant der Code ist, bzw. wie viele Funktionen gestartet werden.

Dies kann man alles mit xdebug einsehen. Xdebug lässt sich über PEAR sehr einfach installieren.

Achtung! Diese Installation beziegt sich auf ein OSX Betriebssystem mit Apache 1.x und dem zufolge xdebug 1.
Eventuelle Ähnlichkeiten mit anderen Plattformen sind vollkommen unbeabsichtig.
CODE:
pear install xdebug


Danacht muss nun Xdebug nur noch in der PHP Config vermerkt werden. Ich empfehle davor noch ein Verzeichnis anzulegen, in dem man den ganzen Krempel dann ablegen lässt.

CODE:
mkdir /xdebug/
sudo chmod -R 777 /xdebug/

Nun machen wir uns an das Bearbeiten der php Config

CODE:
;;xdebug
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
xdebug.auto_trace=1
xdebug.auto_profile=1
xdebug.profiler_enable=1
xdebug.output_dir="/xdebug/"


So werden autmatisch alle Seitenaufrufe geparst. Ist aber nicht zu empfehlen, da wenn man das mal vergisst und eine Woche an einem Projekt arbeitet ein dickes temporäres Verzeichnis entstehen kann.

Geschrieben von Peter Rehm

19.07.2006 um 16:08:09

Abgelegt in Verschiedenes

Tags für diesen Artikel: , ,

ADODB Table Prefix

Ohne Kommentare

Bei fast jedem Projekt arbeitet man mit Tabellen Prefixen, um das Projekt z.b. 2x in der gleichen Datenbank laufen zu lassen. Gestern habe ich angefangen mein Projekt auf ADOBD und dabei festgestellt dass es noch keine eingebaute Funktion für das Verwalten eines Prefixes gibt. Daher hab ich das nun auf meine Anforderungen angepasst.

Mein Prefix liegt in $cfg['tbl_prefix'].

Die Querys werden nun so aufgebaut ("SELECT * FROM ##daten").

Statt Execute nimmt man nun die neue Funktion pExecute.

Diese Funktion muss in die adodb.inc.php implementiert werden, ich hab diese in der aktuellen ADODB Version in Zeile 784 direkt vor Execute plaziert.

CODE:
/**
*    Function to Replace the Prefixes
*    After replacing it the SQL Statement will be passed to EXECUTE()
*    @param sql SQL statement to execute, ## will be replaced with the Prefix
*/
function &pExecute($sql)
{
global $cfg;
return $this->Execute(str_replace('##',$cfg['tbl_prefix'],$sql));
}

Geschrieben von Peter Rehm

28.06.2006 um 10:39:27

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: ,

Multi List Drag & Drop - Sajax!

Mit 2 Kommentaren

Als ich über die Seite von Tom Westcott gestolpert bin war mir klar, ich muss das in mein neues CMS einbinden. Ich hatte mir damals schon vorgestellt dass das für die Inhaltsstruktur oder für die Sidebar interessant sein könnte, aber ich war damals noch in der Planungsphase.

Als ich dann die Implementation in Serendipity die ich durch Garvin's SuperBlog entdeckt habe getestet habe, war mir klar, genau das will ich auch. Allerdings hat mir nur die AJAX Implementierung zugesagt, da ich ganz genau weiss da manche kunden bei so futuristischen Anwendungen sicher vergessen das abzuschicken. Daher muss das automatisch gemacht werden. Tom hat glücklicherweise auch gleich beide Methoden bereitgestellt.

Allerdings war der Code sehr verworren, und daher habe ich angefangen den Code neu aufzubauen, da ich vor allem im CMS das dann schon sauber einbauen wollte. Anstelle der umfangreicheren Implementation reicht nun folgendes:

CODE:
/**
* db settings
*/
$cfg['server']['host'] = "localhost"; // server
$cfg['server']['user'] = "root"; // dbuser
$cfg['server']['pass'] = ""; // password
$cfg['server']['db'] = "sajaxdemo"; // dbname

/**
*    start the connection
*/
$conn = mysql_connect ($cfg['server']['host'],
$cfg['server']['user'],
$cfg['server']['pass']);
$result = mysql_select_db ($cfg['server']['db'],$conn);

/**
*    include the sajax file
*/
include("sajax.php");


Danach muss noch der Pfad in der sajax Datei angepasst werden, dass das einbinden der styles und des JS auch funktioniert.

CODE:
var $sajax_path='thirdparty/sajax/';


Die Funktion update_db sollte dann auch an die Gegebenheiten angepasst werden. Die Funktion greift auf die global Datenbankverbindung zu.

Das Auslesen wird dann direkt in dem File gemacht in dem Sie die Liste anzeigen möchten.

Um dies zu vereinfachen habe ich eine Bespiel Datei mitgeliefert, in der Sie das alles sehen können. Dazu auch der passende SQL dump.

Beispielseite - Download
    Ich hoffe dieses Script findet irgendwo sinvollen Einsatz. Über Feedback würde ich mich freuen.

Geschrieben von Peter Rehm

20.06.2006 um 00:33:22

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: , ,

PHPThumb Fehler

Mit 1 Kommentar

phpthumb error

Zum Bilder verkleinern und skalieren wird sehr oft phpThumb verwedet was an sich auch toll ist, jedoch hat man oft das Problem, dass man eine Applikation lokal entwickelt und beim Hochladen gibt es dann einen Fehler.

Bei phpThumb kommt es relativ oft zu dem Fehler

Unknown image type identified by ?ph ( 0x3c 0x3f 0x70 0x68 ) in SourceImageToGD

Die ist sehr ärgerlich aber es gibt einen einfach Workaround

Man muss einfach folgende Zeilen in phpThumb/phpThumb.php entfernen:

CODE:
if (@$_SERVER['PATH_INFO']) {
$_SERVER['PHP_SELF'] = str_replace($_SERVER['PATH_INFO'], '', @$_SERVER['PHP_SELF']);</em></em>

<em><em>$args = explode(';', substr($_SERVER['PATH_INFO'], 1));
if (!empty($args)) {
$_GET['src'] = @$args[count($args) - 1];</em></em>

<em><em>}
if (eregi('^([0-9]*)x?([0-9]*)$', @$args[count($args) - 2], $matches)) {
$_GET['w'] = $matches[1];
$_GET['h'] = $matches[2];
}
for ($i = 0; $i < count($args) - 2; $i++) {
@list($key, $value) = explode('=', @$args[$i]);
if (substr($key, -2) == '[]') {
$_GET[substr($key, 0, -2)][] = $value;
} else {
$_GET[$key] = $value;
}
}
}


Danach sollte es gehen, mir ist vor allem das Problem bei meinem 1&1 Server aufgefallen, da es lokal meistens funktionierte.

Geschrieben von Peter Rehm

27.04.2006 um 14:39:57

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: ,

PHP4 & 5 im Shaker unter OSX

Ohne Kommentare

Eigentlich bin ich immer noch hin und hergerissen auf welcher PHP Version ich die Anwendeungen entwickeln soll.

PHP5 bringt schon tolle Features mit sich. Daher habe ich mich dazu durchgerungen nun endlich mal PHP5 für mich als Testplattform zu installieren. Ich kann wegen Kundenprojekten aber nicht auf PHP4 verzichten, daher habe ich beide Pakete nebeneinader installiert.

Dann habe ich ein Config File für PHP4 erstellt in /etc/httpd/httpd.php4.conf und das gleiche für PHP5 /etc/httpd/httpd.php5.conf
Für die Installation habe ich die Entropy.ch Packages verwendet.

Um aber nicht immer von Hand wechseln zu müssen hab ich ein kleines Shellscript gebastelt. Sind nur ein paar Zeilen.

CODE:
#!/bin/bash
if [[ "$1   " == 5 || "$1" == 4 ]]; then
VERSION=$1;
else
echo -n "Please choose between PHP4 and PHP5 (4/5)";
echo -e "";
fi

if [ "$VERSION" == 4 ]; then
sudo cp /etc/httpd/httpd.php4.conf /etc/httpd/httpd.conf;
echo "config updated to php4 - restarting Apache graceful..";
sudo apachectl graceful;

elif [ "$VERSION" == 5 ]; then
sudo cp /etc/httpd/httpd.php5.conf /etc/httpd/httpd.conf;
echo "config updated to php5 - restarting Apache graceful..";
sudo apachectl graceful;
fi

Geschrieben von Peter Rehm

11.02.2006 um 13:50:14

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: , ,

FCKedit Pt. II

Ohne Kommentare

Selbst das Update auf die 2.2 Version brachte keine Verbesserung.
Aber dafür eine entscheidende Erkenntnis:

Das wird alles verhunzt weil der HTML Code nicht komplett XHTML valid war.
Ist ja ein sinniger Grund.
Der Haken ist nur, dass quasi alles versaut wird was nicht 100% XHTML ist.
Und bei Bedienung durch Kunden kann alles mögliche passieren.

Und ich weiss wovon ich rede :-)

Ich bitte daher die OS-Gemeinde, behebt die Probleme.
Komisch ist auch, im IE gibt es das Problem, im FF quasi nicht.
Und wenn ich schon mecker, ICH WILL SAFARI SUPPORT!!

Geschrieben von Peter Rehm

19.01.2006 um 02:19:46

Abgelegt in PHP, Programmierung

Tags für diesen Artikel: , , ,

Easteregg in PHP

Ohne Kommentare

Sachen gibts...

Sogar die PHP Entwickler haben sich einen Spaß erlaubt und einen Easteregg in den Source eingebaut. Es ist so banal dass man damit immer noch viele Leute schokieren kann :-)

Gerade eben erhielt ich den Link

http://peter-rehm.de/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

und war schokiert was ich da sah. Ein Hundebild!!

Die Eastereggs funktionieren mit folgenden Strings:

CODE:
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000


Geschrieben von Peter Rehm

15.01.2006 um 18:29:20

Tags für diesen Artikel: ,