Malcolm Beck´s: Focus auf Adressleiste setzen

0 47

Focus auf Adressleiste setzen

Malcolm Beck´s
  • javascript
  1. 0
    Der Martin
    1. 0
      Malcolm Beck´s
      1. 0
        Der Martin
        1. 0
          Malcolm Beck´s
  2. 0

    Ständig wird max_execution_time ans Limit gebracht

    Malcolm Beck´s
    • php
    1. 0
      dedlfix
      1. 0
        Malcolm Beck´s
        1. 0
          Gunther
          1. 0
            Malcolm Beck´s
    2. 0

      Mögliche Ursache „filemtime“

      Malcolm Beck´s
      1. 0
        dedlfix
        1. 0
          Malcolm Beck´s
    3. 0
      Malcolm Beck´s
  3. 0
    misterunknown
    1. 0
      Malcolm Beck´s
      1. 0
        misterunknown
      2. 0
        dedlfix
        1. 0
          Malcolm Beck´s
          1. 0
            misterunknown
          2. 2
            dedlfix
    2. 0
      Malcolm Beck´s
  4. 0

    Fehler: Premature end of script headers

    Malcolm Beck´s
    • webserver
    1. 1
      dedlfix
      1. 0
        Malcolm Beck´s
        1. 0
          MudGuard
          1. 0
            Malcolm Beck´s
        2. 1
          dedlfix
          1. 0
            Malcolm Beck´s
            1. 1
              dedlfix
              1. 0
                Malcolm Beck´s
                1. 0
                  dedlfix
                2. 0
                  Malcolm Beck´s
                  1. 0
                    dedlfix
                    1. 0
                      Malcolm Beck´s
                      1. 0
                        Malcolm Beck´s
                        1. 0
                          dedlfix
                          1. 0
                            Malcolm Beck´s
                            1. 0
                              Malcolm Beck´s
                            2. 0
                              dedlfix
                              1. 0
                                Malcolm Beck´s
                                1. 0
                                  dedlfix
                                  1. 0
                                    Malcolm Beck´s
          2. 0
            Malcolm Beck´s
            1. 0
              dedlfix
    2. 0
      Malcolm Beck´s
  5. 0

    Hoster-Vergleich, Strato vs. 1und1, Adressleiste „gelöst“

    Malcolm Beck´s
    • webserver

હેલો

kann man mittels Javascript den „Focus“ auf die Adressleiste des Browsers setzen, wenn eine Seite aufgerufen wird? Ich will, das wenn ich meine Seite aufrufe (oder auch bei einem neuen tab, wo die Seite geöffnet wird), den Focus auf der Adressleiste haben. Idealerweise wird das Adressfeld gleichzeitig geleert. Geht das irgendwie?

બાય

--
 .
