jueves, 12 de febrero de 2009

V-Cube 6x6x6 Resuelto en 3 minutos y 28 segundos

Este chabon resuelve el V-Cube de 6x6x6 en 3 minutos y 28 segundos, por si no lo sabían, el de 6x6x6 existe materialmente e incluso hay algunos como los del video que resuelven asi:

miércoles, 11 de febrero de 2009

openVPN temporal rapida y practica en linux

Con estos comandos, pueden crear una vpn de manera muy rápida y sencilla con openvpn, y sin necesidad de "configuración", si por alguna urgencia necesitan vpn...

En el server:


openvpn --proto tcp-server --lport 9000 --dev tun0 --ifconfig 10.4.0.1 10.4.0.2


En el client


openvpn --proto tcp-client --rport 9000 --remote DIRECCIONIPREMOTA --dev tun0 --ifconfig 10.4.0.2 10.4.0.1


NOTA: asegúrense de que no colisionen las ips del ifconfig y que los puertos sean accesibles (en el ejemplo el 9000),

NOTA: pueden no especificar el proto, y utiliza el protoclo por defecto UDP

Forma elegante de expresar el codigo ascii de un caracter especifico

Simplemente hay que utilizar el operando "?", anteponiendo lo al carácter del cual se quiere obtener el código ASCII, en el siguiente ejemplo se usa "?A" para obtener el código ASCII de la letra A mayúscula


# el abecedario en mayúsculas
# la funcion chr convierte un numero al carácter que representa en ASCII
print (0..25).map{|x| (?A+x).chr}.join(" ")

viernes, 6 de febrero de 2009

Ampliar la funcionalidad de una clase existente

Hola, estamos viendo el ruby para PC, y hoy les voy a pasar un truco para agregarle funcionalidad a una clase ya existente en el lenguaje (también otra que se haya definido de la manera que sea, puede ser extendida )

Supongamos que no nos gusta que el metodo para convertir a entero de la clase String, se llame to_i, y nos parece mejor idea que se llame to_integer



class String
def to_integer
to_i
end
end

print "99".to_integer + 1, "\n"



Lo que hicimos fue definir de manera parcial la clase String, esto es, definirle los métodos que queramos a String, obviamente manteniendo también los métodos originales de la clase String




Bueno, esto fue ruby para PC, y espero que les haya gustado, chau

Usa yield, por que si no lo usas se oxida

Sin duda, yield es un elemento muy poderoso de estos lenguajes de programación "modernos", en definitiva, lo que yield hace es invocar el bloque de código que se le paso por parámetro a un método especifico. Un ejemplo




def foo(x)
if x < 3
yield
end
end

foo(2) { print "hola mundo" }




Con la sola definición de yield no es sencillo darse cuenta rápidamente de como podría aplicarse, pero para que se den una idea, todos los métodos del array que reciben bloques estan implementados usando yield, estos son (entre otros), each, inject, select, find, etc..., también métodos como synchronize del mutex usan yield con propósitos de RAII y con un sin fin de aplicaciones. Aca otro ejemplo:



# compone cualquier funcion dos veces, toma como inicio el parámetro
def compdouble(x)
yield(yield(x))
end

# devuelve x*x*x*x = 81 (composicion doble de x*x)
print compdouble(3){ |x| x*x }, "\n"



también puede servir para pasar expresiones como parámetros, que solo seran evaluadas si se necesitan, la siguiente idea se aplico en el logger de rsif



# invocamos logger.info con parametro normal, entonces el
# interprete siempre evalúa la expresión
# para pasarle el parámetro a logger.info,
#sin importar si logger info vaya a loguear o no
# aveces evaluar determinadas expresiones conlleva
# a invocar metodos, accesar a bases de datos,
# hacer calculos, etc..

logger.info Locale.hello_world

# Es mejor si en lugar de pasarle el paremetro
# normalmente, se lo pasemos en un bloque
# entonces el bloque solo sera invocado
# si el parametro necesita ser evaluado, es decir
# cuando el metodo decida que va a loguearlo, definitivamente

logger.info { Locale.hello_world } # las llaves hacen que se pase el bloque de código

# pseudo-codigo resumido de logger.info:

def logger.info( x = nil )
if loguear
if block_given?
print yield,"\n"
else
print x,"\n"
end
end
end



Otro ejemplo es la implementación de visitor pattern usando ruby, con yield es muy cómoda de implementar y también de usar (el link que les pase hace la comparativa entre la implementación de lo mismo en varios lenguajes)

Espero que les haya sido de utilidad, hasta el próximo post

lunes, 2 de febrero de 2009

¿Porque pasa? Grave vulnerabilidad de ejecucion de codigo en el kernel 2.6.28 (y otros)

Asi como le escucharon, salio un nueva vulnerabilidad del kernel 2.6.28 con impacto de ejecución remota de código ( o Denial of service, segun el caso ), aca una copia de la nota original, de watchmouse:

------------------------------------------------------------------------------------------------------------------------

The Linux Kernel is prone to a remote buffer-overflow vulnerability because the software fails to perform adequate boundary checks on user-supplied data.

An attacker can exploit this issue to execute arbitrary code with kernel-level privileges. Successfully exploiting this issue will result in the complete compromise of affected computers. Failed exploit attempts will result in a denial-of-service condition.

The issue affects Linux Kernel 2.6.28; other versions may also be vulnerable.
------------------------------------------------------------------------------------------------------------------------


Que bueno que en el software libre estas cosas se corrigen rapido, lo mas que podemos hacer es actualizar el kernel y ya hay una versión patcheada, o parchearlos nosotros mismos si esta a nuestro alcance

La nota original de la pueden leer aca

En securityfocus pueden ver mas información acerca de la vulnerabilidad, las versiones afectadas del kernel, etc...

net-security también publico una nota