Archiv der Kategorie: Allgemein

Mein Beitrag zum Developers Shame Day

Mein Beitrag zum Developers Shame Day am 03.11.2010:

Oh, wie ich mich schäme, der Code ist von Oktober 2002, stammt aus einem Teil, der für ein Onlinerollenspiel vorgesehen war (damals gab es das Wort Browserspiel noch gar nicht – trotzdem wollte ich sowas bauen; leider war das Projekt damals viel zu groß für mich).

Im Großen und Ganzen habe ich allerdings grade dadurch, dass ich diesen Code geschrieben habe, davon genervt war, wieviel „Arbeit“ das immer wiederkehrende Tippen von < und > überdrüssig war und hiermit erste, zarte Schrittchen im Bereich PHP und Klassen getätigt habe überhaupt erst näher zu OOP in PHP 3+4 und Verwendung von Template Engines (direkt im Anschluss war es FastTemplate, kurz dannach Smarty … bis heute) … soviel zum Thema „sich weiterentwickeln durch schlechten Code“!

Hab sowas mal bei thedailywtf gesehen, hatte es aber in dem Moment doch schon zu sehr verdrängt, als dass da was geklingelt hätte.


class pageproducer
{
function getDoctypeInfo()
{
return "\n\n";
}

function getStartingTag($tagname)
{
return "<".$tagname.">\n";
}

function getEndingTag($tagname)
{
return "\n";
}

function getMetaTagEquiv($name,$content)
{
return "";
}

function getTitle($name)
{
return "".$name."";
}

function getCSS($cssurl)
{
return "";
}

function getHeader()
{
$header = $this->getMetaTagName( "keywords", "") . "\n";
$header .= $this->getMetaTagName( "description", "") . "\n";
$header .= $this->getMetaTagName( "robots", "") . "\n";
$header .= $this->getMetaTagName( "revisit-after", "") . "\n";
$header .= $this->getMetaTagEquiv( "Content-Type", "text/html; charset=iso-8859-1") . "\n";
$header .= $this->getMetaTagEquiv( "expires", "0") . "\n";
$header .= $this->getTitle(HEAD_NAME) . "\n";
$header .= $this->getCSS("rpg.css") . "\n";
return $header;
}

function getHeadSection()
{
$head = $this->getStartingTag("head");
$head .= $this->getHeader();
$head .= $this->getEndingTag("head");
return $head;
}


}

Ich persönlich finde das Konstrukt wirklich schlimm und oberpeinlich; ich komme also heute mit Papiertüte über dem Kopf zur Arbeit 😉 Aber was soll’s, mittlerweile sieht mein Code nicht mehr so aus; mittlerweile übergebe ich das Charset als Parameter #muhaha 😉

Mal ernsthaft: Ich finde die Idee des Ganzen „Developers Shame Day“ sehr gut. Gut für Newbies, dass auch wir „Pros“ mal „Newbies“ und „Script-Kiddies“ waren; gut für uns „Pros“, um unsere eigenen Wurzeln zu reflektieren und nicht zu vergessen.

2 Jahre Blogjubiläum

Heute ist Jubiläum: Mein Blog – dieses Blog – gibt es nun genau 2 Jahre. Zumindest ist das erste Posting so alt. Es handelt vom Suchfeld des Firefox und wie man damit direkt bei php.net nach Funktionen usw. suchen kann. Seitdem kamen zuerst nur sporadisch neue Beiträge und ich musste mich auch erstmal an das „neue“ Medium Blog gewöhnen.

Mittlerweile habe ich das ganze besser im Griff, poste auch ab und zu mal was interessantes und ich hoffe, das ein oder andere Posting konnte euch auch mal helfen.

Zukünftig möchte ich natürlich noch mehr posten, vor allen Dingen natürlich mehr Code-Sachen. Schauen wir mal, wer mich ein wenig kennt, der weiß, dass ich wirklich nicht viel Zeit habe. Aber ich versuche, nicht ungeduldig werden 😉

So, jetzt habe ich euch genug von eurem Zeug abgehalten; los, los, wieder zurück an die Arbeit 😉

Daten verteilt bearbeiten

Ich muss mal eine Lanze brechen für den Cloud-Computing Dienst Dropbox.

Meine Situation derzeit: Ich stehe früh auf (4:30 Uhr), wecke ab 6 die Kinder, bringe die bis halb 8 in den KiGa, versuche bis 8 auf der Arbeit zu sein (was nicht immer hundertprozentig funktioniert), arbeite dann und versuche, bis 16:30 wieder zu Hause zu sein, “Kinderdienst” bis die ins Bett gehen. Bis die dann schlafen und ruhe einkehrt, kann es schonmal 20 Uhr werden, dannach steht dann das Studium an, was dann schon bis Mitternacht gehen kann. Und am nächsten Tag wieder von vorn.

