Installing MongoDB Binaries on Mac
and unzip.
sudo mkdir /usr/local/mongodb_data /var/log/mongodb
sudo chown -R root /usr/local/mongodb
sudo vi /usr/local/mongodb/mongod.conf
Insert the following content
dbpath = /usr/local/mongodb_data
# Only accept local connections
bind_ip = 127.0.0.1
Create a LaunchDaemon
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.mongodb.mongod</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/mongodb/bin/mongod</string>
<string>run</string>
<string>--config</string>
<string>/usr/local/mongodb/mongod.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/mongodb</string>
<key>StandardErrorPath</key>
<string>/var/log/mongodb/output.log</string>
<key>StandardOutPath</key>
<string>/var/log/mongodb/output.log</string>
</dict>
</plist>
Try it with http://localhost:28017
Compiling error regarding xcode select
Make sure that you have the Apple Command Line Tools from https://developer.apple.com/downloads/index.action?=command%20line%20tools installed. This should be necessary unless you want to develop OSX or iOS applications.
Then just execute this on the command line to set the default entry.
There you go...
Installation PEAR/PECL/autoconf/intl/icu auf Mac OSX Mountain Lion
- Install PECL & PEAR
sudo php install-pear-nozlib.phar
- Add to php.ini
extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20090626"
- Update pear channels
sudo pecl channel-update pecl.php.net
sudo pear upgrade-all
- Install ICU from http://site.icu-project.org/download/48#ICU4C-Download
cd icu/source/
./runConfigureICU MacOSX
make
sudo make install
If you get something linke this...
configure: error: in `/Users/peterrehm/Downloads/icu/source':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
./runConfigureICU: ./configure failed
you have to install the apple command line tools which you will find
under the following URL for the appropriate OS version like Mountain Lion.
then you should be able to install it..
If you have autoconfi missing go for that:
tar -xzvf autoconf-latest.tar.gz
cd autoconf-2.69/
Now you should add "extension=intl.so" to php.ini and restart apache. Here you go.
Anzeige der git branch in der Console (OSX/bash)
PATH=$PATH:/usr/local/git/bin:.
source /usr/local/git/contrib/completion/git-completion.bash
PS1='[\u@\h \w$(__git_ps1 " (%s)")]\$ '
Danach sieht der shell prompt wie folgt aus:
[peterrehm@tokyo-3 /www/scalc (master)]$
Dadurch wird nebenbei auch die completion hinzugefügt, zum Beispiel bei
der Auswahl der Branches mittels git branch
gängige PHP Fehler - Tipps & Tricks
und bei der Fehlersuche zu helfen. Dabei ist mit allerdings sehr schnell
aufgefallen dass einige grundlegende Unschönheiten zu finden sind.
Daher will ich anhand des mir zugesandten Codes einige Tipps zur PHP Entwicklung
geben.
register_globals
Ein immer wieder auftrendes Problem ist die register globals Geschichte,
da PHP einem lange Zeit die Freiheit ließ, auf die POST Variable 'test' auf
zwei Arten zuzugreifen. Entweder als $test, oder per $_POST['test'].
Nutzt man erstere Variante kann man sich nie sicher sein, woher der
Inhalt der Variablen eigentlich stammt, und man vergisst leicht einen
vielleicht gefährlichen Inhalt zu escapen. Sofern die Möglichkeit besteht
ist es sogar empfehlenswert register_globals auszuschalten. Aber man
sollte es sich zumindest immer angewöhnen, auf POST/GET/REQUEST variablen
immer mittels den dafür vorgesehenen superglobalen Arrays zuzugreifen.
SQL Injections
Eine große Gefahr stellen vor allem im Zusammenhang mit register_globals
die SQL Injections dar, über die nicht gewollter SQL Code eingeschleußt
werden kann. Um hier nicht auszuschweifen sollte man sich immer angewöhnen,
Inhalt der manipuliert sein kann, zu escapen. Eine einfach Möglichkeit
hierzu bietet mysql_real_escape_string(). Man sollte sich wenigstens
angewöhnen den Inhalt immer zu escapen. Es empfiehlt sich auch eine
eigene Funktion dafür zu nehmen, dass man später auch noch andere
Verfahren einsetzen könnte, indem man nur eine Funktion überarbeiten
muss. Hier ein Beispiel:
CODE:/**
* easy accesible handle to escape all db strings
* @param string $string string which should be escaped to be put into an sql statement
* @return string returns the escaped string
*/
function escapeDB($string)
{
global $run;
if(is_numeric($string))
{
return $string;
} else {
return $run['db']->qstr($string,get_magic_quotes_gpc());
}
}
Variablen
Man sollte Variablen immer klein schreiben, und Umlaute sollten nicht
eingesetzt werden. Es ist meist auch recht angenehm die äquivalente englische
Bezeichnung für Variablen zu verwenden. EIn unschönes Beispiel:
CODE:'$Arbeitsverhaeltnis', '$Kündigungsfrist', '$Sonstiges'
Fehlermeldungen
Fehlermeldungen sollte man am besten immer beherzigen. PHP kennt verschiedene
Modi, je nach "wichtigkeit" eines Fehlers. Meist werden die NOTICE's
ausgeblendet. Allerdings sind NOTICES oft auch recht hilfreich,
da man erkennt wo man z.B. eine noch nicht initialisierte Variable
verwendet. Es empfiehlt sich meistens alle Fehlermeldungen anzuzeigen.
Die macht man wie folgt:
CODE:error_reporting(E_ALL);
Vor allem gefährlich ist das manuelle Unterdrücken von Fehlermeldungen
mittels dem @ Operator. Diesen sollte man auch nicht einsetzen, da dadurch
die Fehlersuche oft erschwert sein kann.
Dies mal nur als kurze Zusammenfassung.
Performancetests / Profiling in C
Man compiliere sein Programm wie folgt:
Danach muss das Programm einmal ausgeführt werden
Danach kann man sich direkt die Profiling Informationen anzeigen lassen, in meinem Fall:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
91.9 1.13 1.13 1 1130.00 1130.00 _ins_sort [3]
2.4 1.16 0.03 ___sfvwrite [4]
1.6 1.18 0.02 2 10.00 10.00 _print_array [5]
1.6 1.20 0.02 _write [6]
0.8 1.21 0.01 ___vfprintf [7]
0.8 1.22 0.01 _localeconv_l [8]
0.8 1.23 0.01 _printf [9]
0.0 1.23 0.00 1 0.00 0.00 _create_random_array [39]
0.0 1.23 0.00 1 0.00 1150.00 _main [1]
Index by function name
[4] ___sfvwrite [3] _ins_sort [5] _print_array
[7] ___vfprintf [8] _localeconv_l [9] _printf
[39] _create_random_arra [1] _main [6] _write
malloc in C
Zur Erklärung:
Bei der Fehlermeldung
kommt man schnell zu einem Truschluss. Der Fehler befindet sich nicht in der Zeile 41
sondern liegt einfach an der Header Datei.
Damit sollte das Problem erledigt sein
KDebug (kdbg) unter Ubuntu
Debuggen von meinen C Übungen mit kdbg unter Ubuntu beschäftigt.
Angefangen mit dem Installieren von Ubuntu unter Parallels Desktop,
aber darauf will ich nicht näher eingehen. Wer das nicht kann ist schonmal
raus.
Nachdem Ubuntu installiert ist, geht es gleich weiter mit dem installieren
von kdbg. Dies ist allerdings nicht ganz so unkompliziert, zumindest unter
meinem System. Normal kann man kdbg über "Anwendungen" -> hinzufügen/entfernen
installieren, ging bei mir aber nicht
Nun die komplizierte Art & Weise über die Konsole.
Als erstes habe ich mich von der Bash entfernt, um gleich wieder die zsh
zur Verfügung zu haben
Dann machen wir einfach kurz eine root zsh Shell auf, um das alles zu installieren.
Ansonsten sollte man aber nicht auf einer root shell arbeiten.
Alternativ kann man sich auch kurz eine root Bash aufmachen.
Installieren kann man kdbg auch komfortabel über apt. Allerdings muss man die
sources.list dazu anpassen, die "RESTRICTED" Einträge entfernen.
Es sollte danach dann so a
deb http://de.archive.ubuntu.com/ubuntu/ edgy-updates main
deb http://security.ubuntu.com/ubuntu edgy-security main
Die deb-src einträge sind egal. Nun muss apt upgedated werden.
Nun wird kdbg mit allen benötigten Programmen installiert.
Nun kommt der spannendere Teil, der Einsatz von kdbg.
Also erstellen wir einfach ein C Programm und compilieren das.
z.B. folgendes Programm
Damit man das Programm debuggen kann, muss es zwingend mit dem Parameter -g
compiliert werden.
Kommt ein Fehler, dass z.b. die Headerdateien nicht gefunden werden können,
muss man ein Package nachinstallieren.
Nun sollte sich das Programm ohne Probleme compilieren lassen.
Nun kann man das Programm debuggen.
Nun kann man sich in den Debugger einarbeiten und z.B. mit [F5] das Programm ausführen.
MySQL Berechtigungen in Confixx
Hinweis für den Administrator dieses Blogs: Der Fehler kann durch fehlende
Index-Schlüssel der Datenbank verursacht werden. Auf MySQL-Systemen
muss der Datenbankbenutzer-Account in der Lage sein, Index-Schlüssel
zu erstellen und folgende Abfrage auszuführen:
CREATE FULLTEXT INDEX entry_idx on serendipity_entries (title,body,extended);
...
Der Index konnte auch nicht manuell erstellt werden, da dem Benutzer schlichtweg die Rechte dazu fehlen.
Dies ist eine Standardeinstellung des Verwaltungstools Confixx.
Dies ist in meinem Fall bei einem Managed Server sehr ärgerlich, und ich hab sofort den Support benachrichtigt, der meinte das kann man nicht umstellen.
Eine Lange Recherche im Internet brachte auch keien Erfolg, und ich nahm gleich Kontakt mit SW-Soft, dem Hersteller von Confixx auf. Von dem Support Team erhielt ich umgehend folgene Hilfestellungen:
../confixx/html/include/class.MysqlPermissions.php eingestellt werden.
Oder man kann die Berechtigungen manuell in der Datenbank 'mysql' setzten.
In diesem Fall muss man auch die Variable $restore_users_permissions in der
Datei confixx_main.conf auf '0' setzen. Sonst werden die Berechtigungen wieder
überschrieben.
Vielen Dank an das Support Team von Confixx und ich hoffe, dass mein Provider das nun auch so umsetzen kann!
Aufwachen beim Aufklappen verhindern
Der Tipp stammt von hier.
Stress Tests für Webentwickler
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.
[PHP] String als Zipfile
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!
* 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ß!
Mod Rewrite und die Sonderzeichen
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.
/**
* 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.
Xdebug zum Performancetest in PHP
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.
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.
sudo chmod -R 777 /xdebug/
Nun machen wir uns an das Bearbeiten der php Config
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.
IFrames mit variabler Höhe
Daher kann man sich nur mit JavaScript aushelfen. Dieses Javascript wird beim onLoad ausgeführt. onLoad kann nicht nur bei body Elementen sondern auch bei iframe Elementen verwendet werdenten verwendet. Allerdings kann Safari mit den onLoad Elementen nicht viel Anfangen, dies ist das Hauptproblem. Da kann man sich nur helfen, indem man in den body einen onload hinzufügt der die Größe speichert.
Das passende JavaScript dazu:
fix = 300; // fixe höhe
min = 100; //mindes höhe
max = 300; //max höhe
if(fix>max) return fix; // wenn fix größer als max => fix
if(fix>min && fix
if (window.innerHeight) {
h = window.innerHeight;
} else if (document.body && document.body.offsetHeight) {
h = document.body.offsetHeight;
}
if(h
if(h>max) return max;
return h;
}
function adjustIframe()
{
document.getElementById('iframe1').height=getIframeHeight1();
}
Danke an Alex für die "Inspiration"

