# Tuesday, April 08, 2008

String.Format mit geschweifter Klammer

Mit Hilfe der String.Format-Methode können ja bekanntlich formatierte Einsetzungen in einen String vorgenommen werden. Im Ursprungsstring werden dazu Platzhalter in der Form {0}, {1}, etc eingefügt. Sind allerdings im Formatstring, als dem String, in den die neuen Teile eingesetzt werden, geschweifte Klammern enthalten, werden diese als Formatierungszeichen betrachtet. Aufgefallen ist mir dies bei der Formatierung der Zeichenkette:
#ifndef _BLABLUB_H_
#define _BLABLUB_H_

#  ifdef __cplusplus
  extern "C" {
#  endif /* __cplusplus */
BLABLUB sollte dabei durch den entsprechenden Namen der Headerdatei ersetzt werden. Allerdings hagelte es mit folgendem FormatString bei jedem Versuch, die formatierte Ausgabe zu erzeugen, eine FormatException.
public static string HeaderExklusionStart = "#ifndef {0}"
    + Environment.NewLine
    + "#define {0}"
    + Environment.NewLine
    + Environment.NewLine
    + "#  ifdef __cplusplus"
    + Environment.NewLine
    + "  extern \"C\" {"
    + Environment.NewLine 
    + "#  endif /* __cplusplus */";
Um den Fehler zu beheben, müssen einfach geschweifte Klammern, die ausgegeben werden sollen und somit nicht als Formatierungsanweisungen zu interpretieren sind, doppelt eingefügt werden:
+ "  extern \"C\" {{"

Auf den Fehler hingewiesen hat mich der Artikel Kombinierte Formatierung im MSDN. Prädikat: Wertvoll.
Tuesday, April 08, 2008 12:14:50 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback

Fehlerkorrektur: String auf ASCII-Reinheit prüfen

In meinem gestrigen Post String auf ASCII-Reinheit prüfen hat sich ein Fehler eingeschlichen. Die öffentliche Eigenschaft Encoding des StreamWriters ist ReadOnly. Um das Encoding des StreamWriters festzulegen, muss dieses im Constructur übergeben werden:
sourceWriter = new System.IO.StreamWriter( sourceFS, Encoding.ASCII );

Tuesday, April 08, 2008 10:00:49 AM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Monday, April 07, 2008

String auf ASCII-Reinheit prüfen

Momentan liegt mein beruflicher Schwerpunkt eher auf der Programmiersprache C im Embedded Umfeld. Da dies jedoch nicht meine präferierte Sprache ist und außerdem die Arbeit (Webserverprogrammierung, CGI-Funktionen, etc) auf Grund der Vielzahl von ähnlichen CGI-Funktionen ein bisschen nach Automatisierung riecht, habe ich begonnen, einen Codegenerator zu schreiben.
Ein paar Worte zur Erklärung. Wir haben eine Anwendung mit zentraler Pseudodatenbank, die alle Programmteile als Quelle und Senke nutzen. Ca. 80% der Datenpunkte sollen per Web-Frontend editierbar sein. Um den Programmierer des Web-Frontends nicht mit den Interna des Microcontrollers zu belasten, stellen wir die Datenpunkte über CGI-Funktionen bereit. Somit muss für jeden Datenpunkt eine ähnlichlautende Zugriffsfunktion in C erstellt werden. Lediglich der Datentyp ändert sich. Die Pflege der Datenpunkte erfolgt in einer Excel-Datei, die auch externen Firmen zur Verfügung gestellt wird.
Da es sich bei dem generierten Code um C-Code handelt und die eingesetzte Entwicklungsumgebung keine Quelltexte in Unicode verarbeiten kann, muss ASCII-Code generiert werden. C# verarbeitet jedoch 2 Byte breite Chars und schreibt liebend gern Unicode. Dies wäre an sich kein Problem, da man einem StreamWriter ja über dessen öffentliche Eigenschaft Encoding die Codierung der Daten vorgeben kann. Jedoch sind, warum auch immer, in den Bezeichnern der Datenpunkte Umlaute vorhanden. Diese können jedoch nicht einfach so in ASCII konvertiert werden, da sie dort nicht definiert sind. So kam schnell der Gedanke nach einem eigenen Konverter oder Filter auf.
Aber wie?

Möglichkeit 1 - Regular Expression Match
System.Text.RegularExpressions.Regex regex = 
     new System.Text.RegularExpressions.Regex( "[^\x00-\x7F]" );
 if ( regex.IsMatch( testString ) )
 {
     //Nicht-ASCII-Zeichen gefunden
 }
Mit dieser Regular Expression werden alle Zeichen gefunden, deren Byte-Repräsentation nicht im Bereich 00 bis 7F liegt. Man könnte nun im If-Block ein paar Methoden zur Ersetzung von beispielsweise 'ä' einsetzen. Allerdings werden dann nur diese Zeichen ersetzt, alle anderen müssen anderweitig behandelt werden. Dadurch wird der Programmablauf inkonsistent.
Alternativ könnten diese Zeichen nicht weiter beachtet werden. Dies würde dann entsprechende Lücken in der Ausgabe hinterlassen.
Wird der If-Block jedoch nicht angesprungen, ist der String garantiert frei von Nicht-ASCII-Zeichen.

Möglichkeit 2 - Regular Expression Grouping
Ändert man den regulären Ausdruck von oben ein wenig ab, kann man die gefundenen Zeichen gruppieren. Dies ermöglicht es, eine Match-Collection zu verwenden, die weitergehende Möglichkeiten bietet. Die Syntax für des regulären Ausdrucks für die Gruppierung wäre:
System.Text.RegularExpressions.Regex regex = 
    new System.Text.RegularExpressions.Regex( "(^\x00-\x7F)" );
System.Text.RegularExpressions.MatchCollection matches =
    regex.Matches( testString );
foreach ( System.Text.RegularExpressions.Match match in matches )
{
    //Nicht-ASCII-Zeichen-Gruppe gefunden
}
Dabei stellt das Objekt Match eine ganze Reihe nützlicher Funktionen bereit, so zum Beispiel die Position des Matches im Ursprungs-String oder die Länge des Matches. Es werden nämlich mit dieser Möglichkeit auch Gruppen wie im Beispiel "Hallööö Welt" die Gruppe "ööö" als ein zusammenhängender Treffer erkannt.

Möglichkeit 3 - Die Klasse Encoding
Die Klasse Encoding stellt verschiedene Möglichkeiten bereit, um mit Zeichen und Zeichenketten zu hantieren. Bei dem oben dargestellten Problem war dies mein erster Anlaufpunkt. Jedoch bin ich nach einigen Monaten C-Programmierung hier einem falschen Pferd aufgesessen :). Man beachte nachfolgende Zeile C#-Code und komme bitte nicht auf die Idee, dies irgendwo zu verwenden:
Encoding.ASCII.GetString( (byte[])testString, 0, testString.Length );
Die Methode GetString der Klasse Encoding.ASCII erwartet als ersten Parameter ein Byte-Array. Was würde man also in C machen? Richtig. Wie oben geschrieben, castet man seine Zeichenkette, eigentlich ja nur ein Char-Array in ein Byte-Array. Die Datentypen sind ja jeweils 1 Byte lang. 1 Byte? Ein Char in C#? Und da steckt der Fehler. In C# ist ein Char 2 Byte lang. Stichwort Unicode. Glücklicherweise meckert dies bereits der Compiler an.
Wie dem auch sei. Der Versuch mündete schließlich in folgendem Qullcode:
string testString = "Halööö Welt. Hähähäh!!!";
byte[] byteArray = Encoding.ASCII.GetBytes( testString );
Console.WriteLine( Encoding.ASCII.GetString( byteArray, 0, byteArray.Length ) );
Dieser Codeschnippsel spuckt dann, wie erwartet, einen ASCII-String aus: Hall??? Welt. H?H?H?!!! Wer damit leben kann...

