Joaquin Sorianello: Agregando un botón para chequear las cuentas pop3 en Gmail

Cansado de usar un cliente de correo, me decidi a unificar las casillas de mail, y recibir todo en Gmail, el problema es que actualiza las casillas POP3 aproximadamente cada una hora. Si bien existe una forma de forzar la actualizacion, esta en la parte de configuracion, siendo muy poco practico.
Descubri un script para GreaseMonkey, de Tim Smart, pero solo funciona para la versión en Ingles. Me di cuenta que adaptarlo al español era casi trivial. Aca esta la versión modificada:



// ==UserScript==

// @name GMail POP3 Quick Checker

// @namespace http://userscripts.org/users/tim

// @description Add's a link next to 'Refresh' to quickly check all POP3 Accounts

// @include http://mail.google.com*

// @include https://mail.google.com*

// @require http://updater.usotools.co.cc/51516.js

// @require http://userscripts.org/scripts/source/56812.user.js

// ==/UserScript==



function clickElement( element ) {

var clickEvent = document.createEvent("MouseEvents");

clickEvent.initMouseEvent( "click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null );

element.dispatchEvent( clickEvent );

}



var navigating = false;



GMailAPI({

onViewChange: function() {

if ( this.viewType === 'tl' ) {

var divs = this.viewElement.ownerDocument.evaluate( ".//div[contains(.,'Actualizar') and @act='20']", this.viewElement, null, 7, null );

for ( var i = 0, div, refreshCont, refreshLink; div = divs.snapshotItem( i++ ); ) {

if ( div.added === true )

return;



refreshCont = document.createElement('div');

refreshLink = document.createElement('div');

refreshCont.className = 'goog-inline-block';

refreshLink.className = 'AP';

refreshLink.appendChild( document.createTextNode('Actualizar Cuentas POP3') );

refreshCont.appendChild( refreshLink );



refreshCont.addEventListener( 'click', function() {

if ( top.location.hash && top.location.hash.length > 1 )

navigating = top.location.hash;

else

navigating = true;



top.location.hash = '#settings/accounts';

}, false );



div.parentNode.parentNode.appendChild( refreshCont );

div.added = true;

refreshLink = refreshCont = null;

}

divs = null;

}

else if ( this.viewType === 's' ) {

if ( navigating === false )

return;



var links = this.viewElement.ownerDocument.evaluate( ".//span[contains(.,'Comprobar si tengo correo ahora')]", this.viewElement, null, 4, null );

for ( var link; link = links.iterateNext(); )

clickElement( link );



top.location.hash = navigating === true ? '#inbox' : navigating;

navigating = false;

}

}

});

Pablo Benjamín Arroyo: Instalar font manager en archlinux

Esta es una herramienta muy importante para un diseñador..nos permite instalar fuentes, probarlas y visualizarlas.

En ubuntu la tenia instalada, pero en mi nuevo archlinux probe con "pacman -S font-manager" y no esta disponible en los repositorios de la distribución asi que me puse a compilarlo e instalarlo manualmente:


Descargar el archivo con el codigo fuente:

$ wget http://font-manager.googlecode.com/files/font-manager-0.4.1.tar.bz2



Extraerlo:

$ tar xvjf font-manager*



Nos movemos a la carpeta:

$ cd font-manager*



Configuramos la compilacion para chekear dependencias:

$ ./configure



Listo, compilamos todo:

$ make



Ahora instalamos lo que compilamos:

$ sudo make instalall



Y listo, ahora podemos ejecutar el programa desde Aplicaciones > Graficos > Font manager



Bookmark and Share

Sebastian Bassi: Nueva edición de Biologia molecular para programadores


Biología Molecular para programadores

Clases en auditorio.
Fundamentos y herramientas de Biología Molecular esenciales para trabajar en Bioinformática.
Objetivos: Incorporar los conocimientos básicos de biología molecular útiles para trabajar en bioinformática, desarrollar aplicaciones especializadas o dar soporte informático a biólogos moleculares, biotecnólogos, bioquímicos y médicos
Inicio: Se dictará lunes de 18.30 a 21.30 hs. desde el 28 de septiembre de 2009
Duración: 15 horas, en cinco clases de 3 hs cada una.
Costo: $180

Mas información en la página del Club de programadores.

Joaquin Sorianello: Flasheando el dir 300

Hace unos días, después de una visita al canal de chat de Buenos Aires Libre (#buenosaireslibre en freenode) me arme de valor y la instale DD-WRT (Un firmware basado en Linux para routers, con una gran cantidad de funcionalidades) a mi DIR-300. Use dos guías diferentes: la oficial, que es bastante escueta, y otra, para un router similar, que explica como configurar nuestra máquina para que el flasheo sea un éxito. Decidí escribir una guía en castellano, con bastante información que no hay sobre el proceso.

Conceptos Generales:
Herramientas que vamos a utilizar:

-GNU/Linux, en el sabor que mas nos guste. (Yo personalmente utilice Ubuntu Jaunty 9.04)

-Un servidor tftp (En Debían y derivados sudo apt-get install tftp xinetd tftpd).

-El archifamoso Putty (sudo apt-get install putty)

-Un cable de Red (Elemental Watson!)

-Los archivos ap61.ram, ap61.rom, linux.bin y dir300-firmware.bin (En su versión mas actualizada, desde el sitio oficial)

Hay cinco pasos principales para flashear el router:
1)Configurar el servidor tftp en la máquina que vamos a utilizar y verificar su funcionamiento.
2)Entrar al RedBoot del DIR- 300. Para eso vamos a usar un script de bash, que nos va a simplificar el trabajo.
3)Cargar el RedBoot modificado(ap61.ram) en la memoria del router.
4)Cargar la imagen de linux, linux.bin.
5)Configurar el script de inicio del router.

