Conectados

Hola!!

¿Alguien sabe como hacer en RoR para acceder a todos los usuarios que
hay
logueados en ese momento en la aplicación si he usado Acts As
Authenticated? La idea es hacer el típico DIV de conectados. Lo que hago
ahora es que al autenticarse pongo un atributo boleano de la BD a true y
cuando se desconectan a false. Pero si cierran la ventana sin clicar el
parametro en la BD sigue como true y al entrar otra vez se ve como
conectado cuando realmente no lo
está.Por eso he pensado hacerlo en las sesiones… alguna forma de acceder a
todas las sesiones que hay o algo por el estilo y acceder a los ids de
usuario.

Salud!

jabberID: [email protected]
blog: http://llibertat.wordpress.com
SIP: [email protected]

Hola,

Tal vez sea matar moscas a cañonazos pero se me ocurre que puedes hacer
una
petición al navegador del cliente, algo así como:

Conectado proc{ |c| c.request.user_agent =~ / / ? false : true }

Y hacer que se evalue cada x tiempo de los usuarios que tienes marcados
cómo
conectados.

Saludos.

On 17/05/07, Hector Muñoz [email protected] wrote:

Por eso he pensado hacerlo en las sesiones… alguna forma de acceder a
Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Blog: www.lacoctelera.com/tomaslucas

Los Tres Chiflados (NRT).

On May 17, 2007, at 10:47 AM, Hector Muñoz wrote:

clicar el
parametro en la BD sigue como true y al entrar otra vez se ve como
conectado cuando realmente no lo está.
Por eso he pensado hacerlo en las sesiones… alguna forma de
acceder a
todas las sesiones que hay o algo por el estilo y acceder a los ids de
usuario.

Esta complicado porque estar online es un concepto no muy bien
definido, o definible desde el servidor. Uno puede logarse y acto
seguido irse a pasar la tarde con la familia dejando el navegador ahi
abierto.

Nosotros definimos estar online como una ventana de tiempo desde la
ultima peticion, digamos 3 minutos por ejemplo. Suele ser una
aproximacion suficiente para un site. Asociamos un timestamp al
usuario last_seen_at que se actualiza en un filtro en cada peticion
depues de la autenticacion, y para saber quienes estan online, o si
alguien en concreto esta online, simplemente vemos si last_seen_at es
mayor que Time.now menos la ventana de tiempo.

– fxn

Tengo un problema del propio lenguaje Ruby.
Tengo un DateTime… para restar 3 minutos a un DateTime. ¿cómo lo hago?

Gracias!

Saludos!

jabberID: [email protected]
SIP: [email protected]
blog: http://llibertat.wordpress.com

– Les banderes no són més que draps de colors –

On 5/17/07, Hector Muñoz [email protected] wrote:

Tengo un problema del propio lenguaje Ruby.
Tengo un DateTime… para restar 3 minutos a un DateTime. ¿cómo lo hago?

La solución no es de Ruby sino de ActiveSupport, pero supongo que te
servirá en tu aplicación Rails…

Time.now - 3.minutes

Hector
Muñoz escribió:> Ror-es mailing list

[email protected]
simplelogica.net

Sin Rails…

irb(main):001:0> t = Time.now
=> Thu May 17 23:45:54 +0200 2007
irb(main):002:0> t - 3*60
=> Thu May 17 23:42:54 +0200 2007

:wink:

Salute,
Mauro.

Hola!!

He seguido tu consejo y he hecho que a cada petición después de la
autenticación se actualize el campo last_seen_at. Eso funciona sin
problemas.
Lo que no funciona es la consulta a la BD. Algo debo estar haciendo mal
o debe
haber algun lío de tipos.
las_seen_at en la migración la he declarado como :timestamp y en la BD
se ha
puesto del tipo datetime. Yo, al actualizar el campo lo hago con
Time.now. La
consulta que hago, siguiendo los consejos que me han dado en esta misma
lista, necesito hacer paginación de los resultados así que la llamada es
la
siguiente:

@conectado_pages, @conectados = paginate :usuarios, :order => ‘login
ASC’, :conditions => “activated_at IS NOT NULL AND last_seen_at >
#{Time.now-3.minutes}”, :per_page => 10

