kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Temporary failure in name resolution [2002]

    geschrieben von fuerderer

    Ok, dieser neue Fehler sieht sehr ähnlich aus, tritt aber an anderer Stelle auf.

    Hier geht es um die Überprüfung, ob eine neue phpBB Version verfügbar ist.
    Dazu ruft der PHP-Code im Hintergrund normalerweise https://version.phpbb.com/phpbb/versions.json auf, und das scheint bei deinem Setup fehlzuschlagen.

    Ich habe nun doch nochmal etwas Test-Code geschrieben:
    <?php
    header('Content-Type: text/plain');
    $handle = fsockopen('ssl://version.phpbb.com', 443, $error_code, $error_msg);
    var_dump([
        'succeeded' => $handle !== false,
        'error_code' => $error_code,
        'error_msg' => $error_msg,
    ]);

    Das entspricht im Wesentlichen dem, was auch phpBB intern versucht.
    Wenn dieser Beispielcode auf deinem Webspace einen Fehler liefert, dann liegt es nicht an phpBB sondern an der Serverumgebung.

    Zum Testen müsstest du diese PHP-Codezeilen in eine Datei (z.B. mit dem Namen
    test-dns.php
    ) speichern und per FTP auf den Server laden.
    Dann kannst du die Datei aufrufen um den Test auszuführen. (z.B. unter https://rockplanet-test.4lima.de/test-dns.php wenn du die Datei auf dem Test-Webspace abgelegt hast.)
    Anschließend kannst du die Datei wieder vom Webspace löschen um aufzuräumen.

    Ausgabe im Erfolgsfall
    array(3) {
      ["succeeded"]=>
      bool(true)
      ["error_code"]=>
      int(0)
      ["error_msg"]=>
      string(0) ""
    }


    Ausgabe im Fehlerfall
    array(3) {
      ["succeeded"]=>
      bool(false)
      ["error_code"]=>
      int(0)
      ["error_msg"]=>
      string(98) "php_network_getaddresses: getaddrinfo for version.phpbb.com failed: Temporary failure in name resolution"
    }
  • in: Temporary failure in name resolution [2002]

    geschrieben von fuerderer

    Die Datenbank-Einstellungen müssten bei phpBB in der Datei
    config.php
    liegen.
    (Die Info hab ich von hier: https://www.phpbb.com/community/viewtopic.php?t=2397076)

    Vielleicht kannst du diese Datei über FTP editieren und dann die Versuche mit dem Hostnamen durchführen.
  • in: Temporary failure in name resolution [2002]

    geschrieben von fuerderer

    Ok, das ist jetzt mehr so Raterei, eine richtig schlüssige Idee hab ich nicht.

    Was passiert, wenn du 127.0.0.1 statt localhost als Hostname des Datenbankservers einträgst?
    Wenn das ebenfalls nicht funktioniert, ist die Fehlermeldung interessant.

    Hast du Webspace und Datenbank zum Teil auf verschiedenen Lima-City Nutzerkonten liegen?
    Wenn ich das im DNS richtig deute, hat z.B. der rockplanet-test Nutzer keine eigene Datenbank, d.h. dieser müsste die Datenbank eines anderen Accounts nutzen. Aber vielleicht irre ich mich da.
    Die Datenbank eines anderen Nutzers kann man nach meinem Verständnis nicht zuverlässig über
    localhost
    einbinden sondern man sollte hier den
    <NUTZER>.lima-db.de
    Namen nehmen. (Mit <NUTZER> ist dabei der Accountname des Datenbankeigentümers gemeint.)
  • in: Temporary failure in name resolution [2002]

    geschrieben von fuerderer

    Ok, schwierig. Das sieht nach einem seltsamen Fehler aus.

    localhost steht normalerweise in der hosts-Datei des Systems und ich kann mir schwer vorstellen, dass diese kaputt ist.
    Andererseits weiß ich auch nicht, wie der Fehler sonst zustande kommen sollte.

    Ich hab mal folgendes Skript auf meinem Webspace abgelegt und zum Test aufgerufen:
    <?php
    header('Content-Type: text/plain');
    readfile('/etc/hosts');

    Damit erhalte ich dann diese Ausgabe:
    127.0.0.1	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    ff00::0	ip6-mcastprefix
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    172.19.0.5	9f42fc1bd208
    2a01:4f8:242:4a14:2::5	9f42fc1bd208

    Wenn du möchtest, kannst du das selbe einmal auf deinem Webspace ausprobieren, vielleicht finden wir damit noch etwas heraus.

    Für wahrscheinlicher halte ich aber, dass an der Fehlerstelle ein anderer Name als localhost versucht wird aufzulösen - warum auch immer.
  • in: Temporary failure in name resolution [2002]

    geschrieben von fuerderer

    Der Fehler besagt, dass es ein Problem bei der DNS-Auflösung des Datenbank Server Hostnamens gab.
    (Zumindest kann ich mir momentan keine andere Ursache vorstellen.)

    Nutzt du die Datenbank von Lima-City oder eine andere, externe DB?
    Was hast du als Hostname für die Datenbank eingetragen?
  • in: Excel - Ersetzen von rechts

    geschrieben von fuerderer

    Die
    substitute
    Funktion wird auf Deutsch wohl
    wechseln
    genannt.
    Quelle: https://en.excel-translator.de/searchresults/?mssearch=substitute

    Ich hab gerade kein Excel zum Testen da, aber versuch es mal damit.
  • in: Probleme mit mysql

    geschrieben von fuerderer

    blogvvard schrieb:
    vielleicht war älteren php versionen der fehler egal und sie sind einfach drübergebügelt ohne mit einer fehlermeldung alles abzubrechen
    Korrekt, diese Info habe ich in der PHP Doku jetzt auch gefunden.

    As of PHP 8.1.0, the default setting is MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. Previously, it was MYSQLI_REPORT_OFF.
    Quelle: PHP-Doku zu mysqli_driver::$report_mode

    Deshalb ist der Fehler auch noch von der PHP-Version abhängig.
  • in: Probleme mit mysql

    geschrieben von fuerderer

    Ich habe mal ein Github Issue erstellt. (#681)

    witze-dschungel schrieb:
    Die Spalte "IP" hat eine Länge von 15 Zeichen, aber eine IP-Adresse ist deutlich länger. Ich frage mich, wie das jemals funktioniert haben kann? Vielleicht habe ich etwas übersehen?

    Die 15 Zeichen wurden offensichtlich an IPv4 bemessen. Aber das passt natürlich nicht mehr mit IPv6 Adressen, die bis zu 39 Zeichen lang sein können.

    witze-dschungel schrieb:
    Nur die Zeilennummern passen in dem Fall nicht zu denen, die ich im Code finde. Vielleicht wurde etwas geändert oder du hast eine alte Version installiert.

    Das ist einfach der Unterschied zwischen dem Tag 20220803.1 (letzter Release) und dem aktuellen master-Stand.

    blogvvard schrieb:
    und wie gesagt, die 500er fehlermeldung kam auch bei allen anderen mysql benutzenden programmen die ich ausprobierte, also auch bei mybb, wp, phpbb und piwigo, so ich sie im default-website verzeichniss installierte.

    Ich kann jetzt spontan nicht sagen, was genau bei den anderen Systemen nicht funktioniert. Eine MyBB Instanz hatte ich auf dem Lima-City freespace getestet, die konnte ich installieren.
    Da müsste ich also wieder die jeweilige Fehlermeldung sehen, um das im Einzelfall beurteilen zu können.

    blogvvard schrieb:
    und natürlich liegt es an lima city!

    Aufgrund der Fehleranalyse würde ich jetzt nicht sagen, dass bei Lima-City etwas kaputt ist.
    Der Fehler tritt natürlich nur auf, wenn ich per IPv6 zugreife und nicht wenn ich per IPv4 zugreife. Vielleicht können die anderen Hoster kein IPv6. Vielleicht warst du beim Test mit deinem Client an einem Anschluss oder auf einem System ohne funktionierendes IPv6. Vielleicht hattest du keinen AAAA-Record ins DNS eingetragen. Vielleicht hat der Happy Eyeballs Algorithmus IPv4 statt IPv6 bevorzugt.
    Das alles können Gründe sein, wieso der Fehler nicht auftaucht. Aber die Fehlerursache muss in der Software mylittleforum behoben werden, nicht bei Lima-City.

    Ich lese grade, dass du Unterschiede anhand der PHP-Version gefunden hast.
    Da muss ich nochmal forschen, ich kann mir im ersten Moment nicht vorstellen, dass das einen Einfluss haben soll.
  • in: Probleme mit mysql

    geschrieben von fuerderer

    Ok, bisher sehe ich wenig Informationen, um mit der Fehlersuche anzusetzen.
    Ich habe einmal testweise selbst mit dem Software-Installer eine myBB-Instanz aufgesetzt. Das lief so weit und ich konnte mich im Forum einloggen. (Mehr hatte ich nicht getestet.)
    Ich sehe also kein grundsätzliches Problem mit dem Software-Installer.

    Was genau nun nicht funktioniert, kann vermutlich am besten die PHP-Fehlermeldung sagen. Und an die müssen wir ran kommen.

    Ja, ich brauchte soeben auch einige Anläufe, bis error logging mittels
    .user.ini
    bei mir funktioniert hatte.
    1. Bitte beachte den Punkt am Anfang des Dateinamens. Du hast in deinem Post die Datei ohne diesen Punkt genannt.
    2. Nach meiner Beobachtung funktioniert die Datei im Unterverzeichnis der Applikation aber nicht im Hauptverzeichnis des Nutzers.
    3. Ich musste noch
    log_errors
    auf
    on
    setzen, also so:
    log_errors = on
    error_log = //home//webpages//lima-city//fuerderer//logs//php-errors.log
    Diese Info fehlt hier auf der Infoseite bezüglich Error Logging:
    https://www.lima-city.de/hilfe/ich-bekomme-einen-fehler-angezeigt-was-kann-ich-tun
    Falls das zufällig jemand vom Lima-City Team liest, bitte ergänzt diese Zeile noch.

    Nun hoffe ich, dass du mit diesen Tipps eine brauchbare Fehlermeldung aus dem System bekommst, um der Ursache tiefer auf den Grund gehen zu können.
  • in: Facebook Verifikation

    geschrieben von fuerderer

    Hallo skateen,

    die DNS-Einträge deiner Domains bei Lima-City kannst du unter Verwaltung > Websites & Domains > Domains ändern.

    Dort klickst du zuerst auf die betreffende Domain, dann auf "DNS verwalten", dann auf "Eintrag erstellen".
    - Bei Typ wählst du "TXT" aus.
    - Als Name gibst du nochmal deine Domain ein (nicht das @, wie es laut Facebook-Beschreibung bei einigen Registraren nötig sei)
    - Als Inhalt übernimmst du den Text wie von Facebook vorgegeben.

    Viele Grüße,
    fuerderer
  • in: Berechnen von einem Durchmesser durch Abzug von Windungen

    geschrieben von fuerderer

    Hallo Werner,

    schöne Geometrie-Frage. Dann versuche ich einmal mein Glück, ich hoffe es wird verständlich.

    Die Theorie

    Klebeband und Toilettenpapier sind zwar räumliche Objekte, aber wir können die Ansicht auf den Querschnitt und damit zwei Dimensionen reduzieren. Die Breite des Bands wird dabei ausgeblendet. Nur die Länge und Dicke spielen noch eine Rolle.

    Wenn das Band aufgewickelt ist, stellt es geometrisch einen Kreisring dar. (Siehe Wikipedia-Artikel zum Kreisring, dort ist auch eine Zeichnung mit Formelzeichen, die ich im Folgenden verwenden werde.)

    Dieser Kreisring hat einen bestimmten Flächeninhalt. Wird das Band abgewickelt, entsteht ein langes schmales Rechteck (Länge Mal Dicke des Bands) mit gleichem Flächeninhalt. Wird das Band erneut aufgewickelt, entsteht ein neuer Kreisring mit weiterhin gleichbleibendem Flächeninhalt.

    Kontrollrechnung

    Ich überprüfe einmal deine bisherige Berechnung, um sicher zu stellen, dass ich die Situation richtig verstehe und die Theorie dazu passt.

    Du hast einen Coil mit Außendurchmesser D = 1800 mm (Außenradius R = 900 mm)
    Der Innendurchmesser d beträgt 500 mm (Innenradius r = 250 mm)
    Materialstärke t = 2 mm

    Die Anzahl der Windungen ergibt sich einfach aus der Breite des Kreisrings und der Dicke des Materials.
    Formel: n = \frac{R - r}{t}
    Formel: n = \frac{900 mm - 250 mm}{2 mm}
    Formel: n = 325

    Für die Bandlänge berechne ich zuerst den Flächeninhalt des Kreisrings.
    Formel: A = \pi \cdot \left(R^2 - r^2\right)
    Formel: A = \pi \cdot \left((900mm)^2 - (250mm)^2\right)
    Formel: A = 2348340,5 mm^2

    Daraus ergibt sich dann über die Rechtecksformel die Länge des Bands.
    Formel: l = \frac{A}{t}
    Formel: l = \frac{2348340,5 mm^2}{2 mm}
    Formel: l = 1174170 mm = 1174,17 m

    Das passt beides zu deinen Angaben.

    Nun zur Fragestellung

    Es werden 25 Windungen von dem Coil abgewickelt. Dadurch reduziert sich der Radius um 25 Mal die Dicke des Bands.
    Der neue Radius r ist also:
    Formel: r = R - n * t
    Formel: r = 900 mm - 25 * 2 mm
    Formel: r = 850 mm
    Der Coil hat also nach dem Abwickeln der 25 Windungen noch einen Außendurchmesser von 2*r = 1700 mm.

    Jetzt berechne ich den Flächeninhalt des Kreisrings, der dem abgewickelten Band entspricht. Also ein Kreisring mit Außendurchmesser 1800 mm und Innendurchmesser 1700 mm. Hintergrund ist, dass der selbe Flächeninhalt auch beim erneuten Aufwickeln wieder entsteht.
    Formel: A = \pi \cdot \left(R^2 - r^2\right)
    Formel: A = \pi \cdot \left((900 mm)^2 - (850 mm)^2\right)
    Formel: A = 274889,36 mm^2

    Aufgewickelt wird dieses Band nun auf einen Kern mit Innendurchmesser 500 mm (Innenradius r = 250 mm)
    Ich kenne außerdem den Flächeninhalt, kenne aber nicht den Außenradius. Deshalb muss ich die Formel für den Flächeninhalt des Kreisrings so umstellen, dass ich den Außenradius R berechnen kann.
    Formel: A = \pi \cdot \left(R^2 - r^2\right) | Beide Seiten geteilt durch Pi
    Formel: \frac{A}{\pi} = R^2 - r^2 | Beide Seiten + r^2
    Formel: \frac{A}{\pi} + r^2 = R^2 | Ziehe die Wurzel von beiden Seiten (und vertausche die Seiten)
    Formel: R = \sqrt{\frac{A}{\pi} + r^2}

    Jetzt noch die Werte einsetzen und durchrechnen.
    Formel: R = \sqrt{\frac{274889,36 mm^2}{\pi} + (250 mm)^2}
    Formel: R = 387,3 mm

    Der neu aufgewickelte Coil hat am Ende einen Außendurchmesser von 2*R also 774,6 mm.

    Nochmal zum Verständnis

    Mit Flächeninhalt meine ich nicht die Fläche des Bands (z.B. Papierfläche), denn dafür müsste ich noch die Breite kennen, die hier irrelevant ist. Es geht immer um die Fläche des Kreisrings, wenn ich den Coil im Querschnitt betrachte.

    Ich hoffe, das war verständlich. Melde dich gerne, falls es noch Fragen gibt.

    Viele Grüße,
    fuerderer
  • in: Windows VM im Netzwerk über FTP/SSH erreichen?

    geschrieben von fuerderer

    Ok, aufgrund der Antworten scheint das eine NAT-Konfiguration in HyperV zu sein.
    Das schlussfolgere ich aus den verschiedenen IP-Ranges (zwischen Heimnetz und virtuellem Netzwerk der VM) und weil die VM im Router nicht auftaucht. Trotzdem wundert mich, dass du aus der VM heraus keine Geräte im Heimnetz erreichen kannst (Antwort 3), das müsste ein NAT eigentlich durch lassen.

    Prinzipiell gibt es zwei Möglichkeiten.
    Du könntest das NAT weiterhin nutzen, brauchst dann aber Port-Forwarding Regeln, damit Dienste der VM erreichbar sind. Der Windows-Host muss also eingehende Anfragen gemäß Regeln an die VM weiter geben. Möglicherweise wird die veränderliche IP-Adresse der VM hier noch zum Problem, das heißt du müsstest diese entweder in Debian statisch festlegen oder den DHCP-Server im virtuellen HyperV-Netzwerk anweisen, immer die gleiche IP-Adresse zu vergeben.

    Du könntest alternativ in den Netzwerkmodus "Extern" wechseln, dann sollte sich die VM in dein normales Heimnetz eingliedern, als wäre sie ein eigenständiges physikalisches Gerät. Erfahrungsgemäß kann so ein Setup aber insbesondere mit WLAN etwas Probleme bereiten.

    Wie gesagt, ich selbst habe nicht direkt Erfahrung mit HyperV, deshalb kann ich leider nur grob Hilfestellung geben. Ein paar Infos hab ich von folgender Seite, die könnte dir evtl. auch weiter helfen:
    https://nocksoft.de/tutorials/hyper-v-netzwerkkonfiguration-inklusive-nat-netzwerk/

    Ich wünsche viel Erfolg beim Konfigurieren!
  • in: SCHUTZ-MAIL.DE | Anonyme kostenlose temporäre E-Mailadressen

    geschrieben von fuerderer

    Hallo BruchpilotNr1,

    das Projekt finde ich eine super Idee. Ich kenne die Thematik: Wenn man Spam-Mails bekommt würde man gerne wissen, wer jetzt schon wieder die eigene Mail-Adresse verkauft hat.

    Rein optisch finde ich die Webseite schon sehr gelungen, gute Arbeit!

    Super finde ich auch, dass du eine Datenschutzerklärung formuliert und die Mechanismen des Dienstes beschrieben hast. Andererseits ist mir aufgefallen, dass kein Impressum zu sehen ist. Das würde ich mich persönlich nicht trauen, aber ich bin auch kein Anwalt, kann dir also nicht sagen wie da genau die Rechtsprechung ist.

    Eine Aussage in der Datenschutzerklärung verstehe ich vom technischen Hintergrund nicht ganz:
    Nach 60 Tagen kann die gleiche E-Mailadresse erneut vergeben werden.
    Nach meinem Verständnis müsste der Dienst stumpf alle eingehenden Mails speichern, nach 30 Tagen löschen und bei entsprechender Anfrage per Browser alle Mails einer bestimmten Adresse aus der Datenbank ausgeben. Demnach gäbe es kein Konzept von "E-Mailadressen" oder anders gesagt, wenn die letzte Mail einer Adresse gelöscht ist, ist auch die Adresse implizit verschwunden. Vielleicht verstehe ich das aber noch falsch.

    Wenn ich die Seite neu lade, bekomme ich oftmals eine neue Mailadresse zugewiesen. Ich weiß nicht ob das Absicht oder ein Bug ist, aber die zufällig gewürfelte Adresse sollte vielleicht innerhalb meiner Browser-Session gleich bleiben, außer ich möchte explizit eine neue haben. Nach manuellem "Change" scheint sie ja dann auch persistent zu sein.

    Eines unterscheidet schutz-mail.de von anderen, vergleichbaren Diensten: Ich kann den Teil vor dem @-Zeichen selbständig festlegen. Heißt konkret: Wenn ich mich vor längerer Zeit mal mit einer bestimmten Adresse irgendwo registriert hatte und der Dienst dann plötzlich eine Mail zur Verifikation senden möchte, kann ich diese Mail finden und muss dafür nichts weiter als die Adresse kennen.

    Umgekehrt kann das aber auch zum Sicherheitsproblem werden, das fiel mir soeben noch auf. Wenn ein Dienst die Mail-Adressen von seinen Nutzern z.B. im Profil anzeigt, könnte eine andere Person ebenso auf das Postfach zugreifen und z.B. einen Passwort-Reset per Mail durchführen.
    Ich würde prinzipiell an dem Konzept festhalten, aber dennoch irgendwo erwähnen, dass alle Mails ungeschützt abrufbar sind, sofern man die Mailadresse kennt.

    Insgesamt schätze ich, schutz-mail.de ist nützlich um für kurze Zeit eine Mail-Adresse zu haben, die ich dann direkt wieder wegschmeißen möchte. Wenn ich über längere Zeit Mails empfangen und dabei aber nachverfolgen möchte (im Sinne: Ich habe für jeden Dienst eine separate Mailadresse und kann nun zuordnen, wer für den Spam verantwortlich ist), dann würde ich eher einen anderen Dienst nehmen, weil es bei schutz-mail.de (zumindest aktuell noch) umständlich ist, mehrere Mailadressen auf eingehende Mails zu überwachen.
  • in: Ordner aus Verzeichnis anzeigen, nach Datum sortieren

    geschrieben von fuerderer

    Hallo davy,

    das Problem liegt hier im Detail, und zwar beim Abruf des Erstellungsdatums.

    PHP kennt
    filemtime()
    (letzte Änderung des Inhalts),
    filectime()
    (letzte Änderung der Inode) und
    fileatime()
    (letzter Lesezugriff).

    Bei Verzeichnissen bedeutet "Änderung des Inhalts": Elemente wurden in das Verzeichnis eingefügt, gelöscht oder darin umbenannt.

    Es fehlt in PHP eine Funktion "filebtime" (birth-time, Erstellungsdatum) obwohl das in Linux prinzipiell auch abrufbar wäre.

    Falls die Ordnerinhalte immer nur kurz nach dem Erstellen befüllt und dann nicht mehr angefasst wurden, könnte filemtime() für dich funktionieren. (Weil es dann in zeitlicher Nähe zum Erstellungsdatum liegt.)
    Gerne zeige ich auch die algorithmische Lösung um dann wie gewünscht die Ordner zu sortieren, falls dir das weiter hilft.

    Wenn du zwingend das Erstellungsdatum brauchst, würde ich raten, auf eine andere Sprache (z.B. C oder Rust) auszuweichen. Kommt natürlich darauf an, in welcher Umgebung das laufen soll. Auf dem Lima-City Freespace z.B. kann generell nichts anderes als PHP ausgeführt werden, also auch Aufrufe anderer Progamme aus PHP heraus werden blockiert.
  • in: Windows VM im Netzwerk über FTP/SSH erreichen?

    geschrieben von fuerderer

    Hallo Tobi,

    das Setup mit der VM überblicke ich noch nicht komplett. Du schreibst im Titel von Windows, im Text von Debian. Was davon ist das Hostsystem, welches System ist Gast?

    Beim virtuellen Netzwerk habe ich leider nur mit VirtualBox (basierend auf KVM (das hatte ich glaub ich falsch in Erinnerung.)) Erfahrung. Prinzipiell gibt es dort das NAT-Netzwerk und die Netzwerkbrücke. Ich schätze das ist bei HyperV ähnlich und gehe davon aus, dass du versuchst eine Netzwerkbrücke in Betrieb zu nehmen.

    Dann noch ein paar mehr Detailfragen:

    Ist der PC per Kabel oder WLAN angebunden?

    Konfigurierst du IPv4 oder IPv6?

    Welche der folgenden Ziele kannst du aus der VM heraus anpingen: Den Host-PC, den Laptop, Server im Internet?

    Hat die VM eine IP-Adresse in der üblichen IP-Range deines Heimnetzwerks bekommen?

    Falls dein Heimrouter eine Netzwerkübersicht mit Geräten auflistet, taucht die VM dort nochmal extra (zusätzlich zum Host-PC) auf?


    Ich muss leider viel fragen, weil ich so auf Anhieb noch keine potenzielle Fehlerquelle sehen kann.

    Grüße, fuerderer
  • in: Lima Auktions .de-Domain nutzbar mit Vertag

    geschrieben von fuerderer

    joachimhahn schrieb:
    Wo findet man die Auktionen überhaupt, suche hier schon seit 1er Stunde

    Wenn du hier im Forum unterwegs bist, dann ist oben der "Community"-Bereich offen.
    Darunter habe ich eine weitere Navigationsleiste:
    Forum | Favoriten | Angesagt | Auktionen | Benutzer | ...
    Oder, Direktlink: https://www.lima-city.de/auctions
  • in: LimaCity SSH Zugang auf Windows

    geschrieben von fuerderer

    Hallo mehralsnurradio,

    da es um SSH geht, vermute ich das betrifft einen Cloud-VPS, also nicht den Webspace.

    Die Fehlermeldung kenne ich vom openssh-client unter Linux. Sie erscheint wenn der Server ausschließlich Key-Authentifizierung, also keine Passwort-Authentifizierung erlaubt (das ist hier der Fall) und zudem die Key-Authentifizierung fehlschlägt.

    Damit die Key-Authentifizierung funktioniert, muss der private-Key unter C:\Users\USERNAME\.ssh\id_rsa liegen (Quelle) und der public-Key muss in der Verwaltung auf dem betreffenden VPS erlaubt werden.

    Der Artikel SSH-Keys erzeugen in der Hilfe behandelt das Thema.
  • in: Logikgatter durch Machine Learning simulieren

    geschrieben von fuerderer

    Hallo thecoody,

    zunächst einmal habe ich zwei kleine Anpassungen durchgeführt:
    In Zeile 82 steht:
    XOR.test(input1, input2)
    Da sollte eher 'self' stehen:
    self.test(input1, input2)


    Und bei der Berechnung der Backpropagation habe ich die Formel etwas abgeändert.
    Aus diesem Teil
    e1 = self.w31 / (self.w31 + self.w32) * e3
    e2 = self.w32 / (self.w31 + self.w32) * e3
    habe ich das hier gemacht:
    e1 = self.w31 * e3 * self.sigmoid_derivative(neuron3)
    e2 = self.w32 * e3 * self.sigmoid_derivative(neuron3)
    Begründung:
    Die Ableitung der Propagierungsfunktion in Neuron 3 ist für das Endergebnis relevant, deshalb sollte diese auftauchen. Dagegen spielt die Summe aus den beiden Gewichten bei der Ableitung keine Rolle, sondern nur das jeweils individuelle Gewicht.

    An dieser Stelle zeigt das NAND-Gatter schon sehr gute Ergebnisse, nur das XOR-Gatter will noch nicht so richtig.
    Generell scheint es mir, als sei das XOR-Gatter um einiges schwieriger zu trainieren als das NAND-Gatter.

    Ich habe testweise zum Trainingsbeginn statt zufalligen Parametern einen Parametersatz vorgegeben, der bereits "in die Richtung" von XOR geht:
    XOR.w11 = 2.0
    XOR.w12 = 2.0
    XOR.w21 = 2.0
    XOR.w22 = 2.0
    XOR.w31 = 2.0
    XOR.w32 = -2.0
    
    XOR.b1 = -1.0
    XOR.b2 = -3.0
    XOR.b3 = -1.0
    Und ich habe die Trainingsparameter stark verändert. (1,4 Millionen Epochen, learning_rate=0.3)
    Nun "akzeptiert" das neuronale Netz seine Aufgabe und trainiert in die richtige Richtung, aber die Optimierung verläuft sehr, sehr langsam.


    Ich hoffe, ich konnte damit ein klein wenig weiter helfen.
  • in: Funktion wird nicht als Funktion erkannt

    geschrieben von fuerderer

    Hi,
    interessanterweise überschreibt die counter-Funktion sich selbst. Das ist hier Ursache für die Fehlermeldung.

    Da die Funktion denselben Namen hat wie die Zählvariable (beide heißen counter), kann sie nur einmal aufgerufen werden und zerstört sich dabei.

  • in: Domain Inhalt ändern funktioniert nicht mehr!

    geschrieben von fuerderer

    Die Weitereitung 301 besagt "Moved Permanantly", d.h. dein Browser darf die Weiterleitung im Cache behalten und zukünftig automatisch weiterleiten.

    Versuche einmal in einem privaten Fenster die Domain aufzurufen. Wenn du dann nicht weitergeleitet wirst, lag es nur am Cache und du könntest z.B. einmal den Browsercache komplett leeren.
  • in: node.js Server unter Domain

    geschrieben von fuerderer

    adimy schrieb:
    Da sich ja, wie schon gesagt, die IP regelmäßig ändert, habe ich einen Dynamic DNS Hostname der auf diese Verweist. Kann ich den auch nutzen?
    Ja, das DynDNS nimmt dir die Arbeit ab, die Domain regelmäßig an die neue IP anzupassen. Im einfachsten Fall verwendest du den DynDNS Namen so wie er ist.

    Falls dir der Name nicht gefällt und du stattdessen eine eigene Domain nehmen möchtest, hilft eventuell ein CNAME-Record. Da kann ich aber leider nicht aus Erfahrung sprechen, weil ich das noch nie ausprobiert habe. Ich verweise hier einmal auf Wikipedia:
    https://de.m.wikipedia.org/wiki/CNAME_Resource_Record
  • in: node.js Server unter Domain

    geschrieben von fuerderer

    Zwei Möglichkeiten fallen mir dazu ein:

    Der direkte Weg
    - Du stellst in deinem DNS deine private IP-Adresse ein.
    - Im Router musst du in der Firewall für das Zielgerät eine Ausnahme schalten, sodass man von außen nach innen verbinden darf.
    - Bei IPv4 braucht es zudem ein Port-Forwarding im NAT des Routers.
    - Deine IP ändert sich vermutlich regelmäßig, außer du hast beim ISP eine statische Adresse gebucht. Bei jeder Änderung müsstest den DNS-Eintrag anpassen - z.B. per Skript über eine Api.

    Über einen Tunnel
    Dieser Weg bietet sich an, wenn du bei einem Hostingprovider einen Server mit SSH-Zugang angemietet hast.
    Beispiel: Du kannst per SSH auf myuser@myserver zugreifen. Der node.js Server läuft lokal auf Port 8080 und soll auf dem Server unter Port 80 verfügbar gemacht werden. Das Kommando dazu sieht dann so aus:
    ssh -R 80:localhost:8080 myuser@myserver
    Damit werden Verbindungen über SSH zu dir getunnelt.
  • in: HTML zu Bild

    geschrieben von fuerderer

    Ich bin hier auf eine Anleitung gestoßen:

    https://codepedia.info/convert-html-to-image-in-jquery-div-or-table-to-jpg-png/

    Das sieht nach einer clientseitigen Lösung aus, unter anderem wird jQuery benutzt.
    Ich habe die Anleitung aber nur kurz überflogen und die Demoseite angeschaut.
  • in: Hilfe gesucht.

    geschrieben von fuerderer

    Da der Code auf Github liegt, kannst du natürlich auch einfach ein Issue erstellen. Das hätte dann den Vorteil, dass alle Nutzer dieser Software von der Änderung profitieren.
  • in: Betriebssystem ohne programmieren

    geschrieben von fuerderer

    Das kommt darauf an, was du mit dem neuen Betriebssystem erzielen möchtest.

    Falls du z.B. nur auf das Ausssehen und Verhalten der grafischen Oberfläche Einfluss nehmen möchtest, empfiehlt es sich beispielsweise KDE Plasma zu installieren.

    Die Oberfläche ist vielfältig konfigurierbar mit einigen Themes und weiteren Einstellungsmöglichkeiten.

    Wenn du aber tatsächlich ein neues Betriebssystem (sowas wie ein Linux-Kernel) erschaffen möchtest, wirst du ohne Programme zu schreiben vermutlich nicht weit kommen.
  • in: 13-stellige Zahlen aus Text filtern

    geschrieben von fuerderer

    Was du suchst ist preg_match_all

    Das Array, das von preg_match zurück kommt, enthält nur einen Treffer und dessen Subgruppen. (Wobei du im Regex keine Gruppen definiert hast, brauchst du in dem Fall auch nicht)

    Bei preg_match_all werden alle Treffer als zweidimensionales Array geliefert.

    Beispiel:
    <?php
    $str = $_POST['text'];
    $pattern = '/[0-9]{13}/';
    preg_match_all($pattern, $str, $matches);
    
    $anzahl = count($matches[0]);
     
    for ($x = 0; $x < $anzahl; $x++)
    {
        echo $matches[0][$x] . "<br />";
    }

    Auf die Weise bekommst du dann alle gefundenen Zahlenfolgen.
  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    Beim letzten Fiddle ist mir wohl ein Fehler unterlaufen. Einige meiner Änderungen waren nicht gespeichert.

    Das Beispiel was du nennst, ist kein Problem für das Dropdown-Menü. Du kannst jeden Menüpunkt frei konfigurieren und einstellen, welche Zeilen genau angezeigt werden sollen.
    Um das besser zu demonstrieren, habe ich das Beispiel nochmal etwas erweitert:
    https://jsfiddle.net/jzkeL5p9/48/

    Vielleicht verstehe ich das genaue Problem noch nicht, wieso das Dropdown-Menü nicht zielführend sein soll.
  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    So, jetzt habe ich mich nochmal dran gesetzt.
    Ich bin der Meinung, mit Dropdown-Menüs kann man das Problem deutlich besser lösen, als mit einfachen Buttons.

    Hier kannst du dir das Ganze mal anschauen: https://jsfiddle.net/jzkeL5p9/47/

    Punkt 1 hat sich damit in meinen Augen erledigt.

    Zu 2: Du siehst beispielsweise unter
    case "Puppe":
    im Javascript-Code folgendes:
    modify_all([
        ["fmd", false],
        ["fmh", false],
        ["fp", true],
        ["ft1", false],
        ["ft2", false],
        ["ft3", false],
        ["model_choice", false],
    ]);
    break;
    Dabei bedeutet "true", dass das Element eingeblendet wird, bei "false" wird es ausgeblendet. In dem Fall wird also "fp" angezeigt und alles andere ausgeblendet.
    Du kannst hier nach Belieben ergänzen, ändern usw.

    Zu 3: Bei der aktuellen Lösung musst du eben im zweiten Dropdown-Menü "Alle" auswählen, um bei Model sowohl Damen als auch Herren einzublenden.
  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    Ich habe jetzt auf jsfiddle etwas versucht:
    https://jsfiddle.net/jzkeL5p9/13/

    Wenn man zuerst auf "Damen" drückt und dann auf "Model", wird die Zeile mit Model (Damen) eingeblendet und die Zeile mit Model (Herren) ausgeblendet. Drückt man zuerst auf "Herren" und dann auf "Model", verhält es sich umgekehrt.

    War das so gemeint?
  • in: Tabellenreihen per Klick ein-/ausblenden Javascript

    geschrieben von fuerderer

    Was genau ist das Problem? Wenn du für jeden Button eine Liste an id's bereitstellst, sollte alles funktionieren. Oder hast du Zeilen, die von mehr als einem Button betroffen sind?

    wadolowski schrieb:
    Gibt es einen Befehl/Code der die Zeilen vor dem ausführen neuer Befehle erst einmal in den Urzustand versetzt???
    Wenn zu Beginn z.B. alle Zeilen sichtbar waren, dann ist es kein Problem per Skript auch wieder alle sichtbar zu machen.

    Wenn du uns Beispielcode zeigst oder hochlädst und verlinkst was du versucht hast, können wir besser helfen.
  • in: Funktionen der Seite in externer SVG-Datei nutzen

    geschrieben von fuerderer

    Der Javascript-Code der SVG Grafik ist hier tatsächlich auf ein separates window-Objekt beschränkt, das wusste ich zuvor noch nicht.

    Ich hab jetzt eine mögliche Lösung erarbeitet.

    function.min.js:
    function example() {
    alert('Es hat geklappt');
    }
    document.addEventListener("DOMContentLoaded", function() {
      // Erstelle von außen explizit ein parent-Attribut, um danach von innen nach außen zugreifen zu können.
      document.getElementById("map").contentWindow.parent = window;
    });


    Skriptcode in der map.svg:
    document.addEventListener("DOMContentLoaded", function() {
      // Zugriff über das vorher erstelle parent-Attribut nach außen
      parent.example();
    });
    Das Konstrukt mit
    document.addEventListener
    kann hier entfallen, wenn du die Funktion example nicht sofort, sondern z.B. bei einem Klick ausführen möchtest.

    Allerdings habe ich es nur in Firefox 62.0 getestet. Du solltest einmal durchprobieren, ob auch andere Browser diese Lösung unterstützen.
  • in: Funktionen der Seite in externer SVG-Datei nutzen

    geschrieben von fuerderer

    Ich hoffe, ich habe die Beschreibung richtig verstanden. So auf Anhieb kann ich aber nur spekulieren.
    Vielleicht liegt es an der Ausführungsreihenfolge, vielleicht blockiert der Browser etwas aus Sicherheitsgründen. Das müsste man dann herausfinden.

    Könntest du einen Link zur Seite senden, wo man sich das Problem anschauen kann?
  • in: PHP E-Mail - Bei GMail steht "über Lima-Mail.de"

    geschrieben von fuerderer

    Dieser Hinweis entsteht denke ich nicht durch eine falsche Programmierung, sondern der Mailserver von Lima-City wird einfach bestimmte Header in die Mail einfügen die GMail dann entsprechend darstellt.

    Wenn du das unbedingt entfernen möchtest, gibt es eine Alternative:
    Du kannst dir eine beliebige Mailadresse z.B. bei GMail erstellen. Dann nutzt du PHPMailer oder eine andere Bibliothek um die Mail über SMTP zu versenden.
    Der Vorgang ist somit der gleiche, als würdest du die Mail über einen Mailclient wie Thunderbird senden und Google dürfte keinen Hinweis zu Lima-City mehr anzeigen.
  • in: Textdateien bei LimaCity

    geschrieben von fuerderer

    Was meinst du mit Textdateitools?

    Ist das eine fertige Software oder ein Framework bzw. eine Bibliothek? Dann bräuchte ich einen Link, denn über Google hab ich das nicht gefunden.

    Meinst du damit die PHP-Befehle zum Verarbeiten von Textdateien, also fopen, fwrite, fgets usw.? Dann solltest du Beispielcode liefern, denn prinzipiell funktionieren diese auf Lima-City.
  • in: Fehler bei if-elif-else in Python

    geschrieben von fuerderer

    horstexplorer schrieb:
    - Zeile 9 fehlt ein + hinter zwischen var und String.
    - Den Input immer in lowercase umwandeln, dann lässt sich damit leichter arbeiten egal wie die Schreibweise ist.
    So weit stimme ich horstexplorer zu.
    Die Korrektur der Bedingung stimmt aber leider nicht. Das Beispiel hätte zur Folge, dass immer nur das erste Wort verglichen wird und die anderen werden ignoriert.

    Nochmal auf Anfang, ich nehme die Abfrage von mehralsnurradio:
    if pi == 'Schlecht' or 'Nicht gut' or 'Nicht so gut':
    Das funktioniert so nicht, weil die Syntax von Python nicht wie die deutsche oder englische Grammatik funktioniert. Das "or" kann nur logische Ausdrücke verknüpfen und ein String wie 'Nicht gut' für sich alleine ist kein logischer Ausdruck.

    Richtig wäre es so:
    if pi == 'Schlecht' or pi == 'Nicht gut' or pi == 'Nicht so gut':


    Es gibt noch eine andere Möglichkeit, die ist etwas kürzer und gefällt dir vielleicht besser:
    if pi in ('Schlecht', 'Nicht gut', 'Nicht so gut'):
    Hier erstelle ich aus den drei Begriffen eine Liste und frage anschließend, ob die Benutzereingabe in der Liste enthalten ist.
  • in: Endungen nur von .php entfernen .htacess

    geschrieben von fuerderer

    Wenn ich den Code richtig verstehe, entfernt dieser keine Endungen sondern sorgt dafür, dass PHP-Dateien über URLs ohne Endung überhaupt aufgerufen werden können.

    Das was dir dann die Umleitung macht z.B. von /test.php auf /test müsste anders aussehen.

    Hast du noch andere Anweisungen bezüglich dieser Umleitung in der .htaccess?

    Und was passiert wenn du im Browser ein privates Fenster öffnest? Beobachtest du dann noch den selben Fehler?
  • in: Welche Sprachen bei Lima City?

    geschrieben von fuerderer

    HTML, CSS und Javascript sind ja clientseitige Sprachen. Da der Server hierbei nur die Dateien ausliefern muss, gibt es (abgesehen von Dateitypbeschränkungen) keine Einschränkungen seitens des Webservers.
    Was du mit SSI meinst ist mir nicht klar.

    Serverseitig bietet Lima-City nur PHP als Programmiersprache an. Man könnte noch SQL erwähnen, das ist als Abfragesprache ja auch eine Sprache.
  • in: Angemeldet bleiben

    geschrieben von fuerderer

    Wenn ich jetzt auf deiner Seite angemeldet bin und den Browser schließe und neu öffne, bin ich wieder abgemeldet. Das funktioniert also schonmal.

    Was noch nicht geht, ist die Funktion "Angemeldet bleiben".
    Dazu solltest du die folgenden Zeilen noch einmal überarbeiten:
    setcookie("bleiben", "no", time()-4000);
    setcookie("bleiben", "yes", time()+4000);
    Wenn du einem Cookie einen neuen Wert geben möchtest, ist es nicht notwendig, diesen vorher zu löschen. Die obere der beiden Zeilen kannst du dir also sparen. Setze einfach den neuen Wert mit neuem Ablaufdatum und die Sache ist gut.

    Der gleiche Fall ist dann nochmal drei Zeilen weiter unten, da solltest du auch die Zeile zum Löschen des Cookies entfernen.
  • in: Angemeldet bleiben

    geschrieben von fuerderer

    Hallo mehralsnurradio,

    das Problem müsste in der myaccount.php an dieser Stelle liegen:
    if ($_SESSION["login"] == "no") { 
    header("Location: /konto"); 
    }
    Wenn ein neuer Benutzer die Seite betritt, dann hat seine Session-Variable noch keinen Inhalt. Das bedeutet, dass das Feld "login" auch nicht "no" enthalten kann. Die Bedingung ist nicht erfüllt und du bekommst keine Weiterleitung.
    Besser wäre sowas:
    if (!isset($_SESSION["login"]) || $_SESSION["login"] != "yes") { 
    header("Location: /konto");
    exit;
    }


    Ich hoffe, dass du dieses Skript wirklich vorerst nicht produktiv einsetzt, denn dazu müsstest du noch einiges zum Thema Absicherung dazulernen.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Gut, ich hab den Fall einmal an einem einfachen Beispiel nachgestellt.

    Folgende CSV-Datei ist gegeben:
    1,Max,Mustermann
    2,Karl,Otto
    3,Friedrich,Schmidt
    Falls du in deiner Datei als erste Zeile Überschriften hast, solltest du diese entfernen oder in PHP extra behandeln.

    Nun habe ich folgende SQL-Tabelle erstellt:
    CREATE TABLE `personen` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `vorname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      `nachname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    Und jetzt kommt der PHP-Code, der die Daten hier einträgt:
    <?php
    // SQL Zugangsdaten
    $db = new PDO("mysql:host=localhost;dbname=db12345", "db-user", "db-password");
    
    // CSV Dateiname
    $csv_file = fopen("./data.csv", "r");
    
    function bulk_insert($db, $dataset) {
      $values = implode(",", $dataset);
      // Spaltennamen anpassen
      $query = "INSERT INTO personen (id, vorname, nachname) VALUES $values;";
      $db->query($query);
    }
    
    $lnr = 1;
    $dataset = [];
    
    // Anzahl der Spalten anpassen
    $expectedcolumns = 3;
    
    while (($line = fgetcsv($csv_file)) !== false) {
      if (count($line) == $expectedcolumns) {
        $fields = [];
        foreach ($line as $field) {
          $fields[] = $db->quote($field);
        }
        $dataset[] = "(" . implode(",", $fields) . ")";
        if (count($dataset) >= 100) {
          bulk_insert($db, $dataset);
          $dataset = [];
        }
      } else {
        echo "Error on line $lnr: Expected $expectedcolumns columns but found " . count($line) . "\n";
      }
      $lnr++;
    }
    if (count($dataset) > 0) {
      bulk_insert($db, $dataset);
    }
    
    fclose($csv_file);
    Die wichtigen Stellen im Skript, an denen du noch etwas anpassen musst, habe ich kommentiert.

    Ich hoffe, ich konnte damit weiter helfen.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Zu 2.:
    Ich hatte mir überlegt, lokal z.B. einen Apache mit PHPMyAdmin aufzusetzen. Du kannst dann das Upload-Limit in Apache und PHP (wo es vermutlich Probleme macht) selbst definieren und darüber die großen Dateien direkt in die externe DB bei Lima-City einspielen. Ich bin mir jedoch nicht sicher, wie es dabei mit der Performance aussieht, weil die Datenbankverbindung über eine große Strecke mit womöglich hohen Latenzen aufgebaut ist.

    Zu 3.:
    Du könntest per FTP die CSV-Datei auf den Webserver laden und ein PHP-Skript schreiben, das die CSV-Datei zeilenweise liest, parst (also die einzelnen Datenfelder extrahiert) und dann blockweise, z.B. immer 100 Datensätze gemeinsam in die DB einspielt.
    Zum Parsen der CSV-Datei gibt es wohl in PHP bereits Funktionen, jedoch habe ich damit keine Erfahrung.
    https://secure.php.net/manual/de/function.fgetcsv.php
    Und das Einfügen in die Datenbank geht mit MySqli oder PDO.
    Die genaue Implementierung hängt dann von dem Aufbau der Tabellen und der CSV-Dateien ab.
  • in: Sehr grosse Dateien mit phpMyAdmin importieren

    geschrieben von fuerderer

    Ich schmeiß mal verschiedene Ideen in den Raum:

    1. Die Dateien auftrennen in kleinere Teile.
    2. Das Upload-Limit erhöhen, z.B. mit einer lokalen PHPMyAdmin Instanz und damit direkt auf die Lima-City DB zugreifen.
    3. Ein eigenes (PHP-)Skript schreiben, das die Daten aus der CSV-Datei liest und in die Datenbank übernimmt.

    Nur, um eine Vorstellung zu bekommen: Wie groß sind denn nun die CSV-Dateien? Also gemeint ist die Dateigröße und/oder die Anzahl der Datensätze.
  • in: Error "allow_url_fopen=0"

    geschrieben von fuerderer

    Laut PHP Manual kann man die Option allow_url_fopen nicht über ini_set() verändern.

    Es bleiben also zwei Möglichkeiten:
    1. Den PHP-Interpreter umkonfigurieren
    2. Das Skript abändern, sodass es auf anderem Weg auf die Web-Ressource zugreift, das ist jedoch recht umständlich.

    Was meinst du mit „neuer Server“? Ist das der Lima-City Webspace? Falls ja, Free oder Premium (bei Premium: Welches Paket?)

    Im Free-Paket von Lima-City ist es nicht möglich, die Konfiguration abzuändern, ich kann dir leider nicht sagen, ab welchem Premium-Paket das möglich ist. Kann das vielleicht jemand ergänzen?
  • in: Interner Website Counter

    geschrieben von fuerderer

    Ich hab hier mal ein Beispiel, vollständig mit HTML außen rum:
    <!doctype html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Counter</title>
      </head>
      <body>
        <p>Sie sind der <?php
    $f = fopen("./counter_value.txt", "c+");
    flock($f, LOCK_EX);
    $counter = ((int)fgets($f))+1;
    ftruncate($f, 0);
    rewind($f);
    fwrite($f, "$counter\n");
    flock($f, LOCK_UN);
    fclose($f);
    echo $counter;
    ?>. Besucher.</p>
      </body>
    </html>
    Alles zwischen <?php und ?> ist PHP-Code. Den kannst du schnappen und dort in dein HTML einfügen, wo der Zählerstand angezeigt werden soll.
    Wichtig ist dann noch, dass die HTML-Datei die Endung .php bekommt, damit der PHP-Code auch ausgeführt wird.
    Falls du die Dateiendung .php nicht magst, gibt es noch gewisse Tricks, um auch in einer HTML-Datei PHP-Code auszuführen. Das lässt sich per .htaccess einstellen.
  • in: Interner Website Counter

    geschrieben von fuerderer

    Mit PHP lässt sich da auf jeden Fall was basteln.
    Einen externen Anbieter würde ich nicht nehmen, gerade wegen der DSGVO ist das einfach zu umständlich für einen simplen Counter. Du müsstest ja alleine dafür wieder einen Vertrag zur Auftragsdatenverarbeitung schließen, den Anbieter in der Datenschutzerklärung nennen, usw.

    Wieso meintest du „vorzugsweise JS“? Eine rein clientseitige Lösung wirst du nicht bekommen, wenn du die Zugriffe aller Besucher zählen möchtest und nicht jeder Besucher seinen eigenen Zähler haben soll.

    Ein PHP-Snippet kann ich dir gerne noch liefern. Du musst mir nur sagen, ob du den Zählerstand lieber in einer Datei oder in einer SQL-Datenbank ablegen möchtest und ob du mehrere Zähler haben möchtest (z.B. pro Unterseite) oder einen Zähler für die gesamte Website.
  • in: Anmeldung per PHP

    geschrieben von fuerderer

    Prinzipiell ist kein System zu 100% abgesichert. Das gilt für das Betriebssystem auf dem die Website läuft, für den Webserver, für den PHP-Interpreter und auch für dein PHP-Skript.

    Das PHP-Skript ist jedoch das, worauf du Einfluss hast, und wo Sicherheitslücken auch am wahrscheinlichsten sind. Wenn du uns das präsentierst, können wir drüber schauen und bezüglich Sicherheit beurteilen.
  • in: Wie kann ich meine Webeite sicherer machen? PHP

    geschrieben von fuerderer

    Hi Jonas.

    Es gibt einige Angriffsszenarien, die du als PHP-Entwickler kennen musst. Wenn du mit Daten vom Benutzer arbeitest (also $_GET, $_POST, $_COOKIE, $_SERVER, Dateiuploads) musst du beispielsweise entsprechende Sorgfalt walten lassen und diese je nach Verwendung passend maskieren.

    Eine gute Übersicht über mögliche Angriffe bietet Wikipedia:
    https://de.m.wikipedia.org/wiki/Sicherheit_von_Webanwendungen#Angriffsmethoden

    Zu jedem dieser Angriffe gibt es dann wiederum einen ganzen Artikel.
    Wenn du alle dort aufgeführten Angriffe verstanden und abgewehrt hast, dann hast du schon eine sehr sichere Seite.

    Für ein kleineres Projekt kannst du die unteren drei Angriffe durchaus ignorieren. Also Man-in-the-Browser, Denial-of-Service und Phishing. Diese sind sehr schwer bis unmöglich serverseitig abzuwehren.
  • in: php ftp script

    geschrieben von fuerderer

    Du gibst bei ftp_put zweimal die Variable $zieldatei an. Beim zweiten Mal wird der lokale Pfad der hochzuladenden Datei erwartet. Bist du sicher, dass hier $zieldatei für dich passt?

    Vielleicht solltest du dir einmal diese Seite ansehen, die Datei-Uploads behandelt: https://secure.php.net/manual/de/features.file-upload.post-method.php
    Insbesondere das Feld tmp_name ist für dich interessant, denn darüber erfährst du, wo die Datei lokal abgelegt ist.
  • in: Kartellverdacht von Insider bekommen

    geschrieben von fuerderer

    darvin schrieb:
    Aber wie ist es prinzipiell, wenn man weiß (und es beweisen kann), dass einer eine Straftat begonnen hat und es nicht meldet. Macht man sich dann Strafbar?
    Ich habe dazu folgendes Video von einem Rechtsanwalt gesehen: https://www.youtube.com/watch?v=O72f2cMNFp8

    Zusammengefasst: Nur sehr schwere Straftaten (genannt werden z.B. Angriffskrieg, Hochverrat, Geldfälschung, Raub, Mord) muss man anzeigen. Bei weniger schweren Straftaten bleibst du selbst straffrei, wenn du diese nicht anzeigst.
    Meiner Einschätzung nach musst du ein Kartell also nicht anzeigen.
  • in: Automatische Aktualisierung von Bildern

    geschrieben von fuerderer

    Die Html-Seite und das eingebundene Bild werden vom Cache unabhängig voneinander behandelt.
    Egal, ob man nun mit PHP irgendwelche Header setzt oder Meta-Tags ins Markup einfügt, das wirkt sich alles nur auf die Html-Datei aus, während das Bild munter weiter im Cache gespeichert bleibt.

    Das Ziel ist also, den no-cache Header für das Bild zu setzen und nicht für die Html-Datei.
    Am einfachsten geht das in einer .htaccess Datei:
    <Files bilddatei.jpg>
      Header add Cache-Control "no-cache"
    </Files>
    ^^ Der Dateiname muss noch angepasst werden.

    Theoretisch könnte man auch PHP verwenden um das Bild auszuliefern und dabei die Header zu setzen, einfacher dürfte aber der Weg über .htaccess sein.
  • in: Problem beim ausgeben eines Cookies mit PHP

    geschrieben von fuerderer

    Wenn ich deinen Code so verwende, funktioniert bei mir alles wie es soll. Du musst natürlich die Variable actions initialisieren, aber das hast du vermutlich getan, sonst würde der Browser die entsprechende Zahl an Klicks nicht anzeigen.

    Vielleicht liegt es am Cache.
    Hast du die Seite irgendwo stehen, sodass man mal draufschauen kann?
    Ansonsten könntest du auch mal den vollständigen Code posten. Eventuell ist woanders noch ein Fehler.
  • in: Meta-Tags mit JS auslesen ?

    geschrieben von fuerderer

    Versuche mal diesen Beispielcode:
    var metas = document.getElementsByTagName("meta");
    for (var i=0; i<metas.length; i++) {
      var e = metas[i];
      if (e.hasAttribute("name") && e.hasAttribute("content")) {
        var name = e.getAttribute("name");
        var content = e.getAttribute("content");
        console.log("Meta-Tag; Name: " + name + ", Inhalt: " + content);
      }
    }
    Den kannst du dann noch anpassen, je nachdem was genau du auslesen möchtest.
  • in: Leere Elemente aus Array ersetzen

    geschrieben von fuerderer

    Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.

    Anstatt
    preg_replace("/^[\s]?$/", "Ersatz", $array);
    müsstest du also
    $array = preg_replace("/^[\s]?$/", "Ersatz", $array);
    schreiben.

    @horstexplorer:
    Hinter dem Ausdruck für Whitespaces steht ein Fragezeichen, d.h. der String kann ein Leerzeichen enthalten, muss aber nicht.
  • in: Mit PHP Zeichenkette ausgeben, die am häufigsten in String..

    geschrieben von fuerderer

    na-web schrieb:
    Ich möchte wenn der String "Hallo, Hallo, Welt" ist die Zeichenkette ausgeben, die am häufigsten vorkommt also "Hallo" in diesem Fall ausgeben.
    Wie definierst du denn eine solche Zeichenkette, meinst du ganze Wörter?

    Denn "Hallo" kommt zwar zweimal vor, dagegen kommt aber die Zeichenkette "l" ganze 5 Mal vor.
  • in: Umstellung auf PHP bei meinem Wordpressblog

    geschrieben von fuerderer

    Um ehrlich zu sein, finde ich es schon witzig, dass man mehreren Parametern in einer Funktion den selben Namen gibt. Was sich der Entwickler deines Themes dabei wohl gedacht hat?

    Aber darum geht es nicht, du brauchst eine Lösung.
    Ich hab ein bisschen rumgespielt und herausgefunden, dass PHP 5.6 diese Schreibweise tatsächlich erlaubt. In der Variable $bwc steht dann der Wert, der für das zweite der beiden gleichnamigen Argumente übergeben wurde, der erste Wert wird also ignoriert.

    Nun, PHP 7 erlaubt das nicht mehr und um das Problem zu lösen, sollte es reichen wenn du dem ersten der beiden $bwc Parametern einen anderen Namen gibst. Hier ein Beispiel, was ich ändern würde:
    Funktionskopfzeile bisher:
    function art_normalize_widget_style_tokens($content, $bw, $bwt, $ewt, $bwc, $bwc, $ewc, $ew) {

    Ändern zu:
    function art_normalize_widget_style_tokens($content, $bw, $bwt, $ewt, $dummy, $bwc, $ewc, $ew) {


    Ich hoffe, du kommst damit weiter. Ist ja immerhin ein "Fatal Error", womöglich gibt es also noch mehr Probleme, bis der Blog unter PHP 7.0 glatt läuft.
    Viel Erfolg!
  • in: PhP Script aufrufen mit JS

    geschrieben von fuerderer

    horstexplorer schrieb:
    Allerdings wird hierbei nicht gewartet darauf, dass das PhP Script fertig gelaufen ist.
    Wie setze ich das so um das wenn das Script beendet wird meine Funktion ausgeführt wird, aber die Website nicht auf das beenden dieser wartet?
    Mich verwundert, dass dieses Skript nicht auf PHP wartet. Auf welche Weise hast du das denn überprüft? Denn eigentlich sollte es warten, das hast du schon richtig programmiert.

    Was mir an der Stelle aber auffällt:
    horstexplorer schrieb:
    Ich würde gern eine Webseite anzeigen lassen mit div 1 ausgeblendet und div 2 eingeblendet. Dann soll ein PhP Script ausgeführt werden und wenn das fertig durchgelaufen ist soll div1 ein und div2 ausgeblendet werden.
    Diese Beschreibung passt nicht zum Skript, dort blendest du die beiden Div's genau umgekehrt ein und aus. Das war doch hoffentlich nicht der einzige Fehler ...
  • in: CSS: Halbkreis erzeugen und einzelne Segmente füllen

    geschrieben von fuerderer

    Ich würde in diesem Fall eine Vektorgrafik erstellen. Falls du dich damit auseinander setzen möchtest, empfehle ich folgendes Tutorial: https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial

    Das Beispielbild, welches du gepostet hast, lässt sich mit SVG wunderbar nachbilden und diesen Vorgang kann man auch automatisieren, z.B. mit PHP.

    Was meinst du mit Ansprechbarkeit/Formatierbarkeit der Segmente? Alles was die statische Darstellung betrifft (Farben, Aufteilung, Größe der Segmente) kann man serverseitig vorberechnen und benötigt dann nicht einmal CSS. Soll sich die Darstellung jedoch auf dem Client ändern (z.B. mit hover-Effekten), dann wird das Ganze komplizierter.

    Eine Änderung der Farbe von Objekten im SVG wäre soweit ich weiß sogar mit CSS möglich, ich möchte das jetzt aber nicht garantieren. Wenn du komplizierteres machen möchtest, z.B. Größenänderungen, müsste man jedoch evtl. auf Javascript zurückgreifen.
  • in: Passwort ertellen

    geschrieben von fuerderer

    horstexplorer schrieb:
    Leider dauert das ganze relativ lang. Fürs Passwort generieren weniger das Problem, aber bei aufrufen in scripten ungeeignet, da es knapp 50s dauert. Evtl gebt das ganze schneller?
    Klar geht das schneller. Ich hab dir meinen Ansatz gepostet. Ein einzelner, richtig angewandter hash_hmac reicht aus, damit lässt sich in 86 Mikrosekunden ein neues Passwort berechnen. Machst du das Ganze komplizierter, dauert es natürlich entsprechend länger.
    Ich nehme an, dass die Berechnung von Pi bei dir sehr viel Zeit in Anspruch nimmt.
  • in: Passwort ertellen

    geschrieben von fuerderer

    Dieser selbst ausgedachte Algorithmus ist bestimmt interessant und eine nette Spielerei, hat aber leider entscheidende Nachteile.
    Zum einen lässt sich die wahre Sicherheit sehr schlecht abschätzen. Der Algorithmus ist schließlich geheim und du kannst als einziger beurteilen, wie sicher er sein wird. Da kann es schonmal passieren, dass du etwas übersiehst und eine Kryptoanalyse schneller zum Erfolg führt als du erwartet hättest.
    Zum zweiten lässt sich dieser Algorithmus schlecht vervielfältigen. Stell dir vor, du wärst Mitarbeiter eines IT-Unternehmens und müsstest diese Passwortänderung für insgesamt 100 Kunden implementieren. Würdest du dir 100 neue Algorithmen einfallen lassen?

    Ich empfehle daher, offene Algorithmen einzusetzen, deren Sicherheit gemäß Kerckhoffs Prinzip nur auf der Geheimhaltung eines Schlüssels beruht.

    Mein Ansatz sähe so aus:
    $key = "143105b7cdfbc1a9c055676b5ab370c2441131636b690283fd45c94564c64138";
    $date = date("d.m.Y");
    $db_password = hash_hmac("sha256", $date, $key);

    Meinen Beispielkey musst du natürlich austauschen, denn wenn er hier im Forum rumsteht, ist er logischerweise nicht sicher.

    HMAC ist dafür konzipiert, dass auch bei tausenden offengelegten Nachricht-Hash Paaren zu einer neuen Nachricht nicht der entsprechende Hash ermittelt werden kann, ohne den Key zu kennen.
    In diesem Fall bedeutet das konkret: Auch wenn jemand weiß, dass das einfache Datum zur Berechnung genutzt wird und über Jahre hinweg alle Datenbankpasswörter protokolliert hat, kann er ohne Key nicht das Passwort für den nächsten Tag errechnen.


    Und falls du diese Passwortänderung tatsächlich auch noch auf einem anderen Rechnernetz haben willst, kannst du einfach den Key austauschen anstatt einen neuen Algorithmus zu entwerfen.


    Ein entscheidendes Problem gibt es trotzdem noch: Wer den Programmcode in die Finger bekommt (und dabei ist es egal ob selbst implementiert oder meine HMAC Variante), der kann alle Passwörter, auch alle zukünftigen ermitteln. Du solltest deshalb in Erwägung ziehen, das Passwort jeden Tag auf einem deiner beiden Systeme zufällig zu erzeugen und auf eine sichere Weise auf das andere System zu übertragen.
  • in: Innerhalb einer Klasse auf eine andere Klasse zugreifen

    geschrieben von fuerderer

    user012 schrieb:
    Was wäre denn die andere/leichtere Methode?
    Na genau die, die du auch schon (fast) korrekt umgesetzt hast - mit dem Autoloader.
    Ich muss hier noch anmerken:
    - Den Autoloader packst du am besten in eine eigenständige Datei. Die lässt sich dann einfach von überall her einbinden.
    - Jede Klasse kommt ebenfalls in eine eigene Datei, gemäß dem Namensschema des Autoloaders. Nur dann werden Klassen die man benötigt auch gefunden und es werden keine Klassen unnötig geladen.

    Du musst dann nur noch daran denken, in jeder Datei die als Skripteinstieg dient einmal den Autoloader einzubinden. Anschließend kannst du nach Belieben deine Klassen verwenden und was fehlt wird automatisch geladen.

    So einen Autoloader zu verwenden ist bei großen Projekten wesentlich einfacher als im Blick zu behalten, wer denn jetzt genau wen einbindet.
  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Dass hinter dem function Schlüsselwort ein Klammerpaar fehlt, ist mir nicht sofort aufgefallen. Ich habe deinen Beispielcode zum Test in ein neues HTML-Dokument eingefügt und dann mit Firefox geöffnet. Wenn es irgendwelche Fehler, in diesem Fall Syntaxfehler gibt, steht dann in der Webkonsole eine Fehlermeldung mit Zeilennummer und sogar Zeichenposition. Schaut man dann nochmal genauer an die Stelle, fällt der Fehler auch meistens schnell auf.

    Den anderen Fehler, dass du das event nicht übergeben hast, hab ich direkt entdeckt. Aber auch hier hätte die Webkonsole weiter geholfen. Die beschwert sich dann, dass die Variable "event" den Wert undefined enthält und kein Attribut "keyCode" besitzt.

    Klar, als Entwickler muss man auch lernen seine eigenen Fehler zu finden, auch wenn es keine Fehlermeldungen gibt. Ich baue dazu meistens Ausgaben in meine Programme ein, in Javascript geht das z.B. mit console.log()
    So kann man den Programmablauf generell oder auch bestimmte Variablenwerte untersuchen und damit den Fehler eingrenzen, bis man ihn schließlich gefunden hat.

  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Beim Test hab ich zwei Fehler gefunden:
    1. Bei der function-Deklaration im setTimeout (Zeile 11) fehlt ein rundes Klammernpaar, direkt nach dem wort "function".
    2. Das "event" musst du beim Aufruf von KeyCheck übergeben (Zeile 16) und in der Funktionsdeklaration entgegen nehmen (Zeile 7), sonst kannst du nicht darauf zugreifen.

    Hier ist das Ergebnis, zumindest bei mir funktioniert es jetzt.
    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Versuch</title>
        <script>
    function KeyCheck(event) {
        var KeyID = event.keyCode;
        if(KeyID==83) {
            document.getElementById("Text").innerHTML = "Der Text";
            setTimeout(function() { document.getElementById("Text").innerHTML = "";  }, 3000);
        }
    }
        </script>
      </head>
      <body onkeydown="KeyCheck(event)">
        <span id="Text"></span>
      </body>
    </html>
  • in: setTimeout in einer Funktion

    geschrieben von fuerderer

    Das ist nicht besonders schwer. Wenn du uns zeigst, was du bereits versucht hast, können wir sicher helfen, vielleicht hast du ja einfach einen kleinen Fehler drin.

    Grob läuft das etwa so ab:
    function onButtonClick() {
      // Text einblenden
      setTimeout(function() {
        // Text, Button, was auch immer wieder ausblenden
      }, 5000)
    }

    Das musst du jetzt natürlich an deine Umgebung anpassen. Ich weiß ja nicht wie deine Seite aufgebaut ist und wie die betroffenen Elemente für Javascript ansprechbar sind.
  • in: Seite aufrufen mit PhP

    geschrieben von fuerderer

    Ob jetzt der Homeserver die Mail senden soll oder Lima-City, darüber lässt sich bestimmt streiten.
    Ich selbst habe keine Erfahrung mit Mailservern, kann aber bei dem PHP-Ansatz weiterhelfen. Dass ein PHP-Skript ein anderes aufruft, ist für mich nichts neues, so etwas habe ich schon ein paar mal gemacht.

    // Irgendein PHP Code
    $empf = urlencode("name@domain.tld");
    $btrf = urlencode("Betreff");
    $msg = urlencode("Nachricht");
    file_get_contents("https://horstexplorer.lima-city.de/test1.php?empf=$empf&btrf=$btrf&msg=$msg&key=Key");
    // Noch mehr PHP
    Das hat aber zur Folge, dass dieses PHP-Skript, das auf dem Homeserver läuft, auf den Lima-City Server wartet bevor es den Skriptablauf fortsetzt. Ist das nicht gewünscht, müsste ich schauen was PHP da alternativ zu bieten hat.

    Bezüglich Sicherheitsbedenken würde ich 3 Dinge beachten:
    - Variable Werte immer schön mit urlencode() maskieren.
    - Einen Key einbauen. (hat horstexplorer bereits) Dieser muss natürlich ausreichend lang und zufällig sein und logischerweise auch überprüft werden, damit nur das berechtigte Skript auf die Schnittstelle zugreifen kann.
    - https verwenden, damit die Url (insbesondere der Key) nicht unterwegs mitgelesen werden kann.
    Wenn du diese 3 Punkte beachtest, wüsste ich nicht, was daran noch unsicher sein sollte.
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Allerdings kann mit den Gruppenrecht etwas gemacht werden, weil FTP und PHP unterschiedlichen Gruppen angehören. Ob das angesichts der Tatsache, dass beide aber Owner sind, eine Rolle spielt, teste ich noch etwas durch.
    Damit wirst du nicht viel erreichen. Wenn ein Prozess dem Owner einer Datei angehört, gelten für ihn die Ownerrechte, alles andere interessiert einfach nicht.

    Um das mal an einem Extrembeispiel klar zu machen: Wenn ich unter Linux einer Datei, die mir gehört die Rechte 077 gebe, darf ich selbst nicht mehr darauf zugreifen, während alle anderen Nutzer alles damit tun dürfen.
    Die Berechtigungen ändern kann ich natürlich trotzdem wieder, ich kann mich also nicht selbst von einer Datei aussperren. Aber solange ich die Rechte auf 077 belasse, wird mir der Zugriff verwehrt.

    Für Lima-City würde ich die Situation ganz einfach zusammenfassen:
    1. Wir müssen uns nicht um die Sicherheit des eigenen Webspaces kümmern. Andere Nutzer können nicht darauf zugreifen, das wird durch das FTP-Wurzelverzeichnis, open_basedir und die Sperrung einer Reihe von PHP-Funktionen sichergestellt. Außerdem sind die group- und others-Rechte standardmäßig bei neuen Dateien auf 0 gesetzt.
    2. Als FTP-Nutzer den PHP-Skripten Rechte wegzunehmen wird nicht funktionieren - zumindest nicht wirksam. Gleiches gilt umgekehrt.

    Die Dateirechte hier auf dem Webspace brauchen uns also nicht zu interessieren. Wir lassen sie einfach wie sie sind und alles ist gut.
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Meine Beobachtung: FTP und PHP sind der selbe Owner/Eigner, doch sie gehören zu unterschiedlichen Gruppen. PHP zur Gruppe 65534, FTP zur Gruppe 33. Dennoch haben zugeteilte Gruppenrechte keine Bedeutung, denn der Eigner ist halt jedesmal der selbe. Andererseits kann ich mit einem PHP-Script den FTP-Zugriff mit chmod 040 sperren - und umgekehrt. Offenbar kann man die Unterscheidung auf diese Weise dennoch erreichen, und eine Absicherung wird auf diese Weise möglich. Oder?
    Auf Unix-Systemen ist es üblich, dass der Owner einer Datei jederzeit deren Rechte ändern kann. Da FTP und PHP immer als Eigentümer zählen, wäre damit eben kein Schutz gewährleistet.

    Die Rechte 040 habe ich also ausprobiert - und jetzt bin ich auch verwirrt. :confused:
    Wenn das Owner-Leserecht fehlt, kann ich über FTP die Rechte nicht mehr ändern. Ist das bei dir genauso?
    Außerdem kann ich mit FTP das Leserecht und das Schreibrecht des Eigentümers nicht mehr entfernen, sobald es einmal gesetzt ist. Wenn ich über FTP "chmod 000" bei einer Datei mit den Rechten 777 versuche, stehen die Rechte anschließend auf 600.

    Mit PHP ist eine Rechteänderung aber immer möglich, ohne Einschränkung.

    Mir erschließt sich deshalb noch nicht, wie man jetzt über FTP eine Datei anlegen soll, damit PHP diese noch lesen aber nicht mehr schreiben kann. Das war doch das Ziel des ganzen. Kannst du dafür ein Beispiel machen?
  • in: Die richtigen Rechte auf Lima City

    geschrieben von fuerderer

    theglobe schrieb:
    Binary-Butterfly-Artikel:
    "lima-city
    Keine Trennung von PHP- und FTP-Nutzer möglich, daher chmod wirkungslos und korrekte Dateirechte nicht realisierbar.

    Website: https://www.lima-city.de/
    Quelle: Support."

    (Gilt laut Artikel übrigens auch für 1&1, Alfahosting, Domainfactory, Hetzner und andere.)

    So wird es wohl sein. Mit der Einschränkung, dass die von mir genannten unorthodoxen Rechte-Einstellungen sehr wohl verhindern können, dass ein eingeschmuggeltes oder manipuliertes PHP-Script Schäden verursacht.
    Nein, auch die von dir vorgeschlagenen Rechte helfen nicht gegen eine Manipulation von Skriptdateien durch PHP.

    Ein PHP-Programm kann einfach selbst ein chmod() ausführen, eben weil es mit dem selben Nutzer wie FTP arbeitet. Das sieht dann z.B. so aus:
    <?php
    $perms = fileperms(__FILE__);
    chmod(__FILE__, 0600);
    $f = fopen(__FILE__, "a");
    fwrite($f, "// ".date("H:i:s")."\n");
    fclose($f);
    chmod(__FILE__, $perms);
    Speichere dieses Skript auf deinem Webspace und erteile ihm die Rechte 400. Es wird trotzdem bei jedem Aufruf einen Kommentar mit der aktuellen Uhrzeit bei sich selbst ergänzen. Dazu macht es sich zunächst schreibbar, hängt dann eine Zeile an und stellt schließlich die ursprünglichen Rechte wieder her, um nicht aufzufallen.
  • in: Darstellungs-Lags bei Animation

    geschrieben von fuerderer

    noxious schrieb:
    Zum einen weisen Funktionen wie "Sleep" darauf hin, dass du die Funktion von Framerates nicht verstanden hast. Du wartest nicht im Frame, du nimmst die Sekunden, wartest bis diese auf 1 höher als vorher sind und inkrementierst bis dahin eine Frames-Variable. Wenn die vergangene Zeit größer als 1 Sekunde ist, teilst du die aktuellen Frames durch die vergangenen Sekunden und erhälst... Frames per Second. Dann setzt man die Frames und die vergangenen Sekunden auf 0. Und fährt fort. Da wartet man nicht.
    Ich zeige die "Frames per Second" ja nicht direkt an, das würde mir nichts bringen weil das dann ja auf 50 steht, ich aber trotzdem nur 2 Frames jede Sekunde sehen kann.

    Was ich hier habe ist ein Framezähler, der kontinuierlich von Frame zu Frame hochzählt. Der Sinn davon ist es, eine Animation zu haben, damit sich das Bild zwischen den Frames auch jedesmal ändert. Ich hätte auch ein Rechteck im Kreis bewegen können, da gäbe es die selben Symptome.

    noxious schrieb:
    Ähnliches gilt für Framerate-Begrenzer. Man wartet nicht, sondern zeichnet nur, wenn die aktuelle Zeit größer als die gewünschte Zeit ist. Du sagst nicht "mache alles, warte n sekunden, mach dann das nächste", weil du dann immer die FPS + "die Zeit die du gebraucht hast" bekommst. Du updatest deine Daten so oft wie möglich, aber zeichnest nur, wenn die gewünschte Zeit vergangen ist.
    Mir ist bewusst, dass ich im Beispielprogramm oben nicht ganz exakt 50 FPS habe, weil von Sleep zu Sleep immer ein paar Mikrosekunden vergehen. Das ist aber auch ein Minimalbeispiel. Im ursprünglichen Programm schaue ich permanent auf die Uhr und warte nur so lange, wie es noch bis zur nächsten Frame dauert. Damit bekomme ich dann exakt 50 FPS.

    Das Problem ist ja nur ein Anzeigeproblem. Es lässt sich innerhalb des Programms nicht messen, da die Gameloop und paintComponent() regelmäßig aufgerufen werden und nirgendwo hängen bleiben.

    Ok, ich habe einmal testweise das
    Thread.sleep(20)
    ersatzlos gestrichen. Nun lastet das Java-Programm 1,6 CPU-Kerne aus und es werden ca. 33000 Frames pro Sekunde gezeichnet. Tatsächlich sichtbar sind jetzt ca. 18 Frames jede Sekunde, sehe ich auf einer Zeitlupenaufnahme meines Bildschirms. Das ist besser als 2 aber immernoch nicht gut, denn meines Wissens nach kann mein Bildschirm 60 Bilder pro Sekunde darstellen.

    Wenn ich jetzt den Framerate-Begrenzer einbaue, wie du ihn beschrieben hast, bin ich wieder da wo ich vorher war: Bei 50 gezeichneten Frames pro Sekunde, von denen 2 sichtbar sind. Und im Prinzip habe ich nur den Sleep-Befehl durch eine Busy-Waiting Warteschleife ersetzt, die jetzt einen CPU-Kern voll auslastet.


    Es wäre interessant, wenn mal jemand ein sauberes Beispiel schreiben könnte, das irgendeine Animation zeigt ohne dass man Maus oder Tastatur benutzen muss. Das würde ich dann bei mir testen und berichten.


    Edit: Jetzt habe ich das Problem endlich gelöst!
    Ich habe am Ende der Methode paintComponent() folgende Zeile eingefügt:
    Toolkit.getDefaultToolkit().sync();
    In der Dokumentation steht dazu:
    Synchronizes this toolkit's graphics state. Some window systems may do buffering of graphics events.

    This method ensures that the display is up-to-date. It is useful for animation.
    Anscheinend ist die Ubuntu Unity-Oberfläche eines dieser Systeme, die die Grafikausgabe puffern. Deshalb brauche ich die Zeile um ein flüssiges Bild zu bekommen, während es auf anderen Betriebssystemen auch so schon flüssig läuft.
  • in: Fehlererkennuung

    geschrieben von fuerderer

    Ich bin etwas spät dran, hoffe das ist noch relevant.

    Die Hamming-Distanz von 6 sagt ja aus, dass sich zwei verschiedene, gültige Codewörter in mindestens 6 Stellen unterscheiden. Das einfachste Beispiel wäre ein Wiederholungscode mit n=6

    Erstmal grob zum Verständnis:
    Aus einer "0" macht der Wiederholungscode "000000"
    Aus einer "1" macht der Wiederholungscode "111111"
    Diese Codewörter sind also nur gültig, wenn alle Bits gleich sind. Und damit haben wir eine Hamming-Distanz von 6, weil bei einer Änderung alle 6 Bits geändert werden müssen.

    Ein Korrekturverfahren kann jetzt problemlos 2 Bitfehler korrigieren. Es kann aber gleichzeitig auch beim Auftreten von 3 Bitfehlern einen Fehler melden, dann aber nicht korrigieren. Die Begründung an 3 Beispielen:

    001010: Hier haben sich wahrscheinlich zwei 1er-Bits eingeschlichen => Korrektur zu 000000
    101100: Das ist genau der Fall, in dem wir drei Bitfehler haben aber diese nur melden und nicht korrigieren können.
    011101: Hier haben sich wahrscheinlich zwei 0er-Bits eingeschlichen => Korrektur zu 111111
    (Die Reihenfolge der Bits in den fehlerhaften Codes spielt hier natürlich keine Rolle und wurde von mir willkürlich gewählt.)

    So, ich hoffe dass es durch diese Beispiele klarer wurde.
  • in: Darstellungs-Lags bei Animation

    geschrieben von fuerderer

    Hallo zusammen,

    ich versuche mit Java ein Spiel zu programmieren, das Problem ist aber, dass die Grafik zeitweise extrem ruckelt.
    Hier ein minimales Beispiel, in dem der Fehler auftritt:
    package test;
    
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MyPanel extends JPanel implements Runnable {
    	static final long serialVersionUID = 1l;
    	private int frameNr;
    
    	public MyPanel() {
    		new Thread(this).start();
    	}
    
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		frameNr++;
    		g.drawString("Frame Nr. " + frameNr, 10, 50);
    		System.out.println(frameNr); // wird regelmäßig und flüssig in die Konsole ausgegeben
    	}
    
    	public void run() {
    		try {
    			while (true) {
    				Thread.sleep(20);
    				this.repaint();
    			}
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setSize(400, 200);
    		frame.add(new MyPanel());
    		frame.setVisible(true);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    Die Gameloop ruft 50 Mal pro Sekunde repaint() auf. In der paintComponent() Methode zähle ich die tatsächlich gezeichneten Frames und schreibe die Nummer auf die Konsole und in das JPanel.

    Die Ausgabe auf die Konsole erscheint immer regelmäßig und flüssig. (siehe Kommentar Zeile 20) Auf dem JPanel sehe ich jedoch zeitweise nur noch zwei Frames pro Sekunde. Der Zähler springt dort dann in 25er-Schritten nach oben.

    Es scheint, als würde das Java-Programm die Frames regelmäßig zeichnen, aber sie werden eben nicht regelmäßig auf dem Bildschirm angezeigt.

    Außerdem beobachte ich eine Abhängigkeit zu meinem Mauszeiger. Das Problem tritt überwiegend dann auf, wenn sich der Mauszeiger außerhalb des Fensters befindet oder wenn er im Fenster ruht. Wenn ich die Maus dagegen permanent innerhalb des Fensters bewege, bekomme ich eine flüssige Darstellung.

    Ich nutze Ubuntu 16.04 mit der Unity-Oberfläche.
    Als Hardware habe ich einen Intel Core i7 Prozessor und eine Intel Grafikkarte.

    Kann mir jemand erklären, wie es zu dem Problem kommt und wie man es beheben kann?
  • in: Problem/Frage bezüglich AJAX - PHP (POST)

    geschrieben von fuerderer

    Die Überprüfung auf
    !isset
    oder
    empty
    ergibt in der switch-case Anweisung nicht besonders viel Sinn. Du könntest auf "if, else if" umsteigen, dann funktioniert das.

    Aber diese Tests hast du vermutlich auch nur zum Debugging eingebaut. Wenn du wissen möchtest, welchen Wert eine Variable genau hat, dann hilft dir die Funktion
    var_dump()
    . Diese gibt dir den Typ und Inhalt einer Variablen aus.

    Teste damit mal
    $_POST['final']
    ,
    $final
    und
    $meldung
    durch, dann solltest du mehr wissen.
  • in: .sh Script per PhP starten

    geschrieben von fuerderer

    horstexplorer schrieb:
    Die Rechte im Verzeichnis habe ich mit
    chown www-data /sys/class/gpio/*

    hoffentlich richtig gesetzt.
    Nun ja, das ist naheliegend. Du kannst das aber auch überprüfen.

    Zuerst einmal würde ich gerne sehen, welche Rechte jetzt tatsächlich gesetzt sind. Das kannst du mit
    ls -l /sys/class/gpio
    abfragen.

    Dann kannst du einmal versuchen, die funktionierenden Shellskripte mit www-data Rechten auszuführen.
    Wechsle dazu einfach mit
    sudo su www-data
    in den Rechtekontext des Webservers und teste dann die Shellskripte.

    In PHP empfiehlt es sich, die Fehlermeldungen explizit einzuschalten. Füge also oben im Skript folgende Zeilen ein:
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    Danach gibt dir PHP unter Umständen auch Fehler aus.

    Mit diesen Schritten kannst du dann den Fehler genauer eingrenzen.
  • in: Subdomain erstellen

    geschrieben von fuerderer

    cybercrack schrieb:
    Kann man dass nicht für alle Subdomains automatisch machen?
    In der Webseiten verwaltung kann man ja, einfach *.domain.com machen, geht das auch bei den SSL-Zertifikaten?
    Prinzipiell gibt es Wildcard-Zertifikate, diese sind aber so weit ich weiß relativ teuer. Let's Encrypt bietet diese Wildcard-Zertifikate nicht an.
    Update: Ich habe soeben mitbekommen, dass es dieses Feature ab Januar 2018 geben soll. (Quelle)


    Bleibt also (bis dahin) nur noch, die Anforderung von Zertifikaten zu automatisieren, dann sind wir wieder hier:
    xn--94h schrieb:
    Du kannst das mit curl verwirklichen.

    Dazu muss sich der Script in mit deinen Account einloggen und in die Verwaltung gehen.


    Mehr dazu
  • in: Reload-Quelle feststellen

    geschrieben von fuerderer

    kalb schrieb:
    Welche JS methoden zum Reload gibt es den?
    Ich kenne da nur
    location.reload()
    . Überschreiben scheint nicht zu funktionieren, das hab ich grad versucht.

    Aber vielleicht reicht ja auch schon eine Suche durch den Quelltext nach dem Begriff reload.
  • in: Style eines untergeordneten DIV-Tags ergänzen?

    geschrieben von fuerderer

    Ich konnte jetzt bei den geposteten Codestücken nicht direkt einen Fehler erkennen.

    Vermutlich bist du auf einen der gemeinen Fallstricke von Javascript hereingefallen. Speziell geht es um die Variable i. Wenn du eine for-Schleife hast, die etwa so aussieht:
    for (var i=0; i<=25; i++) {
      // ...
    }
    dann solltest du das "var" durch "let" ersetzen, also so:
    for (let i=0; i<=25; i++) {
      // ...
    }
    Hintergründe dazu gibts z.B. auf Stackoverflow. Das Problem dabei ist, dass die Variable i bis zum Ende gezählt wird und schließlich einen Wert annimmt, der zur Abbruchbedingung führt. Wird dann das Callback aufgerufen, hat i einen zu großen Wert und es wird kein Element mehr gefunden.

    Wenn ich mit der Vermutung nicht richtig liege, müsstest du wohl etwas mehr Code liefern. Praktisch wäre, wenn du einen Link zu deiner Seite senden könntest.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Ein Beispiel gibt es hier: http://doc.qt.io/qt-5/qtnetwork-http-example.html
    In der "http/httpwindow.cpp" steht wohl der Code zum eigentlichen Download. Ich hab das aber nur überflogen, scheint auf den ersten Blick relativ viel zu sein.

    Grob zum Verständnis: Das C++ Programm ruft eine .php-Datei vom Webserver auf und damit startet dieses PHP-Skript auf dem Server automatisch. Und wenn PHP Ausgaben macht (z.b. mit echo), dann empfängt C++ diese Ausgaben und macht damit irgendwas, das Beispielskript speichert es in eine Datei.

    Was ich damit sagen möchte: Serverseitig brauchst du keine Textdatei zu erzeugen. Was zum C++ Programm übertragen werden soll, gibst du einfach mit echo aus.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Also, hier noch ein Beispiel für einen timing-safe Stringvergleich in C++:
    bool hash_equals(const char *a, const char *b) {
      bool equals = true;
      while (true) {
        equals &= (*a == *b);
        if (!(*a && *b)) {
          return equals;
        }
        a++;
        b++;
      }
    }
    Am besten, man kompiliert das ohne Optimierung, damit der Compiler nicht noch irgendwelchen Mist macht.


    uebungen-till schrieb:
    Wie könnte ich das mit der serverseitigen Authentifizierung machen?
    Dazu brauchst du serverseitig ein Programm, das den Hashwert aus der Datenbank liest, ein vom Nutzer übergebenes Passwort damit überprüft und dann dem Client antwortet ob die Anmeldung erfolgreich war. Außerdem muss das Programm alle Serverzugriffe überwachen (was auch immer die Nutzer genau machen können) und dabei sicherstellen, dass nur angemeldete Nutzer zugreifen können.
    Ist deine MySql Datenbank bei Lima-City? Dann wirst du wohl PHP für die Authentifizierung verwenden. Hast du einen eigenen Server, kannst du auch andere Möglichkeiten in Betracht ziehen.

    Ein Beispielprogramm wäre jetzt komplex, etwas Vorarbeit solltest du schon leisten. Wenn es an einem bestimmten Punkt klemmt, dann helfe ich gerne wieder.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    Klar, mach ich.

    Zunächst einmal erzeuge ich einen Passworthash:
    $passwort = "passwort123";
    $hash = password_hash($passwort, PASSWORD_DEFAULT);
    echo $hash;
    Ergebnis (z.B.)
    $2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C
    Hier kommt bei jedem Aufruf der Funktion
    password_hash()
    ein anderes Ergebnis heraus, deshalb bekommst du nicht genau den gleichen Wert, falls du das wiederholst.


    Jetzt erkläre ich kurz die Bestandteile des Hashs:
    $2y$10$
    Angaben über den Algorithmus (und hier z.B. noch die verwendete Zahl der Runden)
    4mijsKmr44Tt5Olakgacue
    Der Salt (hier 22 Zeichen, das gilt aber nicht für jeden Algorithmus)
    A6w.K.8K8l12Up1PVPl4b052hWpFk.C
    Der eigentliche Hashwert


    Ich musste feststellen, dass du den Salt nicht zuverlässig vom Hashwert abtrennen kannst, da die Trennung eben abhängig vom Algorithmus wäre. Es gibt aber eine einfachere Lösung, denn man kann auch den ganzen Hashwert übergeben und der Algorithmus nimmt sich dann seinen Salt.

    Hier also die Überprüfung eines Passworts:
    $passwort = "passwort123";
    $hash = "$2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C";
    $kontrollhash = crypt($passwort, $hash);
    echo $kontrollhash."\n";
    var_dump($hash == $kontrollhash); // Vorsicht mit dem Vergleichsoperator!
    Ergebnis:
    $2y$10$4mijsKmr44Tt5OlakgacueA6w.K.8K8l12Up1PVPl4b052hWpFk.C
    bool(true)


    Wenn das Passwort nicht stimmt, kommt ein anderer Hashwert heraus:
    $passwort = "passwort124";
    Fürht zu:
    $2y$10$4mijsKmr44Tt5Olakgacuea5V4gj1Gu.U3C0B0XKti0sY57dubtzW
    bool(false)


    Ich schrieb noch: Vorsicht mit dem Vergleichsoperator!
    PHP empfiehlt, beim Vergleich solcher Hashwerte eine Funktion zu verwenden, die nicht für Timing-Attacken anfällig ist und bietet zu diesem Zweck die Funktion
    hash_equals()
    . Für C++ gilt dies prinzipiell auch. Wenn du das beachten möchtest, kann ich auch hierzu noch Beispielcode liefern.
  • in: Qt Passwort mit Passwort Hash aus Datenbank vergleichen

    geschrieben von fuerderer

    uebungen-till schrieb:
    Zum hashen in PHP habe ich das benutzt:
    password_hash($password, PASSWORD_DEFAULT);
    Ok, dann schau dir mal die Funktion
    crypt()
    an. Diese gibt es zum einen als PHP-Funktion (siehe Manual). Dort steht z.B. folgendes:
    password_hash() ist ein einfacher crypt()-Wrapper und kompatibel zu bestehenden Passwort-Hashes.

    Tatsächlich kann man mit
    crypt()
    die Passworthashs überprüfen, die mit
    password_hash()
    erstellt wurden. Dazu übergibt man zuerst das Passwort und als zweites die Angaben über Algorithmus und Salt (also den entsprechenden Teil des Hashs) und vergleicht das Ergebnis mit dem vorgegebenen Hash.

    Die
    crypt()
    -Funktion gibt es auch für C++, zumindest bei Linux ist das so. (siehe Manpage)
    Falls du Windows einsetzt, musst du schauen ob es eine äquivalente Bibliothek für Windows gibt.

    Ich hab mich jetzt kurz gefasst und alles nur grob beschrieben, für Rückfragen bin ich da.
  • in: Daten Byte-weise mit C oder C++ in andere Datei kopieren

    geschrieben von fuerderer

    Ich habe mir die 3 Dateien einmal heruntergeladen. Wenn ich minimalbeispiel.cpp kompiliere und ausführe (Linux), bekomme ich eine neue Datei, in der genau die vorderen 100 Byte fehlen - wie erwartet.

    Dass Windows hier andere Ergebnisse liefert, liegt vermutlich an Zeile 36:
    file_neu.open("b_my.txt",ios::out);
    Füge hier einmal noch das binary-Flag hinzu:
    file_neu.open("b_my.txt",ios::out | ios::binary);

    Ich konnte jetzt nicht selbst testen ob das die Ursache war, weil ich gerade kein Windows zur Hand habe.


    Edit:
    Noch ein Hinweis, ich schrieb vorher von der Schleife, die man eher vermeiden sollte. Damit meite ich z.B. sowas, Zeile 38-41:
    for (long i = 0; i <= (size-size_header-1); i++)
    {
        file_neu << nutzdaten[i];
    }
    Du kannst die Daten einfach mit write() schreiben und benötigst keine Schleife. Das ist um Größenordnungen schneller. (auch wenn das bei 2MB vielleicht noch nicht so bemerkbar ist.)
    Konkret heißt das, du kannst diese Schleife komplett durch folgenden Befehl ersetzen:
    file_neu.write(nutzdaten, size-size_header);
  • in: Daten Byte-weise mit C oder C++ in andere Datei kopieren

    geschrieben von fuerderer

    Wenn du die Datei schon komplett im Speicher hast, musst du sie tatsächlich nicht nochmal einlesen. Die Schleife mit der byteweisen Ausgabe in die Datei ist aber auch nicht wirklich brauchbar.

    Du kannst bei einem char-Pointer einfach einen Wert dazuaddieren, dadurch verschiebt sich der Pointer.
    char *nutzdaten = memblock + size_header;
    nutzdaten
    steht jetzt direkt nach den Headern und du kannst mit Hilfe von write() die Daten ab hier in eine Datei schreiben.

    Ansonsten: Was genau ist dein Problem? Ist es das hier:
    chst schrieb:
    [...] und bin leider recht bald wieder gescheitert, weil die neue Datei um insgesamt 8 Zeilen (bei 12500 eingelesenen) zu lang wird:
    Dann müsstest du mir erklären, was "8 Zeilen zu lang" bedeutet. Die Zeilen können ja nicht aus dem Nichts kommen, also was genau ist am Ergebnis falsch?
  • in: Style eines untergeordneten DIV-Tags ergänzen?

    geschrieben von fuerderer

    Wenn du ein Element ausgewählt hast, kannst du mit dem Attribut "children" an die inneren Elemente gelangen.

    Also, ein deinem Beispiel würde
    map_id.children
    ein Array liefern mit allen Elementen, die sich im Baum direkt unter dem ausgewählten div befinden. Ausgenommen sind Text-Elemente, also die Textbereiche, die nicht in ein weiteres Tag eingeschlossen sind.

    Du musst dich dann von Knoten zu Knoten durch den Baum nach unten vorarbeiten. Oft reicht es, die children abzuzählen, um an das gewünschte Element zu kommen.

    mathesoft schrieb:
    Ergänzend wäre es hilfreich, wenn ich den letzten Winkelwert speichern könnte, wenn der Nutzer dann zB 5 Grad weiterdrehen möchte. Wie mache ich das mit dem Werte speichern am besten - irgendwo auf der Page einen Value setzen?
    Klar, dazu reicht zunächst einmal eine Variable. Im Normalfall hast du einen Skriptblock, in dem die Funktion zur Drehung deklariert ist. Du kannst dann außerhalb des Funktionsblocks die Variable deklarieren, damit sie ihren Wert behält solange die Seite offen ist.

    Möchtest du den Wert auch gespeichert lassen wenn der Nutzer die Seite schließt, musst du z.B. auf LocalStorage zurückgreifen.
  • in: Rekursion schnell berechnen

    geschrieben von fuerderer

    jonas-bayer schrieb:
    Die Methode pow war mir tatsächlich auch schon aufgefallen - weil meine Zahlen Integer.MAX_VALUE deutlich überschreiten, nützt sie mir aber wenig.
    Hättest du ein konkretes Beispiel für Formel: n und Formel: w, bei dem Formel: n den Wert Integer.MAX_VALUE überschreitet? Ehrlich gesagt glaube ich kaum, dass das Ergebnis dann noch annähernd in der Größenordnung 10^5000 liegt.

    Theoretisch gibt es auch noch die Möglichkeit, die Potenz bitweise durchzuführen.
    Pseudocode zur Berechnung von a^b:
    e = a
    Stelle b binär dar
    Ignoriere die 1 ganz vorne bei b
    Iteriere von links nach rechts über die restlichen Bit von b:
        e = e * e
        Falls Bit = 1:
            e = e * a
    Gib e zurück


    Ein anderes Problem ist aber noch die Berechnung der Wurzel, denn dabei kommt kein ganzzahliger Zwischenwert heraus. Erst das Endergebnis ist wieder eine Ganzzahl.

    Man könnte jetzt durch vorheriges Multiplizieren und anschließendes Dividieren auch "Nachkommastellen" in die BigInteger Objekte einfügen, muss aber aufpassen, dass die Genauigkeit am Ende auch ausreicht um auf den richtigen Ganzzahlwert runden zu können.

    Dann ist mir noch aufgefallen, dass Formel: (w-sqrt(w^2-1))^n schon sehr früh kleiner als 1 ist und sich bei größeren Argumenten sehr schnell immer mehr der 0 annähert. In der Praxis wird man diesen Teil der Formel also ignorieren können.
  • in: Rekursion schnell berechnen

    geschrieben von fuerderer

    Ich kann bei dem Problem nicht ganz folgen, das beginnt schon bei der Definition der rekursiven Funktion:
    jonas-bayer schrieb:
    Formel: x(n+1,w)= 2*w*x(n,w)-x(n-1)
    Was bedeutet Formel: x(n-1)? x ist doch für zwei Argumente definiert. Meintest du Formel: x(n-1,w)?

    jonas-bayer schrieb:
    Formel: x(n,w)=1/2*((w+sqrt(w^2-1)^n+(w-sqrt(w^2-1)^n)
    Und hier werden zwei geöffnete Klammern nicht wieder geschlossen.

    jonas-bayer schrieb:
    Der Haken: In Java sind keine Methoden zur Potenzierung für die BigInteger / BigDecimal-Objekte implementiert.
    Ich sehe bei BigInteger eine Methode namens "pow". Richtig, sie nimmt ein Argument vom Typ int als Exponent entgegen, aber generell sollte das reichen. Wenn du noch größere Exponenten hast, wirst du das Ergebnis auch kaum noch abbilden können.

    So wie ich das einschätze, darf Formel: w eine sehr große Zahl sein, ohne groß Probleme zu verursachen. Wenn aber Formel: k ebenfalls "sehr groß" wird, also allerspätestens bei ca. 12 Dezimalziffern, wird die ganze Berechnung unpraktikabel, weil dann das Ergebnis einfach viel zu groß wird.
  • in: PHP einbinden

    geschrieben von fuerderer

    cybercrack schrieb:
    Ich möchte dies aber zentral in einem anderem Ordner speichern, leider können diese dann nicht mehr dadrauf zugreifen da diese ja keinen Zugriff mehr haben, da der Subdomain nur auf den einen Ordner Zugriff hat.
    Ja, das ist bei Lima-City so geregelt. Man muss sich dann etwas anders behelfen.

    Ich würde vorschlagen, ein neues MySql-Passwort mit file_get_contents() auf die verschiedenen Domains zu verteilen. Du brauchst dann für jede Domain ein Skript, das etwa so aussieht:

    neues-pw.php
    <?php
    $neuesPw = var_export($_GET['newpw'], true);
    file_put_contents(__DIR__."/mysql-pw.php", <<<EOF
    <?php
    const MYSQL_PW = $neuesPw;
    EOF;

    An einem zentralen Ort kannst du dann etwa so ein Skript ausführen:
    <?php
    $neuesPw = "abc123";
    
    file_get_contents("https://site1.example.com/neues-pw.php?newpw=$neuesPw");
    file_get_contents("https://site2.example.com/neues-pw.php?newpw=$neuesPw");
    file_get_contents("https://site3.example.com/neues-pw.php?newpw=$neuesPw");

    Du musst nur aufpassen, dass die URL's, mit denen man das Passwort setzt, von niemandem manuell aufgerufen werden. Ansonsten gibt es danach keine Verbindung mehr zur DB. Das ist aber auch schon das ganze Risiko, es wird also niemand das richtige Passwort zur Datenbank auslesen können.

    @airfield-manager
    Das Vorgehen ist prinzipiell möglich, du musst aber daran denken, dass die PHP-Datei beim include() selbst schon geparst wird und PHP nur das Ergebnis einbindet.

    Und wenn eine URL das MySql-Passwort ausgibt, besteht das Risiko, dass dieses gefunden wird. Das wollte ich effektiv vermeiden, weshalb ich neue Passwörter lieber verteilen würde als sie von einem zentralen Ort zu lesen.

    Außerdem sollte man an die Performance denken, wenn bei jedem Request gleich noch ein zweiter Request durch den Webserver muss um Konfigurationen zu laden.
  • in: Apache2: SSL mit Dynamischen VirtualHosts

    geschrieben von fuerderer

    Ich kenne jetzt nicht jedes Detail von Apache, ob man die SSL-Zertifikate aus dynamisch generierten Pfaden lesen kann.

    Du könntest aber ein Skript schreiben, das alle Zertifikate in /var/certs sucht und aus deren Namen die Apache Konfiguration zusammenbaut. Da drin steht dann eben für jede Domain ein VirtualHost-Block.

    Nach einer Änderung an den vorhandenen Domains müsste man dann einmal das Skript aufrufen und danach Apache neu starten. Wäre das eine Option für dich?
  • in: Reload-Quelle feststellen

    geschrieben von fuerderer

    Neben den von dir genannten Punkten gibt es noch die Möglichkeit, eine Seite per HTTP-Header nach einer bestimmten Zeit neu laden zu lassen. Ansonsten fällt mir gerade auch keine weitere Möglichkeit mehr ein.

    Wenn du uns die URL mitteilst, können wir einmal selbst auf die Suche gehen.
  • in: Chat-Anwendung sendet doppelte Nachrichten

    geschrieben von fuerderer

    Stichwort dafür ist Ajax.
    Ein Tutorial z.B. im html-seminar

    Es wird dann kein Formular abgesendet sondern die Nachricht im Hintergrund von Javascript an den Server gesendet. Für eine Chatanwendung solltest du außerdem auch Nachrichten per Ajax vom Server laden.

    Noch besser für den Zweck eignen sich Websockets. (setzt glaube ich auch Web Whatsapp ein)
    Diese sind aber hier bei Lima-City nicht möglich.
  • in: php sql view probleme

    geschrieben von fuerderer

    Demnach schlug der Aufruf von execute() fehl. Ich füge direkt danach noch eine Zeile ein, um die Fehlerursache auszugeben:
    public function getBesucher(){
             
            $json = array();
             
            $stmt = $this->prepare("SELECT `visitor_year`, `visitor_month`, `visitor_day`, `visitor_hour` ,count(`visitor_ip`) as besucher FROM `view_besucher` GROUP BY `visitor_hour`,`visitor_day` , `visitor_month` order by `visitor_date` ");
            var_dump($stmt === false);
             
            var_dump($stmt->execute());
            echo $this->error; 
            var_dump($stmt->store_result());
            var_dump($stmt->bind_result($year,$month,$day,$hour,$besucher));
            $counter =0;
            while ($fetch_return = $stmt->fetch()) {
                $json[] = '[Date.UTC('.$year.','.$month.','.$day.','.$hour.'),'.$besucher.']';
            }
            var_dump($fetch_return);
            var_dump($json);
            return $json;
        }
    Was bekommst du dann als Ausgabe?
  • in: php sql view probleme

    geschrieben von fuerderer

    Die Funktion mysqli_error() gibt dir eine Fehlerbeschreibung, direkt nachdem ein Fehler auftrat. Außerdem musst du das betreffende Mysqli-Objekt übergeben, das wäre in deinem Fall $this.

    Ich versuche es einmal anders, lass mich die Methode getBesucher() um ein paar Debuggingausgaben ergänzen:
    public function getBesucher(){
    		
    		$json = array();
    		
    		$stmt = $this->prepare("SELECT `visitor_year`, `visitor_month`, `visitor_day`, `visitor_hour` ,count(`visitor_ip`) as besucher FROM `view_besucher` GROUP BY `visitor_hour`,`visitor_day` , `visitor_month` order by `visitor_date` ");
    		var_dump($stmt === false);
    		
    		var_dump($stmt->execute()); 
    		var_dump($stmt->store_result());
    		var_dump($stmt->bind_result($year,$month,$day,$hour,$besucher));
    		$counter =0;
    		while ($fetch_return = $stmt->fetch()) {
    			$json[] = '[Date.UTC('.$year.','.$month.','.$day.','.$hour.'),'.$besucher.']';
    		}
    		var_dump($fetch_return);
    		var_dump($json);
    		return $json;
    	}
    Wenn du das ausführst, was wird dir dann ausgegeben?
  • in: php sql view probleme

    geschrieben von fuerderer

    muellerlukas hat gleich zu Beginn von PDO gesprochen, obwohl du das nicht explizit erwähnt hattest. Ist das überhaupt richtig, dass du PDO einsetzt oder nutzt du Mysqli?

    Bei Mysqli musst du prinzipiell jeden Schritt überprüfen, also die Rückgabewerte von prepare, execute, store_result und bind_result auswerten. Ansonsten entgehen dir womöglich Fehler.
  • in: php sql view probleme

    geschrieben von fuerderer

    Irgendwo muss die Ursache ja liegen.

    Kannst du vielleicht etwas mehr Code posten? (Wo man auch die Fehlerbehandlung sieht)

    Was genau bekommst du auf Lima-City als Ergebnis? Bedeutet "kein Result", dass du nachweislich ein leeres Ergebnis bekommst oder schlug die Abfrage fehl?

    Kannst du vielleicht noch einmal sicherstellen, dass die Daten in der DB von Lima-City vorhanden sind. (Auch wenn du schon sagtest, dass PhpMyAdmin Ergebnisse liefert.)
  • in: Encoded JS Injection

    geschrieben von fuerderer

    Der verlinkte Artikel von mein-wunschname auf Stackexchange scheint schlüssig, demnach bedeuten diese Requests auch keine Bedrohung.

    Ich muss mich noch einmal korrigieren, die maskierten Sonderzeichen sind nicht vom Client maskiert sondern vom Webserver, um sie in das access_log zu schreiben. Und die Länge von 64 byte ist wohl auch nicht konsistent, wenn man die von kozak veröffentlichten Zugriffe betrachtet.

    Ich würde das ganze also einfach ignorieren, eine Gefahr besteht wie gesagt nicht.
  • in: Encoded JS Injection

    geschrieben von fuerderer

    Ja, das ist wirklich sehr verwunderlich.

    Ich schaue zunächst einmal auf den Auszug aus dem access_log. Offensichtlich hat ein Client mit dem Webserver verbunden aber keinen gültigen Request abgesendet sondern nur eine fragwürdige Zeichenkette verschickt. Der Webserver hat das zurecht mit 400 Bad Request beantwortet.

    Diese fragwürdige Zeichenkette enthält viele Sequenzen in der Form "\x**" wobei die beiden Sterne jeweils einer Hexziffer entsprechen. Das erinnert mich sofort an PHP, denn dort kann man Sonderzeichen auf diese Weise kodieren. Dekodiere ich das ganze, erhalte ich 64 Byte für mich zufällig scheinende binäre Daten, aus denen ich nichts weiter schließen kann.

    Ich vermute einen unabsichtlichen Fehler irgendeines Programmes da draußen im Netz, aus dem keine Gefahr hervorgeht. Mir ist nicht klar, wie du das ganze mit Javascript und einem Javascript Obfuscator in Verbindung bringst oder woraus du schließt, dass Fail2Ban die Verbindung blockiert hätte.

    Für weitere Analyse würde ich mehrere dieser Requests sammeln. (kozak und mein-wunschname, ihr könnt das gern gemeinsam tun) Vielleicht lässt sich dann ein Schema erkennen. Außerdem könnte man versuchen, die IP-Adresse zurück zu verfolgen, z.B. über einen Reverse Lookup oder durch geografisches Eingrenzen.
  • in: Webseiten-Inhalt zyklisch aktualisieren

    geschrieben von fuerderer

    Hallo,

    das mit Long Polling bekommst du sicher hin, also fangen wir klein an:
    Zuerst einmal musst du Ajax verstehen. Bei Ajax ruft Javascript im Hintergrund eine bestimmte Seite vom Server ab und wertet dann das Ergebnis aus. So könntest du z.B. regelmäßig beim Server anfragen, ob es Neuigkeiten gibt.
    Ajax-Tutorial mit Beispiel
    (Auf der Seite kannst du dich mal umschauen, es gibt auch Tutorials zu CSS und zu Javascript allgemein.)

    Zu Long Polling wird das ganze, wenn der Server erst dann etwas sendet, wenn es auch Neuigkeiten gibt.
    Also ganz grob, etwa folgender Ablauf in PHP:
    <?php
    for ($i=0; $i<=30; $i++) {
      if (neuigkeitenVorhanden()) {
        neuigkeitenSenden();
        exit;
      }
      if ($i<30) sleep(1);
    }
    sendeInfoNichtsNeues();
    Ich habe die Zählschleife eingebaut, damit es keine Timeouts gibt, falls längere Zeit nichts gesendet werden muss. Der Browser muss halt nach jeder Antwort wieder neu anfragen.

    Vorteil von Long Polling gegenüber regelmäßigen Ajax-Requests ist einfach, dass die Internetleitung entlastet wird. Es ist dann das PHP-Skript selbst, welches z.B. im Sekundentakt nach neuen Nachrichten in der Datenbank schaut.

    Da du auch Countdowns erwähnt hast: Diese interagieren normalerweise überhaupt nicht mit dem Server. Sie bekommen nur einen Startwert und werden dann von Javascript bis auf 0 herunter gezählt.
  • in: WebSockets bei Lima-City einrichten?

    geschrieben von fuerderer

    Websockets sind alleine mit PHP und damit auf Lima-City leider nicht umsetzbar.

    Da bleibt dir nur, per Ajax zu pollen oder vielleicht noch serverseitig auf Long-Polling zu setzen. Wenn du dein genaues Ziel beschreibst, (wie häufig bekommt der Nutzer Aktualisierungen) kann ich dir noch genauere Tipps dazu geben.

    JS wirst du übrigens in jedem Fall brauchen, egal ob für Websockets oder Ajax. Es sei denn, du lädst die Seite sekündlich neu, aber das ist äußerst unpraktisch, ressourcenfressend und deshalb auf Lima-City ebenfalls nicht erlaubt.
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Gut, das was wir hier tun ist alles andere als sauber. Am besten wäre es, wenn ein PHP-Skript von der Kommandozeile ohne Zeitlimit gestartet wird und alleine die ganze Serie erledigt. Aber deinem Eröffnungspost nach ist das wohl nicht möglich.

    Ich nehme an, du möchtest den Bot hier auf Lima-City zum Laufen bekommen, richtig?

    sonok schrieb:
    Wenn bei den Cronjobs mal einer ausfällt ist der ganze Textblock futsch.
    Dass ein Cronjob ausfällt, halte ich für eher unwahrscheinlich, im Gegensatz zu dem Risiko, dass die Weiterleitungskette abbricht. (z.B. durch ein Timeout)

    sonok schrieb:
    Ich bräuchte außerdem eher eine ziemlich sekundengenaue Ansteuerung ...
    Das bekommt man hin - durch entsprechend geregelte Verzögerungszeiten.

    Eins ist mir auch noch nicht klar: Der Bot läuft einmal etwa 10 Minuten (300 Nachrichten im Abstand von 2s), aber wie oft muss er das tun? Stößt du ihn z.B. manuell an für die nächsten 10 Min. oder soll er täglich einmal für 10 Min. arbeiten?
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Ok, dass dieses Skript aus einem Cronjob heraus aufgerufen wird, war mir nicht ganz klar, da du einmal "Browser" erwähnt hattest. Vermutlich funktioniert meine Lösung dann also nicht.

    Wie und wo richtest du diese Cronjobs ein? Meist kann man die Aufrufe nämlich minütlich neu starten. Das wären für dich dann 30 Aktionen pro Cronjob. Zum einen kannst du wie bisher mit Weiterleitungen arbeiten, zum anderen kannst du auch mehrere Nachrichten in einen Skriptaufruf versenden. Dabei musst du nur auf das Limit der Ausführungszeit achten und vielleicht hat auch der Cronjob-Client ein eigenes Timeout. Das lässt sich durch Probieren feststellen.

    Wenn du beispielsweise 6 Nachrichten auf einmal sendest, dauert das Skript 12 Sekunden. Dieses müsste dann noch 4 Mal weiterleiten. (für insgesamt 5 Aufrufe) An den Parametern kann man wie gesagt noch schrauben, aber eine Minute kannst du damit bestimmt überbrücken, bis dann (hoffentlich) der nächste Cronjob anläuft und die Aufgabe übernimmt.
  • in: Probleme mit Weiterleitungen

    geschrieben von fuerderer

    Hallo sonok,

    unter den vorgegebenen Umständen schien mir dein Vorhaben zunächst schwierig, aber dann kam ich auf eine simple Idee:
    <?php
    header("Refresh: 2");
    Der HTTP-Header weist den Browser an, in 2 Sekunden die Seite neu zu laden. Bleibt nur zu hoffen, dass die Anweisung in dem eingesetzten Browser beachtet wird. Falls nicht, kann man noch die Alternative per meta-Tag versuchen.

    Du kannst auch eine andere Url angeben:
    <?php
    header("Refresh: 2; url=http://example.com/");

    Und den Mechanismis zum Mitzählen bekommst du bestimmt selbst implementiert.
  • in: mysql-Abfrage zur Ausgabe aktueller Datensätze MIT Sortierun

    geschrieben von fuerderer

    chst schrieb:
    Leider brauche ich für meine nachfolgende grafische Aufbereitung eine chronologische Aufbereitung.
    Ja, an diesem Punkt wird es schwierig mit purem SQL-Code. Ich habe auf die Schnelle auch nichts passendes gefunden.
    Da du die Datensätze aber sowieso in einem Array sammelst, kannst du dieses einfach in PHP umkehren.
    Schreibe folgende Zeile hinter die Schleife, bevor du das JSON-Objekt erzeugst:
    $output = array_reverse($output);
    Und zur Abfrage nimmst du die Zeile mit "DESC" und "LIMIT 0, 20"
    Das sollte für deinen Anwendungsfall ausreichen.

Login zum Webhosting ohne Werbung!