--Configurando el servidor tftp---

1-Instalamos, usando apt-get xinetd, tftpd y tftp
Bash:~$ sudo apt-get install xinetd tftpd tftp

2-Creamos el archivo de configuración en /etc/xinetd.d
Bash:~$ sudo gedit /etc/xinetd.d/tftp
Y le ponemos como contenido:

----Código----
service tftp
{
protocolo = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no }
----/Código----

3- Creamos el directorio /tftpboot, que es la carpeta que contiene los archivos compartidos por tftp y le damos permisos para que sea de acceso irrestricto, y no sea propiedad de nadie

Bash:~$ sudo mkdir /tftpboot
Bash:~$ sudo chown -R nobody /tftpboot/
Bash:~$ sudo chmod -R 777 /tftpboot/

4- Si no descargamos los archivos aun, lo hacemos ahora y los ponemos en nuestro directorio /tftpboot/ (son cuatro archivos en total)

5-Reiniciamos xinetd
Bash:~$ sudo /etc/init.d/xinetd stop
Bash:~$ sudo /etc/init.d/xinetd start

6- Probamos que todo funcione correctamente:
Bash:~$ tftp 127.0.0.1 #Nos conectamos por loopback al servidor que esta corriendo en nuestro equipo
tftp> verbose #Ponemos a la sesion en modo verbose, asi tenemos mas feedback de lo que pasa.
Verbose mode on.
tftp> get linux.bin #pedimos el archivo linux.bin
getting from 127.0.0.1:linux.bin to linux.bin [netascii]
Received 3764422 bytes in 0.5 seconds [60230752 bits/sec]]]
tftp> quit #terminamos la sesión
Nuestro servidor tftp funciona!!!!!

----Entrando al RedBoot----
No es fácil entrar al RedBoot sin la ayuda del siguiente script:

---Codigo---
#!/bin/bash
echo

echo ""
echo "Ingrese el nombre o la direccion IP del host: "
read host
while true
do
if eval "ping -c 1 -s 1 $host" > /dev/null; then
echo "Router Awake"
putty telnet://$host 9000 -m redboot.txt
break
else
echo "Esperando al Redboot para iniciar. Presione CTRL + C para salir"

sleep 1
fi done
---/Código---


Le ponemos el nombre que mas nos guste, en mi caso router.sh.

Tenemos que crear también un archivo redboot.txt que contenga lo siguiente:
---Código---
^C
-
--/Código---

Ahora empieza la acción!!!

-Desconectá el router (todos los cables de red y la energía), dale un besito de buenas noches y prometele que después de la operación va a sentirse mucho mas enérgico, animado, y funcional.
-Enchufa la computadora al router, usando el cable de red, en el puerto WAN.
-Cambia la ip de tu equipo a 192.168.20.80
Bash:~$ sudo ifconfig eth0 192.168.20.80 up #cambia eth0 por la interface que estes usando.
-ejectuta el script router.sh:
---Sesión de Bash---
Bash:~$ sudo ./router.sh

Ingrese el nombre o la direccion IP del host:

192.168.20.81 #esto lo ingresamos nosotros y le damos enter
Esperando al Redboot para iniciar. Presione CTRL + C para salir # Ahora conectamos la energia al router, despues de un momento nos tendria que abrir una ventana de putty
---Sesión de Putty---
RedBoot> load ap61.ram #Ojo!! es el ap61.ram, no se confundan con el ap61.rom!

RedBoot> go #La sesión va a ser terminada, ni se te ocurra resetear el router!

---/Sesión de Putty---

#Nos conectamos por cualquier puerto LAN del router, teniendo cuidado de no desconectar la alimentación
Bash:~$ sudo ifconfig eth0 192.168.1.20 up #Cambiamos la Ip a 192.168.1.20
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:
192.168.1.1

Esperando al Redboot para iniciar. Presione CTRL + C para salir.

---Sesión de Putty---

DD-WRT> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System

... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.20
DD-WRT> load -r -b %{FREEMEMLO} ap61.rom

Using default protocol (TFTP)
Raw file loaded 0x80080000-0x800a8717, assumed entry at 0x80080000
DD-WRT> fis create -l 0x30000 -e 0xbfc00000 RedBoot
An image named 'RedBoot' exists - continue (y/n)? y
... Erase from 0xbfc00000-0xbfc30000: ...
... Program from 0x80080000-0x800a8718 at 0xbfc00000: ...
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> reset
#El Router se va a reiniciar, con el nuevo bootloader, por lo tanto, cerramos la ventana de putty y esperamos ~1 minuto, para volver a lanzar el script de conexión.
---/Sesión de Putty---
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:

192.168.1.1
Esperando al Redboot para iniciar. Presione CTRL + C para salir.
---Sesión de Putty---
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2

DD-WRT> load -r -b 0x80041000 linux.bin #tomate unos segundo para chequear bien los números en Hexadecimal.
DD-WRT> fis create linux # Esta operación tarda unos minutos, tené paciencia
DD-WRT> fconfig boot_script true

DD-WRT> fconfig boot_script_timeout 4
DD-WRT> fconfig
Run script at boot: true
Boot script: Enter script, terminate with empty line
>> fis load -l linux
>> exec
>> Boot script timeout (1000ms resolution): 3 #Apretamos Enter
Use BOOTP for network configuration: false #Apretamos Enter
Gateway IP address: #Apretamos Enter
Local IP address: #Apretamos Enter
Local IP address mask: #Apretamos Enter

Default server IP address: #Apretamos Enter
Console baud rate: 9600 #Apretamos Enter

GDB connection port: 9000 #Apretamos Enter

Force console for special debug messages: false #Apretamos Enter

Network debug at boot time: false #Apretamos Enter
Update
RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> reset
---/Sesión Putty---
---/Sesión Bash---

Ya tenemos el ddwrt instalado!
Normalmente, no te va a levantar la ip automagicamente, para eso, desconecta el cable de red, espera que el router termine de arrancar, y volvelo a conectar, es un bug conocido de DD-WRT.

Para entrar a la configuración web:
http://192.168.1.1

Fuentes:
Sitio Oficial
Guia Oficial
Guia Copada del foro ddwrt
Archivos para el DIR-300 (Poniendo DIR 300 en el cuadro de busqueda)


Pablo Benjamín Arroyo: Cuenta en Spotify !

Spotify es un servicio que te permite escuchar musica sin descargarla, solo por streaming, usando un cliente.

Spotify solo esta disponible gratuitamente en algunos paises:


Pero para crear la cuenta, se puede utilizar un proxi. El proxi tiene que estar situado en R. Unido, España o en cualquier pais donde se puede accerder gratuitamente a una cuenta spotify.

Un buen servidor es este. Una ves en el proxi, vamos a navegar hasta la pagina de creacion de cuenta ->

https://www.spotify.com/en/get-started




Le hacemos clic en GO y nos va a llevar a la pagina de spotify. Nos registramos como en cualquier pagina, pero en la parte de Country (pais) seleccionamos UK y en la parte de Postal code (codigo postal) escribimos SE17 2DJ


Una ves creada nuestra cuenta, vamos a descargar el cliente.

Primero instalamos wine:

$ sudo apt-get install wine



Ahora descargamos el programa cliente:

$ wget http://www.spotify.com/download/Spotify Installer.exe



Y lo ejecutamos

$ wine Spotify\ Installer.exe



Lo instalamos como a cualquier programa de windows

Y lo ejecutamos:

$ wine .wine/dosdevices/c\:/Archivos\ de\ programa/Spotify/spotify.exe



Nos logueamos con nuestro nombre de usuario y contraseña

__

Ahora para crear un acceso directo al programa en el panel seguimos estos pasos:

1)Descargamos el icono

$ wget http://kallepersson.se/upl/spotify.svg



2) Clic derecho en el panel de gnome y "Añadir al panel"



3) Clic en "Lanzador de aplicaciones personalizado"



3) Completar los campos con lo siguiente



Nombre: Spotify

Comando: wine .wine/dosdevices/c\:/Archivos\ de\ programa/Spotify/spotify.exe

Comentario: Escuchar musica online

4) Clic en el icono:



y remplazamos la direccion del icono anterior:



Por la del icono que descargamos:

/home/usuario/spotify.svg

Y el lanzador terminado



Ahora solo hay que hacer un clic en el icono



--

Muy facil...si tenes alguna duda, deja el comentario



Bookmark and Share

Pablo Benjamín Arroyo: Gimp 2.8 : mejoras y funcionalidades

07/09/2009 - Tras la publicación de la última versión estable de GIMP (2.6.7), con mejoras en estabilidad y solución a varios bugs, acabamos de conocer algunas de las nuevas características de este programa de manipulación y edición de imágenes.
  • Capas agrupadas del mismo modo que en Phtoshop lo que supondrá una importante mejora en su uso.
  • Mejoras en pinceles, permitiendo rotaciones, cambio del aspect ratio, ángulo de inclinación....
  • Etiquetado de fuentes: todos los recursos (pinceles, fuentes, patterns, gradientes..) pueden ser etiquetados, lo que mejorará su ordenación y búsqueda.
  • Posibilidad de añadir cálculos en campos de entrada lo que permitirá permitirá introducir operaciones matemáticas en el escalado de imágenes.
  • Nueva gradiente por defecto disponible
  • Los modos de capa han sido agrupados por tipo.
  • Novedades en la exportación de imágenes: guardar imágenes en JPG o PNG solo será posible mediante la nueva opción Exportar. Guardar servirá para salvar los propios documentos en XCF, el formato de GIMP. Además dispondremos de una función de exportación rápida y de la posibilidad de exportar los valores de color a otros formatos( CSS, PHP, Java, Python..)
  • Mejoras en la interfaz gráfica y en su personalización.
  • Hotkeys o atajos de teclado.
Todavía no se conoce la fecha del lanzamiento definitivo de Gimp 2.8.


Fuente

Bookmark and Share

Ezequiel Gutesman: List comprehensions y generadores: Haskell y Python para principiantes

Un feature que siempre me gustó de Python son las list comprehensions (o listas por comprensión) y los generadores. En este post voy a escribir un texto que me hubiera gustado encontrar un tiempo atrás cuando por primera vez me topé con estas maravillas.

Una lista por comprensión es una forma de obtener una lista de manera "descriptiva", por ejemplo la lista de las primeras 10 potencias de 2:


[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]


Podría obtenerse como:


[2**n for n in range(0,11)]


Que se pdoría leer como: "2 elevado a la n, para n en el rango de 0 a 11". En este caso range() es un generador de números.

Qué significa que sea un generador? simplemente que retorna un iterador y a medida que se le pidan cosas las va a ir produciendo (existe otra función que hace esto mismo con mejoras en el consumo de memoria, llamada xrange(), pero no me voy a poner a explicarlo acá).

Entonces podríamos por ejemplo, querer hacer un generador que me devuelva los números de la secuencia de fibonacci (nunca le encontré el sentido a usar esta secuencia, salvo para jugar, que es lo que estamos haciendo...). Entonces veamos un poco qué herramientas nos provee python (algunas) para hacer generadores.

El siguiente código va contando. Hasta cuando? por siempre, me devuelve un número atrás del otro siempre que yo le pida:



def contar():
x = 0
while True:
yield x
x = x + 1



El operador yield alcanza para crear un generador. Lo que hace es devolver el control al caller de la función generadora. Al volver a llamarse el generador, retoma la ejecución desde la línea siguiente al yield, haciendo lo que queremos y no devolviendo siempre 0, o colgarse (por el while True).

En una consola de python, podemos probarlo:


>>> a = contar()
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()
4


Lo mismo hacemos ahora, pero para generar la venerada secuencia (notar que los dos primeros están aparte pues son los casos base de la definición recursiva de la secuencia)



def fib():
i = 0
first = 0
yield first
second = 1
yield second
while True:
next = first + second
first = second
second = next
yield next



Ahora bien, todo muy lindo pero de donde vienen estas bondades como las listas por comprensión y los generadores? Bueno, las listas por comprensión al menos, fue un feature que Python "tomó prestado" de otro lenguaje... Haskell, del paradigma funcional.

Cómo hacemos esto mismo que acabamos de hacer en Python en Haskell? Empecemos por las listas por comprensión:


Main> [2^n| n[1,2,4,8,16,32,64,128,256,512,1024]


Que "leído" sería: "Los dos-a-la-N que vienen de tomar n de la lista de 0 a 10", como Haskell habla mas que nada, el lenguaje de los matemáticos, no tiene problemas similares al range(n,m) de python, que va de n a (m-1)...

Sigamos. Qué notan de raro en la línea en haskell? Un generador!, en realidad dos! Por qué?


Main> [0..10]
[0,1,2,3,4,5,6,7,8,9,10]


Genera la secuencia de 0 a 10. Mientras que n
en el contexto de la lista por comprensión, va "tomando" n's de la lista.

Algo importante para decir, es que los generadores dentro de las listas por comprensión, tanto en Python como en Haskell pueden anidarse, prueben estos códigos en Python y Haskell respectivamente:


Main> [ (x,y)| x



[(x,y) for x in range(0,6) for y in range(11,16)]


Dan lo mismo!

Una prueba de velocidad


Ya es suficiente como para que el que este leyendo esto siga investigando por su cuenta las bondades de los generadores y las listas por comprensión tanto en Python como en Haskell, al final del post hay algunos links.
Pero me quedé jugando, y probé algunas cosas... por ejemplo. Fíjense estas definiciones de funciones que hay para ir tomando los números de fibonacci en Haskell:



fibo 0 = 0
fibo 1 = 1
fibo n = fib (n-1) + fib (n-2)


fib :: Int -> Integer
fib n = fibs !! n
where
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)



fibo es la versión recursiva, LENTA que me va dando los números de la lista. Cada vez que quiere calcular el n-ésimo número, tiene que calcular los (n-1) y (n-2)-ésimos, y para calcular cada uno de estos seguir hacia atrás, por lo que el orden de este algoritmo es exponencial.
En cambio fib es una versión que hace uso de una SUPER bondad de los lenguajes funcionales que son los folds, funciones de alto orden (les recomiendo leer este último link!). Esta implementación tiene orden lineal, o sea, que la podemos poner a competir con la versión que habíamos armado para python y que la competencia sea mas justa... hagamoslo!

Los competidores:


fib :: Int -> Integer
fib n = fibs !! n
where
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)



VS.



def fib():
i = 0
first = 0
yield first
second = 1
yield second
while True:
next = first + second
first = second
second = next
yield next



Los invito a que lo prueben... En el próximo post mis resultados...

Espero que este post les haya dejado algo!

Links:
Este link es en la doc de python una comparación con Haskell.
http://www.haskell.org/haskellwiki/List_comprehension
http://www.haskell.org/haskellwiki/Fold
http://www.zvon.org/other/haskell/Outputprelude/zipWith_f.html
http://docs.python.org/tutorial/datastructures.html#list-comprehensions
http://docs.python.org/tutorial/classes.html#generators

Pablo Benjamín Arroyo: Actualizar .bashrc

Yo sabia un comando para actualizar el archivo .bashrc para empezar a usar las alias y sus comandos sin cerrar y abrir un nuevo terminal (muy util cuando estas en un host remoto y no queres volver a conectar cuando cerras el terminal)

Pero descubri otro: simplemente "bash"

Por ejemplo, queremos que el terminal nos salude cada ves que lo ejecutamos, para ello editamos el archivo .bashrc de la carpeta personal:

$ nano .bashrc



Al final agregamos:

echo "Bienvenido
-[ Usuario@PC ]-"

Guardamos y cerramos con CNTRL+O y CNTRL+X respectivamente y a continuacion actualizamos el bashrc:

$ source .bashrc
Bienvenido
-[ Usuario@PC ]-



Podemos cambiar "Usuario" y "PC" por nuestro nombre de usuario y nombre de PC...

==================




Bookmark and Share

Pablo Benjamín Arroyo: Un manual Unix

Que es unix? es un sistema operativo portable, multitarea y multiusuario.

lo crearon unos empleados de AT&T


Y que tiene de importante? es un sistema muy estable y seguro, de el salen derivados otros OS como GNU, Linux, BSD, MacOS X, Solaris, etc

Todos estos sistemas, comparten sus comandos y programas mas imporantes...

A continuacion les dejo un manual de Unix:





Bookmark and Share