He probado todas las combinaciones y no se donde está el problema.
Cuando
ejecuta esta consulta me devuelve siempre un conjunto vacío.

¿Dónde puede estar el problema?

Gracias!

Saludos!

alguien en concreto esta online, simplemente vemos si last_seen_at es
mayor que Time.now menos la ventana de tiempo.

– fxn


Ror-es mailing list
[email protected]
simplelogica.net


jabberID: [email protected]
SIP: [email protected]
blog: http://llibertat.wordpress.com

– Les banderes no són més que draps de colors –

On 17/05/07, Hector Muñoz [email protected] wrote:

Tengo un problema del propio lenguaje Ruby.
Tengo un DateTime… para restar 3 minutos a un DateTime. ¿cómo lo hago?

Por favor, NO secuestréis hilos. Abrid un tema nuevo, que no cuesta
dinero. Los archivos, miles de indefensos clientes de correo y yo
mismo lo agradeceremos.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o simplelogica.net
Recuerda comer mucha fruta y verdura.

On May 18, 2007, at 12:52 PM, Hector Muñoz wrote:

puesto del tipo datetime. Yo, al actualizar el campo lo hago con
Time.now. La
consulta que hago, siguiendo los consejos que me han dado en esta
misma
lista, necesito hacer paginación de los resultados así que la
llamada es la
siguiente:

@conectado_pages, @conectados = paginate :usuarios, :order => ‘login
ASC’, :conditions => “activated_at IS NOT NULL AND last_seen_at >
#{Time.now-3.minutes}”, :per_page => 10

Has probado con un placeholder?

[“activated_at IS NOT NULL AND last_seen_at > ?”, Time.now-3.minutes]

– fxn

Holas…

2007/5/17, Xavier N. [email protected]:

true y
definido, o definible desde el servidor. Uno puede logarse y acto
seguido irse a pasar la tarde con la familia dejando el navegador ahi
abierto.

Nosotros definimos estar online como una ventana de tiempo desde la
ultima peticion, digamos 3 minutos por ejemplo. Suele ser una
aproximacion suficiente para un site. Asociamos un timestamp al
usuario last_seen_at que se actualiza en un filtro en cada peticion
depues de la autenticacion, y para saber quienes estan online, o si
alguien en concreto esta online, simplemente vemos si last_seen_at es
mayor que Time.now menos la ventana de tiempo.

Es una solución sencilla, pero actualizar el campo last_seen_at en
cada petición para una aplicación con mucho tráfico es masacrar la
base de datos, no? La llenas de updates con simples visitas de
visualización…

Se me ocurre que se podría hacer lo mismo pero no actualizando en cada
petición, sino cada X peticiones, o sólo si ha pasado un tiempo
prudencial desde la última petición. Es menos exacto pero creo que
sufrirá menos la base de datos.

Sí!!! Era esooo!!

Gracias!! Mira que no ocurrirseme hacer el placeholder… gracias de
nuevo!

Saludos!!

On Friday 18 May 2007 13:00, Xavier N. wrote:

simplelogica.net

jabberID: [email protected]
SIP: [email protected]
blog: http://llibertat.wordpress.com

– Les banderes no són més que draps de colors –

El jue, 17-04-2008 a las 17:08 +0200, Jaime I. escribió:

2007/5/17, Xavier N. [email protected]:

Nosotros definimos estar online como una ventana de tiempo desde la
ultima peticion, digamos 3 minutos por ejemplo. Suele ser una
aproximacion suficiente para un site. Asociamos un timestamp al
usuario last_seen_at que se actualiza en un filtro en cada peticion
depues de la autenticacion, y para saber quienes estan online, o si
alguien en concreto esta online, simplemente vemos si last_seen_at es
mayor que Time.now menos la ventana de tiempo.

Se me ocurre que se podría hacer lo mismo pero no actualizando en cada
petición, sino cada X peticiones, o sólo si ha pasado un tiempo
prudencial desde la última petición. Es menos exacto pero creo que
sufrirá menos la base de datos.

Yo estoy con Xavier. Puntualizaría que la ventana la podrías sacar por
el tiempo medio de usuario en el sitio dividido por el número de páginas
vistas.

