Archivo | septiembre, 2010

«Anonymous Content» en Google Chrome

30 Sep

Todos los que hemos creado alguna vez una extension para Firefox sabemos que existen varias formas de representar ventanas dentro del explorador. Una de ellas, la recomendada por el equipo de Mozilla es usando su protocolo XUL para representación de interfaces con el usuario. Por otro lado, existe también la posibilidad de insertar nodos dentro del DOM del documento por medio del «Anonymous Content». De esta forma, podemos representar HTML al usuario que la página no puede ver ni acceder a él.

Por otro lado, si quisiéramos hacer lo mismo en Google Chrome, nos encontraríamos con el problema de que este explorador no cuenta ni con un API del estilo de XUL, ni tampoco con la manera de introducir nodos en el árbol DOM sin que sean vistos por la página en la que los introducimos.

éxtasis ácido camión

Existe de todas formas, una manera de poder resolver este problema en Google Chrome. He escrito un articulo en el que explico la manera más sencilla de hacerlo, y cómo podemos proteger nuestro contenido de la pagina en la que lo introducimos. Por medio de IFRAMES. He aquí el articulo:

http://www.borderstylo.com/posts/220-anonymous-content-injection-in-google-chrome

Con esta explicación podrás introducir contenido protegido sin el temor de que la pagina pueda extraerlo o modificarlo.

Conectarse a varios esclavos de MySQL con Ruby

15 Sep

Vamos a ver como nos conectamos a varios esclavos de MySQL que replican de un maestro. Como comentamos en el capitulo anterior, la replicación  de MySQL nos permite aumentar la capacidad de lecturas de nuestra base de datos.

Ahora vamos a estudiar la manera en la que podemos conectar nuestro programa de Ruby a todos esos esclavos. La mayoría de las gemas que nos encontramos soportan múltiples esclavos. Pero la manera en la que se conectan es muy simple, y si nos encontramos en una situación de mucha carga, podemos llegar a tumbar toda la base de datos. Veamos el ejemplo de la gema Sequel.

Para configurar múltiples esclavos, tenemos que configurarla de la siguiente manera (codigo ejemplo de su documentación):

DB=Sequel.connect('mysql://master_server/database', \
    :servers=>{:read_only=>proc{|db| {:host=>db.get_slave_host}}})
  def DB.get_slave_host
    @current_host ||= -1
    "slave_server#{(@current_host+=1)%4}"
  end

Siendo master_server nuestro servidor maestro y slave_server#{(@current_host+=1)%4} nuestros esclavos.

Vamos a hacerlo más aleatorio:

DB=Sequel.connect('mysql://maestro/my_db', \
    :servers=>{:read_only=>proc{|db| {:host=>db.get_slave_host}}})

  def DB.get_slave_host
    slaves = [
      "esclavo_1",
      "esclavo_2",
      "esclavo_3",
      "esclavo_4",
      "esclavo_5",
      "esclavo_6"
    ]
    return slaves[rand(slaves.length - 1)]
  end

Ahora bien, viendo este código, podemos ver ya que la distribución de las conexiones va a ser equitativa, es decir, si tenemos 4 esclavos, cada uno de ellos va a recibir el mismo número de conexiones. Esto en un mundo ideal nos viene bien, pero no nos viene tan bien cuando tengamos alguno de los esclavos con más carga que los demás…

Vamos a darle una vuelta de tuerca. Vamos a tratar de comprobar el estado de los servidores antes de conectarnos, para saber si realmente queremos conectarnos a dicho servidor, o no…

DB=Sequel.connect("mysql://maestro/#{db_name}", \
    :servers=>{:read_only=>proc{|db| {:host=>db.get_slave_host}}})

  def DB.slaves_array
    slaves = [
      "esclavo_1",
      "esclavo_2",
      "esclavo_3",
      "esclavo_4",
      "esclavo_5",
      "esclavo_6"
    ]
    return slaves
  end

  def DB.get_slave_host
    tries = 0
    while tries <= DB.slaves_array.length
      slave = DB.get_slaves_array[rand(DB.get_slaves_array.length - 1)]
      return slave if DB.get_slave_delay <= 1
      tries += 1
    end
  end

  def DB.get_slave_delay(slave, db_name)
    begin
      DBSlave=Sequel.connect("mysql://#{slave}/#{db_name}")
      delay = DBSlave["SHOW SLAVE STATUS"]
      return delay[32].to_i
    rescue
      return 1000
    end
  end

Parte por parte.

Lo que este código hace es simplemente  comprobar si el esclavo al que nos vamos a conectar esta sin retrasos con respecto al maestro y ademas si nos podemos conectar. Para ello, cuando Sequel llame a db.get_slave_host lo que vamos a hacer es lo siguiente:

def DB.get_slave_host
    tries = 0
    while tries <= DB.slaves_array.length
      slave = DB.get_slaves_array[rand(DB.get_slaves_array.length - 1)]
      return slave if DB.get_slave_delay <= 1
      tries += 1
    end
  end

Vamos a sacar un esclavo de la lista de manera aleatoria:

slave = DB.get_slaves_array[rand(DB.get_slaves_array.length - 1)]

Y posteriormente vamos a tratar de conectarnos al esclavo y mirar su estado:

return slave if DB.get_slave_delay <= 1

Esto llama a la función que hemos definido:

def DB.get_slave_delay(slave, db_name)
    begin
      DBSlave=Sequel.connect("mysql://#{slave}/#{db_name}")
      delay = DBSlave["SHOW SLAVE STATUS"]
      return delay[32].to_i
    rescue
      return 1000
    end
  end

Esta función va a comprobar el estado del servidor. Si el esclavo tuviera algún problema, devolvería un retraso elevado (cuando los esclavos tienen mucha carga, suelen retrasarse con respecto a su maestro) o si no podemos conectar, entonces devolverá 1000, dando así un retraso muy elevado indicando que el servidor no esta disponible.

Nota: para que nuestro código pueda preguntar por el estado de los esclavos («SHOW SLAVE STATUS») necesitamos dar privilegios SUPER, REPLICATION CLIENT al usuario que hemos designado a nuestro programa para conectarse a los esclavos:

mysql> GRANT SUPER, REPLICATION CLIENT ON *.* TO 'user'@'domain' IDENTIFIED BY 'password'

En conclusión, si queremos que nuestro código soporte varios servidores esclavos y que compruebe la carga antes de cada conexión, debemos complicar la lógica de conexión a la hora de conectarnos a la base de datos. Las gemas como Sequel nos pueden ayudar a ello con abstracciones de conexión. Es muy sencillo hacer esta comprobación cada vez que nos conectamos. Pero como en todo, este método de comprobación no es escalable a grandes sistemas dado que cada vez que vamos a realizar una lectura, primero hacemos una conexión al esclavo para mirar su estado. Esto hace que la cantidad de conexiones se multiplique por dos.
Mi recomendación es que se trate de hacer un método híbrido donde en paralelo a este código, se compruebe el estado de los esclavos cada vez, y se modifiquen los pesos de cada esclavo dependiendo de dichas comprobaciones. Pero esto corresponde al siguiente post…

Glass en Google Chrome

15 Sep

Por fin ha llegado la extensión de Glass para Google Chrome.

Hemos tenido que esperar por una razón de seguridad. Google Chrome 5 no nos permitía proteger los datos del usuario a la hora de posicionar los ‘slides’ en la pagina web. Pero la nueva versión lanzada, Google Chrome 6 (6.0.472 para ser más específicos) si que nos permite poner los ‘slides’ en la pagina con la seguridad de que nadie ni nada puede acceder a ellas, tal y como la extensión de Firefox está diseñada.

Para instalarte la extensión en Google Chrome, tienes que seguir los siguientes pasos:

1 Conseguir una cuenta de Glass

Si no tienes una cuenta de Glass no te preocupes, simplemente entra en:

http://www.writeonglass.com

Y en el recuadro de los códigos,

Escribe el código bamboo.

Sigue el proceso de registro y ya tienes una cuenta.

2 Entrar en Glass

Si ya tenias una cuenta, entonces lo que tienes que hacer es entrar en Glass. Simplemente, en http://www.writeonglass.com haz click en «Login»:

Introduce tu correo y contraseña de Glass y haz click en «Login».

3 Descargar la Extensión

La extensión se encuentra en la sección de «Download» en el menú principal de arriba a la derecha:

Cuando pulses en «Download» re aparerecerá abajo a la izquierda las instrucciones para que te instales Glass:

Cuando hayas instalado Glass finalmente, te aparecerá un botón arriba a la derecha del navegador:

4 Disfrutar de Glass

Ya es hora de que pruebes la extensión para Chrome.  Cuando estes en una página de Internet que te interese compartir con alguien, haz click en el botón de Glass de tu navegador (o pulsa dos veces seguidas la tecla Control). Te aparecerá el siguiente menú:

Si hacemos click en «New Slide» (o pulsamos la tecla ‘N’) nos aparecerá en la página el Slide preparado para ser rellenado. Primero lo movemos a la parte de la página donde pensamos que tendrá más significado (puedes arrastrar el Slide a la posición que creas más conveniente).

Lo único que tenemos que hacer es rellenar el Slide con las personas a las que queremos remitir nuestro comentario:

Y a continuación, el mensaje que queremos enviar:

Y pulsar Post.

Y ya tenemos nuestro Slide compartido con Andrew. Recibirá una notificación en su propio Glass que le llevará a la página donde hemos situado nuestro Slide y se lo mostrará solamente a Andrew.