Archive for May, 2007

Instalando Debian Etch en un Portatil Compaq nx6320

Tuesday, May 29th, 2007

Bueno, como parte de mi frustrada perdida de portatil; se me asignó para trabajar una portatil HP Compaq nx6320; dicho portatil es un Core Duo 2.16Ghz con 1Gb de RAM y tarjeta de video intel 945g … he decidido (por ser estandar de la empresa) instalarle Debian Etch pero agregandole ciertos "detalles" Phenobarbital que la haràn distinta del resto de los equipos.

Se procedió a instalar debian etch 4.0 (actual stable) aprovechando algunos repositorios locales como los de la ULA, Gulmer y uno interno de la institución.

La instalación procedio "casi" sin cambios, veremos por qué

Particionamiento:
Luego de un experimento sobre velocidades y rendimiento de los diferentes filesystems (experimento que proximamente publicaré en el blog) decidí cambiar el esquema básico por algo un poco "mas elaborado":
>df -hT
S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext2    450M   16M  410M   4% /boot
/dev/sda6      xfs    9,4G   63M  9,3G   1% /home
/dev/sda8     ext3    1,4G   35M  1,3G   3% /tmp
/dev/sda3      jfs    9,3G  1,4M  9,3G   1% /usr/local
/dev/sda9     ext3    1,9G  729M  1,1G  41% /var
/dev/sda5      jfs     19G  203M   19G   2% /var/lib

Observemos, ejemplo; que boot es ext2 (no necesita journaling y podemos montarla en modo ro (solo lectura)).
sda6 (home) es xfs, buenisimo en velocidad para archivos de distintos tamaños, su velocidad de montaje e indexación es sorprendente
sda8 (tmp) montada como ext3 con algunas opciones mas (nodev,nosuid,noexec,data=writeback) que permiten mejor velocidad de esa particion (y algo mas segura).
sda3 y 5 (var/lib y /usr/local) para archivos grandes, append de datos, manipulacion de registros y un journalist efectivo y ademas con bajo consumo de CPU, JFS es bueno para aplicaciones o para dataspaces de bases de datos como postgresql, mysql u openldap.

Instalaciones de paquetes iniciales:
>aptitude install gcc g++ build-essential libncurses5-dev libglade2-dev

Instalación de Kernel 2.6.21.3

Un equipo de estas características requiere un buen kernel, para ello descargamos el kernel 2.6.21.3:
>cd /usr/src
>wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
>tar xvf linux-2.6.21.3.tar.bz2
>cd /usr/src/linux-2.6.21.3

Se que suena "extraño" querer compilar un kernel a la manera tradicional en un debian, pero me gusta:
Compilar el kernel 2.6.21.3
>make mrproper
>make oldconfig
>make gconfig (requiere gnome) ò make menuconfig (requiere ncurses)

solo verifiquemos que ALSA este activo y en sound > pci devices > intel HD (driver: snd_hda_intel)
lspci:
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 01)

Nota: no he tocado mucho la parte de networking (excepto que no tengo ni red de ATM ni WAN).

make all && make modules && make modules_install && make install
mkinitramfs -o /boot/initrd.img-2.6.21.3 /lib/modules/2.6.21.3

Entrada al grub:

Editar el grub para agregar lo siguiente:
title        Debian GNU/Linux, kernel 2.6.21-3-686
root        (hd0,0)
kernel        /vmlinuz-2.6.21.3 root=/dev/sda2 ro idebus=66 pci=routeirq pci=assign-busses
initrd        /initrd.img-2.6.21.3
savedefault

idebus mejora la velocidad de bus del ide/sata, que por defecto es 33

Reiniciamos y verificamos:
>uname -a
Linux lexotanil 2.6.21.3 #3 SMP PREEMPT Mon May 28 20:46:55 VET 2007 i686 GNU/Linux

Tarjeta inalambrica broadcom:
>aptitude install bcm43xx-fwcutter
ejecutar:
>rmmod bcm43xx
Verifiquen cuando se compilo el kernel que en device drivers > network drivers > Wireless se encuentra el modulo broadcom bcm43xx en modo M (modulo)
>modprobe bcm43xx