Como dice Xavier, no hay forma de saber cuando el usuario mira la
pantalla, por lo que es dificil saberlo.

Depende de para que sitio, puedes informar de las conexiones activas del
servidor.

conexiones=%x( netstat -na | grep tcp | grep STA | grep ":80 " | wc
-l).to_i

Y si son muchas, cachearlo o usar medias de herramientas como rrdtool,
del cual hay gema en ruby.

Un Saludo.

Guillermo [email protected]

hola,

Es una solución sencilla, pero actualizar el campo last_seen_at en
cada petición para una aplicación con mucho tráfico es masacrar la
base de datos, no? La llenas de updates con simples visitas de
visualización…

si estás usando ActiveRecord para guardar las sesiones, realmente se
está actualizando la sesión en la db por cada petición, y ya tienes el
campo updated_at. Además, en la misma tabla de sesiones tienes la info
(serializada) de tus usuarios… y por ahí se podría tirar para decir
quién está online.

Si no estás actualizando la db en cada petición (porque usas cookies o
memcached, por ejemplo) sí se podría definir lo que comentas de guardar
sólo si ha pasado más de X desde la última actividad… eso ya depende de
cómo quieras definir el concepto de “usuario activo” en el site.

saludos,

javier ramírez

2007/5/17, Xavier N. [email protected]:

On May 17, 2007, at 10:47 AM, Hector Muñoz wrote:

Hola!!

¿Alguien sabe como hacer en RoR para acceder a todos los usuarios
que hay

No tengo idea de como resuelve esto Rails.

Doy mi experiencia con Java y Tomcat… Ya sé que no tiene nada que ver
pero expongo como se resuelve esto en esta plataforma para ver si hay
algún tipo de enfoque común con como lo hace Rails.

En un contenedor de Servlets puedes definir listener que monitorizan
la creación/destrucción/actualización de sesiones.

El objeto sesión, me imagino que como en Rails, es un objeto que se
crea con la primera petición de un usuario y que se comparte con todas
las peticiones que éste haga hasta que pasa un período de tiempo en el
que el usuario no hace ninguna petición entonces el objeto
sesiónmuere.

Se podría decir que los ‘usuarios activos’ == ‘sesiones vivas’.

Si conseguimos que se ejecute un método cada vez que se crea una
sesión y que se ejecute otro cada vez que una sesión muera podemos ir
cargando un Array estático accesible desde toda la aplicación que vaya
incrementándose con la creación de sesiones y decreciendo cuando el
servidor las mata. El problema está vigilar cuando una sesión muere,
por la creación casi que podemos vigilar. Por eso debe existir una
especia de Listener manejado por el contenedor.

Es así como he resuelto varias veces este tema con Java… seguro que
me he liado mogollón y Rails lo resuelve de un plumazo.

Saludos
f.

2008/4/17 javier ramirez [email protected]:

si estás usando ActiveRecord para guardar las sesiones, realmente se
está actualizando la sesión en la db por cada petición, y ya tienes el
campo updated_at. Además, en la misma tabla de sesiones tienes la info
(serializada) de tus usuarios… y por ahí se podría tirar para decir
quién está online.

Veo muchas soluciones algo complicadas, ¿acaso hay algo malo con esta
solución? En el caso de la aplicación web promedio no veo el problema
con mantener al RDBMS ocupado, la carga no será mucha. Por otro lado,
me parece mucho más elegante hacer algo como
Sessions.find_by_update_at(un_tiempo).algún_campo que llegar a pensar
en un equivalente a callbacks raros o escritura en batch a la BD.

¿Estoy siendo muy ingenuo?

El jue, 17-04-2008 a las 18:50 +0200, Fernando G. escribió:


Correcto

Si conseguimos que se ejecute un método cada vez que se crea una
sesión y que se ejecute otro cada vez que una sesión muera podemos ir
cargando un Array estático accesible desde toda la aplicación que vaya
incrementándose con la creación de sesiones y decreciendo cuando el
servidor las mata.

Ups, por defecto en rails dos, no hay sesiones en el servidor. Las
sesiones se guardan en simples cookies encriptadas.

El problema está vigilar cuando una sesión muere,
por la creación casi que podemos vigilar. Por eso debe existir una
especia de Listener manejado por el contenedor.

