Patrick: Wo ist mein Denkfehler?

Hallo PERLer!

Nach dem mich die Suche daran, wie ich mein Browser dazu bringe, mir wieder den Quelltext anzuzeigen (http://www.teamone.de/selfaktuell/forum/?m=132817&t=25481), fast einen halben Tag "Forschung" gekostet hat, forschte ich gestern abend weiter an meinem Counter (Link hier oben).

Und da wollen mir die Ergebnisse, die ich bei der Browserauswertung erziele, nicht in den Kopf (nein, nein, nicht deswegen, weil Netsi so schlecht abschneidet *gg*).

Also wollen wir es mal durchgehen. So sieht eine Zeile meiner Counterlogfiles aus:

Datum*Uhrzeit*Host*IP*UserAgent*Referer*Bla*Foo*UndNochwas*

Sie wird gesplittet und ein Array @UserAgent erstellt.

Wenn ich im Array (foreach $UserAgent (@UserAgent) etc...) nach der Zeichenfolge MSIE suche, dann wird jeder String, in welcher die Zeichenfolge vorkommt, in einem weiteren Array @MSIE gespeichert. Die Array-Länge ist dann zwangsläufig die Anzahl der UserAgents-Strings, in welcher die abgefragte Zeichenfolge "MSIE" vorkommt, also entspricht der Anzahl der IE-Nutzer. Soweit logisch, nee?

Gut, dann verfeinere ich die Sache und mache nach dem gleichen Muster 7 Einzelsuchen nach MSIE 5.5, MSIE 5.0, MSIE 5.01, MSIE 4.0, MSIE 4.01, MSIE 4.5 (MAC) und MSIE 6.0b. Wenn ich keine Unterversion des IE ausgelassen habe (hier habe ich absichtlich MSIE 3.0 ausgelassen) dürfte die Summe der Einzelergebnisse gleich sein, wie das Ergebnis der "globalen" Suche nach MSIE. Denn in z.B. der Zeichenfolge "MSIE 5.5" ist ja bereits die Zeichenfolge "MSIE" enthalten.

Und eben das differiert. Und zwar ist die Summe der Einzelsuchen höher als das Ergebnis der Suche nach "nur" MSIE!

<Ich benutze mittlerweile nach einem Tipp von CK Hashes, da die Arrays speicherintensiv sind und die UserAgent-Strings ja ellenlang sind, was bei beispielsweise über 24000 Logdateieinträgen im April zu Speicherprobs führt. Aber da es auf dem lokalen Webserver geht, habe ich heute nacht die Ergebnisse verglichen: Sie sind gleich, ob die Hashes oder die Arrays ausgewertet werden.>

Also, wo ist mein Denkfehler? Hier das Beispiel live: http://atomic-eggs.com/cgi-bin/whocannotcount.cgi <-- hier wird Mai_2001.txt ausgewertet.

Patrick
<hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

  1. Huhu Patrick,

    MSIE 5.0, MSIE 5.01

    ohne mich naeher damit beschaeftigt zu haben:
    zaehlst du 'MSIE 5.0' vielleicht doppelt? (Zaehlst du per pattern match?)

    Viele Gruesse,

    n.d.p., muede und schreibfaul ;)

    1. Hallo n.d.!

      n.d.p., muede und schreibfaul ;)

      jaja, habe schon gedacht, Deine eMail-Addy wäre ein Fake, oder die eMails an diese Adresse landen gleich im Trash oder so... Aber denk dran, heute zahle ich keinen Pfennig!

      Patrick
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

      1. Hallo Patrick,

        jaja, habe schon gedacht, Deine eMail-Addy wäre ein Fake, oder die eMails an diese Adresse landen gleich im Trash oder so...

        wusstest du noch nicht, dass sich nd laengst hat klonen lassen und jeder Klon seine eigene Mailaddi besitzt? Wie koennte er sonst mit so wenig Schlaf auskommen? *g*

        Gruesslis
         Kess

  2. Re!

    Und eben das differiert. Und zwar ist die Summe der Einzelsuchen höher als das Ergebnis der Suche nach "nur" MSIE!
    Also, wo ist mein Denkfehler? Hier das Beispiel live: http://atomic-eggs.com/cgi-bin/whocannotcount.cgi <-- hier wird Mai_2001.txt ausgewertet.

    Ich glaube, ich hab's...

    Es liegt an denen, die ihr User Agent um eigene Meldungen ergänzen (wie ich *gg*) und dabei Fehler machen... Habe eben folgende Zeile gefunden:

    Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000; trs technologies are us ag))

    Klar, bei der Suche nach MSIE wird diese nur einmal gefunden. Aber sie wird einmal auch bei der Suche nach MSIE 5.5 aber auch ein weiteres Mal bei der Suche nach MSIE 5.0 ...

    Also müsste noch eine Zeile in der Tabelle sein, die nach dem gleichem Muster gestrickt ist, mom (suche geh)... Hmmh, die ist es nicht: Mozilla/4.0 (compatible; MSIE 5.5; Swen; Swen Wacker; Windows 98) *gg*

    Naja, Problem erkannt, Lösung naht...!

    Patrick
    <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

    1. Re!

      Nachdem die Ursache des im Ausgangsposting geschilderten Problems nun gefunden ist, werde ich eine Lösung erarbeiten.

      Aber wenn wir schon mal bei UserAgents sind, wie verschieden meldet sich Opera? Ich habe bereits folgende unterschiedliche Möglichkeiten in der Mai-Datei gefunden:

      • Opera/5.11 (Windows 2000; U)  [de]
      • Mozilla/4.73 (Windows 98; U) Opera 4.02  [en]
      • Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 5.11  [en]
      • Mozilla/3.0 (Windows NT 4.0; U) Opera 5.02  [en]

      Also meldet sich Opera mal anstelle von Mozilla zu Beginn der Zeichenkette, mal als Netscape-Opera, mal als IE-Opera ;-)

      Ist also überall wirklich Opera, wo Opera (im UserAgent) drin steht?

      Patrick
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

      1. Hallo Patrick,

        Ist also überall wirklich Opera, wo Opera (im UserAgent) drin steht?

        ja.

        MfG, Stefan - Opera/5.11 (Windows ME; U)  [en]
        --
        Opera - the fastest browser on earth! - http://www.opera.com/

  3. Hallo Patrick,

    Sieh dir mal die Zeile 218 an (den zweiten Eintrag habe ich nicht gefunden).
    Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000; trs technologies are us ag))

    Durch Dein Abfragekonstrukt ergibt sich sowas eben.
    Vielleicht änderst Du Dein aufdröseln in so etwas:
    <schnellschuss>
    %count = ();
    for (%Browser)
      {
      if(/compatible; (MSIE \d.\d+);/)
        {
        $count{$1}++;
        $count{'IEGesamt'}++;
        }
      }
    </schnellschuss>

    Grüße
      Klaus

    1. Hallo Klaus!

      %count = ();
      for (%Browser)
        {
        if(/compatible; (MSIE \d.\d+);/)
          {
          $count{$1}++;
          $count{'IEGesamt'}++;
          }
        }
      </schnellschuss>

      Ich verstehe die Abfrage hier nicht ganz. Soll das heißen, dass hier nur ein Mal im UserAgent-String nach der Zeichenfolge MSIE x.x gesucht werden soll?

      Das Ergebnis ist: 549 (http://atomic-eggs.com/cgi-bin/whocannotcount.cgi, ganz unten). Hier wird also nicht die Häufigkeit des Vorkommens der einzelnen Strings gezählt, sondern nur die Anzahl der unterschiedlichen User-Agents, bereinigt von denen, die doppelt die Zeichenfolge "MSIE x.x" enthalten?!?

      Denn die Tabelle zählt 586 Zeilen. Die Zahl 549 könnte daher hinkommen.

      Patrick
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

      1. Hallo Patrick,

        da ist mir natürlich wieder was durch die Lappen gegangen:-(
        Immer diese Schnellschußaktionen. Ich berücksichte ja keine Versionen alá 6.0a.

        Bevor ich mich da noch mal in irgendwelche Abenteuer einlasse, es gibt da ein Modul, das Du Dir ansehen solltes:
        http://www.cpan.org/authors/id/I/IV/IVAN/HTTP-Headers-UserAgent-2.00.tar.gz

        Entweder Du nimmst es so wie es ist, oder Du machst davon 'Anleihen' für eine eigene Auswertung.

        Grüße
          Klaus

      2. Hallo Patrick,

        <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

        auch so ein Schnellschuß: http://www.mfk.at/source/atomic-eggs.zip

        Ich hab noch eine Menge Probleme damit (GroßKleinschreibung und das ganze Alphabeth ist noch nicht drin), aber URIs sollte es schon können;-) (großteils)

        <sample>
        use Atomic::Eggs;

        print Atomic::Eggs::ToAtomic('hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash');
        print Atomic::Eggs::ToEggs('http://www.mfk.at/source/atomic-eggs.zip');
        </sample>

        Schönen Sonnatg noch
          Klaus

        1. Hallo Klaus!

          Vielen Dank, aber ich kann mit beiden Modulen (mit Modulen überhaupt) im Moment noch wenig anfangen. Das Eggs-Modul soll wohl URLs in Anti-Du-nervst-Links (so nennt sich mein als Signatur benutzter "Link") und umgekehrt, nur einbauen konnte ich es nicht.

          Trotzdem hat sich ein Blick in die UserAgent.pm gelohnt: Ich habe nun drei kleine Sripte hochgeladen, je für IE, Netscape und Opera.

          http://atomic-eggs.com/cgi-bin/MSIE_Brow.cgi
          http://atomic-eggs.com/cgi-bin/Netsi_Brow.cgi
          http://atomic-eggs.com/cgi-bin/Opera_Brow.cgi

          Die Scripte werde ich online lassen und erweitern, wenn mir andere Kennungen auffallen, so als kleiner Service, für die wo das interessiert, wie man sagt ;-)

          Übrigens: ich habe noch einen "MSIE 6.00; Windows XP" entdeckt, sowie in der Juni-Datei einen MSIE 7.0 !!! Da ich diese nicht abgefragt hatte, fehlten die mir natürlich :-)

          Ach ja, und jetzt stimmt es hier wieder: http://atomic-eggs.com/cgi-bin/whocannotcount.cgi

          Patrick
          <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>

          1. Hallo Klaus!

            Das Eggs-Modul soll wohl URLs in Anti-Du-nervst-Links (so nennt sich mein als Signatur benutzter "Link") und umgekehrt,

            richtig;-)

            [...] nur einbauen konnte ich es nicht.

            hier wieder einmal die lapidare Bemerkung:
              perldoc perlmodinstall
              perldoc perlmod

            kurz:
            Solange es sich um keine Module, welche irgendwelchen C-Kram benötigen, handelt, kannst Du die Dateien, welche die endung .pm besitzen, meist einfach Lib-verzeichnis Deiner Perl-Installation kopieren.
            Dabei ist zu beachten, daß das Modul auch in einem Unterordner gehören kann, wenn der Package-Name es so will.
            Ein Package ist definiert mit:
            package Kategorie::Modul
            (meist am Anfang der Datei Modul.pm)
            Deshalb gehört es in den Ordner
            /pfad/zur/Perl/site/lib/Kategorie/
            (wo dieser wirklich ist, sagt dir perl-V, und am Ende gibts eine Ausgabe aller Verzeichnisse, in welchen standardmäßig nach Moduln gesucht wird)

            Alternativ kannst Du auch ein eigenes VErzeichnis in einem Perl-Script dazudefinieren:
            use lib '/pfad/zur/eigenen/lib/';

            Naja, ganz so kurz ist es nun doch wieder nicht geworden;-)

            Trotzdem hat sich ein Blick in die UserAgent.pm gelohnt: Ich habe nun drei kleine Sripte hochgeladen, je für IE, Netscape und Opera.

            Besser gut abgeschrieben als schlecht selber machen:-)

            Ach ja, und jetzt stimmt es hier wieder: http://atomic-eggs.com/cgi-bin/whocannotcount.cgi

            Jeden Tag mit einem positven Erlebnis abschliessen erhält die Lust an der Sache, ist mein Motto.

            Grüße
              Klaus