news: nuevos números de spamming
Continuando con mi post anterior sobre spamming, hoy les traigo algunos números que encontré en la página http://www.net-security.org/secworld.php?id=7704. Los datos del mes de Junio, divididos por geografía, son los siguientes:

- El nivel de spam en Francia aumento un 8.6% en junio, convirtiéndolo en el país más spammeado.
- El nivel de spam en USA bajó a 78.4% y en Canada a 72.2%, pero subió en UK a 90.3%.
- En Alemania la taza de spam alanzó el 96% y el 93.9% en Holanda. En Australia disminuyó a 88.8% y a 67.1% en Japon.
- La actividad virulenta subió en Australia un 1.29%, con 1 de cada 68.8 e-mails conteniendo virus, ésto lo coloca en el top de la tabla de Junio.
- El nivel de virus para USA fue de 1 en 371.7, y 1 en 423.7 para Canada. Por su parte en Alemania el nivel de virus fue de 1 en 444.0 y 1 en 644.5 para Holanda. En Hong Kong la actividad de virus fue de 1 en 354.7 y en Japon de 1 en 235.7.

De los datos, observo que Japon es el que más safa. Será que las industrias no necesitan spammear para vender o que no les interesa spammear?
Utilidad para hackear passwords de Windows y Linux
Hace un par de meses, el colo (compañero de trabajo) me comentó sobre una herramienta extremadamente útil. Cuándo me comentaba lo que hacía mi sensación era "naaa, este me está verseando", y resultó que decía la verdad =D

La citada herramienta es Kon-Boot. Y qué tiene de especial?, bueno, que nos permite acceder a sistemas Windows y Linux sin tener que conocer ninguna contraseña, y sin tener que crackear ninguna cuenta!
Y ustedes dirán, pero qué!?, pero cómo?! sin crackear nada??? Si, aunque la solución es más simple de lo que parece. Una vez iniciado el sistema con un live-cd con la imágen de kon-boot, éste modifica el kernel del sistema operativo on-the-fly a medida que se carga, para evitar los mecanismos de autenticación.
Según la página oficial, kon-boot nos permite loguearnos en Windows como usuario administrador sin ingresar ninguna contraseña. El sistema arranca como si no hubiera autenticación para usuarios, directamente nos aparece el escritorio para comenzar a trabajar.
En sistemas linux, nos permite loguearnos como root sin tipear el password correcto, simplemente hay que escribir como nombre de usuario "kon-boot" y tendremos acceso root.
La imágen de kon-boot pesa sólo 110KB! y en la página está disponible tanto para disket como para cd.

Yo lo testié en un Windows XP corriendondo en un VirtualBox y realmente funciona como dicen en la página. También testie un trixbox (distro de linux para el que no sepa) que tengo en el VirtualBox, y también funcionó perfectamente.

Las versiones de Windows testeadas son:
Windows Server 2008 Standard SP2 (v.275)
Windows Vista Business SP0
Windows Vista Ultimate SP1
Windows Vista Ultimate SP0
Windows Server 2003 Enterprise
Windows XP
Windows XP SP1
Windows XP SP2
Windows XP SP3
Windows 7

Las versiones de Linux testeadas son:
Gentoo 2.6.24-gentoo-r5
Ubuntu 2.6.24.3-debug
Debian 2.6.18-6-6861
Fedora 2.6.25.9-76.fc9.i6862

Aunque esto no quiere decir que no funcione en otras distribuciones. Como ya mencioné, lo probé con trixbox y funcionó perfectamente.
news: Técnica anti-análisis para scripts con malware
Hoy leo en este blog, un interesante artículo sobre una nueva técnica de ofuscación para evitar los detectores de malware.
La técnica, que utiliza JavaScript, funciona de la siguiente forma:
1. Consultar la URL donde se almacena el script malicioso.
2. Recuperar su propia función y agregar el string de la URL.
3. Computar el CRC de la función con la URL agregada.
4. Desencriptar el código encriptado en el cuerpo del script usando el CRC computado como clave.
5. Ejecutar el código desencriptado usando la función eval().

De esta forma, el malware no podrá desencriptarse si la función está alterada o la URL es incorrecta. Por esto, si el analizador de malware sólo tiene un ejemplo del script, sin saber desde dónde fué descargado, éste no podrá reconocer las rutinas del malware, dado que necesita de la URL para poder desencriptarlo. Incluso, si el script se coloca en otro lugar distinto al "correcto", éste no podrá ser desencriptado.
Crear máquina virtual en CentOS usando Xen
A continuación les dejo los pasos que realicé hace algunos meses para crear una máquina virtual en un entorno Xen sobre CentOS. Existen herramientas gráficas para la creación de máquinas virtuales en Xen, pero si tienen instalado entorno gráfico, algo que no suele suceder si estamos administrando un server. Para hacerlo de forma gráfica, pueden leer éste artículo en la página de CentOS.
Si bien centos provee la herramienta virt-install para realizar el trabajo por consola, a mi no me sirvió. No logré instalar una máquina virtual utilizando dicha herramienta, y eso que lo intenté de varias formas.
Por esto, terminé recurriendo a lo básico, no utilizar ninguna herramienta más que las básicas de xen, hacer todo el resto a mano, algo que siempre da buenos resultados (si saben lo que hacen).
Igualmente no puedo asegurar nada con respecto a lo que explico a continuación, porque puede que a ustedes no les funcione. Sólo puedo decirles que a mi me funcionó perfectamente y terminé aprendiendo un montón.
Los pasos que describo son el resultado de muchas horas de búsqueda, lectura y pruebas, así que están frente a una receta que no encontré en ningún otro lugar.
En el ejemplo instalo una máquina virtual (Guest) CentOS sobre un host CentOS. Los pasos son los siguientes:

1. descargar rinse desde: http://xen-tools.org/software/rinse/releases.html.
Rinse es el equivalente a debootstrap de debian y sirve para crear la estructura de directorios básica para correr una distro basada en RPMs.

2. instalar rinse:
tar -zxvf rinse-version.tar.gz
make install
3. crear una particion para el sistema guest. En este punto hay dos opciones, usar una partición lógica o crear un archivo que sirva como imágen del sistema operativo.

3.1. para el caso de partición lógica:
lvmcreate VolGroup00 --size 2G --name virtual
donde VolGroup es el nombre del grupo de volúmenes lógicos donde crearemos la partición y 2G indica que la partición tendrá 2GB de tamaño. La partición lógica se llamará virtual (en un acto de inspiración total).
Luego formateamos esta partición con el sistema de archivos que deseamos. Para el ejemplo, utilizo ext3:
mkfs.ext3 /dev/VolGroup00/virtual
3.2. en el caso de utilizar un archivo, creamos la imagen con dd:
dd if=/dev/zero of=/media/virtual.img bs=1M seek=2047 count=1
y la formateamos con el sistema de archivos q queramos. Para el ejemplo, uso ext3:
mkfs.ext3 /media/virtual.img
4. crear una partición para swap. Otra vez, podemos elegir utilizar volumenes lógicos o una imágen en un archivo. Acosejo que sean coherentes con lo que hicieron antes, y elijan lo mismo para la swap.

4.1. Creamos el volúmen lógico de 256MB y lo formateamos para q sea swap:
lvmcreate VolGroup00 --size 256M --name swap
mkswap /dev/VolGroup00/swap
4.2. Creamos un archivo con la imágen swap
dd if=/dev/zero of=/media/virtual.swap bs=1M seek=256 count=1
mkswap /media/virtual.swap
5. Montar la partición root en algún directorio.

5.1. mount /dev/VolGroup00/virtual /mnt/virtual_base

5.2. mount -o loop /media/virtual.img /mnt/virtual_base

6. ejecutar rinse con destino el directorio que servirá como raíz del nuevo árbol de directorios y le indicamos la distribucion que vamos a instalar (opcionalmente también se puede incluir la arquitectura):
rinse --distribution centos-5 --directory /mnt/virtual_base --arch i386
Nota: si tira algún error, puede ser que les falte la librería perl-libwww-perl. Instalarla con:
yum install perl-libwww-perl
7. montar el directorio proc (comunicación con el kernel) en el árbol de directorios recién creado:
mount -t proc none /mnt/virtual_base/proc
8. hacer chroot al sistema de directorios de la máquina virtual creada:
chroot /mnt/virtual_base
9. Una vez en el árbol de directorios de la máquina guest, instalar todas los programas que deseamos, pero acuerdense de instalar el kernel xen:
yum install kernel-xen
10. modificar el /etc/fstab con "nano /etc/fstab" y dejarlo de la siguiente forma:
/dev/sda1 / ext3 defaults 1 1
/dev/sda2 none swap sw 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
none /sys sysfs defaults 0 0
11. crear un nuevo init:
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk initrd.img $(uname -r)
con esto evitamos el error:
mount: could not find filesystem '/dev/root'
switchroot: mount failed: No such file or directory
12. editar el archivo /etc/inittab y agregar una consola porque sino Xen no mostrará el promt de login. Tambien se pueden comentar las ttys dado que no serán de utilidad en la consola xen. Las primeras líneas del inittab deberían quedar similares a las siguientes:
# add a console for xen
co:2345:respawn:/sbin/mingetty console
# comment out the default TTYs
#1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
13. deshabilitar TLS porque alenta la máquina virtual:
# para 32 bit :
mv /lib/tls /lib/tls.disabled
# para 64 bit :
mv /lib64/tls /lib64/tls.disabled
14. deshabilitar el reloj del hardware dado que el sistema guest utilizará el reloj del sistema host. Reemplazamos el hwclock con un script vacío:
echo exit 0 > /sbin/hwclock
15. darle un password a root:
pwconv
passwd root
16. salir del chroot con exit.

