Cofetel es mala?

Hace poco la página de Milenio Puebla publicó el ¿*fraude*? de la Cofetel donde cualquier usuario adelantando su reloj puede modificar la cantidad de usuarios registrados en el RENAUT.

Página de la Cofetel: http://www.cofetel.gob.mx/ (ahí se ve luego luego el contado)
Artículo de Milenio Puebla: http://www.mpuebla.com/nota.php?id=9387 (ahí vienen imagenes y el script original).

¿Cuál es mi dilema al respecto? La pregunta de si el programador fue el idiota, o si los señores de la COFETEL nos mienten a costa de la ignorancia (obvia y justificada) de los usuarios no-programadores web.

Los señores de la cofetel usan el tiempo local de la máquina en vez del servidor (lo que sería lo lógico) y a partir de ahí aumentan el número de usuarios registrados.

¿Cual es el problema? Seguramente el programador web se distrajo (o es babas) y utilizo el get time del cliente, asi pues si cambio mi reloj cambia el tiempo actual que resta de una fecha fija.

Es esto un engaño? Pues no, simplemente el señor programador no sabe matematicas.

En la página principal de Google dice „X espacio libre“ y va aumentando periodicamente. Si checamos su codigo fuente dice una funcion

[cc lang=“js“]
function updateQuota() {
if (!quota_elem) {
return;
}
var now = (new Date()).getTime();
var i;

for (i = 0; i < CP.length; i++) {
if (now < CP[i][0]) {
break;
}
}

if (i == 0) {
setTimeout(updateQuota, 1000);
} else if (i == CP.length) {
quota_elem.innerHTML = CP[i – 1][1];
} else {
var ts = CP[i – 1][0];
var bs = CP[i – 1][1];
quota_elem.innerHTML = format(((now-ts) / (CP[i][0]-ts) * (CP[i][1]-bs)) + bs);
setTimeout(updateQuota, 1000);
}
}
[/cc]

Que es lo que hace? Actualiza el espacio libre segun factores dados por google.

El error en la cofetel es decir valor inicial + (fecha1-fecha2). Sabemos con pocas matematicas y sin sacar numeros magicos ahorita, que el registro de usuarios NO puede ser lineal, es imposible, mientras mas tiempo pasa, menos usuarios se van a registrar, puede ser una funcion exponencial de bajada, puede ser bla bla, pero no lineal… Una curva de distribucion normal, un lo que se les ocurra, pero no lineal. Asi pues, si fecha1 la cambiamos en nuestro reloj de computadora, cuando se recorra la funcion, dara un valor mayor que si disminuimos la fecha1. De hecho si viajamos suficientemente atrás en el tiempo el número irá disminuyendo y podríamos llegar a valores negativos.

Lo que la cofetel debio de hacer fue, pensar „Cuantos usuarios hay, cuantos creemos que se registraran, a que tasa“ y sacar una proyeccion y esto les daría un factor de crecimiento. Imaginemos celulas que se biparten cada segundo, pues con matematicas rapidas sacamos que es 2^t, donde t es el tiempo en segundos, asi en el segundo 0 tenemos 1 celula, en el segundo 1 dos, en el segundo 2, 4, etc, el factor de crecimiento es 2. En el caso de la cofetel debieron haber buscado un factor segun estadistica, probabilidad o yo que se. y entonces decir „Si sabemos que crece a x factor por dia el numero de usuarios“ su funcion seria registrados = (fecha1-fecha2)*factor+valor inicial PERO con fecha2 del servidor no del cliente (sino pasaria lo mismo que dijimos arriba). y con una actualizacion en funcion del factor, es decir, si el factor es registrados por minuto, pues que la funcion se actualice cada minuto, si es por hora cada hora, etc. Asi bien podríamos tener un factor de 1.2 por hora. Entonces cada hora actualizariamos el contador con registrados = registrados + factor, o sea +1.2

La pregunta es si esto es un engaño o no. Lamentablemente (para los que lo quieren asi) no es un engaño. Es simplemente carga de servidor. Imaginemos por ejemplo en el caso de google que tiene millones de usuarios entrando a su pagina, si cada segundo gmail.com llamara a los servidores de google para saber cuanto espacio libre hay, serian millones de peticiones por segundo, lo cual se traduce en carga para google y obvio en a) mejores/mas servidores o b) se cayera google.

—- No leí lo demas, esto es lo importante —-

La solucion? Es sencilla. Imaginemos una tienda que lleva el registro de gente que compra todos los dias. En promedio compran 8 personas diarias. El encargado sabe que en promedio TODOS los dias van 8 personas. Si trabaja un turno de 8 horas diarias, quiere decir que por dia asiste a la tienda 1 persona por hora.

Si lo vemos matematicamente seria
personas que compran = dias * 8
personas que compran = horas * 1

Entonces si yo llego a las 3 de la tarde y el señor empieza a trabajar a las 8 de la mañana y le pregunto „Señor, en promedio cuantas personas han venido hoy?“, si el señor no tuvo la precaucion de contarlas, sabe que en promedio al dia viene 1 persona por hora, por lo tanto dice „Son las 15 horas, entre a las 8, por lo tanto 15-8=7“ simplemente responderia „7 personas“. Mintió? Si porque a lo mejor han venido 4 y no 7, pero estadisticamente en la proxima hora vendran 4 mas.
–> Esto sería equivalente a entrar ahorita a la pagina y preguntar cuantos usuarios registrados hay

