Slippery When Wet #6: XPath and the Default Namespace

18. Mai 2012

I proudly present to you the sixth in a infinite number of posts of “Slippery When Wet.” In these posts I show you a little bastard I stumbled on.

Recently, I tried to work on a XmlDocument with XPath in C#. To get the right expressions easily I used the XML Spy from Altova. As soon as I got the right XPath expressions I started Visual Studio to work in my .NET Application. But here, the only expression that worked was “/*”. According to the .NET Documentation the expressions should work, but they didn’t.

So I tried another XML file, one from the examples in the .NET Documentation of XPath. And with this file the (corresponding) expressions worked as expected. So I searched the difference of the two XML files. After a short time I found the relevant difference: The file that worked had no namespace defined, whereas the non-working file had two namespaces. One namespace with a prefix (xmlns:prefix=”URI”) and a default namespaces (xmlns=”URI”).

As I got the reason for my problem I had to look for a solution. A little bit of googling brought me the solution. I had to add the default namespace to the NamespaceManager with a prefix and then use the XPath expressions with the defined prefix.

In .NET 3.5 Microsoft introduced the XDocument class as a alternative (or a replacement) for XmlDocument. The C# code differs a little bit depending on the used class. I found a description when using the XmlDocument class and two when using the XDocument class.

With the added prefix for the default namespace my XPath expressions worked as expected.

Visual T# (TSharp) – Allererster Schritt

23. April 2012

Pretty Objects hat Visual T# in der Version 3.0 veröffentlicht. Zeit, dieses Tool einmal näher anzuschauen.

Die Installation erfolgt über ein Setup und muss hier wohl nicht weiter beschrieben werden.

Ich starte das Ganze mit einem kleinen Vergleich zwischen dem Testing Framework von Microsoft und Visual T# an einem einfachen Beispiel. Dieses Beispiel hatte ich vor einiger Zeit erstellt, um NUnit vorzustellen.

Die zu testende Bibliothek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Calculator
{
    public class Calc
    {
        public byte Add(byte b1, byte b2)
        {
            int res = b1 + b2;
            if (res > Byte.MaxValue)
            {
                throw new OverflowException();
            }

            return (byte)res;
        }
    }
}

Die Funktion beinhaltet bereits die Überlauf-Absicherung für den zweiten Test, ansonsten nicht viel spannendes an diesem Code…

Erster Test mit Microsoft Test Framework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace CalculatorMSTest
{
    [TestClass]
    public class CalcTest
    {
        [TestMethod]
        public void AddTest()
        {
            Calc calc = new Calc();

            byte sum = calc.Add(12, 26);

            Assert.AreEqual(38, sum);
        }
    }
}

Auch hier gibt es nicht viel spannendes: Initialisierung (Zeile 9), Ausführung (Zeile 11) und Validierung (Zeile 13) wie wahrscheinlich schon tausend mal gesehen.

Der erste Test mit T#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace CalculatorTSharp
{
  testclass CalculatorTest for Calc
  {
    test Add( byte, byte )
    {
      Calc calc = new Calc();

      runtest byte sum = calc.Add(12, 26);

      assert sum == 38;      
    }
  }
}

Auf den ersten Blick könnte man meinen, es sei auch normaler C#-Code, aber auf den zweiten Blick fallen dann die Unterschiede auf:

  1. testclass anstelle von class (Zeile 4)
    Mit dem Keyword testclass wird angegeben, dass es sich um eine Klasse für Tests handelt.
  2. test als Bezeichner für Testmethode (Zeile 6)
    Das Keyword test bezeichnet eine Testmethode. Mit dem nachfolgenden Add(byte, byte) kann angegeben werden, welche Methode mit diesem Test überprüft werden soll. Dies ist aber optional.
  3. Deklarierung des Stimuli mit runtest (Zeile 10)
    Die Anweisung, mit welcher der Stimuli des Tests ausgelöst wird, wird mit runtest bezeichnet. Somit ist klar ersichtlich, was Initialisierung und was Ausführung der Tests ist.
  4. Überprüfung mit Keyword assert. (Zeile 12)
    Für die Überprüfung gibt es das Keyword assert und nicht ein Objekt wie in den bekannten Testing Frameworks
  5. keine Attribute
    Da T# extra für Tests entwickelt wurde sind keine zusätzlichen Attribute nötig (siehe auch Punkt 1).

Eine etwas andere Syntax aber keine spektakulären Neuerungen. Ein paar eingesparte Attribute, sonst etwa der gleiche Aufwand. Bisher also kein richtiger Grund, eine neue Syntax zu lernen.

Schauen wir und noch einen zweiten Test an:

Zweiter Test mit Microsoft Test Framework