17. copiar el kernel recien instalado en otro lado, como por ejemplo a /root
cp /mnt/virtual_base/boot/initrd* /root/initrd.img
cp /mnt/virtual_base/boot/vmlinuz* /root/vmlinuz
18. desmontar todo:
umount /mnt/virtual_base/proc
umount /mnt/virtual_base
19. crear el archivo con la configuración de la máquina virtual para que Xen la pueda crear. El archivo puede estar en cualquier lugar, pero lo crearemos dentro de /etc/xen porque es el primer lugar donde busca Xen al crear una VM. El archivo lo llamaremos "virtual".

19.1. en el caso que utilizaran volúmenes lógicos, el archivo debería contener lo siguiente:
kernel = "/root/vmlinuz"
ramdisk = "/root/initrd.img"
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:VolGroup00/virtual,sda1,w', 'phy:VolGroup00/swap,sda2,w']
root = “/dev/sda1 ro”
19.2. en caso de haber utilizado archivos como imágenes, debería contener lo siguiente:
kernel = “/root/vmlinuz″
ramdisk = “/root/initrd.img″
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:/media/virtual.img,sda1,w', 'phy:/media/virtual.swap,sda2,w']
root = “/dev/sda1 ro”
En vif pueden colocar la mac para la placa de red, y con dhcp le indicamos que obtenga la ip por dhcp. En memory le dimos 255MB y en disk le indicamos cuáles serán las particiones visibles dentro del guest.

20. crear finalmente una instancia de la máquina virtual configurada (la cual llamamos "virtual"). Una vez creada, el promt quedará dentro de la máquina virtual.
xm create virtual -c
Para salir de la máquina virtual, tipeamos Ctrl+J. Si no utilizamos el parámetro "-c", la máquina se creará en background y no veremos el promt. Para meternos en la máquina virtual, hace falta utilziar el comando:
xm console virtual
Para apagar la máquina virtual, ejecutar (desde la máquina host):
xm shutdown virtual
Otros comandos útiles son: "xm destroy " para destruir sin apagar (como si le dieramos al botón del case). "xm list" para listar las máquinas virtuales que se están ejecutando. "xm help" para listar los comandos disponibles.

21. una vez en la máquina virtual, deshabilitar HAL dado que no funcionará:
/sbin/chkconfig haldaemon off
22. si instalamos el servidor ssh y sshd falla al intentar crear la clave, es porque no existe el dispositivo /dev/urandom. Para solucionarlo, ejecutamos:
/sbin/MAKEDEV generic
/etc/init.d/sshd start

Algunas referencias:
http://segvfault.wordpress.com/2008/11/06/xen-centos-5-debian-etch-como-guest/
http://forum.slicehost.com/comments.php?DiscussionID=690
http://blog.jphoude.qc.ca/2007/10/26/centos-5-xen-images-part-1/
http://www.virtuatopia.com/index.php/Building_a_Xen_Virtual_Guest_Filesystem_using_Logical_Volume_Management_(LVM)
http://www.howtoforge.com/perfect_setup_xen3_debian
http://www.howtoforge.org/using-xen-with-lvm-based-vms-instead-of-image-based-vms-debian-etch
http://wiki.xensource.com/xenwiki/
Reducir lista de tags en Blogger
Hace varios días vengo pensando en que el widget que lista los tags es poco configurable, dado que uno sólo lo agrega y no puede setear ningún parámetro. Un parámetro que me resulta importante es poder decir cuales tags debería mostrar a partir de la cantidad de referencias que tenga, porque el listado se va extendiendo cada vez más y más, haciendo molesta la navegación sobre el resto de los widgets. Además la mayoría de los tags tienen una o dos referencias, así que no es tan importante listarlos.
Por eso, me puse a buscar en el código del widget para poder cambiar esto, y porque tal vez alguien más esté pasando por lo mismo, les publico la solución.
La solución (lejos de ser óptima) es la siguiente:
- ir a la pantalla de "Diseño" y elegir "Edición de HTML"
- para ver el código de los widget, selecionen el checkbox "Expandir plantillas de artilugios" (beugh q feo suena artilugios...).
- busquen el id del widget que lista los tags en el código. Para saber cuál es el id del widget, en la página de su blog, utilicen la herramienta para ver el código fuente del firefox o el IE, o el browser q tengan, y busquenlo ahí. Es mucho más fácil encontrarlo si utilizan firefox + firebug (add-on para firefox).
Otra forma es buscar dentro de la pantalla de edición HTML de blogger el código "data:labels", con eso también encuentran el código del widget.
- el código de los tags debe verse similar a este:

<b:widget id='Label1' locked='false' title='Tags' type='Label'>
<b:includable id='main'>
  <b:if cond='data:title'>
    <h2><data:title/></h2>
  </b:if>
  <div class='widget-content'>
    <ul>
    <b:loop values='data:labels' var='label'>
          <li>
           <b:if cond='data:blog.url == data:label.url'>
             <span expr:dir='data:blog.languageDirection'><data:label.name/></span>
           <b:else/>
             <a expr:dir='data:blog.languageDirection' expr:href='data:label.url'><data:label.name/></a>
           </b:if>
           <span dir='ltr'>(<data:label.count/>)</span>
         </li>
    </b:loop>
    </ul>
    <b:include name='quickedit'/>
  </div>
</b:includable>
</b:widget>

- en ese código, haremos una modificación extremadamente simple. Agregaremos una condición if para que en la lista aparezcan sólo aquellos tags que se referencian más de 2 veces (ustedes elijan el valor que quieran). Las sentencias a agregar son <b:if cond="'data:label.count"> y </b:if>, donde > 2 significa que el contador deba ser mayor a dos (repito, pongan el valor que gusten).
El código con las sentencias agregadas debería quedarles similar a esto (encontrarán un comentario al lado de las sentencias agregadas):

<b:widget id='Label1' locked='false' title='Tags' type='Label'>
<b:includable id='main'>
  <b:if cond='data:title'>
    <h2><data:title/></h2>
  </b:if>
  <div class='widget-content'>
    <ul>
    <b:loop values='data:labels' var='label'>
       <b:if cond='data:label.count > 2'>
          <li>
           <b:if cond='data:blog.url == data:label.url'>
             <span expr:dir='data:blog.languageDirection'><data:label.name/></span>
           <b:else/>
             <a expr:dir='data:blog.languageDirection' expr:href='data:label.url'><data:label.name/></a>
           </b:if>
           <span dir='ltr'>(<data:label.count/>)</span>
         </li>
      </b:if>
    </b:loop>
    </ul>
    <b:include name='quickedit'/>
  </div>
</b:includable>
</b:widget>

- guardar y ver los resultados!

Si les interesa conocer un poco más sobre cómo funciona el diseño de widgets y de blogger en general, visiten la página de ayuda de blogger.

Este post va dedicado a Javi, ya que quería hacer algo similar y como yo tengo un poco más de tiempo libre, lo terminé haciendo antes. Además es una forma de agradecerle por haberme prestado la imagen que estoy utilizando en el header del blog, la cual creo que quedó excelente.
Top Supercomputadoras
Como es ya costumbre en junio, TOP500 publicó la 33er edición de su lista con las supercomputadoras más polentosas del mundo.
Es interesante ver que existen semejantes máquinas, con sus altísimos poderes de procesamiento, y con sus altísimos gastos en refrigeración y cuentas de energía eléctrica...
La lista está armada según el poder de procesamiento en FLOPS (Operaciones de punto flotante por segundo) de cada una.
En esta edición la ganadora fue la Roadruner de IBM, ubicada en USA, que cuenta con módicos 129600 núcleos y tira unos 1,105 petaFLOPs/s (cuatrillones de flops por segundo). Le siguió de MUY cerca Cray XT5 Jaguar (también ubicada en USA) de Cray inc. con 150152 núcleos y 1,059 petaFLOPs/s. Y en tercero quedó un nuevo contrincante, la JUGENE - Blue Gene/P también de IBM, pero ubicada en Alemania, que cuenta con 294912 núcleos (faaa) y que tira 825,5 teraFLOPs/s.
La Roadruner gana no sólo en en potencia, sino en eficiencia de consumo de energía. Además cuenta con menos núcleos que las otras dos.
Para que tengan un punto de referencia (tanto hablar de petaflops, uno pierde la noción), según wiki el Intel Core i7 965 XE puede dar unos 70 gigaFLOPs/s, donde: 1 petaFLOP = 10e3 teraFLOPs = 10e6 gigaFLOPs.
Increíblemente (según wiki) la AMD ATI Radeon HD 4870X2 logra 2,4 teraFLOPs!, pero en precisión simple, porque en precisión doble escalan muchísimo menos (osea, un engaño pichanga).
La tabla con las primeras 10 posiciones es la siguiente:
(inicio noticia interesante para argentinos)
Para el que se pregunte, y por casa cómo andamos? Bueno, lamento desilusionarlos (bahh a esta altura...), pero después de una googleada (no muy profunda) encontré que la computación más intensa la realiza "Hope", un cluster Beowulf con 46 procesadores de 64bits. Desgraciadamente en ninguno de los lugares que leí dicen cuantos GFLOPs puede dar.
Pueden leer más sobre este proyecto en http://www.caletao.com.ar/artdoc/05/supercompu.htm y http://www.universia.com.ar/portada/actualidad/noticia_actualidad.jsp?noticia=16315.
(fin noticia interesante para argentinos)