Observen que ahora ha iniciado correctamente el driver:
>dmesg
bcm43xx: Microcode rev 0×127, pl 0xe (2005-04-18  02:36:27)
bcm43xx: Radio turned on
bcm43xx: Radio enabled by hardware
bcm43xx: Chip initialized
bcm43xx: 32-bit DMA initialized
bcm43xx: Keys cleared
bcm43xx: Selected 802.11 core (phytype 2)
PM: Adding info for No Bus:hw_random
ADDRCONF(NETDEV_UP): eth2: link is not ready
bcm43xx: set security called, .level = 0, .enabled = 0, .encrypt = 0
SoftMAC: Open Authentication completed with 00:15:79:c3:d0:00
ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready
eth2: no IPv6 routers present

Debian le ha colocado como alias el eth2 (y no wlan0 como en ndiswrapper).

y podemos revisar su status:
>iwconfig eth2
eth2      IEEE 802.11b/g  ESSID:"LANPRO"  Nickname:"Broadcom 4311"
          Mode:Managed  Frequency=2.437 GHz  Access Point: 00:14:78:C2:D9:00
          Bit Rate=24 Mb/s   Tx-Power=18 dBm
          RTS thr:off   Fragment thr:off
          Encryption key:off
          Link Quality=90/100  Signal level=-42 dBm  Noise level=-71 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Adios a Ndiswrapper!!…

Frecuencia de la CPU:
Este equipo tiene 2 cores (nucleos) y podemos manipular la frecuencia de los mismos de manera independiente (obteniendo el mejor equilibrio potencia/ahorro de energia).

en el kernel, en la parte de POWER MANAGEMENT OPTIONS > CPU FRECUENCY SCALING
Activar:
CPU_FREQ > y
Default CPUFREQ Governor > performance
performance governor > y
los otros gobernadores, colocarlos en M
Observen que el modulo Intel Pentium 4 clock modulation (p4-clockmod) debe estar activo.

Luego, editamos en /etc/modules y agregamos:
>vim /etc/modules
p4-clockmod
cpufreq_conservative
cpufreq_ondemand
cpufreq_powersave
cpufreq_stats
cpufreq_userspace
acpi-cpufreq

Probando CPUFREQ:

para ello instalamos el siguiente paquete:
>apt-get install cpufrequtils

y ejecutamos
>cpufreq-set -c 0 -g ondemand && cpufreq-set -c 1 -g ondemand

Si deseamos que sea trabajable desde gnome:
>aptitude install gnome-cpufreq-applet (si no está instalado ya):

>cpufreq-selector –cpu=0 -g ondemand
>cpufreq-selector –cpu=1 -g userspace

y Cargamos los applets en cualquier lado de nuestra barra, sorpresa!, podemos cambiar la frecuencia de cada CPU de manera independiente!

beryl:

Quien no quiere tener beryl en estos dias? … bueno, este equipo viene con una intel 945G que trabaja montando el driver de xorg intel 810
>aptitude install xserver-xorg-video-i810
y en el kernel habiendo activado a i915 como Direct Rendering Manager.

sources de beryl:
editan su /etc/apt/sources.list y agregan estos repositorios de beryl:
deb http://debian.beryl-project.org/ etch main
deb-src http://debian.beryl-project.org/ etch main

agregan la llave gpg de dicho repositorio:
>wget http://debian.beryl-project.org/root@lupine.me.uk.gpg -O- | sudo apt-key add -

Ahora si:
>aptitude update

e instalar:
>aptitude install libcairo2 libcairo2-dev libcairomm-1.0-0 libcairo-perl libmono-cairo1.0-cil python-cairo libgl1-mesa-dev libgl1-mesa-dri libgl1-mesa-glx libglu1-mesa libwxgtk2.4-1 libwxgtk2.6-0 mesa-common-dev mesa-utils libsvn1 libglitz1 libglitz-glx1 libxfont1 libfontenc1 libwnck-common libwnck18 libsvn1

>aptitude install libdrm2 libpng3 libpng12-0 libpng12-dev libxdamage1 libxcomposite1 x11proto-core-dev x11proto-composite-dev 11proto-damage-dev x11proto-fixes-dev x11proto-gl-dev x11proto-render-dev x11proto-randr-dev