Fazit
Glücklicher Weise übermittelte mir plötzlich ein Kollege die frohe Botschaft, dass die Bezeichner in den nächsten Tagen auf englische Bezeichner umgestellt werden. Also Umlaute ade. Das ist mir in dieser Situation gar nicht unpassend, da mir keine triviale Lösung für das Problem der Konvertierung eines Unicode-Strings in einen ASCII-String bekannt ist. Schließlich müssen einige Dinge beachtet werden, zum Beispiel die CurrentCulture, da wahrscheinlich ein ö in Deutschland einfach durch oe ersetzt werden kann. Ob das im türkischen ebenso möglich ist, weiß ich nicht.

Dieser Beitrag soll zum einen Anregungen geben, wie die Lösung eines solchen Problems angegangen werden kann. Zum anderen ist es ein Aufruf: Falls jemand dieses Problem schon einmal lösen musste, wäre ich (wahrscheinlich nicht ausschließlich) sehr dankbar, seinen Weg kennenzulernen.

Monday, April 07, 2008 9:02:49 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback

DreamSpark - Auffrischung

Heute kam ein Eintrag über DreamSpark vom TechNet Team Blog Austria in meinen Newsreader geflattert. Ich habe bereits am 19.02. darüber gebloggt. Aber leider hat sich seitdem nichts daran geändert, dass mehr als 90% (geschätzt, 24 Unis eingetragen, davon sind mir ca. 15 vollkommen unbekannt) aller deutschen Studenten nicht an diesem Programm teilnehmen können. Microsoft scheint dort leider auch keine Eile zu haben, etwas daran zu ändern. Hoffentlich war das nicht wieder solch eine schöne "Wir geben Software für umsonst ab"-Ankündigung, die dann direkt im Anschluss an die Veröffentlichung vergessen wird.