Para cerrar, y cómo fanático de Linux no podía faltar, les dejo un chart con la estadística de los sistemas operativos usados en estos monstruos. Como podrán ver, Linux se come el mercado, abarcando el 88.69% de las computadoras. Es algo lógico, conociendo las prestaciones, estabilidad y flexibilidad (entre otras cosas) que provee este sistema.
Si les interesa ver más estadísticas, como la tabla completa de supercomputadoras, visiten http://top500.org/list/2009/06/100
Internet con ZyXEL P-600 series en Linux

A continuación les dejo otro de los tantos posts que he escrito para www.linuxespanol.com. Esta vez sobre cómo acceder a internet usando el modem Zyxel P-600 series, el cual las compañías telefónicas entregan configurado para que el usuario utilice un cliente en el sistema operativo que se autentique ante el servidor antes de acceder a internet.
Mi solución es configurar el modem como router y olvidarme de ejecutar el cliente que se autentique, de esta forma es todo más fácil y puedo usar internet en cualquier máquina sin tener q configurar conexiones.
A continuación, el post original:

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

El Zyxel es un modem ethernet asi que la instalación en linux es muy sencilla. En realidad no hay que instalar nada, solo hay que configurar al modem para que funcione como router y configurar la placa de red de la maquina con un ip y una puerta de enlace.

Para configurar el zyxel como router deberemos realizar los siguientes pasos:
1. Abrir una conexión telnet con el modem, cuya ip es 192.168.1.1
$telnet 192.168.1.1
Este nos pedirá un pasword, el cual por defecto es o 1234 o atc456
2. Elegir de entre las opciones la número 11 (Remote Node Setup).
3. Dentro de este menú vemos varias conexiones, de entre las cuales esta activa la 2 (atmpvc0). Deberemos cambiar esto. Para hacerlo, seleccionamos la opción 2, le damos enter y entramos a las propiedades de esta conexion. Allí deberemos cambiar la opción Active=yes a Active=no (para cambiar se utiliza la barra espaciadora). Una vez hecho esto, vamos al final y le damos enter para guardar los cambios.
Una vez hecho esto, deberemos entrar ahora a la conexión 1 (atmpvc3 (ISP,SUA)).
Una vez alli hay que hacer varios cambios.
3.1 Setear la conexion a activa, esto es, poner Active=yes.
3.2 Setear Encapsulation = PPPoE
3.3 Setear Multiplexin = LLC-llcbaced
3.4 Modificar el Outgoing con MyLogin = NombreDeLoginDelProveedor, y MyPassword = PassDelProveedor.
3.5 Ahora a editar las opciones ATM, esto es, seteamos ATM options = yes
3.5.1 Dentro de las opciones de ATM colocamos los siguientes valores: VPI = 8 y VCI = 35
3.5.2 guardamos y salimos
4. Guardamos todos los cambios y salimos. Para salir del telnet, elegimos la opción 99.

Bien ahora hay que configurar la placa de red para que todo funcione bien. La configuración de la placa se puede hacer con algun entorno gráfico, pero voy a explicar usando ifconfig y route debido a que estos comandos están en todas las distribuciones.
Nuestra placa de red deberá tener una ip entre 192.168.1.2 y 192.168.1.254, asi deberemos hacer lo siguiente (suponiendo que nuestra placa de red es la eth0):

#ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.0
Si la interfaz estaba configurada, primero le damos de baja y después la volvemos a dar de alta:

#ifconfig eth0 down
#ifconfig eth0 up
Ahora hay que setear la puerta de enlace, lo que hacemos con el comando route. route sirve para el ruteo de los paquetes. Si tipean solamente route verán los ruteos actuales. Para agregar el que necesitamos deberemos hacer:
route add default gw 192.168.1.1

Ahora hay que configurar los servidores DNS. Esta es la parte mas facil. Hay que editar el archivo /etc/resolv.conf o bien crearlo si este no existe. Dentro de este archivo deberemos colocar los dns que nos da el proveedor de internet.
En el caso de speedy de Argentina los dns son 200.51.211.7 y 200.51.212.7. Para estos dns la configuracion del archivo es:

nameserver 200.51.211.7
nameserver 200.51.212.7

Bien, eso es todo lo necesario para que podamos navegar. Pero el problema es que si no ponemos todo en un script de arranque deberemos configurar la red a cada rato, esto es, poner la ip y la puerta de enlace.
Una solucion es poner los comandos:

ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.0
route add default gw 192.168.1.1
en un script y colocarlo al arranque del sistema.
Otra opcion aplicable a los sistemas basados en debian es editar el archivo /etc/network/interfaces. En este archivo estan las configuraciones de todas las placas que tengamos en la maquina. Lo mas comun es que tengamos solo la entrada:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback interface
iface lo inet loopback

Que es para la interface loopback.
Ahora podemos agregar nuestra configuración debajo. Para esto, deberemos agregar las siguientes lineas:

iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0

gateway 192.168.1.1

Guardamos los cambios y ya esta, no hay q hacer mas nada, cada vez que encendamos la maquina, tendremos conexión a internet. En otras distribuciones se pueden modificar otros archivos para lograr el mismo objetivo, pero como solo trabajo con debian se los quedo debiendo =/

Espero que todo salga bien, mucha suerte =)

news: SORBS se cierra
SORBS, uno de los DNSBL más importantes en internet, anunció que deberá dejar de prestar el servicio debido a que University of Queensland decidió terminar el contrato de hosting sin cumplir con lo acordado.
Dado que ahora SORBS no tiene hosting que lo hospede, no puede continuar a menos que consiga otro lugar desde donde funcionar, por lo que Michelle Sullivan ahora pone a la venta el servicio para que otro pueda seguir brindándolo.
SORBS actualmente recibe 30 billones de consultas DNS por día, por lo que el que lo compre deberá contar con una buena infraestructura. Esto muestra lo utilizado que es el servicio.

Para el que no tenga idea de qué es un DNSBL puede leer mi anterior post: SPAM
Uso de memoria: Firefox vs Chrome vs Safari vs Opera
Hace un par de días leí un estudio realizado en http://dotnetperls.com/chrome-memory donde examinan el uso de memoria por parte de los browsers más populares.
El benchmark comparó las versiones Firefox 3.5 RC, Google Chrome 3.0, Safari 4.0 y Opera 10b corriendo en Windows Vista Home Premium de 32bits con 4GB de RAM. No se examinó IE 8.0 porque el autor no encontró la forma de realizar el experimento con ese browser (ya saben, si es MS, es poco flexible).
La prueba consistió en abrir 150 de los sitios más populares según el listado http://s3.amazonaws.com/alexa-static/top-1m.csv.zip, en tabs separados. El formato para abrir los sitios fue, abrir 30 sitios en pestañas separadas, pedirle al autor que cierre 29 (osea dejando un tab abierto), y repetir el proceso. Para el proceso se utilizó un programa escrito en C# que envía los comandos al browser para que abra las pestañas, utilizando intervalos entre apertura y apertura.
El benchmark me pareció correcto para simular la utilización de un browser y medir el uso de memoria. El código se puede descargar en la misma página donde están los resultados.

El gran ganador? Firefox 3.5 RC, que demostró el menor consumo de memoria tanto en los intervalos de cierre como en los picos con todas las pestañas abiertas. El más irregular fue Chrome 3.0 con marcadas diferencias cuando hay pocas pestañas abiertas y cuando están todas abiertas, consumiendo en los picos 4 veces más que Firefox (1216.16 MB de Chrome contra los 327.65MB de Firefox). La estructura de procesos hace notar la diferencia frente a los threads usados en Firefox.
Por otra parte, Opera y Safari se mantuvieron bastante regulares con ligeras variaciones entre pocas y muchas pestañas, aunque en todos los casos perdieron contra Firefox.
Nuevo uso para las tarjetas gráficas de la mano de CUDA
Hoy pude dedicarme a leer la tesis de un par de compañeros de la universidad la cual trata de CUDA (Compute Unified Device Architecture - Arquitectura de cómputo paralelo de propósito general). Esta nueva forma de ver a las placas de video como arquitecturas de procesamiento paralelo para cualquier aplicación (no sólo las gráficas) me llamó mucho la atención y me parece una excelente idea para aprovechar semejante poder de cómputo para algo que no sea exclusivamente el ocio =P

En éste artículo haré un resumen de lo presentado por estos muchachos en su tesis, la cual denominaron "COMPUTACIÓN DE PROPÓSITO GENERAL SOBRE GPUS UTILIZANDO CUDA", con mi visión sobre esta tecnología.

Para el que no tenga idea (yo no tenía mucha antes de leer la tesis), CUDA es parte de la evolución de las placas de video desde una arquitectura de pipeline de funciones fijas (Entrada del pipeline, Transformaciones del modelo, Iluminación, Simulación de cámara, Rasterización, Texturizado y Superficies ocultas) dedicada exclusivamente al procesamiento de píxels y vértices a una nueva era de GPUs (Graphics Processing Unit) de Propósito General (GPGPU) que permiten la ejecución de cualquier aplicación que pueda ser paralelizada.
Esta evolución no fue pensando directamente en aplicaciones de propósito general, sino que ésta arquitectura permite una significativa mejora en el balance de carga, aprovechándose mejor la potencia de los GPUs. Además provee una mayor flexibilidad para el desarrollador en conjunto con la reducción en la dificultad de programación para el desarrollador, dado que ahora se cuenta con un solo set de instrucciones mientras que antes se necesitaban dos sets, uno para procesar píxeles y otro para procesar vértices (en síntesis, un dolor de huevos).
Las GPUs que fueron diseñadas para realizar grandes cantidades de cómputo, contienen múltiples procesadores que aprovechan la naturaleza paralela de las aplicaciones gráficas, y por lo tanto, gracias a CUDA, se pueden adaptar para realizar cualquier tarea que tome ventaja de la paralelización para lograr mayores velocidades de cómputo.

