Jun 23

Heute melde ich mich mal mit einem ausführlichen Essay zum Thema PHP-Entwicklung.

Vor kurzem stand ich vor der Aufgabe, für einen Kunden Facebook in dessen CMS zu integrieren. Mittels der Facebook-API ist das auch relativ komfortabel. Mal abgesehen davon, daß selbst auf developers.facebook.com verschiedene PHP-APIKits herumschwirren und dort widersprüchliche Anweisungen gegeben werden, ist es dennoch recht schnell schaffbar, eine komplexere Facebook-App zu schreiben.

Bei mir war jedoch die Anforderung gegeben, daß die Applikation zeitgesteuert Daten auf Facebook veröffentlichen können sollte. Asynchron, ohne jegliche Benutzerinteraktion. Das entwickelte sich schleunigst zu einem Problem. Denn bevor die Facebook-API die Arbeit aufnimmt, verlangt sie ein Facebook-Login-Cookie, das nur begrenzt haltbar ist.

Alle meine Versuche, dieses Cookie zu faken scheiterten an einer UID, die Facebook erst nach einer Browser-Anmeldung herausrückt. Im Netz fand ich diverse HowTo’s, wie man das Login curlt und danach ebenfalls via curl seinen Status updaten kann. Aber damit wars das auch schon. Kein Löschen möglich, keine Links posten, Notizen, etc. bla. Und ich wollte ja die volle API-Funktionalität nutzen können.

Also habe ich die cURL-Idee ein wenig modifiziert:

Facebook checkt den Login mit der API-Methode $fb->require_login($permission); – Ist der User nicht bereits in der aktuellen Browser-Session angemeldet, gibts einen Redirect zur “Ja, diese App darf auf meine Daten zugreifen”-Seite und im Anschluß erst einen Redirect zurück zur App, zusammen mit dem begehrten Auth Token. Was an sich schonmal schlecht ist, denn das CMS des Kunden liegt in dessen Intranet, nix mit externer Erreichbarkeit. Mal abgesehen davon, daß das Script ja zeitgesteuert per Cron laufen soll.

Anstelle des Facebook-eigenen Redirects lasse ich mir das API-Kit die entsprechende URL erstellen und curle diese Login-Seite. Dort parse ich alle relevanten Parameter und übergebe sie dem Login-Formular wieder, zusammen mit meinem Benutzernamen und Passwort. Den Redirect fange ich ab und werte statt dessen die zurückgegebenen Header aus. Dort steht nämlich praktischerweise der Auth Token direkt in der zweiten Redirect-URL.

Weiterlesen »

Jun 22

Ähem. Gerade beim SVN-Commit den folgenden Kommentar geschrieben:

* facebook support added
* flickr category support added (MISSING: upload whole cats)

Beim Klick auf “ok” kams mir dann… Scheiß-Abkürzerei. :D

So, Fire Evening nu!

Sep 16

Ich soll für einen Kunden die Wartung und ggfs. ein komplettes Code-Refactoring für ein paar Tools übernehmen. Meine erste Analyse für den Kunden beginnt wie folgt:

  • die Tools sind uralt, historisch gewachsen und für jede gibt es einen anderen Ansprechpartner, aber keiner kennt sich mit allen aus.
  • alle Apps sind in mindestens einem der folgenden Punkte angreifbar:
    - SQL-Injection
    - XSS
    - Session Spoofing
    - Variablen-Manipulation

WTF?!

Jul 03

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

WTF..?!

Dez 10

Ein Kunde hat hier ein interessantes DB-Konstrukt in Verwendung. Anstatt in einer SQL-Datenbank viele kleine Relation-Tables zu bauen, hat er einen nur einen einzigen großen, in dem sämtliche Relationen abgebildet sind (hatte ich das nicht irgendwo schonmal gesehen..?). Die betroffenen Tabellen/Kategorien stehen in diesem Table gleich mit drin.

Der Vorteil: nur eine Tabelle, die voll indiziert permanent im Speicher ist. Sau-performant. Bis zum break-even-point in Sachen Tabellengröße. Den hat der Kunde (trotz heftigen Datenaufkommens) bislang noch nicht erreicht.

Der Nachteil, zumindest am Modell in der vorliegenden Form: in den zugehörigen Tabellen brauchtes für jede Relation ein eigenes Feld.

Das könnte man auch besser lösen. Ist zum Glück nicht mein Job. Der ist es, ein komplett neues Datenmodell zu entwickeln. Juhu!

Sep 10
if (
($company != ” && !$company) ||
($lastname != ” && !$lastname) ||
($tags != ” && !$tags) ||
($email != ” && !$email) ||
($city != ” && !$city)
) {
// resetting namespace if search
$namespace = new Zend_Session_Namespace(‘contact’);
$namespace->list = array();
}

HÄÄÄÄÄH?!

Sep 04
// replace some spooky linebreaks
$this->messagePlain = preg_replace(“/[\r\n]+/”, “\n”, $this->messagePlain);
$this->messageHtml = preg_replace(“/[\r\n]+/”, “\n”, $this->messageHtml);
$this->messagePlain = str_replace(“\n\n”, “\n”, $this->messagePlain);
$this->messageHtml = str_replace(“\n\n”, “\n”, $this->messageHtml);
Aug 25
#content table .tabCol1,
#content table .tabCol3,
#content table .tabCol5,
#content table .tabCol7,
#content table .tabCol9 {
background:#fff;
}
#content table .tabCol2,
#content table .tabCol4,
#content table .tabCol6,
#content table .tabCol8,
#content table .tabCol10 {
background:#f6f6f6;
}

Wtf..?! Was mit cyclen? tabCol1 und tabCol2?? Und wenn ich mehr als 10 Spalten brauche?!? Herr, schmeiß (Entwickler-)Logik vom Himmel!

Nachtrag:
Habe soeben den Counterpart gefunden.

<table cellspacing=”0″ width=”100%”>
<colgroup>
<col width=”5%” class=”tabCol1″ />
<col width=”18%” class=”tabCol1″ />
<col width=”17%” class=”tabCol2″ />
<col width=”20%” class=”tabCol3″ />
<col width=”15%” class=”tabCol4″ />
<col width=”18%” class=”tabCol5″ />
<col width=”7%” class=”tabCol6″ />
</colgroup>
Aug 14

…aus der Mail eines Kunden:

(Kd.)
> > Helfen Sie mir mal auf die Sprünge

(demScroob)
> macht z.B.
> array(
> ‘environment0′ => ‘contact/company/klitsche:demHerrnXseinLaden’,
> );

(Kd.)
Das “company/klitsche” habe ich nicht überlesen…

Aug 06
print “fehlerli ” . __CLASS__;
Mai 21


5. Timm, du hast das echt geil programmiert, was ist dein Geheimnis?
Die innere Einstellung.

Apr 29

<!!– Tisch Subhome-Seite

Autor: Karl Ebert
Bearbeiter: Karl Ebert
Stand: 23.03.2000
Bearbeiter: Hans Czerny
Stand: 10.05.2001

–>

…und ich darf an sowas rumdoktern! (puke)

Apr 24

$string=str_replace(“&”,”",$string);
$string=str_replace(“&”,”",$string);

Gute Idee. Aber ich hätte die beiden Zeilen mal vertauscht…