La cookie puede morir en lo que le especifiques, y yo le suelo poner del
rango de meses o años.

Es así como he resuelto varias veces este tema con Java… seguro que
me he liado mogollón y Rails lo resuelve de un plumazo.

La única forma que conozco es la de Xabier, técnica que se implementa en
muchos sitios, entre otros phpbb guarda la última visita y estima la
cantidad de usuarios de usuarios con un:
count * from users where last_access_time > Time.now - 5.minutes (pero
lo hace a lo php)

Saludos
f.

Saludos.

El 17/04/08, Jaime I. [email protected]
escribió:> Se me ocurre que se podría hacer lo mismo pero no actualizando en cada

petición, sino cada X peticiones, o sólo si ha pasado un tiempo
prudencial desde la última petición. Es menos exacto pero creo que
sufrirá menos la base de datos.

Me respondo a mí mismo… Emili y yo lo hemos definido como lo que
explicaba Xavi, pero actualizando el campo last_seen_at no en cada
petición sino sólo si ha pasado el margen de tiempo que consideramos
(5 minutos) en nuestro caso:

http://pastie.caboo.se/182641

El jue, 17-04-2008 a las 12:03 -0500, Federico B. escribió:

Veo muchas soluciones algo complicadas, ¿acaso hay algo malo con esta
solución? En el caso de la aplicación web promedio no veo el problema
con mantener al RDBMS ocupado, la carga no será mucha. Por otro lado,
me parece mucho más elegante hacer algo como
Sessions.find_by_update_at(un_tiempo).algún_campo que llegar a pensar
en un equivalente a callbacks raros o escritura en batch a la BD.

¿Estoy siendo muy ingenuo?

No. Funciona perfectamente. Yo hablaba de casos en los que uses cookies


Federico

Un Saludo

Guillermo [email protected]

On Apr 18, 2008, at 24:37 , Jaime I. wrote:

El 17/04/08, Jaime I. [email protected] escribió:

Se me ocurre que se podría hacer lo mismo pero no actualizando en
cada
petición, sino cada X peticiones, o sólo si ha pasado un tiempo
prudencial desde la última petición. Es menos exacto pero creo que
sufrirá menos la base de datos.

Me respondo a mí mismo… Emili y yo lo hemos definido como lo que
explicaba Xavi, pero actualizando el campo last_seen_at no en cada
petición sino sólo si ha pasado el margen de tiempo que consideramos
(5 minutos) en nuestro caso:

Da distintos resultados.

Ahi puede pasar que un usuario entre en el minuto 0, y regrese en el
4. Esta ultima visita no se registra de acuerdo a la condicion, pero
cuando preguntes en los minutos 6, 7, 8 por los usuarios online este
usuario no saldra, ya que su last_seen_at es el 0. Puede que ya os
valga asi, lo comento solo para los archivos de la lista.

Parked at Loopia

Esta linea no es bastante sospechosa :slight_smile: ?

@user = User.find(current_user.id)

El 18/04/08, Xavier N. [email protected]
escribió:> > petición sino sólo si ha pasado el margen de tiempo que consideramos

(5 minutos) en nuestro caso:

Da distintos resultados.

Ahi puede pasar que un usuario entre en el minuto 0, y regrese en el
4. Esta ultima visita no se registra de acuerdo a la condicion, pero
cuando preguntes en los minutos 6, 7, 8 por los usuarios online este
usuario no saldra, ya que su last_seen_at es el 0. Puede que ya os
valga asi, lo comento solo para los archivos de la lista.

Sí, lo hemos tenido en cuenta, pero en nuestro caso es la exactitud
que queremos tener. Siempre se puede usar un margen de tiempo
máspequeño para mayor exactitud. O usar dos plazos, uno de la mitad de
tiempo en update_last_seen_at y otro del plazo total en
User.is_online?

Parked at Loopia

Esta linea no es bastante sospechosa :slight_smile: ?

@user = User.find(current_user.id)

Y tanto! Son las prisas, en realidad basta con:

current_user.update_attribute(“last_seen_at” ,Time.now)

Pastie actualizado:
http://pastie.caboo.se/182830