lunes, septiembre 11, 2006

Foto-Mosaicos con metapixel en Gentoo

Tengo en mi casa un poster de una foto de Yoda hecho con multiples fotos de la triologia original de la guerra de las galaxias y desde hace tanto tiempo como tengo el poster tenia ganas de hacer unas fotos de estas.... Me acuerdo cuando hace apenas unos años vi a un tipo por la tele (no recuerdo el nombre) que se japtaba de tener este software para desarrollar este tipo de posters... De las de aquella, para hacer un poster decente se tardaba un güevo y medio, pero hoy en dia tenemos varias soluciones libres para hacerlo y que con los micros de hoy en dia se tarda apenas unos segundos.

Ejemplo:


(hecho con solo 2700 fotos, a ver si subo una cuando tenga todas mis fotos en mi libreria)

Yo opte por metapixel

Para hacerlo funcionar solo necesitamos :

Descargarnos los ultimos fuentes de metapixel

Y tener una buena biblioteca de imagenes... (Cuantas mas mejor, 10.000 es un buen numero)

Descomprimimos, Compilamos he instalamos los fuentes de la ultima version de metapixel.

tar -xzf metapixel-version.tar.gz
cd metapixel-version
make
su
make install
exit


Ahora tenemos que recopilar muchas fotos, si las tenemos en un directorio del disco duro fenomenal, pero si teneis copias en dvds, tendreis que ir dvd a dvd generando una libreria con las fotos en pequeño para utilizarlas a posteriori. Imaginemos el primer caso. tenemos todas las fotos en /home/usuario/fotos , por otro lado crearemos un directorio donde almacenaremos las imagenes redimensionadas en /home/usuario/imagelib

mkdir /home/usuario/imagelib
metapixel-prepare -r /home/usuario/fotos /home/usuario/imagelib


Segun la cantadidad de las fotos que tengamos tardara mas o menos.
Si deseamos añadir mas fotos a la libreria bastara con cambiar el directorio /home/usuario/fotos por el nuevo, por ejemplo, unas que tengamos en un dvd

mount /dev/dvd /mnt/dvd
metapixel-prepare -r /mnt/dvd /home/usuario/imagelib


Esto te añadira las nuevas fotos.

No cometas el error de poner dos veces un directorio con las mismas fotos por que se te duplicaran en la libreria, es decir, no te valida si hay fotos que tienes...

Despues de añadir las fotos solo hace falta seleccionar una para la que quieras hacer un mosaico, por ejemplo /home/usuario/foto.jpg

metapixel --library /home/usuario/imagelib --metapixel /home/usuario/foto.jpg /home/usuario/foto-mosaico.png


En unos pocos segundos lo tendras hecho.

Es recomendable utilizar fotos grandes (dimensiones) para que el resultado sea decente, si por ejemplo tienes una foto de 120x120, lo que puedes hacer es redimensionarla a mayor tamaño con el gimp y despues convertirla en mosaico.

Si antes de --library le pones --collage te hara la foto a modo de collage poniendo unas encima de otras.

Por defecto al generar la libreria de imagenes te redimensiona las fotos a 128x128, normalmente las camaras no suelen hacer las fotos cuadradas, asi que, para que consigas un efecto de redimension sin deformacion deberias hacer la redimension a unos tamaños equivalentes, por ejemplo, para mi canon de 6 megapixels que saca las fotos en apaisado a 3456x2304 y pensando que queremos mantener la anchura de las imagenes de la libreria a 128, la altura correcta para fotos apaisadas seria de (2304 * 128) / 3456 = 85,34, asi que seria interesante añadir --width 128 --height 85 al metapixel-prepare. Hay que tener en cuenta que esto solo nos vale para fotos apaisadas, por lo que tendriamos que hacer una seleccion de las mismas, lo cual en 10.000 fotos puede ser un poquitin aburrido... ¿Convendria hacer algun script que mida dimensiones y haga la redimension consecuentemente?... a ver si se nos ocurre algo.

Hay mas parametros que pueden ser interesantes, pero a mi con estos por ahora me sobran.

Mas info sobre foto-mosaicos y otras herramientas en http://en.wikipedia.org/wiki/Photomosaic

Actualizacion masiva de awstats en Debian

Hace ya algunos meses que me instale el maravilloso awstats para asi controlar un poco el acceso que se hace a la mozleria ips, volumen de descarga, etc....

Cuando lo instale en mi servidorcete debian no vi la forma de actualizar las estadisticas de todos los logs, cogiendo incluso los que tengo almacenados asi que, despues de copiarme el fichero de configuracion de awstats y modificarlo a mi antojo hice este pequeño script para poder hacer estadisticas de todos los logs que tengo almacenados.

update-all-awstats.sh
#! /bin/bash

cd /var/log/apache
gunzip access.log.*

echo "" > access_temp_awstats.log

typeset -i i=0

# contamos los archivos que hay
for file in ls -lt access.log.*
do
    ((i=i+1))
done

typeset -i j=1

