Technik, Gothic und Anderes

Technik ist Spiel, Gothic ist ernst und Zeit hat man zuviel

Archiv für 'Coding' Kategorie


Automatisches und mehrfaches submitten von Formularen

Geschrieben von skaldrom am 30. July 2008

Wirre Gedanken

FormularDieser Beitrag ist dem Titz gewidmet. Dem Titz, der sich aufgeregt hat :pirate-grumble: , obwohl es gar nicht nötig gewesen wäre und der sich nun mit einer gewissen Teilnehmerredundanz anfreunden muss. Hauptsache ist doch, das PHP fliesst und die Variablen bleiben sauber… Und ein Bierchen würde ich auch noch springen lassen :bier:

Eine wichtige Frage zu Beginn: Wieso sollten wir denn automatisch und mehrfach Formulare submitten wollen? Hmm, um den Titz zu ärgern? Weil wir es können? Weil man manchmal tun muss, was man tun muss? Weil man seine 84 Kinder an einem elektronischen Fussballturnier anmelden will :laola: (hat eigentlich schon jemand bemerkt, dass ich neue Smilies und unglaublich Freude daran habe?)? Oder weil man über einen Wettbewerb gestolpert ist, der ebendies nicht verbietet (also das Mehrfachsubmitten, nicht das Kinderanmelden oder die neuen Smilies) und der kein Captcha hat (vielleicht, weil es der Titz vergessen hat)?

Nachtrag 31.07.2008: Schenken mir doch so unglaublich nette Mitarbeiter einer Versicherung heute morgen am Bahnhof einen Müsliriegel. Und auf diesem eher gesunden Teil hat es, ja rate, oh wissbegieriges Volk, einen Wettbewerb. Ob der Titz wohl am Abend für eine andere Firma weitercoded? Ich werde mich auf jeden Fall während der Zugfahrt mal damit befassen :computer: .

Vorgehen

Erster Schritt: Selenium IDE

Man könnte nun wie wild losprogrammieren, oder aber einen einfacheren Weg wählen. Ein guter Startpunkt für automatisiertes Browsen generell ist die Selenium IDE. Dieses geniale Teil für den Firefox zeichnet wie ein Macrorecorder alles auf, was im Browser gemacht wird. Hat man die Teilnahme beim Wettbewerb einmal so aufgezeichnet, so müssen nur noch die click’s, die das Form absenden, durch clickAndWait’s ersetzt werden, damit vor dem Weiterausfüllen (bei mehrseitigen Formularen) auf die neue Seite gewartet wird. Es empfiehlt sich, eine Abschlussüberprüfung als letzten Schritt hinzuzufügen, um um kontrollieren zu können, ob die Kinder erfolgreich angemeldet wurden (markieren des “Dankeblabla”, dann rechte Maustaste und assertTextPresent).

Ein Wettbewerb über 2 Seiten. Aufgezeichnet und bearbeitet mit der Selenium IDE.

Ein Wettbewerb über 2 Seiten. Aufgezeichnet und bearbeitet mit der Selenium IDE.

Diesen Testcase kann man nun abspeichern und eigentlich immer wieder ausführen. Ein Klick reicht und Firefox rasselt alles schön durch. Den Namen leicht verändern kann man durch Editieren des Skripts…

Für den zweiten Schritt sollte man das Testscript als PHP exportieren.

Zweiter Schritt: Selenium RC

Die Selenium RC Komponente kann den Browser fernsteuern und so ferngesteuert am Wettbewerb teilnehmen. Um sie unter Linux Debian zum Laufen zu kriegen, war ein Bisschen Gemurkse notwendig.

Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | 2 Komentare »

AntMe, Spass mit programmierbaren Ameisen

Geschrieben von skaldrom am 2. July 2008