Monday, April 07, 2008 12:36:10 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Thursday, April 03, 2008

"Bloggen ohne Technorati zu nutzen? - Ja, wo kommen wir denn da hin?" ... In eine vorsichtigere Welt?

Dirk schreibt einen netten kleinen Eintrag in seinem Blog, der offensichtlich von der re:publica '08 inspiriert wurde. Dazu meine Antwort:

Ich war zwar nicht/bin nicht/werde nicht sein auf der re:publica, komme mir aber durch Dirks Eintrag so modern vor... :-)
Ich twittere auch nicht... Bin in keinem Social Network vertreten... und - fast schon unglaublich - ich bin ebenfalls nicht bei Technorati registriert ;-)

Und das schöne ist: Ich bin stolz drauf.

Arbeitskreis Vorratsdatenspeicherung

Thursday, April 03, 2008 2:36:40 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Sunday, March 30, 2008

Sender Policy Framework added for dotnetphen.com

Today I designed the SPF-record for my domain and sent it to my provider. Hopefully it is added to the dns the next days.

SPF stands for "sender policy framework" and is, simply said, a dns text-entry that specifies all mail server that are sending mail from a domain. For my domain this is for example "v=spf1 a mx ~all". This SPF record can be explained as:
  • v=spf1
    This identifies the TXT record as an SPF string.
  • a
    dotnetphen.com's IP address is 88.80.208.233 (vcvps1043.vcdns.de). That server is allowed to send mail from dotnetphen.com.
  • mx
    This wizard found 2 names for the MX servers for dotnetphen.com: mail and vcvps1043.vcdns.de (A single machine may go by more than one hostname. All of them are shown.). The servers behind those names are allowed to send mail from dotnetphen.com.
  • ~all
    SPF queries that do not match any other mechanism will return "softfail". Messages that are not sent from an approved server should still be accepted but may be subjected to greater scrutiny.

My mail server sends data with the hostname mail.dotnetphen.com, but my provider added two mx records to the dns. So we have to get rid of the one record that isn't used; we create a second spf entry that points to the active host. After that it has to look like this (in bind syntax):
dotnetphen.com. IN TXT "v=spf1 a mx ~all"
mail.dotnetphen.com. IN TXT "v=spf1 a -all"

The first entry specifies my mx-servers to be "ok", the second on specifies the host with the name mail.dotnetphen.com to be the mx record used to send mail.

To support admins during the sender policy framework setup process the SPF Project Site has a SPF Setup Wizard that is a great help to get a fast start.
Sunday, March 30, 2008 5:11:17 PM (W. Europe Daylight Time, UTC+02:00) #  Comments [0] | Trackback
# Saturday, March 29, 2008

CCC veröffentlicht Schäubles Fingerabdruck

