Question

Il y a un nouveau badge sur Stack Overflow. Le badge « woot » est attribué aux utilisateurs ont visité le site chaque jour pendant 30 jours. Comment pouvez-vous mettre en œuvre une fonction comme celui-ci? Comment pouvez-vous suivre qu'un utilisateur a visité le site chaque jour X jours de la manière la plus simple?

Je pensais avoir deux champs - une pour l'horodatage de la dernière connexion, et un autre pour compter les jours sur l'utilisateur visité en permanence sur le site. La logique est d'abord mettre le compteur à 1, et stocker le temps de connexion aussi bien. Sur la très prochaine connexion, vérifiez si depuis la dernière connexion ne plus d'un jour passé, et incrémenter le compteur, ou le remettre à 1. Et puis mettre à jour le champ d'horodatage à la date actuelle.

Pouvez-vous faire plus simple?

Était-ce utile?

La solution

Vous avez besoin d'avoir un cookie, puisque les gens pourraient ne pas connecter tous les jours - par exemple parce qu'ils sont enregistrés automatiquement pendant 2 semaines, ou parce qu'ils sont sur votre site en train de faire des choses non -stop sans sommeil et le déjeuner pendant 50 heures :) Vous voulez probablement effectivement compter lorsque l'utilisateur accède au site.

Maintenant, on pourrait théoriquement enregistrer tous les accès et effectuer des requêtes de base de données, comme cela a été suggéré plus haut, mais vous pourriez penser (comme je le fais) qui frappe le mauvais équilibre entre l'utilité et la vie privée + simplicité.

L'algorithme spécifié est déficient de façon évidente: puisque vous stocker seulement nombre entier de jours, vous manquez l'utilisateur qui se connecte et toutes les 12 heures (votre algorithme garderaient le nombre de jours 1)

Voici la solution que je trouve être plus propre avec deux champs de date par utilisateur, dans une sorte d'auto-explication Python orientée non-objet:

# user.beginStreak----user.lastStreak is the last interval when 
# user accessed the site continuously without breaks for more than 25h 

def onRegister (user):
    ...
    user.beginStreak = user.endStreak = time() # current time in seconds 
    ...

def onAccess (user): 
    ...
    if user.endStreak + 25*60*60 < time():
        user.beginStreak = time()
    user.endStreak = time()
    user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
    ...

(S'il vous plaît pardonnez mes compétences pythonique, je suis un site universitaire et pour la première fois par l'utilisateur)

Vous ne pouvez pas effectuer cette tâche avec un variable. Je suis sûr que quelqu'un peut écrire un argument propre prouvant ce fait.

Autres conseils

En fait, si les visites de membres sont dans une base de données SQL, vous pouvez faire tout cela avec une seule requête SQL. Ceci est aussi probablement plus rapide que schlepping toutes les données vers un programme client pour vérifier toute façon:

/*
    Find all members who visited at least once every day
  for 30 or more days.  --RBarryYoung, 2009-05-31
*/
;WITH
  cteVisitDays as (
    Select
      MemberID
    , DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
     From tblMembersLog
     Where Not Exists( Select * From tblMemberTags T
    Where T.MemberID = tblMembersLog.MemberID
     And T.TagName = 'WOOT!' )
     Group By MemberID
        , DATEDIFF(dd,'2008-06-01',VisitTime)
    )
, cteVisitRunGroups as (
    Select 
      MemberID
    , VisitDay - Row_Number() Over(
            Partition By MemberID
            Order By VisitDay
        ) as RunGrouping
     From cteVisitDays
     )
SELECT Distinct
  MemberID
 From cteVistRunGroups
 Group By MemberId, RunGrouping
 Having COUNT(*) >= 30

Suivez chaque visite dans votre base de données avec un horodatage (que vous avez probablement déjà de toute façon). Ensuite, créez une instruction SQL et le groupe le résultat par jour, alors que vous comptez le nombre de visites ce jour-là. Pendant la période des 30 derniers jours, il n'a pas le droit d'avoir une journée 0-visite ...

Je deuxième approche de ropstah. Statistiques de l'utilisateur comme le temps etc connexion sont généralement disponibles dans la base de données. Nous devons tirer certains faits sur les données disponibles. Ainsi, plutôt que d'avoir un compteur pour chaque visite et d'autres choses incrémenter, je préférerais un traitement par lots qui fonctionne sur les données de connexion de l'utilisateur et publier les résultats pour ce jour-là.

Mais une fois qu'un utilisateur ed « woot », vous pouvez arrêter de calcul « woot » ness pour cet utilisateur. Sinon, il y a une chance de l'utilisateur se « wooted » tous les jours, jusqu'à ce jour un est rencontré sans connexion. (Mais cela est un problème mineur).

Si c'est la seule chose que vous voulez vous connecter, alors peut-être c'est une bonne solution. Cependant, je tiens à garder la logique et l'exploitation forestière séparée, à la fois pour augmenter la quantité d'informations brutes à ma disposition, ainsi que de permettre peaufinage de la logique sans casser les données existantes.

Dans ce cas, je vous connecter chaque visite ou chaque action (en fonction des besoins / espace / etc), puis écrire un sproc ou une méthode quelque part qui a contrôlé les données et a renvoyé true (correspond à des critères pour un badge) ou faux ( ne correspond pas aux critères).

Le seul cas où je voudrais créer un schéma spécifique pour contenir des informations comme si les calculs était requis ont beaucoup trop longtemps, que ce soit à cause de la quantité de données ou la complexité de celui-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top