Freecodecamp: Streak ist für viele Camper immer noch ungenau

Erstellt am 6. Apr. 2016  ·  39Kommentare  ·  Quelle: freeCodeCamp/freeCodeCamp

Eine der häufigsten Beschwerden, die ich (als Verantwortlicher für Support-E-Mails) bekomme, ist, dass der Streifen nicht korrekt ist. Dies kann an Zeitzonen liegen.

Wir müssen wahrscheinlich einige Testfälle schreiben und diesen Code wirklich straffen. Irgendwelche Freiwilligen?

help wanted bug

Alle 39 Kommentare

Mein erstes Mal mit Open-Source-Beiträgen, aber ich würde gerne sehen, ob ich der Aufgabe gewachsen bin.

Dies ist immer noch ein Problem, über das wir viele Beschwerden erhalten.

@QuincyLarson Ich bin daran interessiert, mitzuhelfen

@sorlovsky Super ! Wir sind an Ihrer Hilfe interessiert! Sehen Sie, ob Sie einige Tests dazu schreiben können, die verschiedene Grenzfälle abdecken. Es scheint zu 99,9% der Zeit zu funktionieren, aber es gibt einige Situationen, in denen es nicht funktioniert, und ich bin mir nicht ganz sicher, warum.

Ich habe mir das ein wenig angesehen und es kann möglicherweise daran liegen, dass es aktuelle Streaks von Challenges zählt und nicht die anderen Aktivitäten (Projekte oder Algorithmen). Es ist auch möglich, dass es sich um Zeitzonen handelt, wie oben angegeben. Ich werde mich mit dem Thema befassen und sehen, ob ich PR kann, wenn sonst niemand dazu kommt.

Kann mir bitte jemand mitteilen, wenn ich hier etwas übersehe.

const daysBetween = 1,5; kann auf const daysBetween = 2 aktualisiert werden; denn die Logik in den folgenden Funktionen sagt immer kleiner als daysBetween und nicht kleiner oder gleich daysBetween. Das bedeutet, dass die Berichterstattung an einem Tag von 12:00:00 Uhr bis 23:59:59 Uhr am nächsten Tag gewährleistet ist. Die Zeitzonenlogik sollte ebenfalls gleich bleiben.

Das Ändern von daysBetween auf 2 bedeutet, dass zwei Tests unterbrochen werden, was behoben werden kann, aber ich müsste zuerst ein wenig lernen, wie die Tests funktionieren.

Die alternative Option wäre, daysBetween auf 1,99 zu setzen, damit alle Tests bestanden, aber Sie hätten die Möglichkeit, den Streak um 7 Minuten und 12 Sekunden zu verpassen.

@donofriov bitte

@donofriov vielen Dank für die Analyse und es ist https://github.com/freeCodeCamp/freeCodeCamp/issues/7468 (hat mit dem Anmeldestatus des Benutzers zu tun)

Wenn Sie Hilfe benötigen, rufen Sie uns im Chatroom an.

Ich müsste erst ein bisschen lernen, wie die Tests funktionieren.

Die Tests sind bei
https://github.com/freeCodeCamp/freeCodeCamp/blob/staging/server/utils/user-stats.test.js

Nun, dies ist ein bisschen komplizierter als üblich zu strukturieren. Ich werde da sein, wenn Sie Dinge herausfinden müssen.

Viel Spaß beim Fixieren!

@donofriov Ja - wenn du denkst, dass das das daysBetween auf 2 und aktualisieren Sie die Tests, damit sie bestehen.

Wenn Sie dazu in der Lage sind, prüfen Sie bitte, ob Sie eine zusätzliche Testabdeckung hinzufügen können, um sicherzustellen, dass dies die verschiedenen aufgetretenen Eckfälle anspricht (es gibt mehrere Probleme im Zusammenhang mit Streaks).

Vielen Dank für Ihre Zeit und Aufmerksamkeit. Dies ist seit Monaten ein großes Problem und eine Quelle vieler Beschwerden, daher wird die Behebung enorm sein :)