AntMe!Nachdem ich die Ameisen in meiner Wohnung mit ganz perfidem tragts-es-zu-euch-nach-Hause-und-vergiftet-eure-Nachkommen-Gift losgeworden bin, habe ich sehr viel sympathischere Zeitgenossen dieser Spezies getroffen: AntMe ist ein Programmierspiel, dass aus Microsofts Coding4Fun Initiative (nicht zu verwechseln mit dem Galileo Coding for Fun Buch. Das ist auch spassig, behandelt auch AntMe, aber zusätzlich noch viele Andere Dinge) hervorgegangen ist. Es hat einen eigenen Wikipedia Artikel und vorallem eine geniale Homepage.

Grundsätzlich geht es darum Ameisen zu implementieren die überleben, Äpfel und Zucker sammeln und unter Umständen auf Käfer und fremde Ameisen losgehen. Ein Markierungsmechanismus sorgt dafür, dass die Ameisen untereinander kommunizieren können. Fortgeschrittene Ameisenpapis und -mamis können spezialisierte Ameisen erstellen und RPG mässig Eigenschaften verbessern, wenn sie dafür andere verschlechtern.

Die Ameisen in Aktion

Die Ameisen können in C# oder in Visual Basic .net mit der notwendigen Intelligenz versehen werden. Bestimmte Methoden werden zu bestimmten Ereignissen aufgerufen; beispielsweise WirdMüde() (ja, mit “ü” und deutsch) oder SiehtFeind(ByVal käfer As Käfer). Zur Steuerung steht fast der ganze .net Sprachumfang zur Verfügung, sowie Ameisenspezifische Hilfsmethoden wie etwa GeheZuBau() oder GreifeAn(käfer).

Quickstart