# creamos el bucle para que ejecute todo desde log.mayor hasta log.1
echo "Volcando antiguos logs a access_temp_awstats.log"
while test $j -le $i;
do
    echo "Volcando access.log.$i a access_temp_awstats.log"
    cat access.log.$i >> access_temp_awstats.log
    ((i=i-1))
done

echo "Borrando anteriores datos de awstats"
rm /usr/lib/cgi-bin/*.txt

echo "Ejecutando la actualizacion de los accesos desde el temporal"
perl /usr/lib/cgi-bin/awstats.pl -config=/etc/awstats/moz.servebeer.com.conf -LogFile=/var/log/apache/access_temp_awstats.log -update

echo "Borrando temporal"
rm access_temp_awstats.log

echo "Zipeando antiguos logs"
gzip access.log.*

echo "Terminado"
exit 0


Hecho esto, no hay mas que ponerlo como tarea del cron y listo.

cd /etc/crond.d/
cp awstats awstats-moz.servebeer.com
nano -w awstats-moz.servebeer.com
# cambiamos con la configuracion de nuestro awstats
crontab awstats


Si alguien tiene una solucion un poco mas elegante no tiene mas que postearla.

Salud3!

miércoles, julio 05, 2006

Enviar archivos por bluetooth de pc a movil o viceversa en Gentoo

Llevo un poco parao mis descubrimientos con linux, mas que nada por las vacas y la cantidad de curro que tengo, este post lo empece a escribir el 5 de julio de 2006 y ya por fin hoy he terminado (10 de septiembre de 2006)....

Salud3!

Bueno, comentaros que con la pagina siguiente todo solucionado :

Guia de Bluetooth en gentoo

Voy ha hacerme un pequeño resumen para que no se me orvide.

Basicamente si utilizas genkernel los modulos ya los tienes instalados menos el protocolo RFCOMM.

Como se trata de un modulo y pensando que ya tienes el kernel generado con # genkernel all hacemos lo siguiente como root

cd /usr/src/linux
make menuconfig


y seleccionamos

Networking --->

<*> Bluetooth subsystem support --->

--- Bluetooth subsystem support
<M> L2CAP protocol support
<M> SCO links support
<M> RFCOMM protocol support
[*] RFCOMM TTY support
<M> BNEP protocol support
[*] Multicast filter support
[*] Protocol filter support
<M> HIDP protocol support


Salvamos y salimos y por que no, hacemos una nueva copia de la configuracion al /boot/

mount /boot/
cp .config /boot/.config-version-con-net-bt


Compilamos los nuevos modulos he instalamos

make modules
make modules_install


Si todo ha ido bien, enchufamos el bluetooth/usb y hacemos un dmesg

dmesg


El dmesg deberia devolvernos algo como esto :

ohci_hcd 0000:00:02.0: wakeup
usb 2-6: new full speed USB device using ohci_hcd and address 2
usb 2-6: configuration #1 chosen from 1 choice
Bluetooth: Core ver 2.8
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: HCI USB driver ver 2.9
usbcore: registered new driver hci_usb


Tambien nos puede dar una idea ejecutar lsusb

lsusb


Si lo cogio bien el lsusb deberia devolvernos algo como esto

Bus 002 Device 002: ID 0db0:1967 Micro Star International Bluetooth Dongle
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000


No se como ira si tienes el bluetooth integrado, pci o otras pajas, pero imagino que no debe ser muy distinto

Una vez que ya vemos que el bluetooth esta soportado en nuestro kernel, necesitamos alguna aplicacion para comunicarnos con otros dispositivos bluetooth, en el wiki que puse al principio nos recomienda BlueZ, que funciona mu bien al menos para lo que yo quiero.

emerge -va net-wireless/bluez-libs net-wireless/bluez-utils


Arrancamos el servicio bluetooth

/etc/init.d/bluetooth start


cambiamos el pin, por defecto 1234 por otro que queramos
nano -w /etc/bluetooth/pin


Ahora probaremos que funciona, para probar voy a poner de ejemplo mi telefono movil, enciendo el bluetooth del movil y escaneamos a ver si vemos el mismo desde el ordenador, con hcitool scan, escaneamos dispositivos bluetooth encendidos.

hcitool scan


El resultado sera algo como esto :

Scanning ...
00:E0:03:64:16:75 Mozvil


Al ver que encuentra el dispositivo Mozvil, instalamos unas valiosas herramientas para hacer los envios de forma mas sencilla, gnome-bluetooth, entre otras, nos instalara:
gnome-obex-send (para enviar archivos del pc al movil)
gnome-obex-server (para recibir archivos del movil en el pc)

USE="bluetooth" ACCEPT_KEYWORDS="~amd64" emerge -va gnome-bluetooth


El ACCEPT_KEYWORDS para los usuarios que como yo tienen amd64

Probamos a enviarnos algo, un mp3 para poner un tono chanchi lerendi al mozvil.

gnome-obex-send fihcero.mp3


Le damos al boton de actualizar para ver el dispositivo al que vamos a enviar y listo.

Para enviar del movil al pc. tan simple como ejecutar el gnome-obex-server

gnome-obex-server


Y desde el movil enviar el archivo y seleccionar el pc como destinatario tecleamos el pin que pusimos y listo.



Algunas cosas interesantes para el tema de los mp3s.
mp3splt, para partir el mp3 en un cacho pequeño (que nos mole para el tono del movil, toda una cancion puede ser una locura), para extraer un cacho de la cancion se le invoca con 3 parametros, nombre de fichero mp3, tiempo desde donde empieza, tiempo donde acaba en el formato minutos.segundos, por ejemplo :

mp3splt fichero.mp3 0.0 0.6


Nos extraera en un nuevo archivo llamado fichero_0.0_0.6.mp3 los primeros 6 segundos de la cancion.

Ademas si soys unos pijoteros que os bajais los mp3s en calidad decente (192 Kbps) seria recomendable que recodificarais con un sonido un poco peor... (total es para que os llamen no para dar un concierto).

El lame tiene un present para moviles que te reduce bastante la calidad (en consecuencia el tamaño) y es tan facil de usar como lame --preset phone fichero-a-recodificar.mp3 fichero-de-salida.mp3

lame --preset phone fichero_0.0_0.6.mp3 fichero-pal-movil.mp3


Como siempre todos los comentarios seran bien recibidos.

Pasando la live de gentoo a usb

Como ya decia en el anterior post, el tema de hacer la live era para probar a hacer una live que cargara desde un usb-stick. Pues bien, nada mas facil si habeis conseguido hacer la livecd con los pasos que os indique teneis que hacer estos sencillos pasos.

Para empezar tenemos que compilar el kernel con soporte para usb-storage incluido en el propio kernel y no como modulo (que es como normalmente se suele poner y te pone por defecto el genkernel)

# hacemos el chroot
cd ~/livecd/source
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf
# Para sistemas de 32 bits desde 32 bits
chroot . /bin/bash --login
# Para sistemas de 32 bits desde 64 bits
linux32 chroot . /bin/bash --login
env-update
source /etc/profile
genkernel --gensplash=livecd-2006.0 --menuconfig all

# En el menuconfig buscamos estas opciones de configuracion para ponerlas en el kernel por defecto
# No se si son necesarias todas ellas pero para mi usb-stick con estas ha funcionado
Device Drivers --->
  USB support --->
    <*> USB Mass Storage support
      [ ] USB Mass Storage verbose debug
      [*] Datafab Compact Flash Reader support (EXPERIMENTAL)
      [*] Freecom USB/ATAPI Bridge support
      [*] ISD-200 USB/ATA Bridge support
      [*] Microtech/ZiO! CompactFlash/SmartMedia support
      [ ] USBAT/USBAT02-based storage support (EXPERIMENTAL)
      [*] SanDisk SDDR-09 (and other SmartMedia) support (EXPERIMENTAL)
      [*] SanDisk SDDR-55 SmartMedia support (EXPERIMENTAL)
      [*] Lexar Jumpshot Compact Flash Reader (EXPERIMENTAL)
      [ ] Olympus MAUSB-10/Fuji DPC-R1 support (EXPERIMENTAL)
# Salvamos la configuracion y esperamos a que termine de compilar el nuevo kernel

# Salimos del chroot
exit
env-update
source /etc/profile



Borramos el contenido total del usb-sitck y la particion (contamos que el usb es /dev/sdd, si no tienes disco duro sata es casi seguro que sea /dev/sda, pero ten mucho cuidado por que te borraras el contenido del usb-stick)

# Para ver que particiones tenemos
sfdisk -l /dev/sdd
# Borramos el contenido
dd if=/dev/zero of=/dev/sdd
# Esto tardara un ratito, se paciente


Una vez borrado el contenido y las particiones del usb creamos unas nuevas, esto es igual que particionar cualquier disco duro, asi que si no sois neonatos en el tema no os deberia costar demasiado, yo lo voy a relatar para el sistema mas sencillo que se me ocurre que es una particion con todo el contenido del usb-stick en sistema de ficheros ext2.

# Como ya hemos comentado, con esto particionamos con sfdisk el /dev/sdd para crear una nueva particion con todo el contenido del usb-stick.
sfdisk -q /dev/sdd << EOF
0,,L,*
;
;
;
EOF
# Yo siempre he utilizado fdisk, esto es el ejemplo que venia en el wiki, pero supongo que podras utilizar el que mas te apetedca.

# Formateamos con ext2
mke2fs -m0 /dev/sdd1
fi


Despues de formatear, montamos el usb-stick y copiamos el directorio donde tenemos la live, podemos copiarla integramente o copiar solo la parte que mas nos convenga, aqui os pongo un ejemplo de rsync contando que el directorio donde montamos se llame /mnt/usbstick y el directorio donde tenemos la live sea el /root/livecd/source/, y excluyendo los archivos inecesarios para el uso de la distro.

# montamos
mount /dev/sdd1 /mnt/usbstick
# copiamos
rsync -a --delete --progress --exclude "*.h" --exclude "etc/bootsplash" --exclude "usr/tmp" --exclude "var/cache/*" --exclude "var/db/*" --exclude "var/log/*" --exclude "var/tmp/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" /root/livecd/source/ /mnt/usbstick/

# limpiamos cosillas por si las moscas
cd /mnt/usbstick
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history


Si venimos de la live del post anterior para cd hay que modificar un par de archivos, el grub.conf y el /etc/fstab

# Configs del grub
sed 's/(cd)/(hd0,0)/g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# Metemos el real_root (reemplazandolo por el cdroot)
sed 's/cdroot/real_root=\/dev\/sda1/g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# quitamos la paja del squashfs
sed 's/looptype=squashfs//g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
sed 's/loop=/livecd.squashfs//g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# hacemos el link de grub.conf a menu.lst (ext2 admite links :D)
rm /mnt/usbstick/boot/grub/menu.lst
cd /mnt/usbstick/boot/grub/
ln -sf grub.conf menu.lst

# cambiamos completamente el fstab
echo "/dev/sda1 / ext2 noatime 0 0" > /mnt/usbstick/etc/fstab
echo "none /proc proc defaults 0 0" >> /mnt/usbstick/etc/fstab
echo "none /dev/shm tmpfs defaults 0 0" >> /mnt/usbstick/etc/fstab


Por ultimo instalamos el grub en el mbr del usb-stick

grub-install --root-directory=/mnt/usbstick /dev/sdd --recheck


Y eso es todo amigos... Supongo que en el caso de que tengamos discos duros sata habra que poner otro real_root en el grub, pero lo desconodco por que no lo he probado.

Si sabeis de alguna forma que se pueda arrancar parecido estableciendo el root como usbroot que te lo coja automaticamente no estaria de mas que me lo contarais :D


Aqui dejo un pequeño script con la ejecucion de todo para posteriores pasos y actualizaciones.

Lo unico que no hace es el tema del kernel que lo teneis que hacer a mano.

#!/bin/bash
# 02-copiar-a-usb.sh
# ==================
LIVECD=~/livecd
TARGET=${LIVECD}/target
TARGET_SOURCE=${TARGET}/files/source/
SOURCE=${LIVECD}/source

#USB settings
USBDEV=/dev/sdd
MNTDIR=/mnt/usbstick

echo -n "Desea particionar el usbstick y formatearlo (solo es necesario la primera vez) [y/N] : "
read yn
echo ""

if test x"$yn" = xy -o x"$yn" = xY; then
#USB
echo "Warning!!! Estas a punto de borrar el contenido de ${USBDEV}!!!"
echo "Las siguientes particiones se sobreescribiran :"
sfdisk -l ${USBDEV}
echo "Estas seguro de que es tu intencion?"
echo "Presiona ENTER para continuar o CTRL-C para salir."
read user_reply
echo "Espera, preparando ${USBDEV} . . ."
dd if=/dev/zero of=${USBDEV}
sfdisk -q ${USBDEV} << EOF
0,,L,*
;
;
;
EOF
mke2fs -m0 ${USBDEV}1
fi

mkdir ${MNTDIR}
mount ${USBDEV}1 ${MNTDIR}

echo -n "Desea copiar el contenido del directorio ${SOURCE} a ${MNTDIR} (toda la informacion que contenga el directorio se borrara) [Y/n] : "

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
    echo "Borrando el contenido de . . . "
    cd ${MNTDIR}
    rm -rf *
    echo "Copiando ficheros a ${MNTDIR} . . ."

    rsync -a --delete --progress --exclude "*.h" --exclude "etc/bootsplash" --exclude "usr/tmp" --exclude "opt/enemy-territory/etmain/video/*" --exclude "var/cache/*" --exclude "var/db/*" --exclude "var/log/*" --exclude "var/tmp/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ${SOURCE}/ ${MNTDIR}/

    echo "Limpiando la nueva live"
    cd ${MNTDIR}
    rm -rf var/tmp/*
    rm -rf var/run/*
    rm -rf var/lock/*
    rm -rf var/cache/*
    rm -rf var/db
    rm -rf tmp/*
    rm -f etc/mtab
    touch etc/mtab
    rm -rf var/log
    mkdir var/log
    mkdir var/lib/
    mkdir var/lib/dhcpc
    rm -rf usr/portage
    rm -rf etc/portage
    rm -rf usr/share/doc
    rm -rf usr/src/
    rm root/.bash_history
fi

echo -n "Vienes de una live iso? (Esto es para cambiar el contenido de algunos archivos como el fstab para que te monte los archivos como dios manda y el config del grub para que te arranque desde el usb) [Y/n] : "

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
    # Configs del grub
    echo "Modificando el fichero ${MNTDIR}/boot/grub/menu.lst . . ."
    # Si viene de la generacion de un cd de arranque
    sed 's/(cd)/(hd0,0)/g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # Metemos el real_root (reemplazandolo por el cdroot)
    sed 's/cdroot/real_root=\/dev\/sda1/g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # quitamos la paja del squashfs
    sed 's/looptype=squashfs//g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    sed 's/loop=/livecd.squashfs//g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # hacemos el link de grub.conf a menu.lst
    rm ${MNTDIR}/boot/grub/menu.lst
    cd ${MNTDIR}/boot/grub/
    ln -sf grub.conf menu.lst

    # fstab
    echo "/dev/sda1     /     ext2     noatime         0 0" > ${MNTDIR}/etc/fstab
    echo "none         /proc     proc     defaults        0 0" >> ${MNTDIR}/etc/fstab
    echo "none         /dev/shm    tmpfs     defaults        0 0" >> ${MNTDIR}/etc/fstab
fi

echo -n "Desea instalar grub en el arranque de ${USBDEV} (solo es necesario la primera vez) [y/N] : "
read yn
echo ""

if test x"$yn" = xy -o x"$yn" = xY; then
    echo "Instalando Grub . . ."
    grub-install --root-directory=${MNTDIR} ${USBDEV} --recheck
fi

echo "Desmontando ${MNTDIR} . . ."
umount ${MNTDIR}

echo "Tu usb auto-arrancable esta listo."

sábado, junio 24, 2006

Creando una live de gentoo desde gentoo

Desde hace unos años queria hacer una live como servidor dedicado de juegos fps (campus de 2004) y como voy a volver este año a la campus me puse las pilas para ver que tipo de live podia hacer.

Buscando por la red encontre este wiki al que doy gracias a su creador y posteadores ya que este post es basicamente una traduccion obviando las cosas que no he utilizado en mi live y agregando alguna que he utilizado que no aparece en el wiki.

Captura del boot splash


Todos los paso comentados son para ejecutarse como root y el directorio elegido que contendra la livecd se ubicara en /root/livecd

Hay que tener en cuenta que segun las cosas que instalemos vamos a necesitar un minimo de 200 Gb (o mas) para compilar etc... asi que df -h para ver el espacio que hay en /root/

Requerimientos :
emerge -va squashfs-tools cdrtools qemu


Sitio de instalacion del original :
cd ~
mkdir -p ~/livecd/source


Cogiendo packetes basicos
# cd ~/livecd
wget [YOUR FAVORITE MIRROR]/releases/x86/current/stages/stage2-x86-2006.0.tar.bz2
wget [YOUR FAVORITE MIRROR]/snapshots/portage-latest.tar.bz2


Extrayendo el stage
cd ~/livecd/source
tar jxvpf ~/livecd/stage2-x86-2006.0.tar.bz2
mkdir newroot


Extrayendo el portage
cd ~/livecd/source/usr/
tar jxvf ~/livecd/portage-latest.tar.bz2


Preparandonos para hacer el chroot
cd ~/livecd/source
mkdir -p proc dev
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mkdir usr/portage/distfiles
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf


chroot al nuevo entorno
cd ~/livecd/source

Normalmente
chroot . /bin/bash --login

Pero si deseas generar una iso compatible con x86 desde 64 bits seria...
linux32 chroot . /bin/bash --login


Actualizacion del entorno
env-update
source /etc/profile


Obligatorioamente hay que bajarse el systema base
emerge -va system

Por si se ha actualizado algo durante el emerge system (por ejemplo gcc)
emerge -uva world

Yo siempre paso de hacerlo (no por que sea un machote sino por que soy un vago)

Editamos el mapa de caracteres del teclado (/etc/conf.d/keymaps)
Para el tipico español
KEYMAP="es"
SET_WINDOWKEYS="yes"


Muy importante editar el /etc/fstab para dejarlo como sigue
echo "" > /etc/fstab
echo "/dev/loop0 / squashfs ro,defaults 0 0" >> /etc/fstab
echo "none /proc proc defaults 0 0" >> /etc/fstab
echo "none /dev/shm tmpfs defaults 0 0" >> /etc/fstab
echo "none /dev/pts devpts defaults 0 0" >> /etc/fstab
echo "" >> /etc/fstab


Zona horaria de la peninsula iberica
ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime


Modificamos el resto de ficheros en /etc/ que te interese

Instalamos lo que te interese, algunos recomendados son :
emerge -va memtest86+ localepurge genkernel dhcpcd mingetty nano

No tan necesario pero recomendable es el coldplug y nada necesario ni recomendable pero super-chuli es el splashutils con algun tema que os apetedca, eso ya depende de cada uno

Emerge de juegos fps basados en el engine de quake3 (Esto es totalmente necesario :o)
USE="dedicated" emerge -va quake3 quake3-alliance quake3-alternatefire quake3-bfp quake3-brainworks quake3-cpma quake3-data quake3-defrag quake3-matrix quake3-nsco quake3-osp quake3-ra3 quake3-ruinhunters quake3-teamarena quake3-threewave quake3-tremulous quake3-truecombat quake3-urbanterror quake3-wop enemy-territory enemy-territory-etpro enemy-territory-fortress enemy-territory-truecombat


NOTA : localepurge es para limpiar de ficheros sobre configuracion de idioma que no usas el mingetty es para hacer autologin y las splashutils son para arrancar con el framebuffer superchuli que nos tiene acostumbrados las instalaciones de gentoo (es posible que tu lo supieras pero yo no :o)

Modificamos otra vez los /etc/ que nos interese

Actualizamos los servicios requeridos para el arranque red, gdm... depende de lo que os hayamos instalado
rc-update add net.eth0 default


Compilando el kernel genkernel forever
emerge gentoo-sources
genkernel all

Si queremos meterle el gensplash (splashutils)
genkernel --gensplash=[theme] all


Configurando grub
Borramos el link de menu.lst a grub.conf (los sistemas de archivo iso no admiten links) y editamos /boot/grub/grub.conf

Salvo excepciones lo podemos dejar algo parecido a esto
default 0
timeout 30
splashimage=(cd)/boot/grub/splash.xpm.gz

title=LiveCD
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 vga=791 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9

title=LiveCD NO-FB
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9

title=Memtest86+
root (cd)
kernel (cd)/boot/memtest86plus/memtest.bin


Si hemos utilizado gensplash, debemos añadir un par de parametros al kernel
splash=silent,theme:livecd-2006.0 CONSOLE=/dev/tty1 quiet

Asi que la linea de LiveCD del grubconf quedaria algo asin:
title=LiveCD
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 vga=791 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid splash=silent,theme:livecd-2006.0 CONSOLE=/dev/tty1 quiet
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9


Copiamos grub.conf como menu.lst
cp /boot/grub/grub.conf /boot/grub/menu.lst


Si utilizamos mingetty debemos editar el archivo /etc/inittab y reemplazar
c1:12345:respawn:/sbin/agetty 38400 tty1 linux

por
c1:12345:respawn:/sbin/mingetty --autologin root --noclear tty1


tambien editaremos el archivo /sbin/rc y reemplazar
if [ -f "/sbin/livecd-functions.sh" -a -n "${CDBOOT}" ]
then
  ebegin "Updating inittab"
  livecd_fix_inittab
  eend $?
  /sbin/telinit q &>/dev/null
fi

por
if [ -f "/sbin/livecd-functions.sh" -a -n "${CDBOOT}" ]
then
  ebegin "Updating inittab"
  /bin/true #livecd_fix_inittab
  eend $?
  /bin/true #/sbin/telinit q &>/dev/null
fi

si no lo utilizamos, deberiamos poner password al root al menos ejecutando passwd


Nos salimos del chroot con exit

Para generar la iso, ejecutamos el script 02 que he puesto al final que hace mas o menos esto:

Desmontar unidades y actualizar el entorno
cd ~/livecd/source
umount sys proc dev usr/portage/distfiles
env-update
source /etc/profile



Copiar la live a un directorio temporal para limpiarla
rm -rf ~/livecd/target
mkdir ~/livecd/target
cp -a ~/livecd/source/boot ~/livecd/target/
mkdir -p ~/livecd/target/files/source
rsync -a --delete --progress --exclude "var/cache/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ~/livecd/source/ ~/livecd/target/files/source/
cd ~/livecd/target/files/source/
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history



Crea el sistema de archivos squash y la iso
cd ~/livecd/target/files
time mksquashfs source/ ~/livecd/target/livecd.squashfs
touch ~/livecd/target/livecd
rm -rf ~/livecd/target/files
cd ~/livecd/

time mkisofs -R -udf -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 3 -hide-rr-moved -c boot.catalog -o ~/livecd/livecd.iso ~/livecd/target/


Por ultimo, para probar el iso sin necesidad de hacer posavasos
cd ~/livecd/
nice -n 2 qemu -m 512 -cdrom livecd.iso


El -m 512 le dice al qemu que utilce hasta 512 Mb de memoria lo pongo por que al cambiar a la version con gensplash requeria mas que los 128 que te pone por defecto

Cada vez que queramos actualizar cosas o instalar nuevos paquetes he generado dos scripts que son mu sencillos de usar.

Ejecutas el 01-entrar-livecd.sh que te ejecuta los pasos hasta el chroot y ejecutas
env-update
source /etc/profile

(Esto se debe a que no se como continuar la ejecucion del script una vez hecho el chroot)

Haces lo que te venga en gana emerge -va world, emerge nuevos paquetes etc

Te sales del chroot con exit y por ultimo ejecutas el script 02-limpiar-y-crear-livecd.sh


Los dos scripts los pongo a continuacion

# 01-entrar-livecd.sh
# ===================
cd ~/livecd/source
mkdir -p proc dev
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf

echo -n "Vas a generar una live compatible con x86 desde un entorno de 64 bits? [Y/n] : "
read yn
echo ""

echo "No te olvides de ejecutar :"
echo "env-update"
echo "source /etc/profile"
echo ""
echo "Despues de hacer esto ya puedes hacer emerges y demas chorradas"
echo ""
echo "Si es la primera vez que entras en tu live (source) tendrias que hacer emerge como poco de system"

echo ""
echo "Cuando termines y salgas 'exit' ejecuta el paso 02-limpiar-y-crear-livecd.sh"
echo ""


if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
linux32 chroot . /bin/bash --login
else
chroot . /bin/bash --login
fi



# 02-limpiar-y-crear-livecd.sh
# ============================
echo -n "Desea desmontar unidades y actualizar el entorno (solamente es necesario si se hico el chroot) [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Desmontar unidades y actualizar entorno"
cd ~/livecd/source
umount sys proc dev usr/portage/distfiles
env-update
source /etc/profile
fi

echo -n "Desea copiar la nueva live? (esto borrara la live anterior -target-) [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Borrando la live anterior -target-"
rm -rf ~/livecd/target
mkdir ~/livecd/target
cp -a ~/livecd/source/boot ~/livecd/target/
mkdir -p ~/livecd/target/files/source

echo "Copiando la nueva live -desde source a target-"
rsync -a --delete --progress --exclude "var/cache/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ~/livecd/source/ ~/livecd/target/files/source/

echo "Limpiando la nueva live"
cd ~/livecd/target/files/source/
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history
fi

echo -n "Desea crear la nueva live (iso)? [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Creando el live"

echo "Creando el sistema squash"
cd ~/livecd/target/files
time mksquashfs source/ ~/livecd/target/livecd.squashfs

touch ~/livecd/target/livecd
rm -rf ~/livecd/target/files
cd ~/livecd/

echo "Creando el iso"
rm -rf /root/livecd/livecd.iso
time mkisofs -R -udf -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 3 -hide-rr-moved -c boot.catalog -o ~/livecd/livecd.iso ~/livecd/target/
fi

echo -n "Desea probar la nueva live (iso) con qemu? [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Probando live..."
nice -n 2 qemu -m 512 -cdrom ~/livecd/livecd.iso
fi

echo "Finish..."

martes, mayo 23, 2006

Primeros pasos con svg

Estaba yo buscando un icono vectorizado de firefox para hacer una cosilla y al poner vectorial + firefox en google me aparecieron varias cosas que me llamaron la atencion (por supuesto aun no he encontrado el icono vectorizado de firefox).

Por lo visto a partir de la version 1.5 de firefox no solo entiende svg, un estandard para definir dibujos e interfaces bidimensionales, sino que ademas es capaz de jugar con el.

Con inkscape el hacer dibujos vectoriales es un juego de niños y francamente me parece que es una herramienta increible. Ignoro como seran las herramientas de pago como Adobe ilustrator, Freehand, etc... pero os aseguro que para mi, inkscape forever...

Ayer me tire toda la tarde haciendo chorradillas con el inkscape y me lo pase teta... A ver si ahora aprendo un poco de como interactuar con el desde javascript y monto alguna pruebecilla, aun asi debajo teneis un par de enlaces para que os entretengais.

Links de interes :
Dibujo vectorial en firefox
Especulando sobre firefox 2.0
Open Clip Art Library

Solo firefox 1.5 o superior :
Can you put the moon in orbit?
AJAX Drawing 2.0
Lexa-moz667 (mi adorado lexatin)
Oskar The mummy (Un proyecto en mente...)

jueves, abril 27, 2006

Alta definicion con mplayer

Hace poco en casa del pedrin me estuvo enseñando algun video que se habia bajado en alta definicion.... me quede flipadisimo con el tema hasta el punto que para quitarle merito me tuve que beber el 50% de las cervezas que habia en su casa.

Para probar que tal funcionaba el asunto me baje un video que casualmente es un concurso de bikinis en alta definicion.

Lo puse y la calidad es impresionante (tanto del video como de las fembras que aparecen en el) pero se veian unas molestas rayas en las zonas en movimiento... una pequeña putada que no pueda resolver el forero del pedrin.

Si os pasa lo mismo probar con los siguientes parametros para lanzar las pelis :

# mplayer -pp 0x20007f peli
# mplayer -vop pp=fd:c peli
# mplayer -vop lavcdeint peli


A mi el que mejor resultado me ha dado es el -vop lavcdeint el primero me seguia dejando rayas aunque se notaba menos y el segundo te bajaba considerablemente la calidad de la imagen.

Muchas gracias pedrin!!! mi novia no te lo agradece tanto pero yo encantado de poder contarle los pelos a las tias en bikini

Pintar imagenes en c con gtk y con vb en mono

En la Arousa-party que estuvimos hace un par de semanas, "Party intima" donde las haya... mi amigo palomo me enseño este programilla que estaba empezando ha hacer para recuperar la soltura en c que le caracteriza... es un ejemplo pequeñin utilizando las gtk para sacar por pantalla una imagen. Me parecio muy interesante sobre todo por que como ahora me ha dado por monear me va a resultar util para un jueguecin que estoy haciendo... segun tome forma posteare algo sobre el por ahora solo decir que es un wargame basado en reglas de un conocido wargame... (espero no violar los derechos de propiedad intelectual...)

El ejemplo es el que sigue.

Abre una ventana con gtk y pinta una imagen en un widget (o argo asin...)

#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

int main (int argc, char **argv) {
  GtkWidget *window,*imagen;
  GdkPixbuf *pixbuf;
  GdkPixmap *pixmap;
  GdkBitmap *mask;

  gtk_init (&argc, &argv);

  pixbuf = gdk_pixbuf_new_from_file("parodius.png");
  gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &mask, 0);
  imagen = gtk_pixmap_new( pixmap, mask );

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
  gtk_widget_show(imagen);
  gtk_container_add (GTK_CONTAINER (window), imagen);

  gtk_widget_show (window);

  gtk_main ();

  return 0;
}


Simplificando un poquitin saque la forma de hacerlo con mono (ya sabiendo que clases utilizar asin cualquiera ^_^)

Imports System
Imports Gtk

Public Class MainClass
  Public Shared Sub Main ()
    Application.Init ()
    new MainWindow ()
    Application.Run ()
  End Sub
End Class

Public Class MainWindow
  Inherits Window

  Public Sub New ()
    MyBase.New("Mozlot")
    Me.SetDefaultSize (400, 300)
    AddHandler MyBase.DeleteEvent, AddressOf OnMyWindowDelete
    Dim wgImage As Gtk.Widget = New Gtk.Image("imagen.png")
    Me.Add(wgImage)
    Me.ShowAll ()
  End Sub
  Private Sub OnMyWindowDelete (ByVal sender As Object, ByVal a As DeleteEventArgs)
    Application.Quit ()
    a.RetVal = true
  End Sub
End Class

jueves, abril 20, 2006

Por que el rename de mi gentoo es distinto al de mi debian?

Escena 1 (Habitacion de informatico lleno de ordenadores, monitores y diversas fricadas como mascara de darth vader, figuritas de final fantasy, naruto)

Narrador : Erase una vez y una vez que se era un informatico feliz y contento que queria compartir nuevos conocimientos adquiridos.

Jaime : Hey tios, habeis utilizado el comando rename alguna vez para renombrar con patrones?

Pedro y Palomo (al unisono) : No, siempre renombramos a pelo con mv fichero por fichero

Jaime (voz en off) : ¡¡¡Jajajajaja!!! hace unos años esperaba este momento, poder enseñarles una cosa nueva que he aprendido y es util a mis dos senseis de linux... he de saborear este momento....

Jaime (frotandose las manos) : Pues bien, el otro dia tenia multitud de ficheros en el servidor (debian) y como no me apetecia ir uno a uno renombrando con mv se me ocurrio mirar el man del rename. Imaginaros todos estos ficheros

Narrador : (Jaime crea una carpeta con 5 archivos en su ordenador de ocio, gentoo inestable por voluntad propia que le ha llevado mas de una vez al borde de la locura)

Jaime : Es tan sencillo como utilizar regular expresions (como me estoy tirando el moco!!. Llevo años intentando entender las regular expresions y ni pa dios, si lo descubri fue por que lo ponia en el man y a base de ensayo y error) de perl en el primer parametro del rename entre comillas simples y como segundo parametro el patron para seleccionar ficheros.

Narrador : (Jaime teclea rename 's/texto a reemplazar/texto reemplazado/' *.txt ; Y no ocurre nada)

Jaime : mmm debo haber escrito algo mal voy a mirar un documento que tengo en el servidor en el que lo apunte

Narrador : (ssh al servidor mira el documento y esta bien escrito. No obstante vuelve a intentarlo y nada)

Jaime : eeee, a mi me funciono ayer... lo juro por Carmack y por que no saque ningun juego mas de violencia sin sentido jamas

Narrador : (cientos de intentos despues se le ocurre mirar man de rename en la gentoo)

Jaime : JODER!!! es distinto al de debian

Narrador : (Jaime con ganas de llorar, Pedro le arrebata el teclado lee un poco el rename de gentoo y dice...)

Pedro : Si es mas facil rename "texto_a_reemplazar" "texto_reemplazado" *.txt

Narrador : (Logicamente funciono... asi que Jaime dandose de cabezazos jura que a partir de ahora probara las cosas en el equipo de presentacion antes de tirarse un moco como tal :D)

FIN

Vuelta a la normalidad avatares en gaim

Seguro que desde hace la hueva que se pueden utilizar avatares en gaim, pero como yo soy un cazurro de narices me di cuenta hace poquito.
Por ahora solo he visto para cambiar las de las cuentas de msn, pero es bien sencillo, nos diseñamos un avatar tan potito como este :


Ya se que no os va a quedar igual ... es que uno es un dandi ;)

Abrimos gaim y seleccionamos herramientas / cuentas.

Seleccionamos la cuenta msn a la que queremos meter el avatar.

Y donde pone icono de amigo, pulsamos abrir y seleccionamos nuestro maravilloso avatar.

Si alguien sabe como meter el avatar para jabber dentro de gaim que me lo haga saber. Que yo npi.

Espero que os haya servido de alguna utilidad (no hay nada mas importante que dar buena imagen en la red ;)

jueves, abril 13, 2006

Requiem

Ayer por la noche murio mi tia abuela Juanita. Una mujer que siempre nos quiso a todos, ayudaba a sus vecinos, sobrevivio a la guerra civil, siempre tenia buen comer y la verda, era muy coqueta.

Ella siempre rezaba por mi, yo soy ateo nunca se lo dije para no darla el disgusto, pero ahora que se ha ido ya nadie rezara por mi.

Tia espero que me equivoque, que exista dios y que hayas pasado a una mejor vida por que si alguien en el mundo se la merece eres tu.

La vida es una treta para que todos acabemos en el mismo sitio, a veces damos importancia a cosas que no las tienen y desde luego es corta de cojones.