*puh* Da bleibt nicht viel Zeit, um vergessene Dinge zu beschaffen. Warum erzähle ich das?

Okay, jeder, der schonmal studiert hat oder studiert kennt das: Man hat permanent das Gefühl, was nicht gemacht zu haben. Oder man bekommt plötzlich die Erkenntnis, dass an der fertig bearbeiteten Einsendeaufgabe doch noch ein Fehler ist. Nur leider liegt die Datei zuhause auf dem Rechner, die Erkentnis kommt aber auf der Arbeit. Dumm. Oder?

Genau dafür habe ich Dropbox. Dieser Dienst bietet einem im Free-Account Modus 2 GB Platz im Netz, auf die man zugreifen kann. Besonderes “Schmankerl” ist das Desktop-Tool von Dropbox. Installiert man dieses, bekommt man ein “Dropzone” genanntes Verzeichnis und ein Tray-Icon (man merkt, ich arbeite auf Windows, das Tool gibt es aber auch für Mac und Linux). Legt man nun Dateien oder Ordner in diesem VZ ab, so synchronisiert das Programm diese automatisch mit meinem Account. Die neueste Fassung wird automatisch geladen.

Das ist toll, denn nun kann ich meine Einsendeaufgaben zuhause bearbeiten und speichern. Diese liegen in der Dropzone. Von der Arbeit aus kann ich diese abrufen, ändern und hochladen (am einfachsten natürlich auch via Dropzone) und bin immer auf dem aktuellsten Stand. Gleiches gilt für Quelltexte, die mensch im Info-Studium ja auch schreiben muss. Alles liegt auf vielen Rechnern, vor allem zentral “in der Cloud”.

Und auch, wenn mein INet mal nicht läuft, die Dateien selbst liegen ja auf meiner Festplatte, ich kann weitermachen. Es gibt durchaus auch Dienste, die stellen das ganze als Netzlaufwerk zur Verfügung, dieses wäre ohne INet nicht erreichbar – und das wäre in meinem Fall “tödlich”.

Also, auch wenn manch einer nun “Werbung” schreit: Ich finde Dropbox gut. Und wer möchte, bekommt bei der Anmeldung über meinen Link nochmal 250 MB mehr.

Dropbox Homepage: https://www.dropbox.com/referrals/NTE2MzgyNDk

Refactoring – Alter Code im neuen Kleid … nicht nur für PHP

Grade in einem Code gefunden, der Aufruf der Funktion ‘getSession()’. Und nun mal die Preisfrage an alle PHP-Pro’s: Wieviel Code davon muss wirklich sein?
Aber erstmal der Originalcode:

function getSession(){
  $akt_timestamp = getTimestamp();
  $ses_timestamp = $_SESSION[getSession_Timeout()];
  if($akt_timestamp > $ses_timestamp){
    return false;
  }
else{
    if($akt_timestamp < $ses_timestamp){
      return true;
    }
  }
}
function getTimestamp() {
  return time();
}
function getSession_Timeout(){ return „usrTimeout“; }

*wow* Das sind 3 Funktionen, die ineinandergreifen, was?
Und nun – nochmal – die Preisfrage: Wieviel Code davon muss sein?
Ich behaupte: Nicht so viel, wie oben steht.
Beweis? Ich refaktorisiere den Code oder neudenglisch: Ich mache refactoring! (Ich red’ da lieber deutsch, aber jeder wie er/sie will).
Betrachten wir die Anforderungen:

  • beim Aufruf der Funktion getSession() wird eine Rückgabe vom Typ Boolean erwartet, dies sollten wir beachten.
  • Vereinfacht wird das refactoring (hier finde ich das passend) dadurch, dass es keine Übergabeparameter an die Funktion gibt.

So, die Hülle der Funktion steht, nun zum Inhalt.
Was macht die Funktion eigentlich?

  • Sie legt eine lokale Variable an, in der die aktuelle Zeit gespeichert wird.
  • Sie legt eine lokale Variable an, in der ein Wert aus der aktuellen Session gespeichert wird.
  • Wenn die aktuelle Zeit größer ist als der Wert der Session, gibt die Funktion false zurück.
  • Ist die aktuelle Zeit kleiner als der Wert der Session, dann gibt die Funktion true zurück.
  • Hier schon der erste Fehler: Was ist, wenn beide Werte gleich sind? Dieser Fall wird nicht berücksichtigt.