CUDA, la cual es desarrollada por NVIDIA, no es la única en su campo dado que ATI lanzo al poco tiempo su Stream Computing, el cual ahora se llama AMD FireStream, pero aunque no llega a ser igual de famosa, no deja de ser prometedora.

La arquitectura de CUDA se basa en un arreglo escalable de Streaming Multiprocessors (SMs) multihilados (la paralelización se logra creando hilos, no procesos, debido a que estos presentan menor costo en los cambios de contexto y accesos a memoria). Cada SM es capaz de manejar 768 contextos de hilos activos simultáneamente. Un multiprocesor consiste de ocho núcleos Scalar Processor (SP), dos unidades de funciones especiales básicas, una unidad de instrucción multihilada, y una memoria compartida on-chip. Dos o tres SMs se agrupan en Texture Processor Clusters (TPCs).
Las mayores ventajas de utilizar GPUs en lugar de CPUs se deben a la relación costo por GFlop, dado que las GPUs superan con creces la cantidad de GFlops que puede entregar una CPU. Pero la diferencia está marcada en las tareas para las cuales fueron diseñadas cada una. Los GPUs fueron pensados para operaciones con alto nivel de procesamiento y paralelismo, con baja cantidad de accesos a memoria. Por otro lado las CPUs se dedican al procesamiento secuencial y optimizan al máximo los accesos a memoria.

Si bien todo suena hermoso para las GPUs, uno tranquilamente podría pensar "por qué no reemplazamos los CPUs por GPUs?". El problema está en que sólo un rango limitado de aplicaciones es altamente paralelizable y pueden aprovechar las facilidades de las GPUs, el resto es muy dependiente de los accesos a memoria y dependen de los datos que se van generando secuencialmente en las distintas instrucciones. Por otro lado, la programación de programas paralelos no es sencilla. Hacer programas que aprovechen la ejecución paralela es bastante complejo, requiere de un buen análisis de los problemas, de la partición de los datos, son más complicados de depurar y mantener, y, aunque intenten lo contrario, son muy dependientes de la arquitectura sobre la que se ejecutan. Un programa que se abstrae de la arquitectura subyacente no logra aprovechar el verdadero poder de cómputo, e incluso puede llegar a generar peores tiempos de ejecución que un programa secuencial.

A pesar de las contraindicaciones, hay casos particulares donde la ejecución paralela es excelentemente aprovechada y es ahí donde las GPUs toman realmente ventaja con respecto a sus "primas", las CPUs. Claros ejemplos son las clásicas multiplicación de matrices, el algoritmo gravitacional N-body, simulaciones de clima y cracking por fuerza bruta >=)
En los resultados de la tesis, los problemas altamente paralelizables logran unos speedups increíbles. Realmente vale la pena esta tecnología si la aplicamos correctamente.

CUDA provee un modelo de programación que utiliza librerías de funciones escritas en C. Las librerías proveen un conjunto de funciones que facilitan la creación de los hilos (definidos en conjunto a través de las funciones denominadas kernels), herramienta de sincronización mediante barreras y facilidades para acceder a las distintas memorias (local del hilo, compartida con otros hilos, espacios constantes, de texturas y la memoria global). Los programas se pueden ejecutar parte en el CPU y el resto en el GPU.

Por lo que pude observar, la programación lleva su tiempo de aprendizaje debido a los conceptos nuevos, las herramientas a utilizar y la mezcla que se puede hacer entre lo que se ejecuta en la CPU y lo que va a la GPU. Igualmente no parece excesivamente complejo y es cuestión de acostumbrarse.

Por suerte el Driver, Toolkit, SDK y debugger de CUDA están disponibles tanto para Windows, como para Linux y Mac, algo que es de agradecer, ya que abren la posibilidad de aprovechar la arquitectura sin importar la elección del sistema operativo. Todo se puede descargar desde http://www.nvidia.com/object/cuda_get.html

Para saber qué placas cuentan con la arquitectura CUDA, pueden visitar http://www.nvidia.com/object/cuda_learn_products.html

Desde éste humilde espacio les mando mis felicitaciones a los creadores de la tesis por su gran trabajo, la verdad que me encantó.
shortcuts: 40 atajos en Linux
Esta vez les traigo algo que acabo de leer en http://120linux.com/40-combinaciones-teclas-ubuntu/, donde el autor se encargó de recopilar 40 de los atajos que utiliza en Ubuntu, aunque sirven para cualquier distribución que utilice gnome e incluso la mayoría se aplica para otros escritorios como kde.
A continuación, los atajos:

1) Ctrl+A = Seleccionar todo (En Documentos, Firefox, Nautilus, etc, no funciona en Terminal)

2) Ctrl+C = Copiar (En Documentos, Firefox, Nautilus, etc, no funciona en Terminal)

3) Ctrl+V = Pegar (En Documentos, Firefox, Nautilus, etc, no funciona en Terminal)

4) Ctrl+N = Nuevo (Crea un documento nuevo, no funciona en Terminal)

5) Ctrl+O = Abrir (Abrir un documento, no funciona en Terminal)

6) Ctrl+S = Guardar (Guardar el documento actual, no funciona en Terminal)

7) Ctrl+P = Imprimir (Imprime el documento actual, not in terminal)

8 ) Ctrl+E = Enviar a… (Envía el documento actual por email, not in terminal)

9) Ctrl+W = Cerrar (Cierra el documento actual, not in terminal)

10) Ctrl+Q = Cerrar ventana (Cierra la aplicación actual, not in terminal)

11) Ctrl + Alt + F1 = Cambia a la primera terminal de consola.

12) Ctrl + Alt + F2(F3)(F4)(F5)(F6) = Selecciona diferentes terminales de consola.

13) Ctrl + Alt + F7 = Volver a la sesión gráfica.

14) Ctrl+Alt++ = Cambia a la siguiente resolución de pantalla (Depende de tu configuración X).

15) Ctrl+Alt+- = Cambia a la anterior resolución X (Depende de tu configuración X).

16) Ctrl + Alt + Backspace = Reiniciar servidor X (por defecto, deshabilitado en Ubuntu 9.04).

17) Alt+Tab = Cambiar entre los programas abiertos.

18 ) Alt+ F1 = Abrir menú de aplicaciones.

19 ) Ctrl+Alt+tab = Navegar entre los programas abiertos.

20 ) ImprPant = Capturar pantalla

21) Ctrl+C = (usado en el terminal) Terminar proceso actual

22) Ctrl + F10 = Menú contextual (botón derecho).

23) Ctrl+Z = (usado en terminal) Enviar proceso al “background.

24) Ctrl+D = Fin de sesión.

25) Ctrl+A = (Usado en terminal) Volver al inicio de la linea.

26) F2 = Renombrar.

27) Ctrl+E = (Usado en terminal) Ir al final de la linea.

28) Ctrl+H = Mostrar/Ocultar archivos ocultos.

29) Ctrl+U = (Usado en terminal) Borrar linea actual.

30) Alt +F4 = Cerrar ventana.

31) Ctrl + Alt + L = Bloquear pantalla.

32) Ctrl+W = (Usado en terminal) Borrar palabra anterior al cursor.

33) Flechas Arriba y Abajo = (Usado en terminal) Buscar entre el historico de comandos.

34) Ctrl+R = (Usado en terminal) Busca entre el historial comandos que comienzan por las letras que pulses.

35) Alt + F2 = Abre menú de ejecución.

36) Alt + F5 = Restaurar ventana maximizada.

37) Ctrl+T= Abrir nueva pestaña.

38) Ctrl+L = Limpia ventana del terminal.

39) Shift+insert = (Usado en terminal) Pegar

40) Click en la rueda del ratón = Pegar texto seleccionado.

Behind the Scenes: IRC
Alguna vez se preguntaron cómo funcionan los protocolos que usamos tan fácilmente a través de lindas interfaces gráficas? Qué es lo que sucede detrás?
Para el que sea tan curioso como yo, a medida q pueda, iré agregando distintas sesiones de protocolos.
En ésta entrega, qué sucede detrás de una conexión con un servidor de IRC (Internet Relay Chat)?
La sesión es simple, me conecto al server irc.freenode.org al puerto 6667 (uno de los clásicos de servers IRC, algunos otros son 6668, 6669 y 7000). Una vez conectado, le digo al server cuál será mi nick y doy un poco de detalles sobre mi usuario . Yo sólo declaré el nombre de usuario, a lo demas le puse la, la y la =D
Luego de esto, el server nos da la bienvenida más alguna información interesante como cantidad de usuarios conectados, cantidad de servers, etc, y ya podemos empezar a chatear.
A continuación me uno al canal de debian con JOIN #debian, y veo el topic más algunas notificaciones del canal más la lista larga de nicks que están en el canal, luego se pueden visualizar algunos mensajes escritos al canal de la forma PRIVMSG #debian :mensaje.
Cansado de mirar algunos mensajes en debian, dejo el canal con PART #debian y ahora me uno a #ubuntu.
Para terminar ejecuto un QUIT, lo cual notifica no solo al server al q estoy conectado, sino a todos los servers q están en la maraña de conexiones del IRC.
Si les interesa el IRC, pueden leer los RFC 1459, 2810 y 2811. A partir de ellos y de sniffear un poco el funcionamiento del mIRC, pude armar un cliente IRC propio =)
demasiadovivo@dvpem:~$ nc irc.freenode.org 6667
NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** No identd (auth) response
NOTICE AUTH :*** Couldn't look up your hostname
NICK demasiadovivo
User dvpem la la la
:bartol.freenode.net 001 demasiadovivo :Welcome to the freenode IRC Network demasiadovivo
:bartol.freenode.net 002 demasiadovivo :Your host is bartol.freenode.net[bartol.freenode.net/6667], running version hyperion-1.0.2b
NOTICE demasiadovivo :*** Your host is bartol.freenode.net[bartol.freenode.net/6667], running version hyperion-1.0.2b
:bartol.freenode.net 003 demasiadovivo :This server was created Thu Feb 5 20:00:04 UTC 2009
:bartol.freenode.net 004 demasiadovivo bartol.freenode.net hyperion-1.0.2b aAbBcCdDeEfFGhHiIjkKlLmMnNopPQrRsStTuUvVwWxXyYzZ01234569*@ bcdefFhiIklmnoPqstv
:bartol.freenode.net 005 demasiadovivo IRCD=dancer CAPAB CHANTYPES=# EXCEPTS INVEX CHANMODES=bdeIq,k,lfJD,cgijLmnPQrRstz CHANLIMIT=#:20 PREFIX=(ov)@+ MAXLIST=bdeI:50 MODES=4 STATUSMSG=@ KNOCK NICKLEN=16 :are supported by this server
:bartol.freenode.net 005 demasiadovivo SAFELIST CASEMAPPING=ascii CHANNELLEN=30 TOPICLEN=450 KICKLEN=450 KEYLEN=23 USERLEN=10 HOSTLEN=63 SILENCE=50 :are supported by this server
:bartol.freenode.net 251 demasiadovivo :There are 23686 listed and 22389 unlisted users on 39 servers
:bartol.freenode.net 252 demasiadovivo 41 :flagged staff members
:bartol.freenode.net 253 demasiadovivo 88 :unknown connection(s)
:bartol.freenode.net 254 demasiadovivo 23354 :channels formed
:bartol.freenode.net 255 demasiadovivo :I have 2509 clients and 0 servers
:bartol.freenode.net 265 demasiadovivo :Current local users: 2509 Max: 5306
:bartol.freenode.net 266 demasiadovivo :Current global users: 46075 Max: 57546
:bartol.freenode.net 250 demasiadovivo :Highest connection count: 5307 (5306 clients) (918096 since server was (re)started)
:bartol.freenode.net 375 demasiadovivo :- bartol.freenode.net Message of the Day -
:bartol.freenode.net 372 demasiadovivo :- Welcome to bartol.freenode.net in Luxembourg, LU, EU.
:bartol.freenode.net 372 demasiadovivo :- Thanks to Jan Prunk for sponsoring this server!
:bartol.freenode.net 372 demasiadovivo :-
:bartol.freenode.net 372 demasiadovivo :- BARTOL, VLADIMIR [1903-1967]. Born in Trieste, Austria-
:bartol.freenode.net 372 demasiadovivo :- Hungary. He is the author of, among others, the novel
...
algunos mensajes más del server
....
:bartol.freenode.net 372 demasiadovivo :-
:bartol.freenode.net 376 demasiadovivo :End of /MOTD command.
:freenode-connect!freenode@freenode/bot/connect PRIVMSG demasiadovivo :VERSION
JOIN #debian
:demasiadovivo!n=dvpem@190.176.252.79 JOIN :#debian
:bartol.freenode.net 332 demasiadovivo #debian :lenny (debian 5.0.1) released!: /msg dpkg lennyr1 | /msg dpkg etch->lenny | 4.0r8 released /msg dpkg etch | NO FLOOD: /msg dpkg pastebin | /msg bots NOT people | offtopic: #debian-offtopic | channel logs: http://purl.rikers.org/%23debian
:bartol.freenode.net 333 demasiadovivo #debian stew 1239556704
....
lista larga de nicknames
....
:bartol.freenode.net 353 demasiadovivo = #debian :@debhelper alturiak cdngfrog mrec Locke0
:bartol.freenode.net 366 demasiadovivo #debian :End of /NAMES list.
:ChanServ!ChanServ@services. NOTICE demasiadovivo :[#debian] Welcome to #Debian. This is a discussion channel; if you have a question about Debian GNU/Linux, ask and we will try our best to answer it. Newcomers should read the channel's guidelines by typing "/msg dpkg guidelines". Please do not paste in the channel; use #flood instead. Thank you.
:bartol.freenode.net 328 demasiadovivo #debian :http://www.debian.org
:masterkernel!n=masterke@user-0c9980q.cable.mindspring.com PRIVMSG #debian :digitalfox: have you greped in the ./debian folder?
:adb!n=hic@orb-rem-catv-c100-p100.vtx.ch PRIVMSG #debian :!w32codecs
:dpkg!n=dpkg@unaffiliated/dpkg PRIVMSG #debian :w32codecs is probably a package that is not distributed by Debian due to legal issues. The package provides codecs for several multimedia formats, such as AVI, Realmedia, and Windows Media. To get w32codecs, ask me about . If you are looking for similar plugins for gstreamer, then look at the gstreamer0.10-plugins-ugly and gstreamer0.10-ffmpeg-full packages.
:bartol.freenode.net 477 demasiadovivo #debian :[freenode-info] help freenode weed out clonebots, please register your IRC nick and auto-identify: http://freenode.net/faq.shtml#nicksetup
:masterkernel!n=masterke@user-0c9980q.cable.mindspring.com PRIVMSG #debian :ls
:masterkernel!n=masterke@user-0c9980q.cable.mindspring.com PRIVMSG #debian :sry wrong box :)
:solid_li`!n=solid_li@unaffiliated/solidliq JOIN :#debian
:solid_liq!n=solid_li@unaffiliated/solidliq QUIT :Nick collision from services.
:solid_li`!n=solid_li@unaffiliated/solidliq NICK :solid_liq
:tossi-!n=tossi-@ip70-185-255-125.ok.ok.cox.net JOIN :#debian
:octoserver!n=octoserv@97.89.120.212 PRIVMSG #debian :can xine even play xvid?
HIU:vlt!n=dm@suez.activ-job.com JOIN :#debian
:tossi-!n=tossi-@ip70-185-255-125.ok.ok.cox.net PART #debian :
PART #debian
:demasiadovivo!n=dvpem@190.176.252.79 PART #debian :
JOIN #ubuntu
:demasiadovivo!n=dvpem@190.176.252.79 JOIN :#ubuntu
:bartol.freenode.net 332 demasiadovivo #ubuntu :Official Ubuntu Support Channel | Channel Guidelines: https://wiki.ubuntu.com/IrcGuidelines | FAQ: https://wiki.ubuntu.com/FAQ | Support options: http://www.ubuntu.com/support | IRC info: https://wiki.ubuntu.com/IRC | Pastes to http://paste.ubuntu.com | Install Ubuntu: http://www.ubuntu.com/getubuntu/download | Jaunty 9.04 Released | http://www.ubuntu.com/getubuntu/releasenotes/904
:bartol.freenode.net 333 demasiadovivo #ubuntu Pici 1241048945
:bartol.freenode.net 353 demasiadovivo = #ubuntu :demasiadovivo poona Xintruder aprilhare solid_liq Anthony2 ikey mistiq funkycat90210 kota skyangel cowgarden disappearedng rjune orogor doppelganger_ ash001 ruler Mr_Wellichen__ ray_ __iron sycr bluemind tigerplug Equs Paraselene_ xInfoNutzx myself |Myxb| bullgard4 Papgena biella yacc_ vlt EruditeHermit rashed2020 s_ amazin kbrosnan Bruce binarymutant bash fbc-mx hoeq Piet osxfr33k Don_Miguel embrik_ cryptide wolf23 z3ro3x azmeuk_ myphnix__
...
lista larga de nicknames
...
:bartol.freenode.net 353 demasiadovivo = #ubuntu :Yasir^ bimberi eLmankku lunxer gardar horstle Rorgo wyggler2 magnetron maswan atlas` Hyperi dimedo JimboOmega AlienX puff hse-hoens pjm0616 nevyn FFEMTcJ redMac flipp Boohbah swamptin Henk-Jan Ciantic akiniemi psaikido xemacs tiberius_
:bartol.freenode.net 366 demasiadovivo #ubuntu :End of /NAMES list.
:ChanServ!ChanServ@services. NOTICE demasiadovivo :[#ubuntu] Welcome to #ubuntu! Please read the channel topic and consider spending some time on the FAQ mentioned there - This channel is officially logged at http://irclogs.ubuntu.com/
:bartol.freenode.net 328 demasiadovivo #ubuntu :http://www.ubuntu.com
:ikey!n=ikey@89.193.140.178 QUIT :Remote closed the connection
:ikey!n=ikey@89.193.140.178 JOIN :#ubuntu
QUIT
Robando información del historial (sin usar JavaScript!)
Hace un par de días leí algo que me sorprendió, una idea realmente simple (como suelen ser las buenas ideas) que da como resultado algo realmente perturbador.
Brendon Boshell posteó en su web-site una demo de código JavaScript que permite obtener el historial (o al menos una buena parte) de los sitios visitados por el usuario. Esto puede servir para armar un perfil con los gustos del usuario y después generar, por ejemplo, propagandas que se adapten a ellos. Esta grave invasión a la privacidad bien podría clasificarse de Spyware.
Para el que no lo tenga claro, los web-sites "no deberían" poder leer el historial de navegación, pero como lo ha demostrado Brendon en esta ocasión y Jeremiah Grossman en el pasado, claramente lo pueden hacer.
Ahora, si están pensando "HA, yo tengo deshabilitado java script en sites no confiables así que esto no me afecta!"... bueno, piensen de nuevo, porque muchos de los lectores de la página dijeron lo mismo, así que Brendon se tomó la molestia de demostrarles lo contrario. Con un nuevo demo probó que se puede hacer lo mismo, pero utilizando sólo iframes, con lo que no es necesario utilizar Java Script.

En este momento seguro se estarán preguntando, cómo lo hace? (yo me volví loco por saberlo apenas lo vi en funcionamiento). Contrariamente a lo que muchos se imaginarían, éste no es un exploit de algún browser. Las herramientas utilizadas aquí son la cache del historial del browser más CSS (Ja, suena loco hackear con CSS) más una buena lista de direcciones web.

Para el caso de la demo con Java Script, el funcionamiento es el siguiente:
- cuando la página se carga, se descarga una lista con muchas (si muchas) direcciones web (entre las cuales estarán google.com, facebook.com, etc) la cual mantiene oculta en un iframe oculto (osea, el usuario no ve nada de esto).
- En los CSS tiene definido el atributo "a:visited{ font-size: 60px;}" (aunque se podría usar cualquier otro).
- Para cada site listado, a través del código JavaScript verifica si el tamaño del font es 60px. Si el tamaño es éste, quiere decir que la página ha sido visitada en el pasado. Esto lo sabe gracias al atributo CSS a:visited que mencioné arriba, ya que una dirección que no ha sido visitada, no tendrá el font tamaño 60px.

Como ven, es como les advertí, muy pero muy simple. Pueden ver parte del código en http://www.making-the-web.com/2009/04/12/mass-browser-history-sniffing-with-javascript/. Es una pena que Brendon no comparta todo el código, y que la pequeña parte que comparte, lo hace con Copyright...


Ahora veamos el caso que más me gustó, utilizando sólo iframes. Este me llevó bastante tiempo entenderlo porque Brendon no comparte nada del código y la explicación que da es de sólo 4 líneas...
Luego de leer un poco y utilizar bastante la lógica, logré crear un par de scripts en php que hacen el trabajo. Si bien el sistema es básicamente el mismo, éste varía un poco dado que no podemos usar programas del lado del cliente. El sistema que creé yo es un poco distinto al de Brendon, pero hace lo mismo. La cosa va así:
- Tenemos un script principal que cuenta con un iframe que se auto refresca cada 3 segundos (podemos usar alguna función como header("Refresh: 3; url=list.php?id=algun_numero"); en php).
- En el iframe contamos con el atributo CSS "a:visited{ background: url(logger.php?id=algun_numero); }". En éste caso si o sí necesitamos de un atributo que necesite contactar al servidor porque no tenemos nada corriendo del lado del cliente, por eso utilizamos background con la función url() que llama al script que logueará si el link identificado por algun_numero fué visitado o no.
- Este iframe cuenta con un sólo link. Se podría contar con muchos links al mismo tiempo y varios atributos a:visited con clases definidas para distinguir entre links, pero para mantener el ejemplo sencillo, dejé un solo link.
- Cuando el iframe se carga, éste cargará el atributo url(logger.php?id=algun_numero) si y solo sí el link que tenemos dentro del iframe fué visitado. Gracias a esto, del lado del servidor, sabemos que si el script logger.php se ejecuta es porque el link identificado con algun_numero fué visitado.
- En cada recarga automática del iframe testeamos un link distinto y así armamos la base de datos con los sites que el usuario visitó.

Si bien este parece un poco más rebuscado, igual es increíblemente sencillo para los buenos resultados que nos da.


Ambos scripts son simples, pero se pueden optimizar para tener mayor y mejor funcionalidad, como por ejemplo para cada página que detectamos como visitada, buscar las páginas relacionadas y buscar con ellas también.


Cómo nos deshacemos del problema? por una parte podemos deshabilitar java script en los sitios que no confiamos (a veces ni en los sitios confiables se puede estar seguro debido al XSS). Por otra parte, podríamos configurar que el browser no guarde historial. Por último podemos bloquear los iframes.
Para deshabilitar Java Script y los iframes, en firefox, podemos usar el add-on NoScript. Por otra parte, los browsers cuentan en su configuración con la posibilidad de que, si el usuario lo desea, no almacenen historial.


Así que ya saben, si ven propagandas en sitios web que se acercan demasiado a sus gustos personales, empiecen a desconfiar =D
Software Wars
Hace un tiempo me topé con este genial gráfico que ilustra el estado de competencia entre los distintos programas, agrupados por empresas, como un mapa de guerra. La fuente original es http://mshiltonj.com/software_wars/
Cabe destacar que el mapa se creó utilizando sólo herramientas de software libre (Inkscape y GIMP).
Es una pena que no se actualice desde el 2006 porque la verdad que está muy bueno.
Bing, el más certero de los buscadores!
El otro día una amiga recibió un interesante e-mail. Un amigo de ella hizo una búsqueda en el flamante Bing y no obtuvo lo que esperaba, aunque si obtuvo lo que todos sabemos =P
Juro que es verdad, al menos al día de hoy (15/06/09) consultando desde Argentina, los resultados siguen siendo los que muestro a continuación, compruebenlo ustedes mismos.

Si por ejemplo, buscamos la palabra "ladrones" en Bing, obtenemos lo siguiente:

Ahora, si buscamos la palabra "chorros", podemos ver algo como esto:

Mala suerte para el gobierno y para Arnet, parece que la gente de Microsoft no tiene pelos en la lengua a la hora de expresar sus opiniones =P


NOTA: que bien que anda Bing!, menos mal que sigue existiendo google...
sex + viagra + porn + drugs = SPAM!
Es tan común recibir SPAM que ciertos términos parecen sinónimo de ello. Quién no ha tenido al menos una dirección de e-mail donde el maldito SPAM les llena la casilla y cuesta separar los mails que nos interesan de los que nos molestan.
Porque al igual que todos estoy re podrido del SPAM (de todo tipo), en éste artículo describiré cómo combatirlo en los e-mails. Antes de empezar, dejo una pequeña definición.


Qué es SPAM?
Y si, alguno podría preguntarse a qué se denomina SPAM. email-SPAM (de ahora en más sólo SPAM) se denomina a todo e-mail no solicitado y que es enviado en masa (muchos receptores). Estos e-mails pueden tener distintas finalidades, como ser, propaganda, phishing, sólo molestar, saturar servidores de e-mail (el clásico Hotmail se Cierra!), esparcir ideologías políticas, religiosas, etc.
Otra forma bien conocida de SPAM es la vista en foros, blogs, fotologs, etc, donde dejan comentarios con sus propagandas.
Por supuesto existen formas de SPAM fuera de internet, como los ya clásicos y ULTRA-molestos mensajes de las compañías de celular con ofertas que nunca nos convienen o premios que nunca ganaremos.
También se puede considerar SPAM a los llamados telefónicos con ofertas de servicios, el reparto de revistas con propagandas, o cartas con propagandas.
Como ven, en la vida estamos saturados de SPAM, algunos quizás hasta sueñan con SPAM.


Cómo saben mi dirección?
Otra pregunta válida es, de dónde sacaron mi dirección de correo???... si se preguntan eso, piensen de nuevo...
Hay muchas formas en las que un spammer puede obtener una dirección. Entre las más comunes tenemos:
- sitios web: si se registraron en una página no muy santa y dejaron el mail, están jodidos. Si tienen un blog, fotolog, red social, página propia, etc, que puede ser accedida por cualquiera y dejaron el mail, están jodidos.
- foros: dejar el e-mail visible por visitantes de un foro es un error fatal.
- salas de chat, grupos de noticias, etc: sucede lo mismo ya mencionado.
- malware: si se infectaron con un virus, éste puede recolectar direcciones de mail que utilicen y las de toooodos los contactos que tengan. Es decir, aunque seamos extra precavidos, el spam nos puede llegar por culpa de un amigo que se infectó.
- servidores de mail mal configurados: si el servidor que utilizan está mal configurado, éste puede enviar SPAM a todas las direcciones que maneja.
- diccionarios: el spammer utiliza diccionarios para crear direcciones de e-mail potencialmente válidas y envía SPAM a ellas. Si tu nombre de usuario forma parte de un diccionario, caes dentro de esta categoría.
- otras: seguro hay otras formas que estoy olvidando citar.


Cómo me defiendo? (usuario final)
Como usuario final lo que podemos hacer es:
- elegir un servidor de e-mail de confianza que cuente con buenos mecanismos antis-spamming, anti-virus, y soporte continuo para solucionar problemas de configuración y vulnerabilidades.
- no dejar nuestra dirección de e-mail en sitios públicos (los mencionados sitios-web, blogs, foros, etc), esto incluye lugares que no estén en la red, como por ejemplo dejar el e-mail a un promotor de la calle.
- utilizar e-mails SPAM-only para el caso en que registrarnos en alguna página requiera dejar un e-mail a donde luego nos envían una confirmación que debemos contestar. Con SPAM-only me refiero a una cuenta de e-mail que no utilicemos nunca, sino que la tengamos sólo para utilizarla en estos casos.
- no contestar a e-mails que son SPAM, lo único que logran con esto es que el spammer sepa que TU dirección de e-mail es válida, colocándola entre los grandes candidatos a enviar más SPAM.
- ayudar a los administradores de los servidores reportando e-mails que son spam.
- instalar una aplicación anti-spam que cuente con técnicas de filtrado por checksum, soporte RDL, filtrado por reglas, filtros Bayesian, las cuales describiré a continuación.


Cómo me defiendo? (administrador del servidor de e-mail)
El administrador del servidor puede hacer varias cosas para limitar la propagación de SPAM. Tal vez la más conocida es utilizar un antispammer (programa dedicado que cuenta con varias técnicas anti-spamming). El problema está en la complejidad del antispammer y el trade-off "eliminar todo el spam" Vs "saturación de recursos" Vs "falsos positivos" (mails válidos rechazados como SPAM por falla en la lógica).
Entre los métodos para lidiar con el SPAM (algunas comúnmente encontrados en los anti-spams), contamos con los siguientes:


Filtrado por Checksum
Se mantiene una base de datos con checksums de spams conocidos y se revisan los mails entrantes buscando coincidencias, si el checksum se encuentra en el mensaje, éste se clasifica como spam. El checksum se calcula utilizando partes del e-mail que no varían. El método es bastante efectivo dado que muchos de los mensajes no varían o varían muy poco. Esta función es igual a la realizada por los antivirus.
Si bien el sistema es bastante efectivo, es bastante eludible dado que los spammers pueden insertar caracteres invisibles (osea, no mostrables) en el medio de los mensajes y así evadir el anti-spam.


DNS Black/Blackholes Lists (DNSBL), también conocidas como Real-Time Black Lists (RBL)
Se utilizan black lists con IPs o DNSs de spammers conocidos de forma que si un e-mail recibido proviene de una dirección conocida como spammer, entonces el e-mail trata como spam.
El sistema funciona de la siguiente manera. Se monta un servidor de DNS que sirve como servidor de black list. Dicho servidor debe tener asignada una dirección de DNS que puede ser interna o pública, dependiendo desde donde se acceda (por ej: dnsbl.mired.com). Cuando un servidor de mail recibe un e-mail, este extrae la dirección del emisor (por ej: 192.168.12.133), la revierte (133.12.168.192), le agrega la dirección DNS del servidor DNSBL (133.12.168.192.dnsbl.mired.com) y hace una resolución de DNS utilizando la dirección obtenida. Si la dirección existe (el servidor contesta con alguna dirección IP del rango 127.0.0.0/8), quiere decir que el emisor es un spammer (está listado en la black list). Opcionalmente el servidor de mail puede consultar la razón por la que dicho emisor está en la black list (consultando el registro TXT).
Existen servidores que permiten consultar sus black-lists en busca de spammers. En general estos servicios permiten hasta un cierto número de consultas gratis y si necesitamos de un volumen mayor, tenemos que pagar por el servicio. Algunos de los servicios más conocidos, que además cuentan con consultas on-line, son:
Spamhaus
SORBS
Spamcop
Spamrats

Es interesante el caso de mxtoolbox que realiza la búsqueda sobre 147 DNSBL y nos devuelve el resultado obtenido en cada uno.

Por otra parte, si queremos montar nuestro propio servidor RBL en Linux, podemos seguir los pasos citados en http://www.blue-quartz.com/rbl/

En la página nemx.com citan las características de los RBL y explican brevemente cada una. El informe es algo viejo (algunos de los links en el ya no sirven), pero la descripción general se sigue aplicando.
En http://www.rfc-ignorant.org/how_to_domain.php describen cómo agregar servidores DNSBL en los servidores de mail más conocidos (postfix, exim, sendmail, qmail, etc)

Las black lists se generan utilizando spamtraps, direcciones de e-mail ocultas que sólo los spammers pueden encontrar (como por ejemplo, ocultas en el código HTML, no visibles para el usuario). Todo e-mail que llegue a este mail, es SPAM. Los Spamtraps pueden considerarse honeytokens debido a su naturaleza. También se utiliza el feedback de usuarios que reportan spam. La direcciones que son reportadas por varios usuarios como SPAM son grandes candidatas a ser agregadas en la black list.

Para limitar el número de falsos positivos, las black lists suelen utilizarse con white lists, o listas de direcciones conocidas como buenas. Si un e-mail proviene de una dirección listada en una white list, entonces se deja pasar.

En wiki pueden encontrar una definición más completa sobre los DNSBL


Verificación DNS inversa (registro PTR)
Tal vez uno de los métodos más efectivos, y de los más usados, es hacer una resolución inversa de DNS. Una resolución inversa de DNS es tomar una IP y consultar al servidor DNS por el DNS asociado. De esta forma si la dirección mail.mired.com resuelve a 192.168.1.1, entonces al intentar una resolución inversa de 192.168.1.1 debería resolver a mail.mired.com.
Dado que la mayoría de los spammers no suelen tener registrada la resolución inversa de la IP que utilizan para enviar SPAM, si por cada e-mail recibido requerimos que la dirección IP mapee a la dirección DNS de donde dice venir, evitaremos un altísimo número de e-mails SPAM.


Filtrado basado en reglas
Se utilizan reglas basadas en listas de palabras o expresiones regulares que no están permitidas en los mensajes, para tratar como SPAM los e-mails que las cumplan. De esta forma se puede rechazar e-mails que contengan las palabras viagra, sexo, porno, etc.
El problema con estas reglas son los falsos positivos, el tiempo que lleva el análisis y que los spammers cambian continuamente las frases y la forma de deletrear las palabras, además de incluir caracteres no visibles para el usuario, pero sí para el filtro. Variaciones como sex0, s3xo, 5exo, sexo (visible como sexo si el mail está formateado en HTML) pueden ser difíciles de detectar. La cantidad de combinaciones posibles es gigantesca e incluirlas todas en la revisión consume demasiados recursos.
Por otra parte, muchos mensajes vienen en formato de imagen jpg, png, etc, de forma que estos filtros no los detectarían.

Otra forma de filtro es el filtrado de headers. La mayoría de los spammers cambian los headers de los mensajes para que parezcan provenir de otros autores, para que parezcan más reales. Estas modificaciones son fácilmente detectables y los mails pueden marcarse como spam.


Filtros Bayesian (también conocidos como filtros de estadística de contenido)
Los filtros Bayesian se basan en estadísticas y aprenden a detectar spam a partir del entrenamiento del usuario. Para cada e-mail recibido, el usuario debe indicarle al sistema si es spam o no. A partir de las palabras incluidas en los mensajes, el filtro crea bases de datos conteniendo palabras que suelen estar en e-mails válidos y palabras que suelen estar en e-mails que son spam.
Cuando el filtro tiene una buena base de datos formada puede distinguir correctamente cuáles palabras pertenecen a cada categoría y decidir si clasificar un e-mail como spam o no. La desición la realiza mediante el análisis de probabilidad computado para todas las palabras incluídas en cada e-mail. Si el total supera un umbral, el e-mail se califica como spam.

Todo esto tiene un fundamento matemático y pueden leer más sobre ello en http://en.wikipedia.org/wiki/Bayesian_spam_filtering
También pueden encontrar una brebe introducción a los filtros Bayesian en http://www.spam-site.com/bayesian-spam-filter.shtml


Verificación SMTP por llamado inverso
Como la mayoría de los spammers utilizan una dirección "From" inválida, una forma de detectar spam es haciendo que nuestro servidor intente conectarse al servidor de mail desde donde supuestamente viene el e-mail. Si la dirección es inválida, se detectará en el intento de conexión y el mensaje puede marcarse como spam.


Forzar el cumplimiento de estándares RFC
Dado que la mayoría de los spammers utilizan soft mal configurado, o sobre el cual no tienen control para enviar los e-mails, muchos de los emisores no cumplen con estándares RFC. Una forma de evitar spam es bloqueando todo e-mail que no es enviado siguiendo dichos estándares. Algunas de las restricciones impuestas son greeting delay, greylists, HELO/EHLO checking, Invalid pipelining, Nolisting, Quit detection.


SPAM en números
En http://barracudacentral.org/ ofrecen gráficas sobre spamming, como el origen, el tipo de contenido y la cantidad de spam recibida en los últimos días. También mantienen una lista negra que se puede consultar para saber si un IP está listado y podemos reportar contenidos de spam. Además ofrece datos de otros malwares.
Como se puede observar, cada dos días se bloquean casi 2 mil millones de e-mails con spam!. Sólo el 6% de los e-mails son aceptados como buenos. El mayor productor de SPAM es USA, seguido por nuestros vecinos brasileros y en 3er lugar los rusos.
A continuación les dejo los gráficos con la distribución del spam en categorías, y también una tabla con los e-mails procesados en los últimos dos días:




Referencias
Pueden encontrar las técnicas anti-spamming con un poco más de detalle en http://en.wikipedia.org/wiki/Anti-spam_techniques_(e-mail) y en http://stason.org/articles/technology/email/junk-mail/index.html en donde incluyen algunas más. En http://www.spam-site.com/anti-spam-techniques.shtml y http://wiki.asrg.sp.am/wiki/Taxonomy_of_anti-spam_techniques también ofrecen una breve introducción a las técnicas más conocidas.
Por supuesto, también es interesante el artículo de wiki sobre SPAM: http://en.wikipedia.org/wiki/E-mail_spam
Por último, dejo la dirección de donde obtuve la imagen para éste artículo: http://www.knowtebook.com/anti-spam-guide-fuer-webmaster-549.htm
Unix cumplió 40!
El domingo pasado (07/06) fue la fecha en que Unix cumplió ni más ni menos que 40 años.
El sistema inicialmente desarrollado por Ken Thompson, Dennis Ritchie y un grupo de colaboradores, fue escrito en lenguaje assembler para la PDP-7 y llamado Unics, nombre inventado por Brian Kernighan para contrastar con el anteriormente desarrollado Multics. Luego el sistema fue renombrado a Unix.
En 1973 fue reescrito en C, lenguaje ideado para la programación de sistemas operativos y creado por el mismo Dennis Ritchie. Esto le sirvió a Unix para ser portado a otras arquitecturas.
La historia de Unix es bastante más larga y parte de ella puede seguirse en varios sites, incluídos:
http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=9133628, http://www.unix.org/what_is_unix/history_timeline.html y http://en.wikipedia.org/wiki/Unix

Me encantó la cita que encontré en el artículo de unix.org con las palabras de Dennis Ritchie y Ken Thompson en 1972 :
...the number of UNIX installations has grown to 10, with more expected...
El usuario menos conocedor seguro conozca más de un sistema tipo Unix, entre los cuales se pueden citar Linux, Solaris, *BSD, e incluso MacOS (aunque no lo parezca).

Una interesante línea de tiempo que encontré googleando es
Feliz Cumple Unix!
Links: programando en Python
Como dije anteriormente en Popularidad de lenguajes de programación Python es un lenguaje que viene pisando fuerte entre los desarrolladores. Desgraciadamente no pude adentrarme demasiado en el universo de Python, pero lo poco que vi, simplemente me encantó. Es realmente como dicen, fácil de aprender y el código fácil de seguir, además programar algo interesante lleva tan solo unas pocas líneas.
La cantidad de librerías existentes es impresionante. Existen librerías para todo, e incluso en muchos casos (como en el caso de GUIs) existe más de una opción para elegir (hablando de librerías GUIs tenemos QT, GTK, WxWidgets, Tcl/Tk, y otras).
Como todo lenguaje moderno, Python es orientado a objetos, con todo lo que esto significa: herencia, manejo de excepciones, polimorfismo, etc.
Además Python es multi plataforma (como la mayoría de los lenguajes interpretados), a menos claro que utilicemos librerías específicas de un sistema operativo.

Bueno, dejo de lado la introducción y paso al motivo del post, los links:

Guía básica para pensar como un informático - Aprender con Python. Esta es una guía muy completa donde se introduce el lenguaje, con su estructura e información sobre cómo usar los tipos básicos (strings, diccionarios, tuplas, etc) así como también la orientación a objetos.

Guía de aprendizaje de Python (pdf). Otra interesante guía donde se introduce el lenguaje con sus herramientas y estructuras básicas.

Inmersión en Python. Libro muy completo que cubre desde la instalación hasta el uso de python como procesador HTML, XML, servicios HTTP y SOAP, explicando, por supuesto, las estructuras básicas y el manejo de objetos.

Python library reference
. Completísima descripción que cubre la mayoría de las librerias improtántes que existen para python. Indispensable a la hora de programar cualquier cosa, sin dudas un "Must Read".

PyGTK: GTK+ for Python. Ni vale la pena que diga de qué trata el link, básicamente nos explica como crear programas usando las librerías GTK+.

GUI programming with python: QT Edition. Manual que describe como crear utilizar QT en programas hechos en python.

PyQT v4 reference GUI. Idem anterior, aunque tal vez menos completo.

PyQT's Classes. Listado de todas las clases disponibles para programar con QT, con una descripción de cada una. Excelente.

PyQT Tutorial. Tutorial simple sobre como crear una interfaz con QT y Python.

Python también cuenta con IDEs que facilitan la creación de programas. Entre los más conocidos están SPE e IDLE, aunque también se puede utilizar el multifacético Eclipse con algún plugin especial para python.

Como ven, Python es excelente, vale realmente la pena darle una oportunidad. En el mundo del soft libre se utiliza muchísimo, sólo basta mirar un poco sobre los programas q utilizamos a diario para darnos cuenta.

En fin, espero que les sea útil.
shortcuts: comandos en vi
Revolviendo un poco entre todas las cosas que tengo almacenadas, donde muchas de las cuales ni recordaba que tenía, encontré esta utilísima imagen con los comandos básicos más útiles de vi, algo que no debería faltarle a ningún administrador.
Lo interesante es que esta imagen viene impresa en tazas que pueden adquirir por unos 13 dolares en http://nostarch.com/mug.htm (si alguien quiere, me puede regalar una =D )


Con esto inauguro la sección shortcuts, donde iré colocando simples ayuda memoria, cosas que debemos tener siempre a mano.
Problema -> Posible Solución
Entre la joda y el trabajo no queda mucho tiempo para armar artículos, así que en esta entrega dejo un recopilado con algunos errores que me han surgido en los años de utilizar linux y sobre cómo los solucioné, así si alguien tiene un problema similar lo puede arreglar rápidamente.
Esto mismo lo he ido publicando en http://www.linuxespanol.com a medida que iban surgiendo.
Espero que le solucione la vida a más de uno antes de frustrarse y dejar de usar Linux por un simple error.

-----------------------------------------------------------------------
Problema:

Al intentar iniciar el sistema, cuando se carga el filesystem, este indica el error:

Error 16: Inconsistent Filesystem Structure
y se queda detenido ahi.

Solución:
Entrar con un live-cd (ubuntu, knoppix, etc), abrir un terminal y ejecutar el comando:

#fsck /dev/sda1 (/dev/sda1 es donde se mapea la particion, ajustenlo a su particion).


Problema:
Al iniciar el sistema, aparece el siguiente error:

I/O Error reading swsusp image

Solución:
Este error nos indica que hay un error con la swap, puede que no tengamos una partición dedicada a la swap o que la partición se corrompió por alguna razón.
Para poder iniciar el sistema igual, entrar con un live cd y modificar la entrada de grub (la del sistema que quieren iniciar). En la línea que dice:

kernel /boot/vmlinux-algo root=/dev/algo [opciones]
agregar la opcion noresume, esto es, la linea debe quedar:
kernel /boot/vmlinux-algo root=/dev/algo [opciones] noresume
Gracias a esto se puede iniciar el sistema sin swap, una vez que inician el sistema pueden buscar la forma de solucionar el problema de la swap, como por ejemplo, creando una swap nueva.


Problema:
Se corrompió la tabla de particiones y no inicia el sistema, o bien no pueden acceder a alguna partición.

Solución:
Iniciar el sistema con un live-cd que contenga el programa "testdisk", systemRescueCD es uno de ellos.
Una vez que iniciaron el sistema con un live-cd, ejecutar el comando testdisk al disco donde se encuentra el problema de las particiones. Seguir los pasos del testdisk y arreglar los problemas encontrados.



Problema:
Tienen una maquina con puerto serie para el mouse y el sistema de ventanas (X11) no les reconoce el mouse.

Solición:
En general van a tener las siguientes lineas en el xorg.conf:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "Emulate3Buttons" "true"
EndSection
En la opción "Device" "/dev/input/mice" cambiar el "/dev/input/mice" por /dev/ttyS0 (o ttyS1, o ttyS2, dependiendo del com que este usando su mouse). Y en la opcion "Protocol" "ImPS/2", cambien el "ImPS/2" por "Microsoft" (si, suena feo, pero es ese el protocolo).
Para resumir, la seccion deberia quedar asi:
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/ttyS0"
Option "Protocol" "Microsoft"
Option "Emulate3Buttons" "true"
EndSection


Problema:
Al arrancar el sistema se obtiene el siguiente error:

Could not stat the resume device file (el dispostivo)
Dado a que si presionamos Enter el sistema carga igual, lo que hay que hacer, si tienen debian o algún derivado, cuando inician el sistema es ejecutar:
#dpkg-reconfigure initramfs-tools
#dpkg-reconfigure initramfs-tools -u


Problema:
Al intentar cambiar el tema (theme) de kdm se obtiene el siguiente error:

Override files found, selected theme will not have effect

Solución:
Si existe algún archivo en /etc/default/kdm.d/ entonces kdmtheme no nos permite cambiar el theme. Lo que se debe hacer es borrar o mover cualquier archivo que se encuentre en /etc/default/kdm.d/



Problema:
Al intentar comprimir un archivo desde konqueror con el programa ark, este ultimo muestra una barra de progreso pero el archivo nunca se comprime y la barra de progreso nunca desaparece.

Solución:
Hay un problema de compatibilidad entre ark y el KIO Slave system, por lo que ark no encuentra el archivo que debe comprimir. Para poder comprimir el archivo se debe cambiar la ruta en konqueror de system:/media/sd* a la ruta absoluta del archivo, como puede ser /media/datos.
No es la solución óptima, pero sirve hasta que encuentre una mejor, dado que hay muchos reportes de este bug pero no encontré otra solución.



Problema
Al iniciar, el kernel nos indica:

Volume group "VolGroup00" not found
Unable to access resume device (/dev/VolGroup00/LogVol00)

Solución
Este problema se puede deber a varias razones, una es que intentaron actualizar el volumen lógico agregando algún PV (volumen físico), o hicieron algún otro cambio, como agregar memoria.
En estos casos (no siempre funciona) el error se puede solucionar arrancando con un livecd y ejecutando:

#vgreduce --removemissing VolGroup00

Otra posible solución es renombrar el grupo de volúmenes ejecutando

#vgrename nombre_viejo nombre_nuevo
Una vez que hagan esto, tendrán que modificar las entradas correspondientes en /etc/fstab, cambiando en nombre viejo por el nuevo.

Otra posible razón es que instalaron el sistema en una computadora y luego migraron el disco a otra computadora. En este caso el problema es que el kernel debe reconocer el nuevo controlador del disco para poder cargar los volúmenes lógicos, por lo que se debe crear un nuevo initrd.
Para esto, iniciamos con un livecd, montamos la raíz en algún lugar como /mnt/linux (para esto tal vez primero se deba activar los volúmenes lógicos con #vgchange -ay, y usar los dispositivos /dev/VolGroup00/LogVol00 o similares).
Una vez que montamos el sistema, hay que cambiar la raíz con #chroot /mnt/linux
Ahora que estamos en el nuevo árbol creamos el nuevo initrd con: #mkinitrd /boot/initrd-nuevo.img version-del-kernel (por ejemplo 2.6.18, pueden fijarse en /boot/grub/menu.lst para saber la versión).
Ya teniendo el initrd hay que modificar el grub para que lea este nuevo initrd, para esto editen /boot/grub/menu.lst y agreguen una nueva entrada o bien modifiquen una ya existente, poniendo en la opción initrd el nuevo initrd.