Ahora bien, si la persona en cuestion preguntara „Mañana a las 3 pm cuantas personas habrán venido?“ El vendedor podría decir con seguridad „15 personas“. Serían las 8 de hoy y 7 de mañana.
–> Esto sería equivalente a mover la hora de tu reloj a la hora de mañana

Mi conclusión:
Como vemos son cuestions de percepciones, la cofetel mintió o no? En realidad a mi no me lo parece. Por un lado es un programador malo que uso la hora cliente y no servidor y por otro lado una funcion matematica deficiente.

A quien se debe echarle la culpa?


UPDATE: Hace unos instantes me hicieron lelgar este link http://intelectualradio.wordpress.com/2010/04/06/cofetel-no-subestimes-a-un-geek/ por twitter.

En dicho artículo el analisis sobre el script es básicamente el mismo, sobre como se actualiza por fecha. Sin embargo considero que el error, a diferencia de lo que opino, es que si tiene una referencia a la base de datos que es el valor incial.

En el caso del artículo dice: „1:13 am del horario de verano“ del 6 de abril, ahorita es 7 de abril y son las 5:32. Su número de usuarios dice:

el articulo –> usuarios=51603051;
ahorita –> usuarios=54004221;

Un incremento en 16 horas y cacho, 3 millones en 16 horas? Discutible, ese dato si no lo discuto, parece falso? si, lo es? 80% que si. Sin embargo si yo cambio mi hora y actualizo la pagina, me cambia la cantidad de usuarios, pero al ver el codigo el usuarios=X sigue siendo el mismo.

Por lo tanto ese numero vino de algun lado, no creo que diariamente lo actualice una persona a mano. A lo mejor tuve la suerte y estaba cacheado y por eso me aparecio 54 en las multiples veces. Cada cuando cambia? No lo se. De donde viene ese numero? Quiero ser ingenuo y pensar que cofetel dice select count(*) from renaut_registrados y lo memcachea. Ahora tendre que reiniciar, probar, ir a windows probar, volver y probar a ver si estoy en lo correcto.

Y sí, yo sé, es un html, pero yo puedo configurar mi apache para que procese html como php. Los servidores de la anahuac asi lo hacen. O tambien actualizan la portada diariamente a mano? Solo sería un punto más a mi favor de que el programador es un idiota. Pero la verdad no puedo esperar mucho de alguien que pone tags con mayusculas… Aunque lo haya hecho un framework, un cms o lo que sea.

Por otro lado queda la duda del codigo comentado que dice:
//var currentTime = new Date(2010,);

Si es un html que se procesa como php porque no interpreto ese pedazo? Es un php dejado dentro de un echo? Si no lo interpreto como php, y por ende no es un php, quiere decir entonces que es un html estatico, y si es estatico como cambian dinámicamente el inicio de usuarios. Y como se que no es un php que se genera y despues por curls generan caches en forma html que es el que vemos, que es originalmente php, pero se genera para mostrarse como html.

Definitivamente reafirma mi teoria que el programador es pesimo. O le habra dicho a la cofetel:
„Ey lo hice con el tiempo del servidor (codigo comentado) pero se actualiza a un usuario por dia, pero si lo pongo con el del cliente se actualiza por segundo“ y la cofetel hubiera dicho „No, por cliente“ (lo cual es super creible, y no es sarcasmo).

Sin embargo… UNA vez mas me demuestra el programador que es pésimo, pues hay 200 maneras de hacer eso mismo sin que nadie hubiera podido ver que pasa (tan simple como un ajax que solo trajera el valor calculado segun la hora del server, que al igual que el cliente cambia, no seria modificable por el usuario, haria lo mismo y nadie sabria como se actualiza pues un ajax solo traeria un valor (hasta formateado con number_format).

En fin, mi teoria es que un mal programador hizo una mala decision y por ende, estamos debatiendo si la cofetel es buena o mala. Que a final de cuentas si nos preguntamos y a la cofetel que le importa cuantos se registran? 1? 2? 3? todos? Le es meramente irrelevante, los que deberian de estar preocupados son telcel porque pierden dinero. La cofetel ordena cancelar los servicios al usuario, telcel los cancela y todos se jo… Si cancelacion de servicio no es suficiente incentivo para que te registres, ver un numerito en su pagina donde nadie nunca en su vida habia entrado hasta que salio este chisme, no creo que sea mejor o igual de bueno como incentivo.

P.D. Quiero aclarar, no defiendo a la Cofetel. El gobierno es basura, nos engaña cuando puede, y todo lo hace mal por beneficio propio, o porque cree que asi conseguirá… Oh! Ya lo habia dicho, conseguira un beneficio. Simplemente mi posición es que aunque si creo que haya malicia detras de esto, no satanizo a la cofetel y si me averguenzo de la pesima programación del que hizo la pagina…