Nun das refactoring:

  1. Die Funktion getTimestamp() wird in der Funktion getSession() durch den Aufruf von time() ersetzt, somit fällt diese Funktion weg.
  2. Die Funktion getSession_Timeout() wird in der Funktion getSession() durch die Rückgabe von getSession_Timeout() ersetzt, somit fällt auch diese Funktion weg.
  3. Ziel der Funktion ist es, ein true oder false bei o.a. Bedingungen zurückzugeben.

Während unseres Refactorings verbessern wir auch gleich die Funktion der Funktion (*g*) und legen auch gleich fest, was passieren soll:

  • Ist die aktuelle Zeit größer wie der Wert in der Session, dann gibt die Funktion true zurück, sonst false.

Klingt einfach? Ist es auch.
Verkürzt man nun sukzessive die if…else Schleife und bedenkt, dass man die beiden lokalen Variablen nicht braucht und ersetzt diese mit ihren Entsprechungen (time() und Session-Wert),  so erhält man folgende Funktion:

function getSession()
{
  return (time() < $_SESSION[‚usrTimeout‘]);
}

Kurz, knackig und präzise. Diese Funktion erfüllt alle Anforderungen (und übererfüllt sogar diese, in dem es die alte Funktion um den Bereich “Zeit ist gleich Sessionwert” erweitert).

Für meine Behauptung oben auf die Frage “Wieviel Code davon ist nötig” würde ich nun sagen: q.e.d.

So, das war ein kleiner Ausflug in die Welt des Refactoring.
Ich hoffe, ihr habt alle was gelernt …

Mit Putty per Doppelklick direkt zum Zielserver

Tja, wer kennt das nicht. Putty auf, richtige Verbindung raussuchen, Username eintippen, an das richtige Passwort erinnern und so weiter und so fort.

Wenn man, wie ich, mit vielen verschiedenen Servern arbeiten muss, wäre man ja über jede Erleichterung dankbar. Für Putty habe ich so eine Arbeitserleichterung nun gefunden.

Also, zunächst stellt man sich in Putty alles für den Server so ein, wie gewohnt, sprich, Serveradresse eingeben, Farben und Größe des Fenstern bestimmen und so weiter.

Nun gibt man dem ganzen einen netten Namen (in diesem Beispiel nennen wir den Rechner “Hades”).

Nun erstellt man sich (zum Beispiel auf dem Desktop) eine Verknüpfung Putty. Diese Verknüpfung editiert man nun und stellt (bei Windows) unter “Ziel” das ganze so ein.

C:\Programme\PUTTY\putty.exe -load „Hades“

Nun wird beim doppelklick schonmal der entsprechende Server ausgewählt und man kann direkt mit dem eintippen von Username und Passwort weitermachen.

Aber da Entwickler bekanntermnaßen ein recht faules optimierfreudiges Volk sind, kann man diesen Arbeitsaufwand auch noch minimieren.

Wir ergänzen das “Ziel” also noch um mindestens 2, maximal 3 Einträge, diese sind

  • ssh
  • l
  • pw

“ssh” gibt den Verbindungstypen vor, “l” den Usernamen und “pw” das Passwort. Die Optionen “l” und “pw” setzen einander voraus (“pw” allein geht nicht) und beide setzen die Option “ssh” vorraus (ohne die geht nix).

Also, wer sich mit Putty zu einem bestimmen Zielserver (zum Beispiel dem SVN oder CVS Server) verbinden will und dabei _nur_ das Passwort eintippen möchte, der schreibt sowas:

C:\Programme\PUTTY\putty.exe -load „Hades“ –ssh –l USERNAME

Den Usernamen müsst ihr schon richtig reinschreiben.

Soll die Verbindung sofort und komplett und ohne weitere Angaben aufgebaut werden, dann macht ihr das so:

C:\Programme\PUTTY\putty.exe -load „Colin (SVN)“ -ssh -l USERNAME -pw PASSWORD

Auch hier: Passwort und Username noch eintragen, dann kann es ganz leicht per Doppelklick losgehen.

Erleichtert einem wirklich etwas die Arbeit, auch wenn es sich empfiehlt, die “pw” Option nicht zu nutzen. Man spart sich das (r)aussuchen des richtigen Servers und den Usernamen, braucht also nur noch das Passwort.

Viel Spaß …

PHP Scripte und die Rechtevergabe

Gestern hatte ich ein wirklich interessanten Fall. Ich sollte ein paar kleinere Fehler aus einer bestehenden – und laufenden – PHP-Datei ausmerzen. Gemacht, neue Datei hochgeladen und siehe da: „500 Internal Server Error“. Der absolute Supergau auf einem Live-System.
Die Lösung war dann doch seltsamer wie ich dachte und ist hier nach zu lesen: Techcrawler – PHP – PHP Scipte und die Rechte der Dateien