1
2
3
4
5
6
7
        [TestMethod, ExpectedException(typeof(System.OverflowException))]
        public void BigAddTest()
        {
            Calc calc = new Calc();

            calc.Add(150, 230);
        }

Der zweite Test validiert die Überlauf-Prüfung. Die erwartete Ausnahme wird als Attribut (Zeile 1) angegeben.

Der zweite Test mit T#

1
2
3
4
5
6
7
8
    test Add( byte a, byte b)
    {
      Calc calc = new Calc();

      runtest calc.Add(150, 230);

      assert thrown System.OverflowException;      
    }

Der wichtigste Unterschied betrifft die Ausnahme. Bei T# wird das Auftreten der Ausnahme ebenfalls mit einem assert Befehl validiert. Der Test folgt somit dem bekannten Schema Initialisierung (Zeile 3), Ausführung (Zeile 5) und Validierung (Zeile 7).

In diesem Beispiel haben wir aus meiner Sicht einen Mehrwert mit T#: Das Schema wird beibehalten, während bei Tests mit dem Microsoft Test Framework die Validierung in ein Attribut an den Anfang des Tests geschoben wird.

Ausblick:
T# bietet noch weitere Vorteile, die ich in einem weiteren Artikel noch beleuchten möchte.

Piwik in Version 1.7.1 erschienen

26. Februar 2012

Schlag auf Schlag geht es weiter, 10 Tage nach dem Release 1.7 ist schon die Version 1.7.1 von Piwik veröffentlicht worden.

In diesem Release wurde ein neues Feature eingebaut: Man kann nun in jedem Report auswählen, wie viele Einträge in der Liste erscheinen. Die dabei gewählten Werte werden gespeichert, so dass beim nächsten Besuch wieder die gewünschte Anzahl angezeigt wird.

In den 15 abgearbeiteten Tickets wurden neben dem oben erwähnten neuen Feature auch Fehler behoben.

Achtung: Das Update hat zur Folge, dass das archive.php Script neu einen Parameter verlangt, wenn es aus einem cronjob gestartet wird. Ein bereits eingerichteter cronjob muss deshalb angepasst werden.

Piwik in Version 1.7 erschienen

17. Februar 2012

Vier Monate nach dem Release 1.6 ist die Version 1.7 von Piwik veröffentlicht worden.

Aus meiner Sicht eine der wichtigsten Neuerungen sind die Grafiken, die nun in den generierten HTML- und PDF- Reports möglich sind.

Es wurden aber auch neue Auswertungen zur Verfügung gestellt, wie z.B. der Loyalty report oder der Recency report.

Die Darstellung des Dashboards kann nun konfiguriert werden. So kann die Darstellung z.B. zwei- oder vierspaltig sein anstelle der standardmässigen drei Spalten.

In den 99 abgearbeiteten Tickets wurden neben den verschiedenen Neuerungen und Verbesserungen auch Fehler behoben und Sicherheitslücken geschlossen.

An dieser Stelle einmal ein grosses Dankeschön an das Piwik Team und allen anderen, die zu Piwik beigetragen haben!

Wieviel sind 72 Brontobytes?

07. Februar 2012

In einer Pressemeldung in der iX zum Dateisystem GlusterFS bin ich über die maximalen Grösse von 72 Brontobytes gestolpert. Bronto(-bytes) hatte ich bis anhin noch nie gehört. Als offizieller SI-Einheitenpräfix existiert dieser Begriff (noch) nicht, weitere Recherchen ergaben aber, dass es sich um das Präfix für 1027 (oder auch hier) handelt.
Solche unvorstellbar grossen Zahlen schreien nach einem Vergleich, um sie fassbarer zu machen.

Die zur Zeit grössten erhältlichen Festplatten fassen 4 Terabyte. Somit müssten wir 18 * 1015 Festplatten einsetzen um das Dateisystem an das Limit zu bringen:

(72 * 1027) / (4 * 1012) = 18 * 1015

Wenn wir nun Server einsetzen, in denen wir auf einer Bauhöhe von 2 Units 12 Festplatten benutzen können und ein herkömmliches Rack mit 42 Units einsetzen können wir in einem Rack 21 Server einsetzen. Das Rack benötigt eine Standfläche von 0,6 m2. Dann benötigen wir für alle Racks (Seite an Seite und Tür an Tür) 42 * 106 km2 Standfläche:

(18 * 1015) / (12 * 21) * 0.6 m2 = 42 * 1012 m2 = 42 * 106 km2

Die Schweiz hat eine Fläche von ca. 42’000 km2. Daraus folgt, dass wir 1000 mal die Fläche der Schweiz benötigen würden, um alle Server aufzustellen.

Europa hat eine Fläche von 10,18 * 106 km2. Demzufolge wäre mehr als 4 mal die Fläche von Europa nötig für alle Server.