..:
  1. Hallo,

    kann man mittels Javascript den „Focus“ auf die Adressleiste des Browsers setzen, wenn eine Seite aufgerufen wird? Ich will, das wenn ich meine Seite aufrufe (oder auch bei einem neuen tab, wo die Seite geöffnet wird), den Focus auf der Adressleiste haben. Idealerweise wird das Adressfeld gleichzeitig geleert. Geht das irgendwie?

    meines Wissens nicht.

    Allerdings zeigt der Internet Explorer (IE8 mit Defaulteinstellungen), den ich in den letzten paar Tagen ab und zu anstatt eines Browsers verwenden musste, beim Aufruf der Forumshauptseite manchmal genau dieses Verhalten. Und das ist sehr lästig, denn wenn man dann mit den Pfeiltasten anfängt zu scrollen, geht der Versuch ins Leere - bzw. man scrollt nur durch die History der Adressleiste.

    Was hast du im Sinn, dass dir sowas vorteilhaft erscheint?

    Ciao,
     Martin

    --
    Wenn alle das täten, wass sie mich können,
    käme ich gar nicht mehr zum Sitzen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. હેલો

      Was hast du im Sinn, dass dir sowas vorteilhaft erscheint?

      Ich habe mir hier eine Art kleine App geschrieben, die ich als Alternative für Foxtab oder Speeddial benutze. Bei Foxtab, oder Speeddial ist es so, dass wenn du die Programme öffnest (Startseite, beim Browserstart oder neue Tab), die Adressleiste fokussiert wird. So kann ich nach Aufruf eines neuen Tabs direkt die Adressleiste für „Suchen“ verwenden, ohne vorher rein zuklicken. Ich hoffe, dass war irgendwie verständlich.

      બાય

      --
       .
      ..:
      1. Hi,

        Was hast du im Sinn, dass dir sowas vorteilhaft erscheint?
        Ich habe mir hier eine Art kleine App geschrieben, die ich als Alternative für Foxtab oder Speeddial benutze. Bei Foxtab, oder Speeddial ist es so, dass wenn du die Programme öffnest (Startseite, beim Browserstart oder neue Tab), die Adressleiste fokussiert wird. So kann ich nach Aufruf eines neuen Tabs direkt die Adressleiste für „Suchen“ verwenden, ohne vorher rein zuklicken. Ich hoffe, dass war irgendwie verständlich.

        ja, das war es. Mir ist trotzdem noch kein Weg bekannt, wie's geht, auch wenn es in deinem Fall sinnvoll sein mag.
        Aber ich wollte zumindest mal meine Bedenken äußern, dass das im Zusammenhang mit "normalen" Webseiten lästig sein kann.

        Ciao,
         Martin

        --
        Vielseitigkeit: Von vielen Dingen keine Ahnung haben.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. હેલો

          Aber ich wollte zumindest mal meine Bedenken äußern, dass das im Zusammenhang mit "normalen" Webseiten lästig sein kann.

          Natürlich, bei „Normalen“ Webseiten würde das keinen Sinn machen. Und Schade, dass es nicht geht. Ich hatte die Leise Hoffnung, dass doch.

          બાય

          --
           .
          ..:
  2. હેલો

    gibt es irgendein Benchmark-Tool, dass alle in einem PHP-Script ausgeführten Funktionen misst und irgendwo speichert? Ich habe auf dieser Seite ständige aussetzer. Ich kann mir nicht erklären, woher die kommen. Lokal treten sie nicht auf. Die treten auch völlig Willkürlich auf, so das man es nicht reproduzieren kann. Manchmal bleibt die Seite beim Login hängen, manchmal bei einem einfachen Seitenwechsel. Browser- und Systemunabhängig.
    Wie kann ich den Auslöser für diese aussetzer finden?

    Ich habe bereits die max_execution_time auf 60 gesetzt. So läuft das Programm in den meisten fällen zwar durch, aber es dauert ziemlich lange. Oft bekomme ich aber auch einen 500 Server Error. In den PHP-Error-logs steht nichts, an die Server-Logs komme ich bei Strato nicht ran. Wie kann ich den Fehler finden?

    બાય

    --
     .
    ..:
    1. Tach!

      gibt es irgendein Benchmark-Tool, dass alle in einem PHP-Script ausgeführten Funktionen misst und irgendwo speichert?

      Ja, nennt sich Profiler und ist Bestandteil der Debugger. Um einen solchen zu installeren, braucht man administrative Rechte. Das Verwenden empfiehlt sich jedoch auf Produktivsystemen. (Mehr kann ich nicht sagen. Ich weiß nicht, was grad aktuell ist. Vielleicht immer noch XDebug.)

      In den PHP-Error-logs steht nichts, an die Server-Logs komme ich bei Strato nicht ran. Wie kann ich den Fehler finden?

      Dann wird das mit dem Installieren des Debuggers/Profilers sowieso nichts. Es sei denn, die Probleme sind genereller Natur und lassen sich auf dem Testsystem nachvollziehen.

      dedlfix.

      1. હેલો

        Dann wird das mit dem Installieren des Debuggers/Profilers sowieso nichts. Es sei denn, die Probleme sind genereller Natur und lassen sich auf dem Testsystem nachvollziehen.

        Da hatten wir neulich noch drüber gesprochen. Nur bei dieser Seite ist es jetzt sehr Extrem. Und auf meinem Lokalen Rechner treten sie nicht auf.

        Eine Vermutung ist, dass ich mit Javascript vielleicht zu viele Requests absetze (ca. 10-12 Aktionbedingte Requests). Aber das auch nur, wenn jeweils eine Aktion, sprich ein klick oder ähnliches passiert. Beim Aufruf der Seite werden diese nicht geladen, nur bei klick (mit Pagespeed in FF getestet). Das ist echt ärgerlich. Manchmal treten die Aussetzer schon auf, wenn ich die Seite ganz neu öffne.

        બાય

        --
         .
        ..:
        1. હેલો

          Das ist echt ärgerlich. Manchmal treten die Aussetzer schon auf, wenn ich die Seite ganz neu öffne.

          Kann ich bestätigen. Beim ersten Aufruf sofort da, beim erneuten (kompletten) Laden => 500 ISE.
          Danach ging es wieder problemlos und flott.

          Ping und Traceroute ohne Auffälligkeiten.

          Nutzt du irgendwelche Server-Module (z.B. mod_rewrite)?

          Ansonsten schon mal den Strato Support befragt, bzw. mal Einblick in das Server Log verlangt?

          Woher weißt du eigentlich, dass der Fehler durch Überschreiten der 'max_execution_time' verursacht wird?

          Gruß Gunther

          1. હેલો

            Kann ich bestätigen. Beim ersten Aufruf sofort da, beim erneuten (kompletten) Laden => 500 ISE.
            Danach ging es wieder problemlos und flott.

            Genau das ist das Problem. Sporadisch geht gar nichts mehr, danach wieder ganz Normal.

            Nutzt du irgendwelche Server-Module (z.B. mod_rewrite)?

            Ja, allerdings route ich nichts auf die index.php. Da ich nur mit GET arbeite, kann ich darauf verzichten (bzw. arbeite ich bewusst mit GET, um darauf zu verzichten). Aber die CSS und JS-Ressourcen route ich um, um das Datum an die jeweilige Datei hängen zu können. „/js/jquery.23312233433.js“. Damit bei änderungen neue Zeitstempel automatisch eingefügt werden können.

            Ansonsten schon mal den Strato Support befragt, bzw. mal Einblick in das Server Log verlangt?

            Das werde ich tun. Wobei es nicht mal nur mit Strato zutun hat. Bei 1und1 und anderen Scripten habe ich ähnliche Probleme. Ob's an den Scripten liegt? Das meiste ist rudimentäres PHP, einfache if/else Zweige. Einfache Schleifen, nichts Weltbewegendes. Mir ist aber gerade aufgefallen, das auf dem Server, wo uns 1 GB zur verfügung stehen, 800 MB schon belegt sind. Ich werde das erstmal aufräumen, wobei das ja kaum daher kommen kann, oder?

            Woher weißt du eigentlich, dass der Fehler durch Überschreiten der 'max_execution_time' verursacht wird?

            PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /.../speedtab/config.inc.php on line 31

            Danach habe ich die max_execution_time auf 60 gesetzt, seitdem läuft es meistens durch. Nur eben mit extrem langen Ladezeiten.

            બાય

            --
             .
            ..:
    2. હેલો

      kann es sein, dass die Funktion filemtime() lange zum laden braucht? Ich benutze dieses im Aktuellen Projekt 2 mal, um Zeitstempel für CSS und JS zu generieren:

       if (file_exists('./js/functions.js')) {  
          $_JStimestamp = filemtime('./js/functions.js');  
       }
      

      Und sowas ähnliches habe ich in allen Projekten (6 glaube ich), und überall habe ich diese Aussetzer. Ich habe es jetzt bei mir entfernt, und teste es mal ausgiebig.

      બાય

      --
       .
      ..:
      1. Tach!

        kann es sein, dass die Funktion filemtime() lange zum laden braucht?

        Die Funktion selbst wird es nicht sein. Möglicherweise wird aber der Dateisystemzugriff durch zu knappe Ressourcen auf dem Server oder durch fremde blockierende Prozesse behindert.

        dedlfix.

        1. હેલો

          kann es sein, dass die Funktion filemtime() lange zum laden braucht?

          Die Funktion selbst wird es nicht sein.

          Das muss ich eh revidieren. Die Aussetzer treten auch bei den kleinsten Requests auf, die ich bspw. mit AJAX absetze. Daher kann es auch nicht an meinem Code liegen, da sich hinter den meisten AJAX-Requests ziemlich kleine PHP-Scripts befinden, die jeweils kleine Aufgaben erledigen. Und selbst mit denen scheint der Server ab und an völlig überfordert zu sein.

          Möglicherweise wird aber der Dateisystemzugriff durch zu knappe Ressourcen auf dem Server oder durch fremde blockierende Prozesse behindert.

          Führt wohl kein Weg am Support vorbei. Ich werde sie gleich mal anschreiben.

          બાય

          --
           .
          ..:
    3. હેલો

      Ich habe auf dieser Seite ständige aussetzer.

      Habe heute eine Antwort bekommen:

      Wie Sie die Logfiles runterladen, erklärt Ihnen folgender STRATO-FAQ Artikel:
      strato-faq.de/643

      Es empfiehlt sich darüber hinaus die Serverside Security zu deaktivieren, damit die max_execution_time auf 120 erhöht wird.
      Wie das geht, erfahren Sie hier:
      strato-faq.de/194

      Der 2. Punkt ist Interessant. Die Hauptdomain, zu der „speedtab.de“ gehört, existiert schon viele Jahre. Da hat sich sicherlich ne Menge angestaut. Ich bin gespannt, ob's hilft. Die Logs schaue mir gleich auch mal an.

      બાય

      --
       .
      ..:
  3. Moin,

    Off Topic:
    Warum beschränkst du das Passwort in deiner App auf 12 Zeichen? :(

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. હેલો

      Warum beschränkst du das Passwort in deiner App auf 12 Zeichen? :(

      Ich habe eine Beschränkung von 1 bis 12 Zeichen eingerichtet (Benutzername wegen derzeitiger Testphase nur ein Zeichen), weil ich mir dachte, dass 12 genug sind. Wie lang sollte ein Passwortfeld sein? Habe es gerade mal auf 25 erhöht, sollte doch reichen? Für mich ist es eh egal, wieviel Zeichen ein User benutzt, in der Datenbank kommt es eh mit Prefix versehen und MD5-gehashed an.

      બાય

      --
       .
      ..:
      1. Moin,

        Ich habe eine Beschränkung von 1 bis 12 Zeichen eingerichtet (Benutzername wegen derzeitiger Testphase nur ein Zeichen), weil ich mir dachte, dass 12 genug sind. Wie lang sollte ein Passwortfeld sein? Habe es gerade mal auf 25 erhöht, sollte doch reichen? Für mich ist es eh egal, wieviel Zeichen ein User benutzt, in der Datenbank kommt es eh mit Prefix versehen und MD5-gehashed an.

        Wenn es der Datenbank egal ist, sollte man es IMHO nicht künstlich beschränken ;) Eine Mindestlänge von 8 Zeichen oder so ist sinnvoll, aber nach oben hin würde ich da keine Grenzen setzen.

        Benutzername habe ich gar nicht gesehen, aber Email reicht ja auch aus.

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
      2. Tach!

        Wie lang sollte ein Passwortfeld sein? Habe es gerade mal auf 25 erhöht, sollte doch reichen? Für mich ist es eh egal, wieviel Zeichen ein User benutzt, in der Datenbank kommt es eh mit Prefix versehen und MD5-gehashed an.

        Dann ergibt sich erst recht keine Notwendigkeit, das Feld in seiner Länge einzuschränken. Selbst wenn man verhindern möchte, dass jemand bei übermäßig langem Passwort zu viel Hash-Rechenzeit verbraucht, muss man nicht unbedingt an dieser Stelle einschreiten. Üblicherweise gibt es eine Begrenzung der Größe der POST-Daten. Und innerhalb sinnvoller Werte für diese, sind die Rechenzeiten akzeptabel. Das Problem ist dann eher, dass Anmeldungen mit solch großen Passwörtern in aller Regel Angriffsversuche darstellen, und man ein generelles Vorgehen bei ebensolchen ausarbeiten sollte.

        dedlfix.

        1. હેલો

          Dann ergibt sich erst recht keine Notwendigkeit, das Feld in seiner Länge einzuschränken.

          Es lag gar nicht an der Rechenzeit bei zu langen Passwörtern. Nur kenne ich es bei Passwörtern nur so, oder hatte den Eindruck, dass überall beschränkt wird. Habe ich nun aufgehoben.

          Das Problem ist dann eher, dass Anmeldungen mit solch großen Passwörtern in aller Regel Angriffsversuche darstellen, und man ein generelles Vorgehen bei ebensolchen ausarbeiten sollte.

          Wie sieht so was aus? Und was versprechen sich Angreifer von so einer art Angriff?

          @misterunknown

          Benutzername habe ich gar nicht gesehen, aber Email reicht ja auch aus.

          Email war zuerst Benutzername, wurde dann aber geändert. Ich hatte keine Lust, noch ein Feld für Email anzulegen, daher habe ich den Benutzernamen einfach „erweitert“. Auf diese Weise ist es eh viel Praktischer. Wobei ich jetzt mit dem Gedanken spiele, ein zusätzliches Feld für Benutzernamen anzulegen, den man später im Profil ändern kann. Wäre ja auch schön, den auf der Seite angezeigten Namen anpassen zu können.

          બાય

          --
           .
          ..:
          1. Moin,

            Wie sieht so was aus?

            Beispielsweise so:

            [Passwort:]
            dasistgarnichtmeinPasswort'; GO EXEC cmdshell('shutdown /s') --%'

            Artikel zu SQL Injection. Wenn man natürlich die Kontextwechsel beachtet und immer schön escaped, ist das kein Problem (es sei denn die Anfragen kommen so frequentiert, dass ein DoS droht).

            Und was versprechen sich Angreifer von so einer art Angriff?

            Da gibt es verschiedene Beweggründe, wie Zugriff auf deine Datenbank/Server oder Zerstörung von Daten.

            Email war zuerst Benutzername, wurde dann aber geändert. Ich hatte keine Lust, noch ein Feld für Email anzulegen, daher habe ich den Benutzernamen einfach „erweitert“. Auf diese Weise ist es eh viel Praktischer. Wobei ich jetzt mit dem Gedanken spiele, ein zusätzliches Feld für Benutzernamen anzulegen, den man später im Profil ändern kann. Wäre ja auch schön, den auf der Seite angezeigten Namen anpassen zu können.

            Naja, ob man jetzt den Anzeigename ändern kann oder nicht, ist vielleicht nicht so relevant, aber sicherlich userfreundlich ;)

            Grüße Marco

            --
            Ich spreche Spaghetticode - fließend.
          2. Tach!

            Das Problem ist dann eher, dass Anmeldungen mit solch großen Passwörtern in aller Regel Angriffsversuche darstellen, und man ein generelles Vorgehen bei ebensolchen ausarbeiten sollte.
            Wie sieht so was aus? Und was versprechen sich Angreifer von so einer art Angriff?

            Pufferüberlauf, was bei PHP nur bei Fehlern in PHP selbst relevant wäre, oder ein DoS-Angriff wären zwei Szenarien.

            Gegenmaßnahmen können im einfachsten Fall die schon erwähnte generelle Beschränkung der POST-Länge sein. Ist in PHP schon eingebaut, und auch im Apachen/FCGI kann das beschränkt werden. Der konfigurierte Wert sollte für für 08/15-Anwendungen schon passabel sein. Lediglich für das Hochladen großer Dokumente/Datenmengen (zum Beispiel unskalierte Bilder) muss/sollte man unbedingt ein Auge drauf werfen.

            Weiterhin kann man immer noch die individuelle Datengröße prüfen. Dann aber nicht zu knapp bemessen sondern eher überlegen, welche Größenordnung absolut unsinnig ist. Beispielsweise könnte der Gedanke sein: 20 Zeichen für einen Namen sind genug. Dann übersieht man aber Adelstitel, zusammengesetzte Namen und Namen anderer Kulturen, in denen anscheinend die gesamte Familiengeschichte eingearbeitet ist :-) Wie wäre es mit 1000? Da geht Karl-Theodors kompletter Name knapp zehnmal rein, und die Verarbeitung hat damit noch längst keine Performance-Probleme.

            dedlfix.

    2. હેલો

      Off Topic:

      Kritik oder Verbesserungsvorschläge sind, was Seiten angeht, bei mir ausdrücklich erwünscht.

      બાય

      --
       .
      ..:
  4. હેલો

    Erstmal danke euch beiden für die Antworten, soweit alles abgehakt. Und Sorry, dass ich nicht schneller antworten kann. Die letzten Tage kommen die Aufträge spät rein, daher bin ich viel und lang Unterwegs. Ich mache jetzt hier weiter, da es neue Erkenntnisse gibt.

    Ich habe eine Gute, und eine Schlechte Nachricht.

    Die Gute, ich weiss, woher der Fehler kommt.
    Die Schlechte, es könnte alles sein :(

    Error Log:

    24.07.2013 00:50:47 speedtab.de [client 176.198.47.130] Premature end of script headers: index.php, referer: http://speedtab.de/  
    24\.07.2013 03:54:09 speedtab.de [client 176.198.47.130] Premature end of script headers: ajax-request.php, referer: http://speedtab.de/?group=3  
    24\.07.2013 04:04:28 speedtab.de [client 176.198.47.130] Premature end of script headers: index.php, referer: http://speedtab.de/?group=2&action=692858.5640121
    

    Da viele Webmaster das gleiche Problem mit verschiedenen Komponenten (CMS, Shop-Systeme ...) haben (bei Strato), würde ich mal auf Strato als Ursache tippen. Da ich das gleiche Verhalten auch bei 1und1 habe, denke ich, dass die Grossen Hoster irgendein Sicherheitsfeature benutzen, was diese Aussetzer auslöst. Oder etwas in der Richtung.

    Die gängigsten Empfehlungen habe ich schon umgesetzt (Chmod: Ordner auf 755, Dateien auf 644), das Gästebuch-Antispam ausgeschaltet. Hat aber nichts gebracht, die Probleme bestehen weiterhin. Das soll sich der Support jetzt mal genauer anschauen.

    Habt Ihr vllt. eine Idee, was es sein könnte?

    બાય

    --
     .
    ..:
    1. Tach!

      24.07.2013 04:04:28 speedtab.de [client 176.198.47.130] Premature end of script headers: index.php, referer: http://speedtab.de/?group=2&action=692858.5640121[/code]
      Habt Ihr vllt. eine Idee, was es sein könnte?

      Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam. Da stirbt der CGI-Prozess, vermutlich schon bevor er irgendeine Ausgabe erzeugt hat.

      Wie kommt man dem vielleicht auf die Spur? Erzeuge am Script-Anfang eine Datei mit zufälligem Namen (tempnam()) und schreib immer mal rein, wo das Programm grad vorbeikommt. Am besten mit file_put_contents() (aber anhängen), damit immer ein abgeschlossener Schreibvorgang stattfindet. Zumindest erstmal grob. Am Ende der Verarbeitung löschst du sie wieder. Kommt das Script nicht bis zum Ende, bleibt die Datei liegen und kann untersucht werden. - Allerdings kann es sein, dass diese "Messung" ebenfalls vom eventuellen Hauptproblem betroffen ist, nämlich dann, wenn es beim Dateizugriff auftritt.

      dedlfix.

      1. હેલો

        Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam.

        Woran erkennst du das?

        Erzeuge am Script-Anfang eine Datei mit zufälligem Namen (tempnam()) und schreib immer mal rein, wo das Programm grad vorbeikommt. Am besten mit file_put_contents() (aber anhängen), damit immer ein abgeschlossener Schreibvorgang stattfindet. Zumindest erstmal grob. Am Ende der Verarbeitung löschst du sie wieder. Kommt das Script nicht bis zum Ende, bleibt die Datei liegen und kann untersucht werden.

        Das klingt nach einem Plan. Werde es gleich mal ausprobieren.

        બાય

        --
         .
        ..:
        1. Hi,

          Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam.

          Woran erkennst du das?

          An der Fehlermeldung "Premature end of script headers".
          Der Apache hat noch nicht mal einen content-Type-Header bekommen.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. હેલો

            An der Fehlermeldung "Premature end of script headers".
            Der Apache hat noch nicht mal einen content-Type-Header bekommen.

            Ich setze keine content-Type-Header, dass macht der Server. Kann das davon kommen?

            Auch in den AJAX-Requests setze ich selbst keine content-Type-Header.

            બાય

            --
             .
            ..:
        2. Tach!

          Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam.
          Woran erkennst du das?

          Am Text der Fehlermeldung. Die Meldung ist typisch für über (F)CGI aufgerufene Scripts. Die müssen eine vollständige HTTP-Response inklusive der Header gefolgt von einer zusätzlichen Leerzeile zurückliefern. Wenn da was fehlt, gibts diese Meldung. Normalerweise macht PHP das für dich. Wenn du sie siehst, ist irgendwas grundlegend kaputt. Sie selbst zu provozieren ist nicht einfach. Da muss man schon den PHP-Prozess abschießen (oder in eine Situation kommen, in der das System den Prozess killt). Einfach nur ein PHP-eigenes Limit zu erreichen reicht da nicht, denn das erkennt PHP selbst und sendet zumindest noch ordentliche Header und (wenn es darf) eine Fehlermeldung.

          Du wirst mit der von mir vorgeschlagenene Methode vielleicht kein einheitliches Ergebnis erhalten. Dann wirds schwer. Oder du siehst, dass es immer in der einen Ecke knallt und kannst das dann auf eine bestimmte Codezeile eingrenzen. Tun können wirst du nichts weiter, außer dem Support einzuheizen, dass sie statt Textbausteinen herauszusuchen mal richtig nachsehen, was da an dem Server krankt.

          dedlfix.

          1. હેલો

            Am Text der Fehlermeldung. Die Meldung ist typisch für über (F)CGI aufgerufene Scripts. Die müssen eine vollständige HTTP-Response inklusive der Header gefolgt von einer zusätzlichen Leerzeile zurückliefern. Wenn da was fehlt, gibts diese Meldung.

            Ok.

            Du wirst mit der von mir vorgeschlagenene Methode vielleicht kein einheitliches Ergebnis erhalten. Dann wirds schwer. Oder du siehst, dass es immer in der einen Ecke knallt und kannst das dann auf eine bestimmte Codezeile eingrenzen.

            Ich habe mir eine kleine Funktion geschrieben, die die Script-Aufrufe mitlogged, allerdings ohne tempnam. tempnam ändert sich bei jedem Aufruf, daher weiss ich nicht, wie ich immer wieder was in die Datei anhängen soll, ändert sich ja jedesmal.

            Meine Funktion (ist bereits Online, ich hoffe es bringt was):

            $_actual_timestamp = time();   // Zeit des ersten Seitenaufrufes festhalten, um einmalige Dateinamen zu erzeugen  
              
              /**  
               * Funktionsaufrufe mitloggen  
               */  
              function script_log ($_function, $_timestamp, $delete=false)  
              {  
                  // Zeitstempel für Dateinamen  
                  $_mtst = utf8_encode( strftime("%d.%m.%Y", $_timestamp) ) . '_' . $_timestamp;  
                  // Temporärer Datei-Name  
                  $tmpfname = './tmp/script_log_' . $_mtst . '.log';  
                  // Status-Text  
                  $_ret = sprintf('%1$s, Function: %2$s'."\n"                       #strtotime(time())  
                                 , utf8_encode( strftime("%d.%m.%Y, %H:%M:%S", time()) )  
                                 , $_function);  
                  // Zeitpunkt und Funktion speichern  
                  if (file_exists($tmpfname)) {  
                        $current = file_get_contents($tmpfname);  
                        $current .= $_ret;  
                        file_put_contents($tmpfname, $current);  
                  } else { // Log-Datei erzeugen, falls nicht vorhanden  
                       $datei = fopen($tmpfname,"w");  
                       fwrite($datei, $_ret);  
                       fclose($datei);  
                  }  
                  // Scriptende, Datei ins Archiv kopieren und löchen  
                  if ($delete) {  
                       copy($tmpfname, './tmp/archive/' . $_mtst . '.log');  
                       unlink($tmpfname);  
                  }  
              }  
              
              // index.php  
              require_once 'addtab.inc.php';  
              script_log ('addtab.inc.php, Zeile 78', $_actual_timestamp); // Nach jedem require, oder einem abgesetzten DB-Query  
            
            

            Die Ausgabe sieht vielversprechend aus. Support habe ich auch schon angeschrieben.

            બાય

            --
             .
            ..:
            1. Tach!

              Ich habe mir eine kleine Funktion geschrieben, die die Script-Aufrufe mitlogged, allerdings ohne tempnam. tempnam ändert sich bei jedem Aufruf, daher weiss ich nicht, wie ich immer wieder was in die Datei anhängen soll, ändert sich ja jedesmal.

              Du musst dir den erzeugten Namen irgendwo zentral merken. Das kann eine Konstante sein, die ist immer global und muss nicht durchgereicht oder mit global "geholt" werden.

              $_mtst = utf8_encode( strftime("%d.%m.%Y", $_timestamp) ) . '_' . $_timestamp;

              Die UTF-8-Kodierung ist nicht notwendig. Oder erwartest du Zeichen jenseits von ASCII im Datum?

              if (file_exists($tmpfname)) {
                          $current = file_get_contents($tmpfname);
                          $current .= $_ret;
                          file_put_contents($tmpfname, $current);
                    } else { // Log-Datei erzeugen, falls nicht vorhanden
                         $datei = fopen($tmpfname,"w");
                         fwrite($datei, $_ret);
                         fclose($datei);
                    }

              Mach es nicht zu umständlich. file_put_contents() kann Dateien erzeugen und es kann auch an vorhandenen Dateien anhängen. Also file_put_contents($datei, $daten, FILE_APPEND); reicht bereits.

              // Scriptende, Datei ins Archiv kopieren und löchen
                    if ($delete) {
                         copy($tmpfname, './tmp/archive/' . $_mtst . '.log');
                         unlink($tmpfname);

              Wenn alles glatt geht, musst du die Datei nicht aufheben. Und wenn du das doch willst, dann nimm move() und nicht copy+unlink.

              script_log ('addtab.inc.php, Zeile 78', $_actual_timestamp); // Nach jedem require, oder einem abgesetzten DB-Query

              Es gibt die beiden magischen Konstanten namens __FILE__ und __LINE__.

              dedlfix.

              1. હેલો

                $_mtst = utf8_encode( strftime("%d.%m.%Y", $_timestamp) ) . '_' . $_timestamp;
                Die UTF-8-Kodierung ist nicht notwendig. Oder erwartest du Zeichen jenseits von ASCII im Datum?

                Ich hatte vor Jahren mal ein Kodierungs-Problem mit der Ausgabe von Timestamp (MySQL), wenn ich die Zeitzone auf Deutschland gestellt hatte. Durch das Explizite kodieren war das Problem behoben. Seitdem mache ich es einfach so.

                  ini_set('date.timezone','Europe/Berlin');  
                  setlocale(LC_ALL, 'de_DE','deu_deu'); // das hier verursachte, wenn ich mich recht erinnere, die Probleme 
                

                Mach es nicht zu umständlich. file_put_contents() kann Dateien erzeugen und es kann auch an vorhandenen Dateien anhängen. Also file_put_contents($datei, $daten, FILE_APPEND); reicht bereits.
                Wenn alles glatt geht, musst du die Datei nicht aufheben. Und wenn du das doch willst, dann nimm move() und nicht copy+unlink.

                Also irgendwann, irgendwann, gebe ich dir aber sowas von'nem Bier aus, oder 2 ;)

                Neue Funktion:

                  /**  
                   * Funktionsaufrufe mitloggen  
                   */  
                  define('TEMPNAME', tempnam("./tmp", "script_log"));  
                  $_actual_timestamp = time();   // Zeit des ersten Seitenaufrufes festhalten  
                  /**  
                   * script_log  (script_log ('config.php', $_actual_timestamp, __LINE__, __FILE__);)  
                   */  
                  function script_log ($_function, $_timestamp, $_line, $_file, $_move=false)  
                  {  
                      // Status-Text  
                      $_ret = sprintf('%1$s, Function: %2$s, Line: %3$s, File: %4$s' . "\n"  
                                     , strftime("%d.%m.%Y, %H:%M:%S", time())  
                                     , $_function  
                                     , $_line  
                                     , $_file  
                                     );  
                      $_text = $_ret;  
                      // Datei erzeugen; falls vorhanden, Daten anhängen  
                      if (file_exists(TEMPNAME)) {  
                            $_text = file_get_contents(TEMPNAME);  
                            $_text .= $_ret;  
                      }  
                      file_put_contents(TEMPNAME, $_text);  
                      // Scriptende, Datei mit Zeitstempel ins Archiv verschieben, wenn es einen Fehler vorher gab  
                      if ($_move) {  
                        rename(TEMPNAME, './tmp/archive/' . strftime("%d.%m.%Y.%H.%M.%S", $_timestamp) . '_' . $_timestamp . '.log');  
                      }  
                  }
                

                Habe es jetzt auch in die AJAX-Requests eingebaut.

                બાય

                --
                 .
                ..:
                1. Tach!

                  Ich hatte vor Jahren mal ein Kodierungs-Problem mit der Ausgabe von Timestamp (MySQL), wenn ich die Zeitzone auf Deutschland gestellt hatte. Durch das Explizite kodieren war das Problem behoben. Seitdem mache ich es einfach so.

                  Beim Wort März kann das passieren, aber nicht bei Zahlen.

                  dedlfix.

                2. હેલો

                  Neue Funktion:

                  Wenn die hier von mir gepostete Funktion richtig arbeitet, dann scheint es ein Problem auf Server-Seite zu sein. Ich konnte jetzt ein paar mal die Aussetzer provozieren, dabei wurde Allerdings leider nichts gespeichert. Eine Leere Datei wird erzeugt, danach bricht es ab.

                  બાય

                  --
                   .
                  ..:
                  1. Tach!

                    Eine Leere Datei wird erzeugt, danach bricht es ab.

                    Unter normalen Umständen schreibt die Funktion. Wenn die Datei ohne Inhalt angelegt wird, dann ist das aus PHP-Sicht eigenartig, denn eigentlich wird sie ja durch das file_put_contents() angelegt und das mit Inhalt. Ich vermute dann dass der Server ein Problem mit dem Dateisystem oder der dahinter liegenden Hardware hat.

                    dedlfix.

                    1. હેલો

                      Unter normalen Umständen schreibt die Funktion. Wenn die Datei ohne Inhalt angelegt wird, dann ist das aus PHP-Sicht eigenartig, denn eigentlich wird sie ja durch das file_put_contents() angelegt und das mit Inhalt.

                      Ich habe den Support schon angeschrieben, erste Antwort war eine Rückfrage, was das Problem sei? Fängt ja gut an mit dem Support. Ich habe in der Zwischenzeit die Funktion etwas verfeinert.

                        /**  
                         * Funktionsaufrufe mitloggen  
                         */  
                        define('TEMPNAME', tempnam("./tmp", "script_log"));  
                        $_actual_timestamp = time();   // Zeit des ersten Seitenaufrufes festhalten, um einmalige Dateinamen zu erzeugen  
                        
                        /**  
                         * script_log  (script_log ('config.php', $_actual_timestamp, __LINE__, __FILE__);)  
                           @return  
                      27\.07.2013, 15:31:41, Function: config.php, Line: 31, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                      27\.07.2013, 15:31:41, Function: html-tmpl.php, Line: 34, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                      27\.07.2013, 15:31:41, Function: formlib.php, Line: 37, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                      27\.07.2013, 15:31:41, Function: loginformular.php, Line: 40, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                      27\.07.2013, 15:31:42, Function: Output starts, Line: 145, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                      27\.07.2013, 15:31:42, Function: Output ends, Line: 295, File: D:\xampp\anonymous\speedtab\index.php, Referer: /  
                         */  
                        function script_log ($_function, $_timestamp, $_line, $_file, $_move=false)  
                        {  
                            // Status-Text  
                            $_ret = sprintf('%1$s, Function: %2$s, Line: %3$s, File: %4$s, Referer: %5$s' . "\n"  
                                           , strftime("%d.%m.%Y, %H:%M:%S", time())  
                                           , $_function  
                                           , $_line  
                                           , $_file  
                                           , $_SERVER['REQUEST_URI']  
                                           );  
                            $_text = $_ret;  
                            // Datei erzeugen; falls vorhanden, Daten anhängen  
                            if (file_exists(TEMPNAME)) {  
                                  $_text = file_get_contents(TEMPNAME);  
                                  $_text .= $_ret;  
                            }  
                            file_put_contents(TEMPNAME, $_text);  
                            // Scriptende, Datei mit Zeitstempel ins Archiv verschieben  
                            if ($_move) {  
                                $_LASTFILENAME = explode(DIRECTORY_SEPARATOR, TEMPNAME);  
                                rename(TEMPNAME, './tmp/archive/' . sprintf('%2$s_%1$s.log'  
                                                                           , strftime("%d.%m.%Y.%H.%M.%S", $_timestamp)  
                                                                           , array_pop($_LASTFILENAME))  
                                );  
                            }  
                        }
                      

                      Jetzt steht in den Archivierten Dateien auch der generierte tempnam(). So kann man prüfen, ob Eventuell was beim verschieben schief gelaufen ist.

                      બાય

                      --
                       .
                      ..:
                      1. હેલો

                        ein letztes Update:

                          /**  
                           * Funktionsaufrufe mitloggen  
                           */  
                          define('TEMPNAME', tempnam("./tmp", "script_log"));  
                          $_actual_timestamp = time();   // Zeit des ersten Seitenaufrufes festhalten, um einmalige Dateinamen zu erzeugen  
                          
                          /**  
                           * script_log  (script_log ('config.php', $_actual_timestamp, __LINE__, __FILE__);)  
                           */  
                          function script_log ($_function, $_timestamp, $_line, $_file, $_move=false)  
                          {  
                              // Status-Text  
                              $_ret = sprintf('%1$s, Function: %2$s, Line: %3$s, File: %4$s, Referer: %5$s' . "\n"  
                                             , strftime("%d.%m.%Y, %H:%M:%S", time())  
                                             , $_function  
                                             , $_line  
                                             , $_file  
                                             , $_SERVER['REQUEST_URI']);  
                          
                              if (file_exists(TEMPNAME))  // Datei, falls vorhanden, Daten anhängen  
                                    file_put_contents(TEMPNAME, $_ret, FILE_APPEND | LOCK_EX);  
                              else  
                                    file_put_contents(TEMPNAME, $_ret);  
                          
                              if ($_move) {  // Scriptende, Datei mit Zeitstempel ins Archiv verschieben  
                                    $_LASTFILENAME = explode(DIRECTORY_SEPARATOR, TEMPNAME);  
                                    rename(TEMPNAME, './tmp/archive/' . sprintf('%2$s_%1$s.log'  
                                                                               , strftime("%d.%m.%Y.%H.%M.%S", $_timestamp)  
                                                                               , array_pop($_LASTFILENAME))  
                                          );  
                              }  
                          }
                        

                        બાય

                        --
                         .
                        ..:
                        1. Tach!

                          if (file_exists(TEMPNAME))  // Datei, falls vorhanden, Daten anhängen
                                      file_put_contents(TEMPNAME, $_ret, FILE_APPEND | LOCK_EX);
                                else
                                      file_put_contents(TEMPNAME, $_ret);

                          file_put_contents(TEMPNAME, $_ret, FILE_APPEND);

                          Diese eine Zeile reicht statt der vier. Du bist der einzige, der in die Datei schreibt. Die anderen Prozesse haben ihre eigene Datei. Also ist kein Locking erforderlich. Und FILE_APPEND stört auch nicht bei nicht vorhandenen Dateien.

                          dedlfix.

                          1. હેલો

                            file_put_contents(TEMPNAME, $_ret, FILE_APPEND);

                            Diese eine Zeile reicht statt der vier.

                            Tatsache. Danke für den Hinweis.

                              /**  
                               * Funktionsaufrufe mitloggen  
                               */  
                              define('TEMPNAME', tempnam("./tmp", "script_log"));  
                              define('ACT_TIMESTAMP', time());  
                              
                              /**  
                               * script_log  (script_log ('config.php', __LINE__, __FILE__);)  
                               */  
                              function script_log ($_function, $_line, $_file, $_move=false)  
                              {  
                                  // Status-Text  
                                  $_ret = sprintf('%1$s, Function: %2$s, Line: %3$s, File: %4$s, Referer: %5$s' . "\n"  
                                                 , strftime("%d.%m.%Y, %H:%M:%S", time())  
                                                 , $_function  
                                                 , $_line  
                                                 , $_file  
                                                 , $_SERVER['REQUEST_URI']);  
                              
                                  file_put_contents(TEMPNAME, $_ret, FILE_APPEND);  
                              
                                  if ($_move) {  // Scriptende, Datei mit Zeitstempel ins Archiv verschieben  
                                        $_LASTFILENAME = explode(DIRECTORY_SEPARATOR, TEMPNAME);  
                                        rename(TEMPNAME, './tmp/archive/' . sprintf('%1$s_%2$s.log'  
                                                                                   , array_pop($_LASTFILENAME)  
                                                                                   , strftime("%d.%m.%Y.%H.%M.%S", ACT_TIMESTAMP))  
                                              );  
                                  }  
                              }
                            

                            Gibt's eigentlich die Möglichkeit, mit strftime auch die Mikrosekunden anzuzeigen? Auf der Doku-Seite zu der Funktion steht nichts darüber?

                            બાય

                            --
                             .
                            ..:
                            1. હેલો

                              die Mikrosekunden

                              Ich mein natürlich Millisekunden. Mikrosekunden ...

                              બાય

                              --
                               .
                              ..:
                            2. Tach!

                              Gibt's eigentlich die Möglichkeit, mit strftime auch die Mikrosekunden anzuzeigen?

                              Der Unix-Timestamp löst nur sekundenfein auf. strftime() nimmt (date() auch) nur Integer entgegen, selbst wenn man das Ergebnis von microtime(true) übergibt. Aber die date()-Seite kennt u als Format für Mikrosekunden, und sagt, dass das bei date() nichts nützt, aber bei DateTime::format().

                              dedlfix.

                              1. હેલો

                                Aber die date()-Seite kennt u als Format für Mikrosekunden, und sagt, dass das bei date() nichts nützt, aber bei DateTime::format().

                                Das funktioniert aber auch nicht wirklich, bzw. weiss ich nicht, wie ich die Mikrosekunden in den Konstruktor bekommen soll:

                                # $date = new DateTime(date('Y-m-d H:i:s:u')); = Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct():  
                                  
                                $date = new DateTime(date('Y-m-d H:i:s'));  
                                print $date->format('Y-m-d H:i:s:u');  
                                # Ausgabe: 2013-07-27 17:19:34:000000
                                

                                http://viper-7.com/6J41CE

                                Irgendeine Idee?

                                બાય

                                --
                                 .
                                ..:
                                1. Tach!

                                  Aber die date()-Seite kennt u als Format für Mikrosekunden, und sagt, dass das bei date() nichts nützt, aber bei DateTime::format().
                                  Das funktioniert aber auch nicht wirklich, bzw. weiss ich nicht, wie ich die Mikrosekunden in den Konstruktor bekommen soll:

                                  Die sollten da von selbst reinkommen, wenn man ihn ohne Parameter aufruft - geht nur so nicht. Aber so:

                                  $date = DateTime::createFromFormat('U.u', microtime(true));

                                  dedlfix.

                                  1. હેલો

                                    Die sollten da von selbst reinkommen, wenn man ihn ohne Parameter aufruft - geht nur so nicht. Aber so:

                                    $date = DateTime::createFromFormat('U.u', microtime(true));

                                    Ja, so geht es. Jetzt taugt das Logging auch etwas, Danke! Jetzt kann ich auch sehen, wie schnell die Scripte in etwa arbeiten. Sehr schnell.

                                    27.07.2013, 19:22:49:187100, Function: config.php, Line: 31, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:188900, Function: html-tmpl.php, Line: 34, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:190400, Function: formlib.php, Line: 37, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:191900, Function: loginformular.php, Line: 40, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:193400, Function: addatabform.php, Line: 50, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:194500, Function: Tabs_Query, Line: 102, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:195900, Function: Output starts, Line: 145, File: /.../htdocs/speedtab/index.php, Referer: /?group=1  
                                    27\.07.2013, 19:22:49:197000, Function: Output ends, Line: 295, File: /.../htdocs/speedtab/index.php, Referer: /?group=1
                                    

                                    બાય

                                    --
                                     .
                                    ..:
          2. હેલો

            Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam.

            Habe ich eigentlich irgendeinen Einfluss auf diese Header?

            બાય

            --
             .
            ..:
            1. Tach!

              Nein. Der Fehler tritt auf, weil der Apache noch nicht einmal ordentliche HTTP-Header übergeben bekam.
              Habe ich eigentlich irgendeinen Einfluss auf diese Header?

              Ja, wenn dein Script ordentlich arbeitet, dann kannst du mit header() direkt eingreifen, und mit Cookies und Sessions indirekt. Ansonsten kümmert sich PHP darum. Bei Perl zum Beispiel muss man sie selbst setzen. Unerfahrene Perler können ein Lied von der Fehlermeldung singen.

              dedlfix.

    2. હેલો

      Das soll sich der Support jetzt mal genauer anschauen.

      Tja, da muss ich wohl mit Leben. Oder die Domain umziehen, Webserver mieten. Da es nicht meine Domain ist, bleibt es wohl vorerst so.

      Bitte haben Sie Verständnis dafür, dass es sich bei STRATO nicht um ein Systemhaus handelt, weswegen wir Ihnen keinerlei Programmiersupport anbieten können.

      Ebenso bitte ich um Verständnis, dass im Shared Webhosting-Bereich gewisse serverseitige Grenzen eingerichtet werden müssen, um eine gewisse Grund-Performance gewährleisten zu können.

      બાય

      --
       .
      ..:
  5. હેલો

    da ich hier noch 'ne Domain bei 1und1 rumliegen habe, habe ich Speedtab einfach mal bei 1und1 installiert, und siehe da, es funktioniert ohne Aussetzer.

    Zum reproduzieren einfach ein neues Konto registrieren, wo nichts gespeichert ist, und dann „F5“ gedrückt halten. Bei Strato reichen oft nur wenige Sekunden, bis die Seite sich aufhängt, bei 1und1 habe ich es noch nicht geschafft, einen Aussetzer zu provozieren.

    Kann man daraus Rückschlüsse auf die Hardware ziehen?

    http://speedtab.de/
    http://e-ypsilon.net/

    Beide installationen sind Identisch, nur dass ich bei 1und1 die RewriteBase in der .htaccess anpassen musste. Das war bei Strato nicht nötig.

    Da liest sich die Antwort von Strato wie ein Witz ...

    Ebenso bitte ich um Verständnis, dass im Shared Webhosting-Bereich gewisse serverseitige Grenzen eingerichtet werden müssen, um eine gewisse Grund-Performance gewährleisten zu können.

    Was soll das denn für eine Grund-Performance sein, wenn sich der Server alle drei Nase lang aufhängt?

    BTW, das Problem mit der Adressleiste habe ich lösen können. Ich habe einfach ein Formular in die Seite eingefügt, dass auf die Suchmaschine meiner Wahl zielt, und beim Seitenaufruf Fokussiert wird, Fertig. Ist nicht schön, aber es funktioniert wie gewünscht.

    બાય

    --
     .
    ..: