Written by Gnuget at 2008.10.04
Si leyeron el post anterior vieron el conflicto que causo Eduardo por que damog rompió la credibilidad del rank de Galaxia Linux.
Después de esa gran tragedia yo tuve la oportunidad de tener una “lluvia de ideas” para mejorar galaxia linux, bien, en lugar de ser una lluvia de ideas vimos a un Programador defendiendo su trabajo convencido que la forma en que hace las cosas es fiable.
El nos cuenta que por ahora están afinando el método y están en beta a lo que yo conteste que el script de damog demostró que tal cosa no va a ser viable y que tendría que replantear la forma en que rankea los sitios; Eduardo en ese momento me reto a que probara el script de damog para demostrar que tal script ya no funciona y que él en cuanto detecte nuevas formas de “meter gol” les iba a programar filtros para que no puedan quitarle fidelidad al rank.
La conclusión al final de la conversación era que si me daba tiempo iba a extender el ejemplo de David Moreno a algo que no se pudiera filtrar y que mostraría que usar impresiones para armar el rank era algo inviable.
Así que hoy deje de ver mi episodio Sara Connors Chronicles y prepare un pequeño caso de estudio.
Primero, pensemos un poco acerca de como funciona su sistema de ranking de galaxialinux.com
1. Crear un script que genere una imagen que a la vez cuente como impresión la pagina del blog que ha sido visitado. (osea este: http://www.galaxialinux.com/rank/banners/banner.php)
2. Contar estas impresiones, pero para darle mas fidelidad tenemos que considerar algunas cosas:
- La ip del visitante no puede ser repetida una cantidad excesiva de veces por que querría decir que el usuario esta apretando repetidamente el botón refresh con tal de subir rank
- Tampoco podemos meter su IP a una black list permanente por que quizá este usuario gusta de visitar este blog mas de una vez al díá por que este se actualiza en mas de una ocasión diariamente
Oks ahora describamos un poco de lo que vamos a escribir:
Lo primero, La ip del visitante no puede ser repetida una cantidad excesiva de veces aquí es donde actualmente YA falla el script de Damog (antes no hacían esta revisión) vamos a ver, la forma mas viable de nunca ser la misma ip sería usando un proxy ¿no? oks, aquí hay un pequeño problema, muchas paginas de proxies tiene pequeños “hacks” para que alguien no pueda usar curl y parsear las ips, vi un caso donde generaban el puerto con javascript y otro donde te exigian javascript “encendido” para poder acceder a la lista, y mejor aun uno hasta tenia un pequeño captcha.
Oks lo mas sano (para mi) fue buscar unos minutos en google y cualquier cosa que tuviera forma de una lista de proxies pegarla en un archivo de texto (aunque esta lista se pegara con pedazos de html o de la pagina no importa realmente, solo importa tener los proxies juntos en un solo texto), rápidamente tenia en un archivo de texto mucha basura junto con proxies revueltos así que parte del script iba a ser obtener esta lista de proxies.
Una vez teniendo mi lista de proxies escribí el siguiente script:
#! /usr/bin/evn python
# -*- coding: utf-8 -*-
#Caso de Estudio Galaxia Linux
#Autor David Valdez
import urllib
import urllib2
import re
class anti_rank:
"""testing"""
def __init__(self):
pass
def main(self):
#request (aquí podemos meter diferentes combinaciones de headers e irlas intercambiando)
#además podemos poner la pagina que queremos que suba en el rank
headers = {'User-Agent':'Firefox','Referer':'http://www.tecnologiaslibres.net/'}
#esta función devuelve una lista de proxies
ips = self.get_ips()
#por cada proxy intentamos hacer una petición
for ip in ips:
try:
proxy = urllib2.ProxyHandler({'http': ip})
opener = urllib2.build_opener(proxy,urllib2.HTTPHandler)
urllib2.install_opener(opener)
response = urllib2.Request("http://www.galaxialinux.com/rank/banners/banner.php",None,headers)
response = urllib2.urlopen(response)
response.close()
#un poco de verbose
print "Visitado con la siguiente ip: "+ ip + " al sitio:tecnologiaslibres.net"
except:
print "Error usando este proxy: "+ ip
print "numero de visitas realizadas: %d" % visitas
#lista de proxies
def get_ips(self):
#lo único que necesitamos esa esta expresión regular que extrae las puras ips
#de toda la basura que tenemos de texto
get_ip = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{0,4}")
file = open("proxies.txt","r")
cadena = ""
for line in file.readlines():
cadena = cadena + line
ips = get_ip.findall(cadena)
file.close()
return ips #regresamos una gran lista de direcciones de proxies
if __name__ == "__main__":
text = anti_rank()
text.main()
EN base a esto, poniéndome en los zapatos de Eduardo, consideraría lo siguiente:
- Siempre cada petición será una ip diferente.
- Suponiendo que los filtros revisen cualquier otra cosa en el header (como user Agent) puede ser fácilmente fálsificable así que no es una solución validar por alguna otra cosa del header.
- Además, banear impresiones por user Agent aumentaría dramáticamente el caso de falsos positivos y muchas impresiones genuinas serían tomados como negativos.
- Quizá banear si dos peticiones pasan muy juntas, tampoco es viable, los primeros lugares en el rank tiene muchisimas impresiones, limitar por tiempo las peticiones afectaría directamente a estos primeros lugares (además que podríamos aleatoreamente “pausar” nuestro script para que tampoco tenga peticiones juntas.
Concluyendo, NO hay forma de saber si una impresión es real o es generada por un script como el arriba escrito entonces TAMPOCO hay forma de Programar un filtro para evitar las impresiones falsas. así que la única forma de tener un rank viable es REPLANTEAR la forma de generar el rank que este no se base en vistas.
[UPDATE] SI no alcanzan a apreciar el código, aquí se ve mucho mas claro
Written by Gnuget at 2008.09.28
Hace unas horas llegue a uno de mis canales favoritos de irc (los que tengo en el auto join) y me encontré con que ese mismo día en la tarde hubo una discusión, bueno no se le puede llamar discusión mas bien fue una rabieta de uno de los programadores de http://galaxialinux.com
Galaxia linux es una gran idea pero tuvieron un error que fácilmente quitaba la credibilidad al rank, el error es simple, ellos cuentan impresiones de pagina, es decir que si yo visito mi blog 30 veces al día probablemente podría subir en el rank gracias a mi mismo. Damog hizo algo para probar la vulnerabilidad, hizo un pequeño scriptcillo para levantar planetalinux en su rank, unos minutos mas tarde (como era de esperarse) PL estaba en el top.
Damog les aviso (quizá no de la mejor manera) poniendo un post en su blog describiendo lo que hizo y extendiendo la mano a los programadores de galaxia linux para ayudar a la mejora del sistema.
Bueno, al contrario de lo que podría esperarse Eduardo entro agrediendo a todo el mundo presente y muy ardido de lo que le hicieron a su proyecto.
Tal situación, solo me recuerda algo que leí hace ya muchos años y es parte de un manual para hacer preguntas inteligentes que escribió Erik S Raymond el cual dice así :
Sobre cómo no reaccionar como un perdedor
Hay bastantes posibilidades de que te equivoques más de una vez en foros de la comunidad hacker -- de maneras detalladas en este artículo o similares. Y se te dirá exactamente en qué te equivocaste, posiblemente con profusos detalles. En público.
Cuando esto sucede, lo peor que puedes hacer es lamentarte por la experiencia, denotar que te han asaltado verbalmente, pedir disculpas, llorar, contener la respiración, amenazar con pleitos, quejarte a los jefes de la gente, dejar la tapa del baño abierta, etc. En vez de eso, esto es lo que tienes que hacer:
Superarlo. Es normal. De hecho, resulta saludable y apropiado.
Los estándares de la comunidad no se mantienen por sí mismos: los mantiene la gente que los aplica activa, visiblemente, en público. No te quejes de que todas las críticas se te deberían haber enviado por correo privado: así no es como funciona esto. Ni resulta útil insistir en que se te ha insultado personalmente cuando alguien comenta que alguna de tus peticiones era errónea, o que sus opiniones diferían. Ésas son actitudes de perdedores.
Ha habido foros de hackers en los que, aparte de un sentido de la hipercortesía mal guiado, se ha prohibido la entrada a participantes por enviar cualquier mensaje haciendo constar errores en los mensajes de los demás, y se les ha dicho “No digas nada si no deseas ayudar al usuario”. El éxodo de los participantes más experimentados a otros lugares les ha hecho descender al balbuceo sin el menor sentido y han perdido toda su utilidad como foros técnicos.
Exageradamente “amigable” (de esa manera) o útil: Elige uno.
Recuerda: cuando ese hacker te diga que te has equivocado, y (no importa cuan rudamente) te diga que no vuelvas a hacerlo, su actuación te concierne a (1) ti y a (2) su comunidad. Sería mucho más sencillo para él ignorarte poniéndote un filtro. Si no eres capaz de ser agradecido ten al menos un poco de dignidad, no te quejes y no esperes que te traten como una frágil muñeca sólo porque seas un recién llegado de alma teatralmente hipersensible y con ilusiones de estar autorizado a todo
Para ver el texto completo ir a: http://www.sindominio.net/ayuda/preguntas-inteligentes.html#NOT_LOSING
Es muy lamentable lo que ha ocurrido, espero que Eduardo la próxima vez muestre un poco mas de madurez y aprenda aceptar sus errores (no importando en que manera se los muestren) sin animo de ofender, este es un caso que le iría MUY bien al blog de pena ajena.
Aquí esta el log de la conversación si quieren saber lo que paso.
[UPDATE]
Cabe destacar que el pagerank de http://galaxialinux.com en este momento es:
Y el de http://mx.planetalinux.org es:
Referencia donde saque el pagerank: http://google.dirson.com/lab/pagerank-calculator.php
Written by Gnuget at 2008.09.26
Una de las ventajas de ubuntu es que hasta este momento cuando quería instalar un modo nuevo para emacs me limitaba a hacer cosas como:
gnuget@box:~/ apt-get install php-mode
Pero ha muchas cosas que no vienen en los repositorios, por ejemplo este maravilloso modo para twittear desde emacs, así que me di a la tarea de probarlo.
Pero ohh sorpresa, no encontraba una forma bonita de hacerlo, primero me limite a agregarlo a donde están los modos que instala apt para emacs que es en: /usr/share/emacs22/site-lisp/ pero esto no es muy bonito por que acostumbro usar emacs en varios equipos entonces me di a la tarea de investigar como decirle a emacs que nos busque en un lugar que nosotros escojamos.
Para agregar un path donde buscar a emacs necesitamos abrir nuestro archivo de configuración .emacs y agregar lo siguiente hasta el principio:
(setq load-path
(append (list nil "~/.emacs-modes/")
load-path))
En este caso agregamos la carpeta ~/.emacs-modes/ al load-path de emacs ya solo bastará poner ahí nuestros modos y emacs sabrá donde encontrarlos
Written by Gnuget at 2008.09.18
Para entender en que radica este tip vamos a poner un ejemplo.
Supongamos que estamos escribiendo un blog, en él diversos usuarios pueden escribir posts y editarlos ahora cuando un usuario va a editar un post previamente escrito además de que el sistema tenga que verificar si el usuario puede acceder a los posts debemos de verificar que el susodicho post pertenece al usuario en cuestión.
Es muy sencillo el saber si el post le pertenece al usuario, esto haciendo una query y ver que el identificador del usuario aparecezca en el user_id de la tabla posts.
Pero que pasa cuando tenemos además de posts, tenemos otros tantos módulos como photos, videos,comments, profiles y muchas cosas mas, el escribir esa query para verificar que cada elemento le pertenece al usuario termina siendo tedioso, es por eso que escribí esta pequeña función:
function pertenece($id,$user_id){
if($this->find(
array(
"{$this->name}.id" => $id,
"{$this->name}.user_id"=> $user_id
),
array(
"{$this->name}.id",
"{$this->name}.user_id"
),
null,
0
)
){
return True;
}
return False;
}
Esta función debe de ser colocada en nuestro app_model dentro de nuestra carpeta /app (si no existe app_mode.php podemos copiarlo de el que esta en /cake/libs/model/app_model.php y ponerlo dentro de nuestra carpeta /app)
Una vez hecho esto, ya solo para verificar la pertenencia del elemento al usuario tenemos que hacer:
$this->Modelo->pertenece($id_del_elemento,$id_del_usuario);
Y devolverá true o false dependiendo de si pertenece el elemento o no.
NOTA: esta función sirve si y solo si seguimos las convenciones de cake, es decir que siempre tenemos una columna id y si va a estar relacionada esa columna con la tabla usuarios debe de existir el campo user_id
Written by Gnuget at 2008.09.17
En las últimas fechas uso linux mint en la computadora y hace poco encontré un error de ortografía.
La pregunta es, ¿alguno de ustedes sabe donde puedo reportar o sugerir una mejor traducción del error en cuestión? ¿se tendría que reportar directamente en linux mint, en gnome o en el proyecto USP?
Dejo screen shot del error en cuestión:
La palabra mal traducida es quitar.