Phing: Remote Tasks Loggen

25. Februar 2011 in Allgemein von Leo

Was in lokalen Phing Tasks abläuft wird bekanntlich in der Konsole angezeigt. So weiss man auch gleich den Grund falls ein Task scheitert.

Hat man nun aber einen Remote Task, läuft dieser auf dem Server ohne das wir etwas mitbekommen. Scheitert ein Task wüssten wir nicht gleich genau wieso. Um dies nun aber zu Loggen, bietet Phing hier einen Parameter der beim Aufrufen mitgegeben werden kann.
Nehmen wir an wir machen z.B. ein PHP exec():

exec("phing testTask -logfile log.txt");

Nun wird alles was auf dem Server passiert in das Logfile “log.txt” geschrieben. Dies geschieht natürlich auch auf dem Server.

Natürlich funktioniert dies auch mit dem Phing exec Task:

<exec dir="/home/" command="phing testTask -logfile LOG.txt"  />

Nachtrag:
Mittlerweile habe ich endlich herausgefunden wie Remote Logs geloggt werden können, welche jedoch nicht mit exec ausgeführt werden. D.h. Phing wird nur temporär auf dem Remote Server sein und per PHP gestartet.

So funktionierts:

// ...
Phing::startup();
Phing::fire(array('-logfile', 'LOG.txt'));
Phing::shutdown();
// ..

Dies ist nur ein kurzer Auszug aus dem Script welches wir aufrufen um Phing auf dem Remote Server zu starten. Wie man aber sehen kann, wird dem “fire” ein Array mitgegeben, in welchem man alle Anweisungen welche wir vom exec kennen mitgeben kann. Diese Optionen findet ihr hier.

Subqueries in TYPO3 mit TypoScript

20. Januar 2011 in TYPO3 von Leo

In TYPO3 lassen sich per TypoScripts normale Subqueries bilden, wie man sie aus MySQL kennt. Das ganze lernte ich im Zusammenhang mit einem RSS Feed, welchen ich für einen Kunden erstellte. So musste ich mit einer ID welche ich zu beginn über eine Variable von RealURL erhielt in grossen mm_Tables nach nach weiteren ID’s suchen, mit welchen ich dann zum Ziel kam.

Für solche grosse Sprünge in Tabellen nutzten wir dann Subqueries, sozusagen Queries in Queries, welche bis ins unendliche verschachtelt werden können (Achtung Ladezeiten!).

elementxy = CONTENT
elementxy {
        # Die Tabelle die durchsucht wird
        table = tx_extension_unsere_tabelle
        select {
            andWhere {
                # Optional: Eine Variable welche wir mitbekommen (get)
                data = GP:tx_extension_pi1|showUid
                insertData = 1
                wrap = uid IN (SELECT uid_local FROM tx_extension_unsere_tabelle_auth_mm WHERE uid_foreign IN (SELECT uid_foreign FROM tx_extension_unsere_tabelle_head_mm WHERE uid_local = |))
            }
            # Der Sysfolder mit den Datensätzen
            pidInList = 1234
            orderBy = crdate DESC
            max = 15
        }

        renderObj = COA
        renderObj {
            # Das Feld welches vom SELECT ausgewählt wird
            field = title
            # Das Resultat wird gewrappt
            wrap = <item>|</item>
       }
}

Was wird also gemacht?
Zuerst geben wir die Tabelle an welche wir mit dem normalen SELECT auswählen, also SELECT … FROM . Welche Spalte wir ins SELECT werfen wird weiter unten im renderObj.field bestimmt, unser normales SELECT würde also so aussehen:

SELECT title FROM tx_extension_unsere_tabelle ...

Das ist natürlich noch nicht alles. Nach dem normalen SELECT geht es weiter mit dem andWhere aus unserem TypoScript Code. Dieses andWhere Statement hängt eigentlich nur ein WHERE an unseren bisherigen Code und wird dann mit dem Rest was im andWhere steht weitergeführt. Deshalb steht im andWhere auch nicht noch ein SELECT oder ähnlich am Anfang.

Nachdem unser Query mit den Subqueries gebildet wurde, wird mit pidInList die ID unseres Sysfolders angegeben, also der Sysfolder wo die Datensätze gespeichert sind, welche wir hier benötigen. OrderBy und Max sind normale SQL Statements, welche sicherlich jedem bekannt sind.

Danach wird unser Resultat gerendert und in den Wrap geschrieben (dort wo die Pipe “|” ist), wir können das ganze noch z.B. mit HTML Code wrappen.

TYPO3 und PHPUnit: Code Testen (+ Hello World)

5. August 2010 in TYPO3 von Leo

Das automatisierte Testen von Code wird immer wie beliebter. Deshalb habe ich diese Woche bei 4eyes die Aufgabe erhalten, mir das ganze mal anzusehen und gleich Tests in TYPO3 zu schreiben um eine Extension zu testen.

Anders als mit Selenium, wird hier jedoch direkt der (PHP) Code getestet, also bevor schon die fertigen Resultate da sind, testet man was zwischen Start und ende passiert. So kann man mit PHPUnit z.B. testen ob eine bestimmte Funktion im Code ein bestimmtes Resultat zurück liefert.

Nachdem ich die Funktionsweise dann auch verstanden habe und das Testen möglich war (nach ein paar Startschwierigkeiten), schrieb ich zuerst mal einen kleinen Hello World Test. Doch bevor wir zum Test kommen, zeige ich euch wie ihr alles richtig einrichtet.

Installation

Die Extension PHPUnit (extkey: phpunit) herunterladen und installieren. Hier findet ihr die Extension auf Typo3.org, klick.