Auf der AntMe Homepage findet man verschiedene Versionen. Wir spielen hier mit der 1.5 Beta 2 (VB.net oder C#, je nach Gusto). Die Profiversion beinhaltet den gesamten Quellcode der Spielengine (!). Das ist so genial, dass es nochmals erwähnt werden darf: Die Profiversion beinhaltet den gesamten Quellcode der Spielengine. Will man sich nur mit den Ameisen beschäftigen, reicht die Einsteigerversion. Im Download enthalten ist ein gut dokumentiertes Ameisenskelett, bei dem sofort losgottgespielt werden kann.
Eine gute Doku über die Klassen und deren Methoden sowie ein Tutorial wird mitgeliefert. Zum Teil beziehen sich die Unterlagen noch auf Version 1.1, aber der Transfer zu 1.5 ist eigentlich kein Problem. Für Leute, die lieber kuckn statt lesen, gibt es gut gemachte Screencasts, die ebenfalls in die Thematik einführen.

Für eher haptisch veranlagte Menschen gibt es auch ein Buch: AntMe! - Programmieren und Spielen mit den Ameisen und Visual C#. Das kenne und besitze ich allerdings (noch) nicht.

Verfügt man noch über keine Programmierumgebung, so könn bei Microsoft gratis die Express Versionen verschiedener Sprachen downgeloaded werden. Für die 3D Visualisierung braucht man
noch DirectX. Mit der neusten Version (nicht mit der im Forum angegebenen) hat es wunderbar gefunzt.

Turniere

Ein Bisschen lebt das Ganze auch vom kompetitiven Element (um ehrlich zu sein, vielleicht ist ein Bisschen etwas untertrieben: ICH FRESS EUCH ALLE AUF!). In der Version 1.5 funktioniert das Importieren von anderen Ameisen leider nicht und es wird eine unbehandelte Ausnahme ausgespuckt:
Der Typ für Member AntMe.SpielKonfiguration.AntMe.Simulation, Version=1.5.0.0, Culture=neutral, PublicKeyToken=37d8e32ef3294969 wurde nicht aufgelöst.

Workaround für die VB-Version (C# ungetestet):
Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Coding, Desktop | 5 Komentare »

Mit PHP einen Monat mit verlinkbaren Daten anzeigen

Geschrieben von skaldrom am 28. June 2008

CalendarFür eine Applikation, in der man Ressourcen reservieren kann, wollte ich ein Kalender mit verlinkbaren Tagen anzeigen (grad wie im Meeting Room Booking System). Da ich aus dem Alter raus bin, in dem man alles selber machen muss und ausserdem eine PHP-Datumsfunktionsphobie (PHPYpiresiaChronophobia) entwickelt habe, wollte ich eigentlich etwas Fertiges verwenden. Es gibt vorallem Kalender in JavaScript, ein Tutorial das den Kommentaren nach nicht funktioniert (und das mittlerweile vom Web verschwunden ist), Scripts ohne Ausgabebeispiele, Riesenmonster (deren Anwendungsbeispiele mehr Code haben als eine Eigenimplementation) oder Kalender, die zwar gut sind, aber irgendwie nicht gepasst haben (I18n, …). Ich möchte auch nix mit Ajax, Sigolin und Meister Propper, denn es soll eine Enterprise-Applikation geben, und da ist JavaScript halt nicht so opportun (und erspart mir wieder ein paar graue Haare mehr). Aber vor allem (aber das verschweige ich hier) hat das wie eine spannende Aufgabe ausgesehen, und als Kontrollfreak will ich es eben doch selber gemacht haben :-D .

Ziel

Das Ziel ist es einen Kalender zu erhalten, der die Wochen anzeigt, bei dem ein Tag (Event) markiert werden kann und das heutige Datum speziell ausgezeichnet ist. Er sollte also in etwa so aussehen (die Monatsnamen und Namen der Wochentage sollten sich auch noch der Sprache anpassen):

PHP-Kalender

Man sollte entweder ein Monat und ein Jahr übergeben können oder einfach nichts, wobei dann der aktuelle Monat und das aktuelle Jahr verwendet werden.

Vorgehen und Implementation

Ich habe mich entschlossen, dem Enterprisefassadefrontsidedecontrollerkurtmitgurtgimmeabreak-Pattern zu folgen… Quatsch, meine Gewohnheit und die Stimmen in meinem Kopf haben mich dazu gezwungen, den Kalender in zwei verschiedenen Funktionen zu implementieren. PHP hat ein absolut geniales Array-Handling, und wenn ich an solchen datenmanipulierenden Aufgaben arbeite habe ich mir angewöhnt, zuerst die reinen Daten in einem (mehrdimensionalen, ev. assoziativen) Array abzubilden. Dies hat den grossen Vorteil, dass ich die aufbereiteten Daten nicht nur für die HTML-Ausgabe, sondern auch von anderen Funktionen aus benutzen kann. Das Ziel wäre ein Array, dass auf der einen Dimension die Wochen und auf der Anderen die Wochentage hat. Man nehme den ASCIIstift hervor und zeichne ein Beispiel für Juni 2008:

[22] => {   '',   '',   '',   '',   '',   '',  '1'}
[23] => {  '2',  '3',  '4',  '5',  '6',  '7',  '8'}
[24] => {  '8',  '9', '10', '11', '12', '13', '14'}
...
[27] => { '31',   '',   '',   '',   '',   '',   ''}

Die Benamsung ist wie folgt:
PHP-Kalender benamst
Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | Keine Kommentare »

AIML: Intelligenz im XML

Geschrieben von skaldrom am 10. June 2008

BrainWenn man schon keine eigene Intelligenz besitzt, ist man froh, dass es sie auch in künstlicher Form gibt. Bis vor einiger Zeit wurde ziemlich proprietär rumgewurstelt, aber nun gibt es AIML, die Artificial Intelligence Markup Language die mit XML und Standardisierung das Verwenden unter verschiedenen Plattformen möglich macht. XML und Intelligenz ist also doch nicht per se ein Widerspruch.

Interessant ist das Ziel dieser Bemühungen (wie auf Pandorabots beschrieben):

Inhalte zu erstellen, die den Besucher dazu veranlassen so lange wie möglich mit dem Bot zu reden.

Auf der Basis von AIML wurden verschiedene Interpreter für verschiedene Programmiersprache geschaffen, Inhaltsdateien erstellt, die alle von der offiziellen Homepage oder der Tools Page heruntergeladen werden können.

AIML als XML (Gimme Code!)

AIML ist ziemlich komplex. Es gibt die Möglichkeit einer Unterteilung in Themen, der Extraktion von Mustern, der spezifischen Auswahl der Antworten etc, etc… Die englischen Übersichten und Tutorials gehen tiefer in die Materie.

AIML Tags

Die wichtigsten Tags von AIML:
Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | 3 Komentare »

PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!

Geschrieben von skaldrom am 7. May 2008

Was haben wir gelernt?

EvilJa, uns wurde gelehrt, dass man wenn immer möglich nicht Dateinamen direkt, sondern eine Variable angeben soll, die für den Dateinamen steht. Warum konnte mir zwar noch niemand so genau sagen, aber ich nehme an, dass es darum geht, dass der Dateinamen oder der Pfad ändern könnte. So habe ich ziemlich oft ganz brav geschrieben:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method ="post">
...
</form>

Und (zum Glück) bin ich nicht der Einzige. Eine kleine Suche auf Googles Codesearch hat gezeigt, dass mindestens Mambo, PHPMyFAQ, Einige Wordpressthemes und viele mehr dasselbe Problem haben. Ich bin bei Weitem auch nicht der Erste, der über Probleme mit dieser Technik erfahren und darüber geschrieben hat.

Problem? mit $_SERVER['PHP_SELF']?

Lasst mich ausholen: Der Apache Webserver hat eine Option AcceptPathInfo, welche standardmässig auf On ist. Mit dieser Option mappt der Apache beliebig lange Pfade auf Dateien, sofern diese irgendwie Bestandteil des Pfades sind. Der Rest wird in Umgebungsvariablen mitgegeben.

Gimme Code

Nehmen wir an, es gäbe eine Datei /subdir/mypath.php welche so aussieht:

<?php
echo "<pre>";
echo "REQUEST_URI: ".$_SERVER['REQUEST_URI']."\n";
echo "PHP_SELF:    ".$_SERVER['PHP_SELF']."\n";
echo "SCRIPT_NAME: ".$_SERVER['SCRIPT_NAME']."\n";
echo "</pre>";
?>

Bei einem Aufruf von: http://localhost/subdir/mypath.php/additional/stuff/nonsense.php?para=4 mappt Apache netterweise alles auf unsere Datei http://localhost/subdir/mypath.php und verstaut den Rest im $_SERVER Array. Die Ausgabe ist:

REQUEST_URI: /subdir/mypath.php/additional/stuff/nonsense.php?para=4
PHP_SELF:    /subdir/mypath.php/additional/stuff/nonsense.php
SCRIPT_NAME: /subdir/mypath.php

PHP_SELF übernimmt also den ganzen Krempel und würde ihn bei unserem Form auch so darstellen. Angenommen, wir haben ein PHP-Script mit der URL http://localhost/contact/myform.php mit folgendem Inhalt:
<form action=”<?php echo $_SERVER['PHP_SELF']; ?>” method =”post”>

Ruft man dieses nun mit folgender URL auf (die aufwändiger als notwendig konstruiert und des besseren Verständnisses wegen nicht URL-encodiert ist):
http://localhost/contact/myform.php/”></form>Hier ein Javascript: <script>alert(’gotcha’);</script><form action=”/contact/myform.php
erhält man:
<form action=”/”></form>Hier ein Javascript: <script>alert(’gotcha’);</script><form action=”/contact/myform.php” method =”post”>

Also vollkommen gültiges HTML (sogar das Form funktioniert) mit fremdbestimmbaren Seiteninhalt. Das ist ja wohl hässlich…

Theorie! Gib mir Praxis!

Ich weiss nicht, wie lange folgende Links funktionieren, beziehungsweise diese Sites anfällig für diese Art von XSS sind:

Digital Postcard (Kein XSS, aber mein Text :-) ):
Postcard XSS

Multimediatreff:
Multimediatreff

Jobs. ch (nicht im Form, dafür mit hohem PageRank):
Jobs.ch

Was nutzt das dem bösen Hacker?

Text in Fremdpages einbauen, Phishing, Indentitätenklau und noch einiges Weiteres. Ein Folgeartikel wird mindestens eine Anwendung zeigen.

Was tun?

Ganz einfach: Das oft verschmähte $_SERVER['SCRIPT_NAME'] verwenden!!!

BTW: Viele Variablen in $_SERVER sind anfällig, aber alles muss ich ja auch nicht verplappern, oder?

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | Keine Kommentare »

Kleine SEO-Tools mit Quelltext in PHP

Geschrieben von skaldrom am 20. March 2008

ToolsEs gibt viele Sites, die online Tools für die Suchmaschinenoptimierung (SEO) anbieten. Es gibt Handverlesene Verzeichnisse von Linkvendor, Eigenentwicklungen von Ravenseo und riesige Zusammenstellungen von den Fachinformatikern, dem Website Spy, dem SEO-Chat und der SEO-Company. Wieso braucht es denn noch mehr? Ganz einfach: Google Schweiz wird - extrem überraschenderweise - nirgends so richtig berücksichtigt. Ausserdem will ich auf der Kommandozeile arbeiten und den Quellcode möchte ich auch, um die Bewertungen nachzuvollziehen und um darin herumzuwurschteln.

Naja, dann hab ich halt mal angefangen. Das Resultat gibts auch zum Download: PHP SEO-Tools.
Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | Keine Kommentare »

Spass und Erleuchtung auf dem XPath

Geschrieben von skaldrom am 13. March 2008

XPathXPath ist eine ziemlich geniale Sache. Es erlaubt die Formulierung von Ausdrücken, die in einer XML-Datei nach gewissen Dingen suchen. Dabei können einzelne, bestimmte oder alle Textinhalte eines Tags, Attributswerte und die Anzahl gesucht und gefunden werden, und das alles jeweils relativ oder absolut zum Root des XML-Dokuments. Die Möglichkeiten sind dabei ziemlich flexibel und es drängt sich ein Vergleich zu SQL auf.

Dies soll kein XPath-Tutorial werden, das machen Andere, an anderen Stellen viel besser.

Ich wollte etwas ähnliches bauen wie Futurelab in Java/JSP realisiert hat, allerdings in PHP. Ausserdem wollte ich, dass es auch mit dem count() Ausdruck und seinen Kollegas umgehen kann.

Programmaufbau

Was XML angeht, kann sich PHP echt nicht beklagen; Mindestens 4 Ansatzpunkte bieten sich dem interessierten Coder. Als einfaches Gemüt mit Freude an KISS (und KISSES :-) ), wollte ich natürlich zuerst SimpleXML bemühen. Leider liefert die dazugehörige XPath-Funktion “nur” die Ergebnisse als String. Dies verunmöglicht ein Highlightning im original-XML. Einen Gang hochgeschaltet und den grösseren Bruder bemüht: Die DOM Erweiterung.

