Tuesday, August 27, 2013

Offtopic: Mein Wort zum Dienstag...


Raucher sind egoistische Schweine!

Den ganzen Tag über muss ich unfreiwillig das Gift einatmen. Von Morgens bis Abends! Da kommt mir das kalte Kotzen!

Wenn ich mal das Fenster aufmachen möchte kommt mir nichts anderes als der giftige Dunst entgegen. Und wenn man doch mal kurz frische Luft hat, ist das nicht von Dauer und wie eine tickende Zeitbombe - nur ohne Restanzeige - und eine Frage der Zeit wann mir wieder eine Körperverletzung angetan wird!

Als Nichtraucher zu leben ist unmöglich! Auf offener Straße, am Bahnhof, im Büro überall werde ich unfreiwillig dazu gezwungen zu rauchen.

Meine Frage an die Raucher: Wie würdet ihr das finden wenn ich euch den ganzen Tag über unfreiwillig kleine Dosen Alkohol ins Blut spritzen würde? Scheiße oder? Ihr wärt die ganze Zeit benommen, könntet nicht Auto fahren und hättet früher oder später Probleme mit eurer Leber bzw. Gesundheit!


Aber am liebsten würde ich jedem Egoisten für jede Belästigung einen Eimer Kuhscheiße über den Kopf leeren!

Wie ihr euch verhalten würdet? Ihr würdet mich wegen Körperverletzung anzeigen. Mein Problem ist nur, dass ich euch deswegen nicht anzeigen kann, weil der Staat sich an euch bereichert und deswegen niemals ein Gesetz entwerfen würde um dies zu unterbinden und das OBWOHL es MEIN RECHT ist nicht ständig zugequalmt zu werden...

Schon mal darüber nachgedacht? Wer als Raucher eine Ignoranz gegen sich selbst hinsichtlich seiner Gesundheit walten lässt auf Grund seines Suchtverhaltens, ist mir das egal, aber nicht wenn sich die gnadenlose Ignoranz und Egoismus auf mich überträgt!

Zum Schluss noch ein hübsches Video...


Einen genüsslichen Tag noch!

Tuesday, April 30, 2013

Doppelte DIRECTORY_SEPARATORS entfernen.

Weil ich als RegEx erfahrener schon oft danach gefragt worden bin, wie man am saubersten mehrfache Separatoren hintereinander entfernen kann, hier ein kleiner Schnippsel.

$ds = DIRECTORY_SEPARATOR;
$source = preg_replace( '~('.$ds.')\1+~', '$1', $file );

Tuesday, April 23, 2013

Java SUN 1.6 auf Ubuntu 12.04 für PhpStorm installieren

Bevor ich das selbst noch einige male selbst "rausfinden" muss, halte ich es hier und jetzt im Blog fest.

Download: https://docs.google.com/file/d/0B5SF2pfUfemVNHdpUnh2bjJ0ME0/edit

unzip sunJdk1.6.zip
cd sunJdk1.6
sh install.sh

und (wann immer möglich )

"/usr/lib/jvm/jdk1.6.0_38/bin/java"

in der Menüführung auswählen.

PhpStorm starten und happy sein.

Was war passiert?
Ich hatte das Problem, dass meine Windows-Fenster sich in allen Himmelsrichtungen geöffnet hatten. Bei der Autovervollständigung bekam ich dieses PopUp niemals in Sichtweite, was natürlich gar nicht geht. Das lag daran, dass open JDK installiert war (default). Unterstützt wird einzig und allein Sun JDK 1.6. OpenJDK wird nicht unterstützt und kann wie man sieht ziemlich hässliche Side-Effects haben.

Wednesday, January 30, 2013

MySQL - utf8_general_ci und 'ß'

Heute habe ich mir in meinem Framework einen Wolf gesucht, da ich der Annahme war, ein Encoding-Bug hätte sich irgendwo eingenistet.

Was war passiert? Ich wollte zwei Datensätze über einen 3-Spalten-Primaray-Key in der Datenbank hinzufügen.

Der sah dann so aus:

array(3) {
  [0]=>
  string(13) "`char` = 's'"
  [1]=>
  string(12) "`number` = 0"
  [2]=>
  string(12) "`userId` = 1"
}

und

array(3) {
  [0]=>
  string(13) "`char` = 'ß'"
  [1]=>
  string(12) "`number` = 0"
  [2]=>
  string(12) "`userId` = 1"
}

Der erste Datensatz lief ohne Probleme flüssig und sauber in die Datenbank. Der zweite, wurde aber niemals hinzugefügt.

Meine Applikationslogik hatte beim 2. Insert zuvor geprüft, ob der Datensatz schon vorhanden war. Und ja, der war da. Aber nicht etwa, weil ein Bug im Code existiert, sondern weil mysql bei der Collation uft8_general_ci ein bösen Encoding-Bug hat. (Seit Jahren...)