Das Problem ist, dass die Berechnung von streak von der Zeitzone abhängt. Angenommen, meine drei Einsendungen in einer Zeitzone sind [Aug 5, Aug 6, Aug 7] . In einer anderen Zeitzone könnten dieselben Einsendungen auf [Aug 5, Aug 5, Aug 6] . Die Kalender-Heatmap ist ebenfalls zeitzonenabhängig, und die Heatmap verwendet immer die Zeitzone des Clients, der die Seite im Browser betrachtet. Wenn wir also wollen, dass streaks mit der Heatmap übereinstimmt, müssen wir die Zeitzone des Clients in der Berechnung verwenden. Das ist im Grunde das, was @LenaBarinova getan hat, als dieses Problem im Januar 2016 mit #6333 behoben wurde. Die Lösung bestand darin, dass der Browser immer dann die Zeitzone des Benutzers sendet, wenn eine Herausforderung gesendet wird. Der Server würde die Zeitzone speichern und daraus die Streaks berechnen. Aber dann im Januar 2017 gab es ein großes Refactoring, das die Art und Weise veränderte, wie Herausforderungen eingereicht werden, und der Fix wurde entfernt . Die serverseitige Logik ist immer noch da, nur der Browser sendet die Zeitzone nicht mehr.

@Motardo Danke für die Untersuchung. Wären Sie daran interessiert, dies zu beheben , damit der Fix von

@QuincyLarson Nachdem ich es mir noch einmal angesehen und darüber geschlafen habe, hier meine Gedanken:

Plan A
Ich denke, dass die alte Lösung nicht ideal war. Es erforderte, dass ein Benutzer angemeldet war, um sein eigenes Profil korrekt anzuzeigen, und es wurden immer noch Inkonsistenzen beim Anzeigen anderer Benutzerprofile in anderen Zeitzonen angezeigt.

Plan B (einfach und unkompliziert, gute temporäre Lösung)
Ich glaube, dass eine einfachere und robustere Lösung darin besteht, die Zeitzone des Clients mit jeder Anfrage zum Anzeigen eines Benutzerprofils zu senden, und der Server könnte die Streaks basierend auf dieser Zeitzone berechnen. Dann wäre es egal, ob der Kunde eingeloggt war oder wessen Profil angesehen wurde. Die Streaks und der Kalender würden immer synchron sein.

Plan C (komplizierter Refactor, mögliche zukünftige Roadmap)
Die wahrscheinlich beste Lösung wäre, Streaks auf dem Server gar nicht zu berechnen. Der Server sollte die Rohzeitstempel an den Client senden und den Client entscheiden lassen, zu welchem ​​Tag jeder Zeitstempel gehört und wie lange die Streaks auf der lokalen Zeitzone basieren. Genau das machen wir mit den Kalender-Heatmap-Daten, damit sie immer konsistent sind.

Ich bin völlig neu im Reagieren und Rxjs, und ich denke, Plan C ist überfordert, aber ich würde gerne einen Patch für Plan B machen und würde gerne andere Ideen und Vorschläge hören.

@Motardo Ich stimme definitiv zu, dass Plan C am sinnvollsten ist.

Hast du dich mit React und RXJS viel verbessert, da du dies vor 15 Tagen gepostet hast? Dies könnte eine gute Herausforderung sein, um die Grenzen Ihrer clientseitigen Scripting-Fähigkeiten auf die nächste Stufe zu heben 😉

Hallo. #16071

Was ich getan habe:
Ich habe zuerst die Streak-Berechnung geändert, um 24 hoursBetween anstelle von 1,5 daysBetween zu verwenden. Dann habe ich die Differenz in Stunden von startOf('Tag') des vorherigen Zeitstempels und des aktuellen Zeitstempels genommen und mit hoursBetween verglichen, um die Arbeiten zu berücksichtigen, die in den letzten 24 Stunden statt am letzten Tag ausgeführt wurden. (Klingt gleich, aber wahrscheinlich einen Versuch wert)

Eine bessere Lösung wäre wahrscheinlich, wenn Sie dem Benutzer erlauben, seine eigene Zeitzone in den Einstellungen festzulegen und alles anhand dieser Zeitzone berechnet/eingestellt wird.

Bearbeiten: Weiß jemand, wie man Dummy-Konten in localhost verwendet / erstellt, die unterschiedliche Streaks haben?

Edit: Vergiss das alles.

Ich habe versucht, tiefer zu graben, und habe festgestellt, dass die Inkonsistenzen zwischen der Heatmap und den Streifen möglicherweise durch die Heatmap verursacht werden. https://github.com/wa0x6e/cal-heatmap/issues/122

@kennethlumalicay Ich glaube, wir sollten Benutzern

@raisedadead Ich denke, es muss einen einfacheren Weg geben, damit

Können wir genügend Angebot einbauen, damit der Streak nicht unterbrochen wird, wenn jemand die Zeitzone wechselt? Ich denke, derzeit halten wir den Streak aufrecht, solange er innerhalb eines 36-Stunden-Fensters liegt.

@QuincyLarson Ich könnte mich irren, aber ich glaube nicht, dass wir den Streak innerhalb eines 36-Stunden-Fensters aufrechterhalten. Afaik erstellt prepUniqueDays ein Array von Zeitstempeln mit 24, 48 usw. Stunden dazwischen und wir vergleichen es mit betweenDays, das 1,5 Tage beträgt, aber der Unterschied zwischen eindeutigen Tageswerten kann nur Ganzzahlen (1,2,...n) sein Es hat nicht wirklich eine Dezimalstelle, die bei der Berechnung von Streifen verwendet wird.

Wie erhalten wir die req.user.timezone? Da der Dummy keine Zeitzone als Eigenschaft hat, ist const timezone = user && user.timezone ? user.timezone : 'UTC'; standardmäßig immer UTC. Stellen wir es nach dem Standort des Benutzers ein?

Wenn wir user.timezone haben, würden die Streaks mit user.timezone übereinstimmen, aber die Heatmap wäre nur immer mit der Zeitzone des Clients konsistent.

Verschiedene Szenarien mit dem aktuellen Setup

wenn die Zeitzone des Benutzers mit der Zeitzone des Kunden übereinstimmt

  • Streaks und Heatmap wären beide genau und konsistent.

wenn die Zeitzone des Benutzers nicht mit der Zeitzone des Clients übereinstimmt (zB VPN, falscher Standort/Zeitzone eingestellt)

  • Streaks wären mit user.timezone genau, die Heatmap jedoch wahrscheinlich nicht.

if user.timezone is undefined (Benutzer ist nicht angemeldet oder hat seinen Standort/Zeitzone nicht festgelegt)

  • Streifen wären ungenau, aber die Heatmap stimmt immer noch mit der Zeitzone des Clients überein, es sei denn, er verwendet ein VPN. Ich denke, wir könnten hier, anstatt UTC als Standard zu verwenden, auch die Zeitzone des Clients verwenden, um die Heatmap abzugleichen.

_PS: Ich könnte mich irren, also korrigiere mich gerne._

@Kenneth-LJS Ich hatte den Eindruck, dass wir zusätzliche 12 Stunden Spielraum eingeräumt haben, aber das kann sich geändert haben. Wenn Sie sich den Code genau angesehen haben, würde ich Ihrem Verständnis vertrauen, wie er zusammenpasst.

In Bezug auf Ihre Szenarien ist es in Ordnung, wenn der Kalender leicht versetzt ist. Nur sehr wenige Camper haben dies bemerkt oder sich darüber beschwert. Campern wird das nicht viel ausmachen. Aber es ist nicht in Ordnung, wenn der Streak unterbrochen wird - das hat so viele Camper veranlasst, sich über diesen Fehler zu beschweren.

Mein Argument wäre also, anstatt zu versuchen, die Zeitzonen herauszufinden und zu synchronisieren, normalisieren wir einfach die Zeit auf EST - wo die meisten Amerikaner leben - und fügen 12 bis 24 Stunden Spielraum hinzu, um die Wahrscheinlichkeit zu verringern, dass jemand versehentlich seine Streifen auf Reisen.

Hallo, ich schreibe, weil ich einen Kommentar von @QuincyLarson zu diesem Beitrag gesehen habe .

Ich bin ein neuer Camper und habe einen "5-Tage-Streak" mit Aktivitäten, die anerkannt werden auf:
Jan18 - 5 Artikel
Jan19 - 24 Artikel
Jan20 - 16 Artikel
Jan21 - 2 Artikel
Jan22 - 7 Artikel
fcc

Ich sehe aus dem obigen Lesen, dass erwartet wird, dass die Termine für "Kalender abgeschlossen" verschoben werden, aber mein Streak zeigt nur 1 Tag an.

===
Randnotiz - Danke für die tolle Arbeit. Dies ist mein fünfter Versuch, Programmieren zu lernen, aber ich denke, dieses Programm wird mich durch den Buckel bringen!

@kennethlumalicay Bitte schau dir das an. Haben Sie eine Idee, was das könnte ?

@ApeCogs kennst du die Zeit, zu der du jede Herausforderung am 21. und 22.

@kennethlumalicay - Der 21. Januar wäre gegen 22:30 - 23:30 Uhr EST gewesen. Der 22. Januar wäre 09:00 - 10:00 EST gewesen. Ich benutze manchmal ein VPN, aber es ist für die Arbeit und die Region ändert sich nicht (östlich).

Ich habe das Problem. Es passiert normalerweise, wenn ich eine Herausforderung zwischen 22:00 CST und 24:00 CST mache. Obwohl ich meinen Streak verloren habe, als ich es am Sonntag gegen 19:00 CST - 20:00 CST getan habe. Dies würde normalerweise auch passieren, wenn ich einen 7-8-Tage-Streak habe. Kein VPN verwenden. Wenn ich noch etwas tun kann, um zu helfen, lass es mich wissen.

screenshot-2018-1-24 learn to code with free online courses programming projects and interview preparation for developer

@ApeCogs Ich habe einige Dummy-Daten verwendet, kann sie aber nicht reproduzieren.

Zeitstempel:

Wed Jan 24 2018 22:30:00 GMT-0500 (Eastern Standard Time)
Wed Jan 24 2018 23:30:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:05:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:12:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:20:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:30:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:39:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:40:00 GMT-0500 (Eastern Standard Time)
Thu Jan 25 2018 09:43:00 GMT-0500 (Eastern Standard Time)

Ich habe 24 und 25 anstelle von 21 und 22 verwendet, um dein "heute" und "gestern" neu zu erstellen.

Ergebnis:

ape

@mriel hast du auch deinen aktuellen Streak verloren? Könnten Sie einen größeren Screenshot mit der Heatmap und den Streaks bereitstellen?

Wiedereröffnung wegen laufender Diskussion

@kennethlumalicay hier ist mein Screenshot:

screenshot-2018-1-25 learn to code with free online courses programming projects and interview preparation for developer

Meistens waren meine vorherigen Streaks 7-8 Tage. Am nächsten Tag mache ich eine Nachtstunde zwischen 18:00 CST - 22:00 CST. Am Tag danach wird mein aktueller Streak 1 Tag betragen.

Ich habe angefangen, ein Protokoll der aktuellen Streaks, des Tages, der Uhrzeit und der Herausforderung zu führen.

Hier steht, dass du am 20. etwas getan hast.
mriel

Aber hier drin ist nichts auf 20.
mriel-2

Ich gehe also davon aus, dass Ihre Zeitstempel mit der falschen Zeitzone angezeigt werden.

    // timezone of signed-in account
    // to show all date related components
    // using signed-in account's timezone
    // not of the profile she is viewing
    const timezone = user && user.timezone ?
      user.timezone :
      'EST';

Wenn Sie also nicht angemeldet sind, wäre der Benutzer null und die Zeitzone wäre 'EST'.
Selbst wenn Sie angemeldet sind, bin ich mir nicht sicher, ob user.timezone tatsächlich existiert, da es in den Dummy-Daten in meiner lokalen Datenbank nicht vorhanden ist. Idk, wenn die DB von fcc anders ist, aber da Sie immer noch die falsche Zeitzone erhalten, erhalten Sie wahrscheinlich immer noch 'EST'.
Ich gehe davon aus, dass dies standardmäßig immer auf 'EST' geht.

~Also habe ich einen möglichen Fix eingereicht, indem ich 'EST' in moment.tz.guess() geändert habe .~

Ich habe gerade eine Challenge gemacht. So ist mein Status:
25.01.2018 20:41 CST Reverse Arrays mit .reverse
screen shot 2018-01-25 at 8 46 08 pm
screen shot 2018-01-25 at 8 44 21 pm

Ich habe beobachtet, wie Herausforderungen während der letzten Woche aufgezeichnet werden, und habe im Grunde gesehen, dass Herausforderungsdaten und Streak nach UTC verlaufen und die Heatmap EST verwendet. Das bedeutet, dass ich und andere Leute in CST vor 18 Uhr Herausforderungen absolvieren müssen, um für alle Teile für denselben Tag gezählt zu werden. Und wenn ich an einem Tag morgens und am nächsten abends Herausforderungen mache, Abschiedssträhne.

Nur ein Gedanke, die Sprachlernprogramme, die ich verwende, haben einen Countdown für Stunden, der neben den Streak-Informationen angezeigt wird. Eine Notiz mit der Aufschrift "Lektionen abschließen, indem... wäre genauso sinnvoll. Ich würde es als erste Priorität für das Streak-Problem bezeichnen, konsistente Zeiten zu erhalten, aber es wäre nützlicher, die Leute über ihre Deadline für den Tag zu informieren, als sich Gedanken über die Anpassung von TZ für Reisen oder die Gewährung von Kulanzzeiten zu machen (so schön das auch klingen mag).

Ein Fehler, der die erstaunliche 100DaysOfCode Challange nutzlos macht


Hier ist mein Profil: https://www.freecodecamp.org/dardandmr

Mein 69 Days of Streak ist ohne Grund kaputt