Nach der Installation erstellt ihr in einer eurer Extensions einen Ordner namens “Tests”. Der Pfad wäre also:

typo3conf/ext/deineExtension/Tests

Nun erstellt ihr im gerade erstellten Ordner ein neues PHP File mit folgendem Namensschema:

tx-extKey_HelloWorld_testcase.php

Wichtig ist hierbei eigentlich nur das “_testcase” am ende, da dies PHPUnit sagt, dass es sich hier im ein Test File handelt (PHPUnit scannt alle ext Verzeichnise automatisch).

Nun füllen wir das PHP File mit dem standardmässig benötigten Code:

<?php
require_once 'PHPUnit/Framework.php';

class tx_extKey_HelloWorld_testcase extends tx_phpunit_testcase {

}

?>

Mit PHP chmod Rechte setzen (Dateien und Ordner)

30. April 2010 in PHP von Leo

Als ich kürzlich mit einem Freund an einem Projekt arbeitete, auf welchem später TYPO3 laufen wird, hatten wir mal wieder das Problem, dass ein Ordner welcher auch noch Dateien enthält nicht mehr vom FTP Server gelöscht werden konnte. Als das Problem erstmals vor einer Woche auftrat, konnten wir es lösen indem wir einfach einen anderen FTP Client (ich glaube es war SmartFTP) anstatt Filezilla nahmen. Dieser konnte alles löschen.

Doch nun lässt sich gar nichts mehr löschen. Die Rechte waren wenn ich mich besinne auf chmod 755, trotzdem machte weder eine Datei noch der Ordner einen wank.

Also schreib ich kurz ein kleines PHP Script, in welchem ich das ganze per PHP lösen versuchte (nein es funktionierte sogar!) :)

Das Script sah dann so aus:

<?php

chmod ("ordnerxy/.htaccess", 777);
chmod ("ordnerxy/.htaccess", "drwxrwxrwx");
chmod ("ordnerxy/.htaccess", 0777);

chmod ("ordnerxy", 777);
chmod ("ordnerxy", "drwxrwxrwx");
chmod ("ordnerxy", 0777);

echo 'ok';

?>

Im ersten abschnitt werden der Datei “.htaccess”, welche im Ordner “ordnerxy” liegt die rechte 777 gegeben. Im zweiten abschnitt werden die selben Rechte auch noch dem Ordner “ordnerxy” gegeben, da sich dieser ja auch nicht löschen liess. Eventuell reicht es sogar wenn man nur dem Ordner die nötigen Rechte gibt.
Um das Script zum laufen zu bringen müssen natürlich jeweils die Pfade angepasst werden, stets vom Script ausgegangen.
In unserem Beispiel hier würde das in etwa so aussehen:

/ordner1/ordnerxy/...

Dabei wäre das Script im Ordner “ordner1″.

Als Datei können übrigens auch andere Dateien mit anderen Dateiendungen angegeben werden.

Das Script muss einfach kurz im Browser aufgerufen werden. Mit dem “echo” am Schluss wird noch bestätigt dass man wirklich das Script geöffnet hat.

Erstellen von grösseren Emoticons in MSN

5. November 2009 in Allgemein, Internet, Software von Leo

Wer sich ein schönes Emoticon, also ein Smiley für MSN erstellt hat, oder eins importieren will, nervt sich wahrscheinlich darüber, dass die maximal grösse nur bei 19 x 19px liegt. Jedoch gibt es einen einfachen Trick um grössere Emoticons zu erstellen, die bis zu 40 x 40px gross sein können. Um dies zu erledigen müsst ihr wie folgt vorgehen. Nehmt euer Smiley und speichert es ins .gif Format ab. Das Smiley sollte jedoch nicht all zu gross sein (50 x 50px reichen). Nun müsst ihr euch das Programm “Microsoft GIF Animator” herunterladen (Link am ende des Artikels). Wenn ihr nun euer .gif habt, importiert ihr es in den GIF Animator (hineinziehen geht am schnellsten). Kopiert es 2 mal hinein, und macht danach im Tab “Animation” ein Häckchen unter “Looping” und “Repeat forever”. Nun wird MSN eine Animation vorgetäuscht, welche eigentlich aus den selben Bildern besteht und sie nie verändert. Nun könnt ihr das Smiley ganz normal in MSN Hinzufügen, und euch über das echt grosse Smiley freuen. Das einzig nervige ist hierbei jedoch, dass GIF nicht gerade des schönste Bildformat ist :-)

Java Programmieren Lernen mit MSN

7. Oktober 2009 in Java von Leo

Ja, auch dies ist möglich. Zwar nicht mit MSN direkt, sondern eher mit dem MSN Addon “MSN Plus!”. Für dieses kann man nämlich eigene Skripte erstellen, welche man dann in MSN benutzen kann. Für den Anfang kann man kleinere Skripte programmieren wie “Random Jokes” oder ähnliches. Das ganze wird in “.js” und “.xml” Dateien geschrieben. Das Hauptprogramm kommt in die “.js” Datei, welche den Namen des Skripts trägt. Dort findet (fast) alles statt. Die Skripts können alle mit Java geschrieben werden, der Vorteil ist dabei, dass auch ein Anfänger schnell die ersten Tricks raus hat und gerade bei MSN Plus Skripten schnell ein Resultat sieht. Natürlich bieten die Macher von MSN Plus eine Hilfe für Entwickler, so könnt ihr auf der offiziellen Seite eine Dokumentation – welche derzeitig leider nur auf englisch verfügbar ist – herunterladen. Diese erklärt euch wie alles Funktioniert, und zeigt auch einige Begriffe und Befehle in MSN Plus.