y luego instalar beryl:
>beryl-core beryl-plugins-data beryl-plugins emerald beryl-settings beryl-manager beryl emerald-themes beryl-plugins-unsupported

Ahora editar el xorg.conf y modificar las siguientes secciones:

agregar:
Section "Extensions"
    Option "Composite" "Enable"
    Option "RENDER"    "Enable"
EndSection

agregar:
Section "ServerLayout"
Option "AIGLX"     "true"

La seccion device queda:
Section "Device"
    Identifier    "Intel Corporation Mobile 945GM/GMS/940GML Express Integrated Graphics Controller"
    Driver        "i810"
    BusID        "PCI:0:2:0"
    Option "RenderAccel" "true"
    Option “AllowGLXWithComposite” “true”
EndSection

Luego que todo está listo, reinician las X (CTRL+ALT+BACKSPACE) o simplemente reinicien el equipo.
Busquen en: Aplicaciones Gnome > Herramientas de Sistema > Beryl Manager

El Automáticamente cargará en modo Beryl, en su menú emergente pueden cambiar entre metacity (modo gnome por defecto) y beryl.

bluetooth:
Cada vez mas gente tiene equipos con bluetooth, celulares, camaras, ratones!, bueno, nuestro equipo puede "fungir" como un hub bluetooth para enviar y recibir archivos, conectarse a dispositivos, etc.

para ello instalamos:
>aptitude install libopenobex1 openobex-apps bluetooth

y configurar en el applet que emerge llamado "bluetooth manager":

recordemos que en /etc/bluetooth/hcid.conf podemos configurar el passkey de nuestro portatil, aunque por defecto es 1234
>vim /etc/bluetooth/hcid.conf

# Default PIN code for incoming connections
        passkey "1234";

en la seccion device he decidido cambiarle el nombre al dispositivo bluetooth:
# Default settings for HCI devices
device {
        # Local device name
        #   %d - device id
        #   %h - host name
        name "%h-%d";
por:
    name "lexotanil";

reinicio el servicio:
/etc/init.d/bluetooth restart

y verifico que el device esta activo:
>hcitool dev
Devices:
        hci0    00:16:41:C5:5D:10

fijense que el scan puede descubrir el bluetooth de mi celular:
>hcitool scan
Scanning …
        00:12:D1:1C:AB:FF       Jesuslara

Confirmo entonces que el bluetooth funciona.

Lectora SD/MMC:
lspci | grep Mass
Mass storage controller: Texas Instruments 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)

La lectora es una texas instruments, aunque el driver sdhci (con algunos cambios) soporta estos device; el driver TI fue liberado hace poco e incorporado al kernel:

>lsmod | grep tifm

tifm_7xx1              10624  0
tifm_core              10368  1 tifm_7xx1

>modprobe sdhci

para probar si lee correctamente probamos con una mini-SD, una SD y una MMC (no tengo m-stick o una CF):
La mejor forma para probar un dispositivo es usando udevmonitor y esperar a que la lectora SD reaccione ante la inserciòn de un dispositivo:
>udevmonitor

Lo que nos muestra que un device ha sido detectado:
UEVENT[1180404391.828884] add@/devices/pci0000:00/0000:00:1e.0/0000:04:06.2/tifm_sd0:1
UDEV  [1180404391.828884] add@/devices/pci0000:00/0000:00:1e.0/0000:04:06.2/tifm_sd0:1

y luego es montado sin problemas.

GDesklets!

Como conclusión, con algo de esfuerzo hemos personalizado el equipo para que funcione optimamente y tenga los ultimos periquitos técnicos; como por ejemplo: Gdesklets!
>aptitude install gdesklets

En equipos previos a este (como mi Acer Travelmate C314) habia hecho funcionar gran parte del hardware; si me faltó algo por que funcionara, pueden indicarme y procederé a explicar su instalación (claro, si se puede).

Consejo sobre PK en el diseño de bases de datos

Sunday, May 20th, 2007

Estuve leyendo un excelente artículo sobre DB en el siguiente blog : http://grunch.com.ve/2007/05/20/estandarizacion-de-bases-de-datos-postgresql/

