Christoph Schnauß: Forums-script von Matt Wright

hallo Forum ;-)

jetzt hab ich mir auch mal die scripte von Matt Wright besorgt (die ja auch als Vorlage für dieses Forum gedient haben) und sie ausprobiert. Funktioniert alles recht gut, aber es gibt zwei Sachen, die ich nicht richtig hinbekomme:
1. im Original werden Datum- und Zeitangaben nach der "englischen" Schreibweise gehandhabt. Wenn ich die entsprechenden Einträge in wwwboard.pl modifiziere, kriege ich zwar "unsere" Formate hin, aber aus irgendeinem Grund werden mir die Monatsnamen nicht angezeigt; statt "Maerz" bekomme ich "00" gesagt.
2. In dem kleinen Paket, das zum download angeboten wird, sind u.a. zwei HTML-Dokumente enthalten. Wenn man das Eingabeformular benutzt, generiert das perl-script ein HTML-Dokument mit der Eingabe, aber es gibt keine "Hauptdatei" wie hier. Muß ich das nun noch selber in das perl-script reinschreiben, daß ich so eine Hauptdatei haben will, oder gibts dazu bereits irgendwo ein fertiges script, das ich bloß nicht gefunden habe ?

Christoph S.

  1. Hi Christoph,

    1. im Original werden Datum- und Zeitangaben nach der "englischen" Schreibweise gehandhabt. Wenn ich die entsprechenden Einträge in wwwboard.pl modifiziere, kriege ich zwar "unsere" Formate hin, aber aus irgendeinem Grund werden mir die Monatsnamen nicht angezeigt; statt "Maerz" bekomme ich "00" gesagt.

    Kann ich nicht viel zu sagen, da ich keine Monatsnamen, sondern die Zahlen verwende, also z.B. 3 für März. Das sieht dann so aus:

    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
       $year += 1900;
       ...
       $month = ($mon + 1);

    $date = "$mday.$month.$year, $hour:$min:$sec Uhr";
       ...
       $long_date = "$mday.$month.$year um $hour:$min:$sec Uhr";

    Falls Dein Server in einer anderen Zeitzone steht, solltest Du vor localtime() noch

    $ENV{"TZ"}="CET";

    setzen, damit die richtige Zeit angezeigt wird.

    1. In dem kleinen Paket, das zum download angeboten wird, sind u.a. zwei HTML-Dokumente enthalten. Wenn man das Eingabeformular benutzt, generiert das perl-script ein HTML-Dokument mit der Eingabe, aber es gibt keine "Hauptdatei" wie hier. Muß ich das nun noch selber in das perl-script reinschreiben, daß ich so eine Hauptdatei haben will, oder gibts dazu bereits irgendwo ein fertiges script, das ich bloß nicht gefunden habe ?

    Die Datei WWWBOARD.HTML ist die Hauptdatei. Ich würde die allerdings in index.html o.ä. umbenennen, damit man den Dateinamen in der URL auch weglassen kann, bzw. damit man kein Directory-Listing bekommt, wenn man ihn wegläßt. Aus dem gleichen Grund würde ich ins messages-Verzeichnis eine leere index.html legen.

    Gruß,
    Stefan

    1. Die Datei WWWBOARD.HTML ist die Hauptdatei. Ich würde die allerdings in index.html o.ä. umbenennen, damit man den Dateinamen in der URL auch weglassen kann, bzw. damit man kein Directory-Listing bekommt, wenn man ihn wegläßt. Aus dem gleichen Grund würde ich ins messages-Verzeichnis eine leere index.html legen.

      hm, danke ...  das "Umbenennen" ist kein Problem, übrigens hab ich auch die wwwboard.pl nach wwwboard.cgi umbenannt. Und ein Unterverzeichnis "messages" hab ich gleich ganz weggelassen, weil das Ganze sowieso ein eigenes Verzichnis gekriegt hat. Dazu muß man ja bloß die mesgdir-Eintragung im perl-script anpassen ...
      Meine Sorge ist aber diese "Hauptdatei". Im Originalzustand enthält sie ja lediglich das Formular zum Absenden eines postings, ist auch logisch. Erwartet hatte ich noch irgendwelche "print"-Befehle im perl-script, die dann in diese "Hauptdatei" ein paar "Subject"-Eintragungen vornehmen, wie das ja offenbar hier im Forum geschieht. Ich finde aber nichts derartiges, und es geschieht auch nichts in dieser Art. Zwar sollte das kein allzugroßes Problem sein, dann halt noch ein paar Code-Zeilen reinzufummeln, aber mich hat das einfach verunsichert.

      Christoph S.

      1. Meine Sorge ist aber diese "Hauptdatei". Im Originalzustand enthält sie ja lediglich das Formular zum Absenden eines postings, ist auch logisch. Erwartet hatte ich noch irgendwelche "print"-Befehle im perl-script, die dann in diese "Hauptdatei" ein paar "Subject"-Eintragungen vornehmen, wie das ja offenbar hier im Forum geschieht. Ich finde aber nichts derartiges, und es geschieht auch nichts in dieser Art.

        Doch, die "Hauptdatei" wird in der Subroutine "main_page" geschrieben. Dabei orientiert sich das Script an den Schlüsselwörtern, die zwischen <!-- und --> stehen.
        Such' doch einfach nach dem Vorkommen des Variablennamens, der den Namen der "Hauptdatei" enthält ($mesgfile), dann stößt Du automatisch darauf...

        Gruß,
        Stefan

        1. Doch, die "Hauptdatei" wird in der Subroutine "main_page" geschrieben. Dabei orientiert sich das Script an den Schlüsselwörtern, die zwischen <!-- und --> stehen.
          Such' doch einfach nach dem Vorkommen des Variablennamens, der den Namen der "Hauptdatei" enthält ($mesgfile), dann stößt Du automatisch darauf...

          hihi, ja, stimmt ... sowas Blödes aber auch: ich habe die "Haupdatei" (ähnlich wie es hier gemacht worden ist) grafisch bearbeitet, bissel Krimskrams dazugetan, und bei der Gelegenheit völlig unabsichtlich die <ul></ul> tags, die das script sucht, rausgeworfen. Jetzt stehen sie wieder drin, und alles funktioniert so, wie es soll.
          Aber es ist immer wieder das gleiche: da sucht man zwei Tage lang nach einem script-Fehler an der falschen Stelle, liest ganze Biblkiotheken durch, quält die Fachleute im Forum mit unnnützen Fragen, und dann  ... dann isses am Ende das Mäuslein, das der Berg gebar.

          besten Dank

          Christoph S.

  2. hallo Forum ;-)

    jetzt hab ich mir auch mal die scripte von Matt Wright besorgt (die ja auch als Vorlage für dieses Forum gedient haben) und sie ausprobiert.

    Hallo Christoph,

    habe mich in den letzten zwei Tagen auch intensiv mit dem Matt Wright Script beschäftigt und eine Adaption nach ASP (Active Server Pages) unter VB-Script durchgeführt, gleich mit ein paar Erweiterungen.

    Habe das Orginal-Script allerdings nicht getestet, sondern nur mal den Quell-Code durchgesehen, um zu sehen, wie es funktioniert.

    Das neue ASP-Forum läuft hier bei mir im Intranet derzeit in der Testphase, die "Final Version" wird in der ersten April-Woche online gehen, (leider erst dann, da ich morgen fuer 3 Wochen nach Taiwan fliege, und ich hasse es nicht ordentlich getestete Versionen ins Internet zu stellen).

    Merke Dir aber schon mal die URL vor, der Source-Code wird da auch veröffentlicht werden...

    http://www.ruhnke.com/forum

    MfG Christoph Ruhnke

    1. habe mich in den letzten zwei Tagen auch intensiv mit dem Matt Wright Script beschäftigt und eine Adaption nach ASP (Active Server Pages) unter VB-Script durchgeführt, gleich mit ein paar Erweiterungen.

      oho, sehr interessant. Auf die "Erweiterungen" bin ich gespannt ... Ich hab das gleiche auch in Arbeit, allerdings habe ich es bei perlScript belassen, um möglichst viel vom originalen Code übernehmen zu können.

      Christoph S.

      1. oho, sehr interessant. Auf die "Erweiterungen" bin ich gespannt ... Ich hab das gleiche auch in Arbeit, allerdings habe ich es bei perlScript belassen, um möglichst viel vom originalen Code übernehmen zu können.

        <ANTWORT>

        Na, ich will Dich nicht auf die Folter spannen, die "Erweiterungen" betreffen Größtenteils das, was hier im SelfAktuell auch schon implementiert wurde. (Vielleicht können wir unsere Arbeiten zu diesem Thema ja mal kombinieren, in Neu-Deutsch nennt man so was glaube ich "Synergie-Effekt")

        Zusätzlich zum Orginal-Script wurde unter ASP implementiert:

        • Der "Schwanzabschneider", der eine unendliche Länge des Index verhindert und "alte" Postings gesondert in komprimierter Form archiviert.

        • Das Einbinden von Links und Grafiken im Posting Text in der Form von {link:http://www.xyz.de} bzw. {image:http://www.xyz.de/bild.jpg}

        • Die Möglichkeit "Flags" zu vergeben, um ungewünschte Auswüchse der Forenbeiträge einzudämmen. (Gruß an die Mannschaft von SelfAktuell, die Idee funktioniert wirklich hervorragend und in Folge ist das Forum hier wieder informativer und auch professioneller geworden)

        • Suchfunktionen in den Archiv-Dateien (noch in Arbeit, wird voraussichtlich mit einer ADO-Server-Gebundenen "Stichwort"-Datenbank realisiert, die beim Archivieren der "Alt-Postings" gefüllt wird.)

        Der erste Ansatz für ein Forum war eine reine Datenbanklösung, aber in der Praxis (bei vielen Hits) ist das, zumindest in Form einer Desktopdatenbank, wie z.B. MS-Access, einfach zu langsam, da ja dann jede Abfrage (einschließlich Index) über den Parser die Serverseitigen Connection-Objekte und nicht zuletzt den ODBC-Treiber geht.

        Dann kam der Gedanke "wie machen das denn die Anderen eigentlich ?" Hier in SelfAktuell fand ich den Hinweis auf Matt Wright's Script...

        Ich wollte allerdings von Anfang an nicht versuchen das Script 1:1 in ASP zu übernehmen, sondern es lediglich als "Koch-Rezept" für ein Multi-threaded Forum verstehen. Deshalb ist eigentlich ein ganz "neues" Script entstanden, welches im Prinzip lediglich an die Datenstrukturen von Matt Wright's Script angelehnt ist.

        </ANTWORT>

        <FRAGE>

        Was das Orginal-Sricpt vom Matt Wright betrifft (wie gesagt, ich habe es nur gelesen und nicht installiert bzw. getestet) beschäftigt mich die (alte Multitasking-) Frage:

        Was passiert eigentlich, wenn zum exakt gleichen Zeitpunkt zwei Besucher "posten" ? Unter Linux und Perl laufen, meiner Information nach, die Scripts jeweils in eigenen Threads, das heißt, unabhängig und "unwissend" von einander und auch vom WWW-Server.

        Das heißt es könnte theoretisch folgendes passieren: Thread 1 liest die Datei mit der aktuellen Nachrichtennummer, Thread 2 tut dies zehn Millisekunden später, Thread 1 schreibt die inkrementierte Nummer zurück und Thread 2 macht dasselbe zehn Millisekunden später.

        Folgt daraus, daß dann in Folge zwei Nachrichten unter der gleichen Message-ID archiviert werden (wäre ja unpraktikabel, die zweite Nachricht würde die erste mit dem gleichen Dateinamen sofort überschreiben, ganz zu schweigen von den möglichen Effekten beim Updaten der Links in den Parent-Posting-Dateien, die ja bei Matt's Script dann anschließend erfolgen...)

        Vielleicht ist das ja auch nur noch nicht passiert, wenn ich mir die zeitlichen Abstände der Postings in diesem Forum anschaue, so liegen doch in der Regel immerhin mindestens ein paar Sekunden dazwischen, so daß das Script, welches ja gleichzeitig die Message-ID inkrementiert, die Nachricht speichert, das Inhaltsverzeichnis aktualisiert und auch die vorhergehenden Nachrichten mit dem Link auf die aktuelle Nachricht versieht, in der Regel schon durch sein sollte, bevor das nächste Posting "submitted" wird.

        </FRAGE>

        <HINT>

        Unter Active Server Pages hat mich dieses Problem nicht viel Mühe gekostet, das integrierte "Application"-Objekt bietet für solche Fälle die Methoden "Application.Lock" und "Application.Unlock" an, die einen gleichzeitigen Zugriff auf Application-Variablen verhindern, der "Zweite" kommt mit seinem Lock erst zum Zuge, wenn der "Erste" seinen Unlock durgeführt hat.

        </HINT>

        MfG Christoph Ruhnke

        1. Hallo Christoph (R.)!

          <FRAGE>

          »»  Was passiert eigentlich, wenn zum exakt gleichen Zeitpunkt zwei Besucher "posten" ? Unter Linux und Perl laufen, meiner Information nach, die Scripts jeweils in eigenen Threads, das heißt, unabhängig und "unwissend" von einander und auch vom WWW-Server.

          Bis vor einiger Zeit hatten wir das Problem. Dann hat Calocybe, ich hoffe der Ausdruck ist richtig, den File-Flocking (oder ist das locking?) eingebaut.

          Es war durchaus zu spitzen Zeiten möglich, dass zwei User zeitgleich posten. Das führte dazu, dass ein Posting vom andern überschrieben wurde (Inhalt). In der Hauptdatei erschien also der gleiche Postingtitel an zwei verschiedenen Stellen, je nachdem wo die 2 User geantwortet hatten. Alle Antworten auf jedem dieser Zeitgleichen Postings erschien sowohl unter dem einen, als auch unter dem anderen, das war ziemlich lustig!

          Nun hat wie gesagt unser Calo dem ein Ende bereitet, so dass dieser Fall nicht mehr vorkommt. Jetzt, wenn 2 zeitgleich posten, bekommt eine von den beiden eine Errormeldung im Stile von "es wurde kein name angegeben", nur halt mit dem Hinweis, es doch in ein paar Minuten mit dem Absenden noch einmal zu probieren

          »»  Folgt daraus, daß dann in Folge zwei Nachrichten unter der gleichen Message-ID archiviert werden (wäre ja unpraktikabel, die zweite Nachricht würde die erste mit dem gleichen Dateinamen sofort überschreiben, ganz zu schweigen von den möglichen Effekten beim Updaten der Links in den Parent-Posting-Dateien, die ja bei Matt's Script dann anschließend erfolgen...)

          Siehe oben :)

          »»

          Bis danndann
          PAF (patrickausfrankfurt), SELFSPEZIAL

          1. Hi Chris und Patrick!

            An Christoph: Excellent analysiert! Genau dieses gegenseitige Ueberschreiben war bis vor einiger Zeit hier noch als der "boese Forumsgeist" bekannt, denn das kam wirklich oefter mal vor. (Die Postings sind ja nicht statistisch verteilt.)

            Nun hat wie gesagt unser Calo dem ein Ende bereitet, so dass dieser Fall nicht mehr vorkommt. Jetzt, wenn 2 zeitgleich posten, bekommt eine von den beiden eine Errormeldung im Stile von "es wurde kein name angegeben", nur halt mit dem Hinweis, es doch in ein paar Minuten mit dem Absenden noch einmal zu probieren

            Nicht ganz. Normalerweise merkt man es gar nicht, wenn zwei Leute gleichzeitig posten, denn beim zweiten wartet das Script einfach eine Sekunde und dann geschieht die Eintragung. Erst wenn nach 10 Sekunden eine bestehende Sperrung immer noch nicht aufgehoben ist, wird dem Anwender eine Fehlermeldung praesentiert.

            So long

            1. An Christoph: Excellent analysiert! Genau dieses gegenseitige Ueberschreiben war bis vor einiger Zeit hier noch als der "boese Forumsgeist" bekannt, denn das kam wirklich oefter mal vor. (Die Postings sind ja nicht statistisch verteilt.)

              Es wär vielleicht ganz hilfreich, wenn man den Code deiner "Lösung" noch bekommen könnte, und sei es auch "nur" zum Vergleich ...

              Gruß

              Christoph S.

              1. Moin!

                Es wär vielleicht ganz hilfreich, wenn man den Code deiner "Lösung" noch bekommen könnte, und sei es auch "nur" zum Vergleich ...

                Ist wahr. So here goes the actually relevant stuff:

                $lockfile = "forum_not_in_use.txt";
                $lock_timeout = 10;         # seconds

                GetForumControl()

                #   Returns 1 if we got the forum under control, 0 if another script instance has still not released control
                #   after $lock_timeout seconds.

                sub GetForumControl() {
                    my $i;

                for ($i=$lock_timeout; $i>=0; $i--) {
                        unlink("$baseurldir/$mesgdir/$lockfile") && return 1;
                        sleep(1);
                    }

                return 0;
                }

                ReleaseForumControl()

                #   Anything to say about this one?

                sub ReleaseForumControl() {
                    local *LFH;

                open(LFH, ">$baseurldir/$mesgdir/$lockfile") return;     # an error at this point is a bad omen
                    print LFH "There's currently no posting being processed, so feel free.\n";
                    close(LFH);
                }

                main()

                #   This is main, the alpha and omega.

                sub main() {
                    # First slurp in the data submitted by the form, then evaluate and put
                    # it into a few variables
                    parse_form();
                    get_variables();

                # Get the forum under control
                    unless (GetForumControl()) {        # After $lock_timeout seconds still not unlocked?
                        # Violently unlock, but do not write the posting; instead, raise a timeout error
                        # If we would write the posting now, a third instance could perform a violent unlock
                        # while we do our stuff.
                        ReleaseForumControl();
                        error('forum_locked');
                        exit;
                    }

                &get_number;                        # Get the Data Number
                    &new_file;                          # Open the new file and write information to it.
                    &main_page;                         # Open the Main WWWBoard File to add link

                # Now Add Thread to Individual Pages
                    if ($num_followups >= 1) {
                       &thread_pages;
                    }

                &return_html;                       # Return the user HTML
                    &increment_num;                     # Increment Number
                    ReleaseForumControl();              # Done.
                }

                main();

                Der Code geht ueberigens auf eine Idee von Jörk Behrends zurueck, der in
                <../../sfarchiv/1999_1/t01858.htm#a8468> anmerkte, dass sich eine Datei nur einmal korrekt
                loeschen laesst und dieser Vorgang betriebssystemintern ordentlich synchronisiert sein sollte.

                So long

        2. Na, ich will Dich nicht auf die Folter spannen, die "Erweiterungen" betreffen Größtenteils das, was hier im SelfAktuell auch schon implementiert wurde. (Vielleicht können wir unsere Arbeiten zu diesem Thema ja mal kombinieren, in Neu-Deutsch nennt man so was glaube ich "Synergie-Effekt")

          Sehr gerne. Sobald ich es so weit hingefuzzelt habe, daß nicht mehr alzzuviele Fehler und Ungereimtheiten vorkommen, maile ich dir das script, enverstanden ?

          »»  Ich wollte allerdings von Anfang an nicht versuchen das Script 1:1 in ASP zu übernehmen, sondern es lediglich als "Koch-Rezept" für ein Multi-threaded Forum verstehen. Deshalb ist eigentlich ein ganz "neues" Script entstanden, welches im Prinzip lediglich an die Datenstrukturen von Matt Wright's Script angelehnt ist.

          Ich bin ähnlich vorgegangen, mit demselben Grundverständnis. Für meine Bedürfnisse kams aber nicht so sehr auf weitere Funktionen an, sondern auf Zutaten wie Framedarstellung und grafisch aufgearbeitete Ansicht (Schrift und Farbe)

          Gruß

          Christoph S.