@QuincyLarson bitte Bruder, was ist das und können wir das rückgängig machen?!
Ich habe die Arbeit zwei Stunden nach 24:00 Uhr eingereicht, ich glaube nicht, dass es sich um einen Zeitzonenfehler handelt, auch wenn es möglich ist, dass so viele Leute hier in der FCC diesen Fehler nicht behoben haben?
image

Ich bin wirklich enttäuscht, ich war so motiviert von dieser 100DaysOfCode Challange, und ich habe alle Front-End-Projekte und alles andere abgeschlossen, ich habe nur 4 fortgeschrittene Algorithmen zu lösen, um mein Front-End-Zertifikat zu erhalten, bin einfach so viele Stunden ohne Schlaf geblieben um die Serie am Laufen zu halten...

Bildschirmfoto

image
image

100DaysOfCode Challange , wenn ein solcher Fehler weiterhin besteht, würde er uns nur die Moral ruinieren.

@JohnnyCheung1989 schau dir meine Fortschritte an, seit der Fehler meinen Streak ruiniert hat :(
image

Es scheint, dass die Videoherausforderungen auch nicht für Streaks gezählt werden, sondern in der Heatmap gezählt werden.

Ich bin ein Anfänger, insbesondere mit Produktionscode. Ich weiß nicht, ob dieser Algo zu viel Overhead erzeugen würde ... Aber da die Heatmap gut zu funktionieren scheint, warum kann der Algo für Streak nicht einfach die Heatmap für Tage mit grüner Farbe überprüfen oder in die andere Richtung gehen und nach grauen Lücken suchen und zurückkehren? ein Wert wie check if element is '#cccc' etc.. wenn ja Break Streak
Entfernen Sie die gesamte aktuelle Streak-Logik-Zeitzone und die gesamte Mathematik und überprüfen Sie einfach die Heatmap auf Farbe im Element ...
Wenn ! grauer Streifen ++ Wenn grauer Stoppstreifen, dann prüfen, ob Streifen länger als der längste Streifen sind?

Verzeihen Sie, wenn dies schon einmal angesprochen wurde.

Ich habe die Heatmap noch nie ungenau gesehen, aber meine Streifen sind gut ... nicht so sehr.

Oder setzen Sie irgendwie ein Flag in den Heatmap-Code und die Streak-Ausgaben können es nicht überprüfen und aktualisieren?

@dverdin83
Ich habe mir nur kurz den Code angeschaut. Heatmap ist ein Plugin, daher sollte der Heatmap-Code nicht bearbeitet werden, da er bei einer Aktualisierung kaputt geht. Was das Zählen des Grüns angeht, so scheint es, dass das Plugin die Farbe im Handumdrehen erstellt, sodass Sie einen Rückruf hinzufügen müssen, um die Berechnung zu verzögern.

Es wäre besser, dasselbe zu überprüfen wie die Heatmap, das wurde von Motardo vorgeschlagen _(siehe seinen Kommentar zum

Schließung dieses Problems zugunsten von https://github.com/freeCodeCamp/freeCodeCamp/issues/17299

Weiß jemand, welche Zeitzone vom Streak-Zähler und der Heatmap verwendet wird? Ich habe gerade eine 74-Tage-Streak verloren, obwohl ich eine Herausforderung um 15:45 Uhr KST (UTC +0900) beendet habe. Der Streak zeigt nur 1 Tag, aber das heutige Quadrat auf der Heatmap ist grün gefärbt und auf der Zeitleiste wird die Herausforderung ebenfalls als heute abgeschlossen aufgezeichnet. Es scheint, als würde der Streak-Zähler eine Zeitzone verwenden, während die Heatmap und die Zeitleiste eine zweite Zeitzone verwenden. Kann das bitte jemand bestätigen? Es ist wirklich demoralisierend, da ich stolz darauf war, die Zahl jeden Tag wachsen zu sehen und sie mit Freunden, Familie und potenziellen Arbeitgebern teilen zu können.

Mir ist bewusst, dass die Korrektur möglicherweise keine hohe Priorität hat, daher würde es mir zumindest helfen, die Regeln des Streaks zu kennen, um meine Codierung entsprechend zu verstehen und anzupassen.

Zitiert von @sgrayme https://github.com/freeCodeCamp/freeCodeCamp/issues/7925#issuecomment -361716788

Ich habe beobachtet, wie Herausforderungen während der letzten Woche aufgezeichnet werden, und habe im Grunde gesehen, dass die Daten der Herausforderungen und der Streak nach UTC verlaufen und die Heatmap EST verwendet ...

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen