Gnuget
Blog de David Valdez

Caso de estudio: Galaxia Linux y por que no basar un rank en impresiones.

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

Galaxialinux y Cómo no reaccionar como un perdedor

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:

205_c47bd157f76dc1b1b19b6ebf0db82bcd_prg0.gif

Y el de  http://mx.planetalinux.org es:

205_50e17763bcf185ae127b33f3c25c98c3_prg4.gif
  

Referencia donde saque el pagerank: http://google.dirson.com/lab/pagerank-calculator.php

Agregar rutas al load_path de emacs

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

Tip: Saber si un elemento pertenece a un usuario en cakephp

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

Error de ortográfia en linux mint

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:

280_49be349ed6339e809d62e9c70b76d520_quitar.png La palabra mal traducida es quitar.
  

 

Páginas: [1] 2 3 ... 36 37 38