y me doy a la tarea de corregir una regla que se indica ahi:
Bueno, creo que esta regla: Toda tabla debe tener un Primary Key, siempre va a ser un campo serial/bigserial con el nombre “id”.
y tomando el ejemplo:
una tabla de facturación (id, nro_factura, cod_empresa…)

Esta regla NO es del todo cierta y "malcria" a los DBA, los hace tercos y perezosos y complica el diseño de capas de datos y gestión de persistencia de datos a los desarrolladores, les explico por que;

Una tabla puede tener un PK (primary Key) que sea igualmente compuesto y ayuda mejor en las consultas (que tener que incluir un serial que no nos ayuda en mucho); si me vas a buscar en una tabla como ejemplo, CNE.electores, es mejor V-13264658 (equivale a electores.nacionalidad, electores.cedula) (que soy yo) que un serial (en la idea de electores.id) 152227276353 es cual no es "naturalmente" correspondiente a mi mismo.

id(mas "underscore" mas "algo") debería ser la forma más optima (y estandar) de nominar los campos PK (o simplemente nominarlos y crear un indice PK) y no simplemente id a secas, en el caso de usar un ID a secas; ¿como haces una tabla de muestreo geográfico cuando las tablas de nivel inferior tienen PK que son la composición de varios indices de sus tablas madre? ej:
pais->estado->municipio->parroquia->sector->barrio

tu caso:
paises.id as id_pais, estados.id as id_estado, municipio.id as id_municipio

ves la parte?

en tu caso, una factura sería id_factura y no id a secas…
quiero el id del producto y el id del cliente de una factura x.

en tu caso, ocurriria que:

SELECT facturas.id as id_factura, clientes.id as id_cliente, productos.id as id_producto FROM facturas
LEFT JOIN productos ON productos.id = facturas.id_producto? (re-denominar el campo?)
LEFT JOIN clientes ON clientes.id = facturas.id_cliente? (re-denominar el campo?)
WHERE
clientes.id = 1 AND factura.id = x AND productos.nombre = 'Igotin'

Moriras usando un alias en los campos y redenominando los campos en los FK de cada tabla, cuando puedes hacer directamente:

SELECT facturas.id_factura, clientes.id_cliente, productos.id_producto FROM facturas
LEFT JOIN productos USING (id_producto)
LEFT JOIN clientes USING (id_cliente)
WHERE facturas.id_cliente = 1 AND facturas.id_factura = x AND productos.nombre_producto = 'Igotin'

Bueno, con que sentencia SQL me teñiré las canas mañana?

Espero les ayude este consejo a denominar "mejor" los campos y sobre todo, los indices primarios.

Cuando la culpa no es del Software

Sunday, May 20th, 2007

Hay gente que toma las cosas personalmente y creen que me meto con las aplicaciones desarrolladas para y por el gobierno, porque tengo alguna tendencia escuálida; pero cuando uno ve cosas como esta:
Error de aplicación encontrado en la página de la Dirección General de la Magistratura:

javax.servlet.ServletException: Cannot create PoolableConnectionFactory, cause: Something unusual has occured to cause the driver to fail. Please report this exception: Exception: java.sql.SQLException: FATAL:  no pg_hba.conf entry for host "192.168.1.227", user "postgres", database "sigefirrhh", SSL off

Cojan consejo: Están conectandose a un servidor PostgreSQL usando el super-usuario en servidores de producción, escalas privilegios y te ganarán acceso a todas las base de datos!; nada más inseguro que eso no puede haber! (capaz y ni le han cambiado el password por defecto (vacio) que viene en debian)

Ahh, pero es que se me olvidaba, su apache-coyote 1.1 no está en debian … o.O … Lotus Domino?, será un solaris? … :P

Te das cuenta que ALGUIEN no está haciendo las cosas como se "deberia" dentro de la administración pública nacional; lo malo es que si te quejas, eres un contrario (ya he recibido muchos malos comentarios por mis opiniones acerca del SENIAT).
Nada más falso que eso, cuando uno dice "no usen tal tecnología" o "hagan uso de estas prácticas" es por su bien, el dia de mañana, chamitos de 16 años (o peor, algún país extranjero) les tumbarán los servidores, les harán un "defacing" y ustedes dirán que la culpa "no fue de ustedes".

Nunca culpes a las aplicaciones, culpa a quienes las implementan, eso es todo …