Apache Ant: Ja/nein-Dialog

Apache kennt von haus aus nur Input Dialoge (korrigiert mich), und damit kann man natürlich “j”/”n”-Eingaben bauen (siehe Examples).  Schöner ist aber ein richtiger Ja/Nein-Dialog, wie Javascripts confirm. Außerdem gibt es if/else nur mit Ant contrib, das nicht zwingend überall installiert ist. Bitte nennt mir eine schönere Lösung als die folgende, aber damit geht’s – Confirm-Dialoge und if/else-Verzweigung abhängig von der User-Eingabe:

Die Targets “setURLs” und “setURLsAndProxy” werden nur abhängig von ${useProxy} ausgeführt, bzw nicht ausgeführt (if/unless).

Apache Ant: antcall für fileset

Dateien lassen sich in Ant (auch rekursiv) mit fileset finden. Allerdings kann man mit Bordmitteln nicht pro gefundenem File einen antcall absetzen. Das Internet schlägt Ant-Contrib vor, da gibt es “for” und “foreach”, aber das zum Laufen zu bekommen bin ich gerade zu blöd. Warum liefern die ihr ant-contrib-<version>.jar nicht mit aus??

Egal. Was mit Bordmitteln geht, ist Javascript (Danke, Björn!). Dann kann man Dateien mit JS auslesen, und an antcall übergeben. Zusammen sieht das so aus:

Validation in Eclipse [UPDATE]

Wer JS-Error angezeigt bekommt, obwohl er schon sämtliche Validatoren deaktiviert hat, der gehe zu

Projekt Einstellungen -> JavaScript -> Include Path -> Source

und gebe unter “Included” ein “_” ein (einfach damit da was steht), unter “Exluded” gebe man “.*” an (quasi via).

Ein

invalid content was found starting with element…

für WSDLs löst man angeblich mit dem Entfernen des Häkchens unter

Eclipse Einstellungen -> XML -> XML Files -> Validation -> Honour all XML schema locations

…bei mir hat das geholfen, allerdings kommen die Fehler auch nicht zurück, wenn ich das Häkchen wieder setze. Eclipse halt. Und: Ja, ich finde es auch komisch, dass hier offenbar XMLs und WSDLs vermischt werden 🙂

Build-File- (Ant-) Probleme lassen sich über

Einstellungen -> Ant -> Editor -> Problems

justieren

Ein

Errors occurred during the build.
Errors running builder ‘JavaScript Validator’ on project ‘some-project’.
java.lang.NullPointerException

lässt sich in Project->Properties->Builders unter “Javascript Validator” deaktivieren.

tbc

EaselJS: Lift-off und OOP [UPDATE]

Also zuerst mal sollte diese EaselJS-Geschichte nun nicht mehr nur auf der Startseite funktionieren – mea culpa!

Was EaselJS für mich so richtig interessant macht, ist die Tatsache, dass jedes Objekt auf dem Canvas eigenständig bleibt – so wie ich das Canvas-Element verstehe (als eine Art Bitmap/BitmapData), ist das nicht immer so? Dadurch kann man diesem kleinen Ball aus meiner Demo zum Beispiel einen Click-Handler geben, wie soeben geschehen.

Dabei ist mir Folgendes aufgefallen: Wenn ich tatsächlich nach und nach mehrere (ausgefeiltere) Demos bauen will, dann würde es der Übersichtlichkeit dienen, wenn ich diese voneinander separieren könnte. Am Liebsten in ihrem jeweils eigenen Objekt, von denen ich dann jeweils eines instanziiere. Nur: Wie funktioniert objektorientiertes Programmieren in JS? Meine JS-Kenntnisse sind etwas eingerostet, aber hier gibt es eine nette Basic- (!) Einführung.

Das Ergebnis kann man sich im Quellcode ansehen: Alle Variablen, die nur zur (bisher einzigen) Demo gehören, sind in “Klasse” “A” ausgelagert… I like! Nun könnte es eigentlich/vielleicht losgehen.

UPDATE:

Hm, andererseits wäre es auch interessant, “richtiges” OOP zu sehen, z.B. das Beerben von EaselJS’ Klassen. Angenommen, ich möchte ein TicTacToe-Spiel bauen, dann hätte ich Kreuze und Kreise, die beide (mir fällt grad kein besserer Begriff ein) Spielsteine (engl. “Tile”)sind, der wieder meinetwegen ein Shape ist. Wenn ich diese etwas ausgefeiltere Einführung als Ausgangspunkt nehme, sieht das so aus:

Potential für Verbesserung sehe ich hier:

  • Kreis und Kreuz nur je einmal zeichnen und wiederverwenden (siehe Doku zu Shape), statt jedes mal im Konstruktor.
  • DisplayObject.cache() verwenden.

Meinungen?

EaselJS: Kickoff

So ein Blog ist ein tolles Spielzeug. Eigentlich wollte ich nur meine Tweets anzeigen. Dafür brauchte ich ein neues Theme (das alte hatte keine Sidebar^^). Das neue ist schick, aber hat da oben diesen grauen Header, für den ich eigentlich keine Verwendung habe… lange Rede, kurzer Sinn: Ich benutze es jetzt als Canvas für EaselJS, mit dem ich gerade rumspiele.

Mittelfristig möchte ich da random das anzeigen, was bei meinen Spielereien so abfällt. Bis auf weiteres muss es aber eine Abwandlung einer Demo von Mike Chambers tun.

Alternativen für Facebook-Posts aus Actionscript

Wer mit der Facebook-API für Actionscript Posts absetzen will, kann das direkt machen:

oder als Javascript-Overlay:

oder als Pop-Up

Das data-Object beinhaltet die in den Docs unter “Publishing” beschriebenen Parameter.

Youtube auf dem iPhone

Youtube empfiehlt zwar die Verwendung von swfobject, dann funktioniert’s aber nicht auf dem iPhone – man sieht nix. Es gibt aber tatsächlich (XHTML-valide) Möglichkeiten, zB diese hier auf Learning the world. Man sieht dann das Preview-Bild, das einem auch zB in der youtube-Suche angezeigt wird. Bei Klick darauf öffnet sich die Youtube-App.

Mich würde allerdings mal interessieren, was man sieht, wenn man sich die Youtube-Videos auf diesem meinen Blog mit dem iPhone ansieht… verdammter Mist. Wieso haben wir eigentlich den IE6 überstanden, nur damit nun die nächste Firma anfängt, dem Web seine Extrawürste aufzuzwingen?? m(

XMLHttpRequest.responseText mit XML *und* Javascript [UPDATE]

ajax

“Normalerweise” besteht so ein responseText aus einem XML-Fragment. Das baut man dann dynamisch in seine Seite und gut ist. Javascript wird dabei nicht mehr ausgeführt.

Ein Trick zum dynamischen Abrufen (und Ausführen) von JS besteht darin, dass der responseText an eval() übergeben und so ausgeführt wird… dazu muss der responseText aber natürlich reines JS sein.

Wenn man nun aber beides will, so erzeuge man einen responseText a la

und voila (hier am Beispiel von ExtJS):

hier nun der Zauber:

Der Trick ist also einfach: Packe das JS in einen <script>-Knoten, und gebe diesem eine ID, um darauf zugreifen zu können 🙂

NACHTRAG: In ExtJS kann man natürlich auch einfach den Parameter loadScripts von Ext.Element.update() nutzen 😀