Zur Zeit wäre das Ausreizen des Dateisystems also noch ein Platzproblem, auch bei einem durchgängig vierstöckigen Rechenzentrum würde ganz Europa durch das Rechenzenter bedeckt.

Piwik in c’t 4/2012

05. Februar 2012

Die aktuelle c’t (Ausgabe 4/2012) beinhaltet den Artikel “Tiefen-Analyse” zum Thema Web-Analytics. Er behandelt zum einen Google Analytics, stellt aber auch verschiedene komerzielle und freie Alternativen vor, unter anderem auch Piwik. Daneben werden aber auch noch Heatmap-Dienste und -Programme vorgestellt. Dabei handelt es sich um Auswertungen, auf welche Elemente der Webseite die Benutzer am Häufigsten klicken. So können Schwachstellen der Webseite (z.B. schlecht erkennbare Links oder Elemente, die von Benutzern als Links wahrgenommen werden, aber keine Links sind) noch besser erkannt werden.
Der Artikel ist keine umfassende Marktanalyse und auch kein detaillierter Test, gibt aber einen guten Überblick über verschiedene Dienste und spricht auch die Datenschutzproblematik an.

Rekursiv vs. Iterativ

29. Januar 2012

In der dotnetpro 8/2011 hat Ralp Westphal im Artikel “Aus Baum mach Fluss” zum Einstieg die Fakultätsberechnung in der rekursiven und in der iterativen Variante gezeigt. Seiner Meinung nach ist die iterative Variante einfacher zu verstehen, besonders für nicht-Mathematiker.
Ich fragte mich dann, welche Variante ist für den Computer einfacher zu verstehen, d.h. welche Variante ist performanter? Oder ist es egal, optimiert der Compiler schon so weit, dass beide Varianten in etwa gleich schnell sind?

Ich habe ein kleines Programm geschrieben, dass die Fakultät für verschiedene Werte mehrmals berechnet, um messbare Werte zu erhalten.
Hier die Resultate:

Factorial recursive and iterative
---------------------------------

10!
Recursive: 00:00:00.0390023
Iterative: 00:00:00.0220012

100!
Recursive: 00:00:00.2940168
Iterative: 00:00:00.1720099

1000!
Recursive: 00:00:02.5131437
Iterative: 00:00:01.0270588

10000!
Recursive: 00:00:25.0624335
Iterative: 00:00:09.4535407

Die rekursive Variante braucht also etwa 2.5 mal so lang wie die iterative. Und bei grossen Fakultäten kommt noch ein weiteres Problem hinzu: Es wird eine StackOverflowException geworfen, da jeder Rekursionsschritt einen Funktionsaufruf zur Folge hat, der einen Teil des Stacks beansprucht.

Fazit:
Der iterative Ansatz ist (mindestens in diesem Fall) auch für den Computer “einfacher zu verstehen”. Neben der besseren Performance ist aber auch die gebannte Gefahr des Stack Overflows ein wichtiger Grund, die iterative Varinate vorzuziehen.

Factorial Source Code

Zeitgeist 2011 reloaded: Suchmaschinen

20. Januar 2012

Im Artikel Zeitgeist 2011 bin ich noch eine wichtige Statistik schuldig geblieben (die man aber bei Googles Zeitgeist sicher nicht finden wird): Von welchen Suchmaschinen oder anderen Quellen kamen die Zugriffe?

Suchmaschinen

Hier die Liste der wichtigsten Suchmaschinen:

Rang Webseite Blog
1 Google Google
2 Bing Google Images
3 Yahoo! Bing

Wahrscheinlich für niemanden überraschend ist Google sowohl bei der Webseite als auch beim Blog an erster Stelle.

Google hat dabei eine erdrückende Übermacht, beim Blog hat die Google Bildersuche als einzige noch einen wirklich sichtbaren Anteil.

Suchmaschinen-Marktanteil Web 2011

Suchmaschinen-Marktanteil Web 2011

Suchmaschinen-Marktanteil Blog 2011

Suchmaschinen-Marktanteil Blog 2011

Diese Übermacht ist bereits seit der Umstellung auf Piwik so, die entsprechenden Grafiken, wie ich sie in Zeitgeist revisited erstellt hatte, habe ich mir deshalb erspart.

Verweise

Hier die Liste der wichtigsten Domänen, die auf meine Webseiten verlinken:

Rang Webseite Blog
1 nsis.sourceforge.net www.rolandbaer.ch
2 de.wikipedia.org www.google.com
3 forum.computerbild.de www.google.de
4 www.google.de www.facebook.com
5 blog.rolandbaer.ch www.google.at