Der Chaos Computer Club hat in der aktuellen Datenschleuder, dem CCC-eigenen Magazin, einen Fingerabdruck von Wolfgang Schäuble veröffentlich. Dabei beließ es der CCC nicht nur bei der Print-Veröffentlichung, sondern legte direkt eine Attrappe bei, mit der Aufforderung, diese möglichst oft (z.B. bei der Einreise in die USA) zu benutzen. Laut heise ist der CCC über einen Sympathisanten an den Fingerabdruck gelangt, der ein Glas, aus dem Schäuble während einer Podiumsdiskussion getrunken hatte, an den CCC weiterleitete.

Doch mit dem Bundesinnenminister gibt sich der CCC nicht zufrieden. In der Datenschleuder ist auch eine Wunschliste enthalten, auf der unter anderem Frau Bundeskanzler Merkel verzeichnet ist. Auch eine Anleitung, wie man einen Fingerabdruck sichert und dem CCC zukommen lässt, liegt der aktuellen Ausgabe der Datenschleuder bei.

Eine rechtlich eindeutige Bewertung der Aktion ist offenbar nicht möglich. Der CCC, der sich vor der Aktion beraten lies, geht nicht davon aus, dass es eine Handhabe durch die Veröffentlichung des Fingerabdrucks gäbe. Jedoch vertreten andere Anwälte (siehe hierzu den Artikel bei heise) die Auffassung, dass mit der Vervielfältigung durchaus eine Ordnungswidrigkeit oder gar eine Straftat vorliegt, Stichwort Datenschutz.

Eine sehr interessante Frage wirft heise noch auf: Darf der Staat millionenfach solche biometrischen Daten der Bürger erheben und intransparent nutzen, der einzelne Bürger jedoch nicht? Ich persönlich finde das eine hervorragende Aktion, unserem Bundesparanoiaminister zu zeigen, dass er einige Punkte seiner ausufernden Überwachungshisterie einmal überdenken sollte. Nicht überall, wo Terror draufsteht, ist auch Gefahr drin.

Saturday, March 29, 2008 4:52:00 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Friday, March 28, 2008

DasBlog Mobile support

Today I was browsing around the internet a bit with my mobile phone and just wanted to check what was going on in my logs as I recognized that dasBlog has a great support for mobile browsers. So, quite a bit puzzled at first, I afterwards asked myself how I could miss that feature. So I checked it out and it seems to be in dasBlog since version 1.9. Really darn cool feature. Again one more point for this great bloging engine.

In consideration on what is going on on the dasBlog mailing list I hope that there will be a future for dasBlog or something similar to this (dasText or whatever is it called). I hope that I then can take some time to also do some work for the new project.

Friday, March 28, 2008 7:55:29 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Friday, March 21, 2008

News about TrueCrypt vulnerability

A little late, but I hope that still in time. Recently the TrueCrypt Devs reacted on the vulnerability report. From their point of view the author of the report hasn't analyzed the source code very well. He has stated the wrong routines and furthermore TC is just not able to encrypt the system partition on Windows 2000 computers. Nevertheless they acknowledged the problem with some storage drivers.
Caused by this problems the TrueCrypt-Team is currently thinking about filing a complaint about Microsoft to publish the hibernation API.

Friday, March 21, 2008 3:23:54 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback
# Monday, March 17, 2008

Für ein Morgen in Freiheit

Meine erste Demo als Teil des Arbeitskreises Vorratsdatenspeicherung, und meine erste bewusst besuchte Demo.

Leider hinke ich mit meinem Bericht etwas hinterher, sodass mir ein wenig die Themen ausgegangen sind. Vieles wurde bereits auf den Mailinglisten des Arbeitskreises Vorratsdatenspeicherung diskutiert, die anderen beteiligten Organisationen werden wahrscheinlich ebenso einiges thematisiert haben, sodass ich dies hier nicht noch einmal alles aufgreifen möchte. Deshalb bleibt mir eigentlich nur noch die Bekanntgabe meiner FEMIF-Galerie. Dies sind ein paar Eindrücke aus der Mitte der Demo, wie sie meines Erachtens nach bisher noch nicht häufig veröffentlicht wurden.

Eine schöne Übersicht über bisherige Reaktionen im Netz gibt es übrigens beim Volkszertreter.

Monday, March 17, 2008 10:32:05 PM (W. Europe Standard Time, UTC+01:00) #  Comments [0] | Trackback