Der Grundsätzliche Ablauf des Laborprogramms ist der Folgende:

  1. Flatfile XML wird in einen DOM-Tree umgewandelt: Ein Aggregat aus Objekten, Attributen, Arrays und was man sonst noch so in einem handelsüblichen Speicher findet.
  2. Er wird versucht, aus den Eingaben des Anwenders Sinn zu gewinnen → die entsprechenden Teile im DOM-Tree mittels XPath zu identifizieren.
  3. Diese Teile werden irgendwie markiert (schwierigster Teil).
  4. Der Dom-Tree wird wieder in ein XML geplättet.
  5. Die Marker werden durch Spans mit Stylesheetinfos ersetzt, um zu zeigen was gefunden wurde.

Fälle und Fallen

Wenn der Anwender etwas sucht, werden vier Fälle unterschieden. Diese Fallunterscheidung wird an Hand des Resultats der XPath Anfrage gemacht. Anzahl der Resultate und Typ (mit Hilfe des Reflection APIs herausgepfriemelt, wohoo(!!!)) bestimmen die Aktion.

Fall 1: Es gibt Nodes im Resultat und die sind vom Typ DOMElement

Juhuu, wir haben simple und einfache Dinge gefunden. Nun müssen wir sie noch schnell markieren. Meine Idee war, dies mit Kommentaren zu machen, die ich jeweils vor vor und nach dem gefundenen Element einsetze:

