Pergunta

Há um novo emblema no Stack Overflow. O emblema " woot " é concedido aos usuários visitaram o site por dia durante 30 dias. Como você pode implementar um recurso como este? Como você pode acompanhar que um usuário visitou o site por dia durante X dias da forma mais simples?

Eu pensei de ter dois campos - um para a hora do último acesso, e outro para contar os dias no usuário visitar continuamente o site. A lógica é a primeira a colocar o contador a 1, e armazenar a hora de login também. Por muito próximo login, verifique se desde o último login há mais de um dia passado, e incrementar o contador, ou defini-lo de volta para 1. E, em seguida, atualizar o campo timestamp para a data atual.

Você pode fazê-lo mais simples?

Foi útil?

Solução

Você precisa ter um cookie, uma vez que as pessoas não podem Entrar todos os dias - por exemplo, porque eles são registrados automaticamente para 2 semanas, ou porque eles estão em seu site fazendo as coisas não -stop sem dormir e almoço para 50 horas :) Você provavelmente realmente quer contar quando o usuário acessa o site.

Agora, pode-se teoricamente gravar cada acesso e executar consultas de banco de dados, como foi sugerido acima, mas você pode pensar (como eu) que atinge o equilíbrio errado entre utilidade e privacidade + simplicidade.

O algoritmo especificado é deficiente em uma maneira óbvia: desde que você armazenar apenas um número inteiro de dias, você perca o usuário que registra dentro e para fora a cada 12 horas (seu algoritmo iria manter a contagem de dias, 1)

Aqui está a solução que eu acho ser limpa com dois Data campos por usuário, em uma espécie de auto-explicativos não orientada a objetos Python:

# 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 )
    ...

(Por favor, perdoe minhas habilidades Pythonic, eu sou um usuário do site acadêmico e pela primeira vez)

Você não pode fazer esta tarefa com um variável. Tenho certeza de que alguém pode escrever um argumento limpo provar este fato.

Outras dicas

Na verdade, se as visitas do Estados estão em um banco de dados SQL, você pode fazer a coisa toda com uma única consulta SQL. Esta é também provavelmente mais rápido do que schlepping todos os dados para um programa cliente para verificá-lo de qualquer maneira:

/*
    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

Track cada visita em seu banco de dados com um timestamp (que você provavelmente já fazer de qualquer maneira). Em seguida, criar uma instrução SQL e grupo o resultado por dia, enquanto você contar o número de visitas naquele dia. No período dos últimos 30 dias, não é permitido ter um dia 0-visita ...

abordagem que segundo ropstah. Estatísticas do usuário como o tempo de login etc são geralmente disponíveis no banco de dados. Precisamos tirar certos fatos a partir dos dados disponíveis. Então, ao invés de ter um contador para cada visita e incrementando coisas, eu preferiria um trabalho em lotes que é executado sobre os dados de login de usuário e publicar os resultados para esse dia.

Mas uma vez que um usuário ed "woot", você pode querer parar de computação ness "woot" para esse usuário. Else, há uma chance do usuário ficar "wooted" todos os dias, até que um dia não-login é encontrado. (Mas isso é uma questão menor).

Se esta é a única coisa que você quer registrar, então talvez seja uma boa solução. No entanto, eu gostaria de manter a lógica e o registro em separado, tanto para aumentar a quantidade de informação em bruto à minha disposição, bem como permitir ajustes da lógica sem quebrar os dados existentes.

Neste caso, eu iria registrar cada visita ou cada ação (dependendo dos requisitos / espaço / etc), e em seguida, escrever um sproc ou a algum lugar método que inspecionou os dados e voltou verdadeiro (critérios de resultados para badge) ou falso ( não corresponde critérios).

O único caso em que eu iria criar um esquema específico para informações espera assim era se os cálculos necessários levou muito tempo, seja por causa da quantidade de dados ou a complexidade do mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top