Archive for September, 2006

WordPress – Captcha! Plugin and Line Breaks

September 23, 2006

(Ausnahmsweise in English)

On my WordPress Sites I’m using the wonderfully simple Captch! Plugin from here. It’s a pity it isn’t supported anymore, so when I found a little bug today I had to have a look at it myself.

It occured to me on one the sites maintained by me (shameless plug: www.blueeyesontour.com about a friend of mine staying in Costa Rica for the next few months ) that when you posted a comment with a lot of text and accidentally entered the wrong Captcha! that you would lose your complete text. Not quite user-friendly.

The problem was that the captcha.php was rendering JavaScript like this:

document.forms[i].comment.value = 'foo long text
continued long text
and even more long text';

This of course caused an unended string literal in JS causing the comment text never to be replaced with the last value.

It’s caused in captcha.php on line 1003:

if (isset($_POST['comment1'])) {
printf("\t\tdocument.forms[i].comment.value = '%s';\n", $_POST['comment1']);
}

which need to be replaced by

if (isset($_POST['comment1'])) {
printf("\t\tdocument.forms[i].comment.value = '%s';\n",
str_replace("\r\n", "' + \r\n '\\n", $_POST['comment1']));
}

After that comments are rendered as follows and displayed as required:

document.forms[i].comment.value = 'foo long text' +
+ '\ncontinued long text'
+ '\nand even more long text';

To Postback or not to Postback

September 9, 2006

Der ASP.net Lebenszyklus ist verwirrend genug, aber mir scheint die neuen Webparts in ASP.net 2.0 – so wunderbar sie auch sind – verkomplizieren die Sachen irgendwie schon wieder?

Mein Fall, eine einfach ASP.net 2.0 Anwendung, Masterpages + Webparts. Eine der Webparts lädt ein Custom Web Control, das selber wiederum von der composite Art ist (also statt selber HTML zu rendern, nutze ich ASP.net Controls, die zusammenfüge und das Rendern übernehmen).

Soweit nichts schwierigies, in CreateChildControls die Controls erstellt und die Event Handler an verschiedene LinkButtons gehängt. Nun füge ich den Webpart auf meine Seite ein und rufe die Seite auf. Wunderbar gerendert, aber die Postbacks funktionieren nicht.

Hmm… der Postback-Event schaut im Browser ok aus. Testweise also nur das Custom Control auf die Seite gegeben (also ohne Webpart). Das selbe Verhalten. Gut, ich leite die Klasse statt von WebControl mal von WebPart ab (immerhin operiere ich ja in eine WebpartZone) und da schau her, die Postbacks gehen.

Aber das kann es ja nicht sein, also zurück auf WebControl umgestellt und ein wenig gegoogelt und diesen Foreneintrag gefunden.

Ein Auszug:

For most web controls to fire postback events they need to have their ViewState loaded.  For dynamically loaded controls this means loading the control prior to the LoadViewState event to ensure the control receives its ViewState.  This means loading the control in Page_Init.  That should be the only change you need.

Also schnell EnsureChildControls in der OnInit dazugefügt und nun funktionieren die Postbacks auch im WebControl. Aber wieso brauche ich das nur für WebControl und nicht für WebPart?

Ein wenig weiter gegoogelt und auf das hier gestoßen.

On initial request (non-postback) EnsureChildControls is called at PreRender stage of the Page. At postback it is called when postback data handling for the first control occurs, that is when FindControl is called which automatically invokes EnsureChildControls first. This happens before Page_Load at first postback data processing stage.

Das könnte also erklären wieso es bei WebParts funktioniert, wenn dort in einer genügend frühen Phase im ASP.net Zyklus ein FindControl aufgerufen wird.

Ob das stimmt, kann ich diesesmal nur vermuten. Zu spät um noch weiter zu recherchieren :)

Zu guter letzt noch ein Link zu einer schönen textuellen Übersicht über die ASP.net Zyklus.

TS: Microsoft Windows Mobile 5.0 – Application Development

September 5, 2006

 

Eigentlich wollte ich ja nach Indien noch eine kleine Zusammenfassung schreiben, aber wie immer ist die Zeit davon gelaufen und Keng hat ja schon eine tollen Post gemacht. Kaum wieder im Lande geht es mit .net gleich weiter ;) Ich habe mal wieder von Matthias eine Mail zu einer MCP Beta Prüfung erhalten. Nachdem ich bis jetzt alle meine MCPs als Beta gemacht habe, nutze ich diese Chance gleich wieder. (Auch wenn es diesesmal keinen Gutschein für eine MCP Prüfung gibt.)

Für alle die nicht wissen wie eine Beta abläuft, hier ein paar Fakten:

  • Man erhält mehr Fragen als die finale Prüfung, dafür werden einige davon nicht gewertet.
  • Zur Beantwortung hat man rund 4h Zeit.
  • Das Ergebnis erhält man erst kurz vor der Veröffentlichung der finalen Prüfung (~3 Monate)
  • Bis auf das Preparation Guide, MSDN und Google ist man auf sich alleine gestellt. (Auch wenn ich noch nie viel von Braindumps gehalten habe.)

Nun genau dieser letzter Punkt ist etwas mühsam, aber dafür bringt es einem auch sehr viel wenn man sich selbst durch den W3 Jungle kämpft. Aber vielleicht hat jemand dafür keine Lust und keine Zeit, also stelle ich mal die Linksammlung zur Verfügung nach der ich gelernt habe. (Ausgehend vom Preparation Guide.)

Prüfungsthemen:

Developing Mobile Applications by Using the Microsoft .NET Compact Framework 2.0

Naja, ich empfehle jedem die .netFX 2.0 Foundation Prüfung zu machen, aber auch hier gibt es ein paar interessante Sachen, die erwähnenswert sind (können sollte man sie alle *g*):

  • Manage data in a .NET Compact Framework 2.0 application by using .NET Compact Framework 2.0 system types. (Refer System namespace)
    • Exception classes
      • Auf jeden Fall lesenswert: MSDN vor allem für alle diejenigen wie ich, die gerne einfach eigene Fehlerklassen von Exception ableiten.
      • TypeForwardedToAttribute class
        • Für den kleinen Entwickler vielleicht nicht so interessant, aber in großen Umgebungen mit vielen Abhängigkeiten sehr hilfreich. Mehr hier.
  • Manage a group of associated data in a .NET Compact Framework 2.0 application by using collections. (Refer System.Collections namespace)
  • Improve type safety and application performance in a .NET Compact Framework 2.0 application by using generic collections. (Refer System.Collections.Generic namespace)
  • Manage data in a .NET Compact Framework 2.0 application by using specialized collections. (Refer System.Collections.Specialized namespace)
    • Hier ist die CollectionUtil Klasse erwähnenswert. Sie erlaubt die Erstellung von Case-Insensitive Hashtables und SortedLists.
    • Außerdem steckt hier BitVector32. Vergleichbar mit BitArray, aber effizienter, jedoch auf 32 bits beschränkt.
  • Implement .NET Compact Framework 2.0 interfaces to cause components to comply with standard contracts. (Refer System namespace)
    • IComparable: Eigene Implementierung zum Vergleichen von Objekten. Wird zur Sortierung verwendet in Listen und Kollektionen.
    • IDisposable: Im Umgang mit Unmanaged Ressourcen viel Wert, wenn man es richtig implementiert.
    • IConvertible: Wer wollte nicht schon immer sein User BO auf ein Boolean umcasten ;) Es gibt aber sicher ein paar Anwendungsfälle.
    • IEquatable: Das Gegenteil zu IComparable, definiert die Equals Methode.
    • IFormattable: Erlaubt die Formatierung eines Strings für ein Objekt zu verändern. Für viele Objekte zu aufwendig, aber schöne Szenarien denkbar.
  • Control interactions between .NET Compact Framework 2.0 application components by using events and delegates. (Refer System namespace)
    • das tägliche Brot des .net Entwicklers
  • Develop multithreaded .NET Compact Framework 2.0 applications. (Refer System.Threading namespace)
  • Implement reflection functionality in a .NET Compact Framework 2.0 application. (Refer System.Reflection namespace)
  • Enhance the text-handling capabilities of a .NET Compact Framework 2.0 application (Refer System.Text namespace), and search, modify, and control text within a .NET Compact Framework 2.0 application by using regular expressions. (Refer System.RegularExpressions namespace)

Designing and Developing a Windows Mobile User Interface

  • Interessant in Bezug auf UI:
    • PDF: Designed for WM Handbook for Smartphone
    • PDF: Designed for WM Handbook for PocketPC

Vieles ist auf dem großen Framework bekannt. Einige Eigenheiten:

  • Design user interfaces to conform to Designed for Windows Mobile guidelines.
  • Manage platform-specific display operations.
    • Create orientation-aware, resolution-aware, DPI-aware applications.
      • Sehr lästig manchmal, aber erspart einem auch teilweise für jedes Gerät eine eigene UI zu basteln. Leider keine guten Beispiele im Netz.
  • Update controls across thread boundaries.
    • Control.Invoke und seine Verwandten! Auf dem großen FX meistens mit guten Exceptions abgefangen, auf dem compactFX leider immer noch kryptische Meldungen.

Integrating Data in a Windows Mobile-Based Application by Using File System, ADO.NET, and XML

  • Streams und dergleichen wie im großen FX.
  • ADO.net 2.0 Datasets: Tolle Einführung hier (Notiz an mich selbst: Umbedingt vor der Prüfung nochmal durchlesen)
  • Work with XML data.
    • Hier die klassische Einführung auf GotDotNet.
  • Encrypt and decrypt data by using classes of the System.Security.Cryptography namespace.
    • Nicht so oft gebrauchtes Thema – daher schlage ich eher nach – aber wird immer wichtiger.
    • Erste Anlaufstelle: http://msdn2.microsoft.com/en-us/library/93bskf9z.aspx
    • Kurz gefaßt: CryptoStream mit entsprechenden Encryptor (benötigt Schlüssel) erstellen und dann wie normalen Stream behandeln.

Managing Data by Using Microsoft SQL Server 2005 Everywhere Edition

  • Neu für mich daher ausführlicher:
    • Erste Anlaufstelle die Books Online.
    • Grundsätzlich eine relationale Datenbank für CE/WM Devices, bestehend aus:
      • CE/WM Device
        • SQL Server Mobile Client Agent: zuständig für Connectivity, Replikation, RDA
        • SQL Server Mobile: die eigentliche Engine
      • Server
        • SQL Server Mobile Server Agent: zuständig für Replikation, benötigt IIS

Installation ist nicht Teil der Prüfung, aber komplex und mit einigen Stolpersteinen.

  • Create a SQL Server 2005 Everywhere Edition database.
    • SqlCeEngine Objekt: Connection String (Data Source = File der SDF Datei), dann CreateEngine Methode
    • SqlCeReplication: Replikation einrichten, SDF Datei als Connection String (liegt auf Server) angeben, dann AddSubscribtion aufrufen (AddOption=CreateDatabase)
    • Details in den Online Books
  • Manage connections to a SQL Server 2005 Everywhere Edition database.
    • SqlCeConnection, SqlCeCommand… Im Prinzip ADO.net nur jeweils mit SqlCe als Prefix der Objekte.
  • Manage data in a SQL Server 2005 Everywhere Edition database (info)
    • direct table access: schnellste Methode, umgeht Query Processor, CommandType.TableDirect
    • seek: unter Verwendung eines Index und TableDirect Mode, ermöglicht Seek ein schnelles Setzen des Readers anhand eines Parameters
    • set range: ähnlich wie seek ermöglicht es das Einschränken der Werte anhand eines Parameters die im Index gesucht werden
  • Perform transactions by using the SqlCeTransaction object.
    • ähnlich wie ADO.net 1.0 Transactions
  • Maintain and protect the contents of a SQL Server 2005 Everywhere Edition database.
    • Compact, Verfiy, Repair und Shrink jeweils über Methoden der Engine
    • AutoShrink und AutoFlush über ConnectionString einstellbar
    • Passwort-Schutz bzw. Verschlüsselung der Datenbank: hier, im wesentlichen über connString
  • Synchronize data by using Remote Data Access (RDA)
    • Es gibt Push und Pull.
    • Aus den Online Books:
      • Die App startet und kontrolliert den RDA, zuständig für Pull und Push von einem SQL Server.
      • Wenn die Tabelle getracked wird (SqlCe trackt Änderungen auf dem Device) muss die App aber immer noch regelmäßig die Änderungen pushen
      • Änderungen auf dem Server müssen durch Drop und Repull auf dem Device aktualisiert werden.
      • Die App kümmert sich um das Löschen der DB auf dem Mobile.
    • SubmitSql erlaubt Ausführung von SQL auf dem Server (über RDA)
  • Synchronize data by using merge replication.
    • nach erfolgreicher Installation und Konfiguration: SqlCeReplication.Synchronize
  • Links:

Developing Communication and Connection Capabilities in Windows Mobile-Based Applications

Hatte das Vergnügen mich die letzten Monate viel hiermit zu beschäftigen, daher überspring ich vieles. Das meiste funktioniert wie im großen Fx.

Implementing Interoperability and Platform-Specific Features in Windows Mobile-Based Applications

Der Fun Teil :)

  • Improve the mobile user experience by using notifications.
  • Implement interprocess communication.
  • Retrieve system state by using State and Notifications Broker.
    • Der einzige S(CH)NAPI den man lieben muss: Part 1
  • Access Microsoft Office Outlook Mobile features and data programmatically by using the OutlookSession object.
  • Expose COM components to managed code, and expose managed code components to COM components. (Refer System.Runtime.InteropServices namespace)
  • Call native Win32 DLL functions from managed code, and control the marshalling of data in a managed code application by using Platform Invoke technology. (Refer System.Runtime.InteropServices namespace)
    • Ähnlich wie im großen: MSDN

Optimizing, Packaging, and Deploying Windows Mobile-Based Applications

Achja nun wo ich fertig bin, sehe ich noch jemand hat eine Übersicht erstellt. Etwas ausführlicher, aber vieles aus den anderen Prüfungen bekannt *g* http://whartonj.blogspot.com/2006/09/71-540-study-material.html

Naja, morgen um 09:00 geht’s los. Werde mir wohl vorher noch ein paar Links anschauen, aber mal schauen wie es läuft ;)