$start=$xo->createComment('MATCH-START');
$end=$xo->createComment('MATCH-END');
$result->parentNode->insertBefore($start,$result->previousSibling);
$result->parentNode->insertBefore($end,$result->nextSibling);

Bug-Potential 1: Es dürfen keine identischen Kommentare im original-XML enthalten sein.

Fall 2: Es gibt Nodes im Resultat und die sind vom Typ DOMAttr

Etwas komplexer: Es ist nach Attributen gesucht worden. Hier wollte ich zuerst Regexpe zum Highlightnen speichern, aber das funktioniert nicht, da einzelne Attribute bestimmter Knoten ausgewählt werden können (//cd[2]/@currency). Naja, dann wurschteln wir hier Marker <!–MATCH-START–> und <!–MATCH-END–> in den Attributsinhalt. Leider werden die Klammern schon mal mit ihren HTML-Entities ersetzt, was dann zum Schluss eine doppelte Codierung ergibt.

Fall 3: Es gibt keine Nodes im Resultat, aber evaluate bringt ein Ergebnis

Es wird eine Funktion wie etwa count() verwendet. Nundenn: Evaluieren, ausgeben, danke.

Fall 4: Es gibt keine Nodes im Resultat und evaluate bringt kein Ergebnis

Das ist eine ID-10-T Eingabe. Fehlermeldung und tschüss.

Das Resultat

Das Resultat kann angesehen und als Gesamtheit mit Quellcode heruntergeladen werden. Kommentare und Bugreports würden mich freuen. Happy coding!!!!

oncode.info XPath Laboratory small

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Coding | Keine Kommentare »

Active Record Pattern in PHP

Geschrieben von skaldrom am 12. March 2008

StorageIn PHP gibt es verschiedene Implementierungen des Active Record Patterns. Auch wenn es uns nimmer so auffällt, die objektorientierte Welt des Codes und die relationale Welt der Daten sind zwei verschiedene Paradigmen, und es braucht unheimlich viel Leim um sie zusammenzukleben. Objektorientierte Datenbanken entwickeln sich, sind jedoch noch nicht Standard (um es mal vorsichtig auszudrücken). Das Active Record Pattern hilft uns mit ein Bisschen Standard-Klebe.

Mit diesem Pattern können Daten aus der Datenbank gesucht und direkt in Objekte übergeführt werden. Änderungen an den Objekten und das Speichern bewirken, dass diese Änderungen auch in die Datenbank übernommen werden.

Ich habe mich für MyActiveRecord von Jake Grimley entschieden, weil es sauber implementiert, nicht zu gross und trotzdem nicht featurearm ist. Die Dokumentation ist ziemlich gut und reicht aus um zu starten.

Benutzung von MyActiveRecord

Suchen und finden

Der Dreh- und Angelpunkt dürfte die Funktion FindAll($class, $where=0, $orderby=’id ASC’, $limit=10000, $offset=0) sein. Sie liefert eine Kollektion von Objekten der entsprechenden Klasse zurück:

foreach (MyActiveRecord :: FindAll('thing') as $thing) {
  echo "I am a {$thing->name}!<br/>\n";
}

Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Theorie und Schnipsel | Keine Kommentare »

UWA Widgets coden

Geschrieben von skaldrom am 25. January 2008

Web 2.0, Just Do It…

Je besser man etwas kennt, desto besser kann man darüber lästern… Ich habe beschlossen, mich ganz praktisch durch das Tal der Tränen zu kämpfen und mich auf dieser Wanderung mit den technischen Teilen von Web 2.0 herumzuschlagen. Wie fühlt sich Ajax an? Wieviel Schatten spendet der DOM-Tree? XML oder JSON, JavaScript und APIs sollten die Dämonen auf meinem Weg sein.

Das Resultat

Das Resultat kann im Ecosystem angesehen und installiert oder von der oncode.info Site downgeloaded werden. Es ist ein Widget, das Adressen über tel.search.ch sucht.
Tel.search.ch bietet ein geniales, gut dokumentiertes REST API an.

Ein paar Screenies?
So siehts in Netvibes aus:
Das tel.search.ch Widget in Netvibes

So in iGoogle:
Das tel.search.ch Widget in iGoogle

Und so in der Sidebar von Windows Vista:
tel.search.ch UWA Widget in Windows Vista Sidebar

Lesen Sie den Rest dieses Beitrages »

Teile und geniesse:
  • Technorati
  • del.icio.us
  • MisterWong
  • Digg
  • StumbleUpon
  • blogmarks
  • Furl
  • Simpy
  • Spurl
  • YahooMyWeb

Ähnliche Artikel

Eingeordnet in Webapplikationen | 3 Komentare »

Selbst einen Flickr Screensaver in VB.net programmieren

Geschrieben von skaldrom am 15. January 2008

ScreensaverJa, ich lebe in einer dunklen Welt: in diese Welt sind die memory_limits noch auf 8MB, viele Pixel auf dem Monitor sind untot, Slashdot ist wegen zuviel Arbeit nicht mehr in der History meiner Browserleiste und aus hier nicht näher zu spezifizierenden Gründen muss ich mit Visual Basic 2005 Express Edition arbeiten. Und das in einer VMWare Umgebung unter Linux. Da kommt Freude auf!

Nundenn, da sucht man sich doch einfach mal ein nettes Projekt um den Einstieg etwas zu erleichtern. Meine Wahl fiel auf einen Bildschirmschoner, der in regelmässigen Abständen Bilder von flickr darstellen soll.

Benötigte Dinge

Um möglichst schmerzfrei auf Flicker zugreifen zu können, benutze ich die FlickrNet API Library von Codeplex. Diese Library ist relativ gut dokumentiert und hat einen irgendwie offiziellen Touch.

Ausserdem benutze ich das Screensaver Starter Kit, das bei Visual Basic dabei ist um das grundlegende Gerüst zu erzeugen. Es kann angewählt werden, wenn ein neues Projekt erstellt wird.

Lustige Details und Probleme

Generell kann man mal ganz viel aus dem generierten Code löschen. Interessierte seien auf das beiliegende Projekt verwiesen.

FlickrNet API Library

Zuerst muss die FlickerNet.dll in das Projekt kopiert werden. Neuere Versionen haben bei mir Probleme gemacht, was aber gar nichts heissen muss. Damit alle diese Fehler ausgeschlossen werden können, habe ich eine aus einem funktionierenden Beispiel herauskopiert. Bei My Project → Verweise muss diese DLL hinzugefügt und der Namespace importiert werden.
Bei Flickr muss noch einen API-Key gelöst werden und dann steht dem Einsatz nichts mehr im Wege.

Bildschirmschoner

Ein Screensaver ist nichts anderes als ein grosses Form ohne Fensterränder, das sich immer nach vorne zwängt und den Mauszeiger abschaltet. Ein Bildschirmschoner sollte drei Modi unterstützen:

  • Darstellen
  • Preview beim Windows-Konfigurationsdialog
  • Einstellungen

Die Hauptarbeit, nämlich die Darstellung des eigentlichen Screensavers wird im ScreenSaverForm gemacht, Die Einstellungen werden über das OptionsForm abgehandelt.

Mit der folgenden Funktion wird die URL von ca. 100 Fotos im Feld allPhotos gespeichert:

''' <summary>
    ''' Lädt die URLs von einigen Bilder zum gegebenen Tag von Flickr in ein Feld
    ''' </summary>
    Private Sub LoadBackgroundImage()
        Dim f As Flickr = New Flickr(apikey)

        Dim options As PhotoSearchOptions = New PhotoSearchOptions()
        options.Tags = My.Settings.Tag
        Dim bgPhotos As Photos = f.PhotosSearch(options)

        allPhotos = bgPhotos.PhotoCollection
        currentImageIndex = 0

    End Sub

Ein Timer erhöht den Index des aktuell darzustellenden Bildes:

Private Sub backgroundChangeTimerTick(ByVal sender As Object, ByVal e As EventArgs) Handles backgroundChangeTimer.Tick

        ' Hintergrundbild ändern und nächstes Bild verwenden.
        currentImageIndex = currentImageIndex + 1
        Refresh()
    End Sub

Dieses Codesnipped lädt ein Bild mit einem Index herunter uns stellt es dar:

Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)
        If allPhotos.Length > 0 Then
            currentImageIndex = currentImageIndex Mod allPhotos.Length
            ' Aktuelles Hintergrundbild gestreckt zeichnen, sodass es den gesamten Bildschirm ausfüllt
            Dim f As Flickr = New Flickr(apikey)
            Dim currentImage As Image
            currentImage = Image.FromStream(f.DownloadPicture(allPhotos.Item(currentImageIndex).MediumUrl))
            e.Graphics.DrawImage(currentImage, 0, 0, Size.Width, Size.Height)
        Else
            myError = "No Photos for this Tag"
        End If

    End Sub

Weiter werden Tastatureingaben und Mausbewegungen abgefangen. Wenn der Screensaver nicht im Previewmodus ist, beendet er sich bei einer Benutzerreaktion.

Das Preview

Beim Screen Saver Starter Kit fehlt das Preview. Irgendwo haben die Hersteller geschrieben, das sei Absicht, damit die Entwickler das erweitern könnten. <laut>Haha!</laut>. Der Grund wurde mir dann schon klar. Bei einem Aufruf im Preview-Modus wird ein Windowshandle des Elternfensters mitgegeben. Da muss man sich als Kind eintragen und das geht mit dem super .net nicht so einfach. Dank VB-Helper und msdner (leider offline: http://www.msdner.com/dev-archive/6/10-32-68963.shtm) habe ich dann eine Lösung gefunden und implementieren können.

Der grösste Teil dieses magischen Codes steht in MyEvents.vb. Um das zu sehen muss man im Menü Projekt → Alle Dateien anzeigen auswählen und den Ast My Project aufklappen. Dort drin befindet sich die Unterscheidung der Modis, etc:

Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer
        Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
        Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As Integer) As Integer
        Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
        Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
        Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
        Public Structure RECT
            Public left As Integer
            Public top As Integer
            Public right As Integer
            Public bottom As Integer
        End Structure
        Public Class Win32Corners
            Public Const SWP_NOACTIVATE As Object = &H10
            Public Const SWP_NOZORDER As Object = &H4
            Public Const SWP_SHOWWINDOW As Object = &H40
            Public Const GWL_STYLE As Object = -16
            Public Const WS_CHILD As Object = &H40000000
            Public Const GWL_HWNDPARENT As Object = -8
            Public Const HWND_TOP As Object = 0
        End Class

        Private Sub SetForm(ByRef f As ScreenSaverForm, ByRef arg As Long)
            Dim style As Integer
            Dim previewHandle As Integer = Int32.Parse(CType(arg, String))
            Dim r As New RECT
            GetClientRect(previewHandle, r)
            With f
                .WindowState = FormWindowState.Normal
                .FormBorderStyle = FormBorderStyle.None
                .Width = r.right
                .Height = r.bottom
            End With
            style = GetWindowLong(f.Handle.