Wer das bei sich überprüfen will, kann folgendes ausführen:

SELECT 's' = 'ß' COLLATE utf8_general_ci;
SELECT 's' = 'ß' COLLATE utf8_unicode_ci;
Man wird staunen, was beim ersten Select für ein Ergebnis sich präsentiert. Also habe ich gezwungenermaßen in einem Sonderfall die Spalten-Collation auf utf8_unicode_ci geändert.

Mehr Details gibts auf MySQL: http://bugs.mysql.com/bug.php?id=27877

EDIT: Okay, von Bug kann man wohl nicht reden, aber von extrem verwirrend. Siehe: http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci

Monday, December 17, 2012

call_user_func_array with constructor

Hast Du jemals versucht eine Klasse mit dynamischen Konstruktor und Methoden-Parameter zu laden?

Wie zum Beispiel:
$className = 'MyClass';
$constructorParams = array('a', 'b', 'c');
$methodName = 'run';
$methodParams = array('x', 'y', 'z');
Wie würde man vorgehen? Der erste Gedanke endet wahrscheinlich so ähnlich:
$class = new $className();
$result = $class->$methodName();

Und hier fängt das Problem an. Die Parameter sind nicht übergeben und es besteht so keine Möglichkeit das zu tun.

Die Lösung für dieses Problem ist eine Kombination aus der Reflection-Klasse und dem user_call_func_array Aufruf.
$rc = new ReflectionClass($className);
if (null !== $rc->getConstructor()) {
$realClass = $rc->newInstanceArgs($constructorParams);
}
else {
$realClass = $rc->newInstance();
}
$result = call_user_func_array(array(
$realClass,
$methodName
), $methodParams);


Sunday, December 16, 2012

SAPRFC PHP 5.4


You have PHP 5.4 and SAPRFC doesn't work anymore? 

Since PHP 5.4 zend has changed their source code. If you want to compile SAPRFC again, you will get many failures. That means, your compile will fail completely.

But I wouldn't writing this blog post without that I would have known the solution!


First

Search the file "saprfc.c" by following command.


cd /; sudo find | grep "saprfc\.c"

Second

Open the file with "nano", "vim" or similars. Then goto line 47 and change:


"function_entry" to "zend_function_entry"

That's all! Now, you are able to compile SAPRFC again. Although with grumble.

I hope this is helpful for you.

Best practices to write php code

Today I will show you a few tricks how to write good php code. If you follow these tricks, your code is easy to read and easier to maintain.

1. The boy scout rule
2. Typehinting
3. Comment rules
4. Distinctive mark for crap
5. How should I begin to refactor?
6. KISS

The boy scout rule

The Boy Scouts have a rule: "Always leave the campground cleaner than you found it." If you find a mess on the ground, you clean it up regardless of who might have made the mess. 

That is the best approach. I can confirm this from years of experience. For more information visit the following link. 


Typehinting

Use typehinting whenever it is possible! PHP supports objects and the array type. For an example take a look at the manual. 


This have an advantage too. Your IDE knows then which class is assigned to the function variable! Your IDE does not support  a correct autocompletion? Then try out PhpStorm.


Comment rules

  • Write your name on each comment for feedback
  • Mark functions that no longer to be used as deprecated. Use the @deprecated tag, explain why and enter the right name of the function class.
  • Describe your functions only when they do "unexpected" or confusing. 
  • Prefers to invest time for a meaningful and clear identification name of the function. It keeps comments shorter.
  • Write always phpDocs! PhpStorm can do it for you quickly!

Distinctive mark for crap

  • A function has more then 6 parameters
    • Solution: Revise your design or use bit-flags
  • Optional parameters are not in last position
  • You use hard coded strings or numbers in switches or if-conditions
    • Solution: Use speeking class constants
    • Advantage: You can change them in one place and search for it easier
  • Code is repeating itself similar or equal
    • Solution: Summarize it into one function
    • Advantage: You need only maintain code in one place. Imagine if you had the code 4 timtes in a file. Then you might have to fix a bug 4 times.
  • Your code of the function or class is very long
    • Solution: Make it shorter into more functions or classes

How should I begin to refactor?

  1. Try to understand the logic. What is the point of this class or this function?
  2. Complete order. Give classes, variables and functions useful names speaking for themselves.
  3. Reduce duplicate code. Summarize them together to a central location.
  4. Looking for distinctive mark for crap
  5. Now is the time to think about whether this is the right architecture. Should I choose a more suitable design pattern?

KISS

Yes KISS! If you want to build a castle, then first build a great tower and expanding gradually. 

Finally, a well-intentioned advice

Just write code which you really need! Everything else is useless and a waste of time and possibly expensive.