Aus dieser Tabelle kann ich einige interessante Schlüsse ziehen:

  1. Das ‘interne Marketing’ zwischen Webseite und Blog ist einseitig. Das Blog erhält viel mehr Traffic von der Webseite als umgekehrt (nicht nur in der Rangliste, sondern auch in absoluten Zahlen). Wenn man die beiden Seiten betrachtet wird auch schnell klar warum: Auf der Webseite ist das Blog besser sichtbar als auf dem Blog der Link zur Webseite. Da besteht sicher noch optimierungspotential.
  2. Das NSIS-Tutorial auf meiner Webseite ist der Traffic-Bringer
  3. Der Einsatz des Plugins Add Link to Facebook zahlt sich aus.

Fazit

Neben den Statistiken und den schönen Grafiken können mit der Analyse mit Piwik auch Schwachstellen der Webseite erkannt werden. Dies gibt Ansporn, Verbesserungen zu planen und vorzunehmen. Dabei kann der Fokus auf Google bleiben, solange die anderen Suchmaschinen noch keinen nennenswerten Marktanteil haben. Dass sich dies im Jahr 2012 ändert würde ich aber eher bezweifeln.

Zeitgeist revisited: A Browsers History

08. Januar 2012

In meiner Zeitgeist-Auswertung habe ich auch die Marktanteile der Browser dargestellt. Aus Neugier wollte ich wissen, ob sich der Marktanteil eines Browsers stark verändert hat. Dazu habe ich die Zugriffe auf meine Webseite seit der Umstellung auf Piwik ausgewertet:

Browser Marktanteile April 2010 - Dezember 2011


Grosse Verschiebungen sind nicht zu beobachten. Beim Internet Explorer ist ein leichter Abwärtstrend auszumachen, die Webkit-Familie kann diese Schwäche zu einer kleinen Marktanteils-Steigerung nutzen.

Für die allgemein als die grossen drei angesehenen Browser Firefox, Chrome und Internet Explorer habe ich noch Grafiken erstellt, die die verschiedenen Versionen der Browser darstellen. Daraus kann man die Aktualisierungen schön sehen. Als erstes der Internet Explorer:

Internet Explorer Versionen April 2010 - Dezember 2011

Internet Explorer Versionen April 2010 - Dezember 2011


Man kann schön sehen, dass der Browser nicht allzu oft überarbeitet wird, mehrere Versionen über lange Zeit verwendet werden und deshalb alte Versionen nicht so schnell ‘aussterben’.

Als Gegensatz dazu Chrome von Google:

Chrome Versionen April 2010 - Dezember 2011

Chrome Versionen April 2010 - Dezember 2011


Die grosse Legende zeigt schon an, dass die Version sehr oft ändert, der Browser also fleissig überarbeitet wird. Der automatische Update-Mechanismus führt auch dazu, dass der Browser schnell aktualisiert wird und deshalb kaum alte Versionen im Umlauf sind.

Beim Firefox sieht man die Philosophie-Umstellung recht schön:

Firefox Versionen April 2010 - Dezember 2011

Firefox Versionen April 2010 - Dezember 2011


Bis im ersten Quartal des letzten Jahres wurde die Version 3.6 wohl weiterentwickelt, dies zeigte sich aber nur in der dritten Versions-Nummer (3.6.x). Ab der Version 4 wurde dann die Google-Philosophie der häufigen Updates mit Versionsnummer-Erhöhung an der ersten Stelle übernommen. Diese werden nun auch automatisch aktualisiert, so dass die Versionen 4 bis 7 kaum mehr im Einsatz sind.
Man sieht auch, dass etwa 20% der Besucher bei diesem “Update-Wahnsinn” nicht mitmachen wollen und bei der Version 3.6 geblieben sind.

Die Tendenzen entsprechen auch den bei browser-statistik.de gezeigten Statistiken der Browser-Versionen (Achtung: umgekehrte Darstellung, neue Versionen werden unten hinzugefügt).

Zeitgeist 2011

06. Januar 2012

Inspiriert von Googles Zeitgeist veröffentliche ich hier ein paar Statistiken aus meinen Piwik-Analysen des vergangenen Jahres.

Suchbegriffe

Rang Webseite Blog
1 nsis tutorial slippery when wet
2 nsis nsis package including subdirectory
3 nsi deleteregkey piwik vs awstats

Browser

Wie aus den Grafiken unten und der Tabelle ersichtlich ist auf meinen Seiten der Firefox klarer Marktführer.

Browser-Marktanteil Web 2011

Browser-Marktanteil Web 2011


Browser-Marktanteil Blog 2011

Browser-Marktanteil Blog 2011

Browser-Familie Webseite (%) Blog (%)
Gecko (Firefox) 63.75 57.00
Trident (IE) 18.58 23.99
WebKit (Safari) 10.99 15.63
Presto (Opera) 6.52 2.63
KHTML (Konqueror) 0.07 0.42
unbekannt 0.09 0.33