Archivos Mensuales: mayo 2007

Instalando Debian Etch en un Portatil Compaq nx6320

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 0x127, 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

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

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? … 😛

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 …

Alguien que es como mi madre! …

Como buen regalo de día de las madres…

Como confirmación de ser la gran doña del Software Libre, algún ser solitario decidió buscar en google "Alguien que es como mi madre" …

Busqueda en google

Y quien mas puede ser como tu madre que …

"Phenobarbital con soda! …"

Aqui la confirmación de la búsqueda …

Gracias Google por ese hermoso regalo de día de las madres!! …

xD

Experimento con datos: migrando a postgreSQL (tercera parte)

Migrar datos desde mySQL hasta postgreSQL no es tan dificil, es sumamente facil; lo engorroso es en la DDL (data de definición), los CREATE TABLE son algo distintos en postgreSQL que en mysql, pero eso es algo que podemos solventar.

Migración de CNE desde mySQL hasta postgreSQL:
conectamos a mysql:
>mysql -u root -p
ejecutamos la conversion de sintaxis a ANSI postgresql:
mysql>set sql_mode = ‘ANSI,ANSI_QUOTES,IGNORE_SPACE,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_ZERO_DATE,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES’;
Query OK, 0 rows affected (0.00 sec)

usamos la base de datos CNE y consultamos la estructura de cada tabla:
mysql>use cne

mysql>show create table maisanta;

CREATE TABLE "maisanta" (
  "cedula" int(10) NOT NULL,
  "nacionalidad" char(1) NOT NULL,
  "nombre" varchar(128) NOT NULL,
  "cod_centro" int(10) NOT NULL,
  "direccion" text,
  "fecha_nac" date default NULL,
  "opositor" tinyint(1) unsigned NOT NULL default ‘0’,
  "telefono" varchar(50) default NULL,
  "abstencion" tinyint(1) unsigned NOT NULL default ‘0’,
  "firma_valida" tinyint(1) unsigned NOT NULL default ‘0’,
  "firma_rechazada" tinyint(1) unsigned NOT NULL default ‘0’,
  "fallecido" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_patriota" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_ribas" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_vuelvan" tinyint(1) unsigned NOT NULL default ‘0’,
  "contra_opo" tinyint(1) unsigned NOT NULL default ‘0’,
  PRIMARY KEY  ("cedula","nacionalidad"),
  KEY "idx_cedula" ("cedula")
)

debemos convertir todos los campos ANSI a campos PostgreSQL (si hubieran auto_increment, pasarlos a serial, los tinyint(1) a int2 y crear un constraint con cedula.

asi queda en postgresql:
tabla maisanta:
CREATE TABLE maisanta
(
  cedula int4 NOT NULL,
  nacionalidad char(1) NOT NULL,
  nombre varchar(128) NOT NULL,
  cod_centro int4 NOT NULL,
  direccion text,
  fecha_nac date,
  opositor int2 NOT NULL DEFAULT 0::smallint,
  telefono varchar(50),
  abstencion int2 NOT NULL DEFAULT 0::smallint,
  firma_valida int2 NOT NULL DEFAULT 0::smallint,
  firma_rechazada int2 NOT NULL DEFAULT 0::smallint,
  fallecido int2 NOT NULL DEFAULT 0::smallint,
  mision_patriota int2 NOT NULL DEFAULT 0::smallint,
  mision_ribas int2 NOT NULL DEFAULT 0::smallint,
  mision_vuelvan int2 NOT NULL DEFAULT 0::smallint,
  contra_opo int2 NOT NULL DEFAULT 0::smallint,
  CONSTRAINT maisanta_pkey PRIMARY KEY (cedula, nacionalidad)
)

la tabla electores queda asi:
CREATE TABLE "electores" (
  "nacionalidad" char(1) NOT NULL default ‘V’,
  "cedula" integer NOT NULL default ‘0’,
  "nombre" varchar(128) default ”,
  "cod_elector" varchar(50) default ‘0’,
  "fecha_nac" varchar(25) default ”,
  PRIMARY KEY  ("nacionalidad","cedula"),
  UNIQUE ("nacionalidad","cedula")
)

Ahora tenemos ambas tablas (electores y maisanta) creadas e indexadas en postgreSQL y en mySQL.

Ahora toca exportar los datos:
>mysqldump -uroot -p -c –compatible=postgresql –skip-opt -t -n cne > cnedump.sql

Hay que tomar en cuenta que ambos comandos toman tiempo (bastante tiempo); estamos hablando que maisanta cuenta con 12 millones de registros y electores del cne cuenta con 16 millones de registros.

Como verán, podemos exportar los datos en una forma casi "compatible" con postgreSQL; posteriormente respaldamos estos datos en postgreSQL:
>psql -U postgres < cnedump.sql
y posteriormente ejecutar el VACUMM ANALIZE
>vacuumdb -a -z

Tambien es posible pasar directamente un backup a postgreSQL sin necesidad de un archivo intermedio usando pipes:
>mysqldump -uroot -p -c –compatible=postgresql –skip-opt -t -n cne | psql -U postgres cne

Ahora, contaremos con dos bases de datos de grandes dimensiones para hacer los benchmarks respectivos (a priori, por el volumen de los datos, apuesto por postgreSQL, pero pueden haber sorpresas).

Notas informativas: Los originales CSV del CNE vienen de una DB posiblemente MS SQL Server u Oracle, el charset es bastante extraño y tiende a corromper algunos registros cuando lo llevas a UTF-8 tanto en mySQL como en postgreSQL.  (nota: cuando aprenderan?).

A la hora de la publicación de este artìculo todavia se estaban pasando los 16 millones de registros a postgreSQL, cuando terminen, realizaré y publicaré la cuarta parte, respuestas de consultas y operaciones con los datos.

Espero termine hoy … 😛

Experimento con datos: y ahi viene Maisanta! (segunda parte)

En uno de esos buhoneros especializados en IT del centro de caracas encontramos la DB maisanta; ella viene de un horrible DBF que ha sido llevado a la forma separada por comas (archivo CSV) y para cargarlo simplemente ejecutamos desde consola de mysql el siguiente comando:

>mysql -u root -p

y nos conectamos a la db CNE creada en el acpitulo 1:
mysql>use cne

crear la tabla maisanta:
mysql>CREATE TABLE `maisanta` (
  `cedula` int(10) NOT NULL,
  `nacionalidad` char(1) NOT NULL,
  `nombre` varchar(128) NOT NULL,
  `cod_centro` int(10) NOT NULL,
  `direccion` text,
  `fecha_nac` date default NULL,
  `opositor` tinyint(1) unsigned NOT NULL default ‘0’,
  `telefono` varchar(50) default NULL,
  `abstencion` tinyint(1) unsigned NOT NULL default ‘0’,
  `firma_valida` tinyint(1) unsigned NOT NULL default ‘0’,
  `firma_rechazada` tinyint(1) unsigned NOT NULL default ‘0’,
  `fallecido` tinyint(1) unsigned NOT NULL default ‘0’,
  `mision_patriota` tinyint(1) unsigned NOT NULL default ‘0’,
  `mision_ribas` tinyint(1) unsigned NOT NULL default ‘0’,
  `mision_vuelvan` tinyint(1) unsigned NOT NULL default ‘0’,
  `contra_opo` tinyint(1) unsigned NOT NULL default ‘0’,
  PRIMARY KEY  (`cedula`,`nacionalidad`),
  KEY `idx_cedula` (`cedula`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=1;

y posteriormente cargamos la data:
mysql>LOAD DATA LOCAL INFILE ‘/home/webapp/repdbf.txt’
IGNORE INTO TABLE maisanta FIELDS TERMINATED BY ‘;’
        ENCLOSED BY ‘\”
LINES TERMINATED BY ‘\n’ STARTING BY ”
(cedula, nacionalidad, nombre, cod_centro, direccion, @fecha_tmp, opositor, telefono, abstencion, firma_valida, firma_rechazada, fallecido, mision_patriota, mision_ribas, mision_vuelvan, contra_opo)
SET fecha_nac = DATE_FORMAT(@fecha_tmp, ‘%Y-%m-%d’);

Observen 2 cosas; primero, tarda un buen rato (aprox. unos 10 minutos si tu mysql está bien "tuneado"), lo otro, es que la fecha esta en formato latino (dia/mes/año) y no en formato ansi (año-mes-dia) vean que puedo adicionalmente pre-procesar los campos antes de ser insertados, en este caso, convertir el campo fecha_nacimiento a una forma ANSI.
ahora, probamos que la data ha cargado correctamente:
mysql> select count(cedula) from maisanta;
+—————+
| count(cedula) |
+—————+
|      12394109 |
+—————+

1 row in set (0.00 sec)

Si me faltó algun registro; bueno, cosas de andar convirtiendo desde esa horrible cosa que es JosPro (lease: Visual Publisher para Windows y compañia).

fijense que la tabla tiene una muy buena respuesta:
mysql> select nombre, fecha_nac from maisanta where cedula = 13264658 and nacionalidad = ‘V’;
+———————————+————+
| nombre                          | fecha_nac  |
+———————————+————+
| LARA GIMENEZ JESUS IGNACIO JOSE | 1978-10-23 |
+———————————+————+

1 row in set (0.09 sec)

Lo cual prueba que la indización se ejecutó correctamente, sino; ejecuten el myisamchk en la db:
>myisamchk -f -p /var/lib/mysql/data/cne/*.MYI

y todo listo.

Ahora, pasaremos todo esto a postgreSQL.

Un experimento con datos: Base de datos del CNE (parte 1)

vamos a realizar un triple experimento; en este caso, vamos primero a migrar la tabla de electores del CNE a mysql, para ello contamos con el acceso publico a los CSV (archivos coma-separados) de todos los electores de las pasadas elecciones presidenciales; para ello debemos descargar de la siguiente página:

http://www.cne.gob.ve/int_generacion_re/definitivo_05oct/index.html

Migración de archivos CSV a mySQL:
Descarga:
una serie de archivos coma separados, comprimidos en zip, uno por estado; como es bastante engorroso trabajar de uno en uno, entonces simplemente procedemos a unificarlos.

Primer paso, normalización:
En primer lugar, los CSV estan en iso (aunque pareciera UCS de Oracle), los archivos vienen divididos en estados; procedemos a conjugarlos en un unico archivo de la siguiente manera:
creo una carpeta CNE y descargo todos los archivos ahi:

>mkdir cne && cd cne

descomprimimos todos los archivos:

>unzip *

y procedemos a unirlos en un solo archivo:

>cat * > datacne.csv

Segundo paso: creación de la DB y las tablas:
nos conectamos y creamos la db CNE:

>mysql -u root -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.33-log Source distribution

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql>create database cne;

y la usamos:

mysql> use cne

ahora, creamos la tabla de registros del CNE:

mysql>CREATE TABLE `electores` (
  `nacionalidad` char(1) NOT NULL default ‘V’,
  `cedula` int(8) NOT NULL default ‘0’,
  `nombre` varchar(128) default ”,
  `cod_elector` int(50) default ‘0’,
  `fecha_nac` datetime default NULL,
  PRIMARY KEY  (`nacionalidad`,`cedula`),
  UNIQUE KEY `idx_venezolano` (`nacionalidad`,`cedula`),
  KEY `idx_cedula` (`cedula`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;

Observe que hemos creado un index unico llamado idx_venezolano, que incluye:
UNIQUE KEY `idx_venezolano` (`nacionalidad`,`cedula`)
Esto mejora notablemente las busquedas por cedula y nacionalidad.

Tercer paso: carga de datos:
y procedemos a cargar el archivo del cne arriba unificado:

mysql>LOAD DATA LOCAL INFILE ‘/home/webapp/datacne.csv’
IGNORE INTO TABLE electores
FIELDS TERMINATED BY ‘;’ ENCLOSED BY ”
LINES STARTING BY ” TERMINATED BY ‘\n’
IGNORE 2 LINES
(nacionalidad, cedula, nombre, cod_elector, @fecha_tmp)
SET fecha_nac = DATE_FORMAT(@fecha_tmp, ‘%Y-%m-%d’);

El ignore 2 lines es porque vienen con un horrible encabezado que hubo que removerlo de cada archivo CSV.

cuando haya cargado, probamos que han cargado los registros:

Cuarto paso: prueba de carga:

mysql> select nombre, fecha_nac from electores where cedula = 13264658;

+———————————+———————+
| nombre                          | fecha_nac           |
+———————————+———————+
| LARA GIMENEZ JESUS IGNACIO JOSE | 1978-10-23 00:00:00 |
+———————————+———————+

1 row in set (0.12 sec)

Ahora, vamos por la otra tabla.

Y si preguntan por mi hackergotchi!

Un embuste 2.0

Tal vez algunos de ustedes recibieron un correo que decia algo como:

Tienes que echarle un ojo a mi nuevo vicio.
Estoy tan seguro de que te va a gustar que te he registrado…sólo falta tu confirmación!

http://us1.badoo.com/phenobarbital/in/104063

Ya me cuentas! 😉

Jesus Lara

Esta invitación ha sido enviada con fecha 7/05/07 21:57 a Perico de los palotes <pericopalotes@gmail.com > a petición de Jesus Lara <jesuslarag@gmail.com>.
Si no deseas recibir más mails nuestros, haz clic aquí.

Apenado, les explicaré la situación:

Una "amiga" me comentó de una interesante aplicación web 2.0 para redes sociales que apuntala mucha de su interfaz gráfica a AJAX, de manera interesante y por gran curiosidad decido inscribirme y probar su aplicación; se llama "badoo.com" y es supuestamente una comunidad virtual de perfiles de usuario para que cada quien se describa y diga como es …

Aqui viene lo interesante, la aplicación (como muchas otras, hi5, etc) solicita un mail para que "invites" a tus "amigos" a la nueva comunidad, a diferencia de otros scripts de este tipo donde te presentan la lista de direcciones y tu decides a quien invitar; los seres inventores de esta aplicación se les ocurrió hacerlo de manera automática!, es decir, tomar tooodas mis 500 direcciones y como buen spam, hacerselas llegar a mis jefes, colegas, mi madre, mi hermano en europa, a la infanta helena y como no, a perico de los palotes.

Sin permiso de mi parte (no hay licencia legal que lo permita) convierten mi dirección en un fuerte emisor de spam publicitario de su comunidad y para colmo, al parecer lo venden a otras listas!, porque mi spam se ha mulplicado por 10 desde que estoy suscrito a ellos.

Para colmo de males, estética y de interface estan gachos, interfaces poco intuitivas y javascripts de gran peso hacen dificil la aplicación incluso en un core duo (el exceso de ajax es malo, siempre); no hay muchos botones y a veces no hay forma de conseguir como hacer las cosas.

Para peor colmo, al igual que match y otras comunidades deshonestas, el 70% de los lindos y hermosos cuerpos que se ven en los perfiles son falsos; en una revisión rápida me encontré con cientos de perfiles donde los datos eran falsos (extraidos de gmail o de algunas comunidades vecinas como hi5) y las fotos eran afamadas actrices porno.

O sea, gracias a Dios y estoy en Linux, porque si hubiera estado en winDOS, capaz y hasta me instalan un troyano …

Todo sea por tener 6 millones de usuarios, asi sean falsos … xD

Ortodoncia al Software Libre

Luego de leer los posts de Octavio Rossell y Gregory Aular sobre un asunto bastante controversial como es traer a Richard Stallman a Venezuela, considero pertinente lanzar algunas palabras al respecto:
Se trata de arar en el mar, de combatir molinos, puede ser gracioso; si, y tema de muchas novelas; pero inútil en el ámbito tecnológico y social, saben por qué no participo más activamente en movimientos de SL como otras personas?; posiblemente sea porque mis convicciones son distintas, tal vez el grupo de usuarios que espero no ha nacido todavia; tal vez este tipo de peleas y discusiones sobre si mi distro es mas linda o la otra más potente me llenan de asco hasta los tuétanos, tal vez sea porque programe en .NET o porque a la hora que hacen los eventos veo Cartoon Network; no sé y a la gente allá afuera simplemente NO LE INTERESA y no LE DEBERIA importar; es simple y llanamente que somos una sociedad de individuos interactuando juntos, no una globalidad de simios que deben tener el mismo criterio y ser cortados con la misma tijera; estamos hablando de individuos participativos, no de redes de zombies.

La cuestión prima en el mundo actual es unificar tecnología con acciones sociales y además, satinarlo con ideas y parcialidades políticas; ya no es solamente el criterio técnico de si uso xinetd o inetd, deb o tar.gz, apt o synaptic; es una cuestión que incluye creencias filosóficas, ideas de como se deben hacer las cosas, cuando y sobre todo por qué; y a fín de cuentas todos somos individuos únicos que responde unívocamente a estas preguntas; sino, somos títeres que nos dejamos llevar por la opinión del momento.
uff, que bueno es python on ice …

Estas discusiones nunca llevarán a ningún lado si cada quien sigue diciendo que "las cosas se hacen libres, pero como yo digo"; considero pertinente indicar que muchas veces he estado en contra de algunas ideas que mister RMS ofrece a la comunidad, tal vez sea porque pertenecemos a dos movimientos políticos distintos (el hecho que los estudiantes de programación lean los libros de linguistica de Chomsky no significa que crean en sus ideas de relativismo cultural), o tal vez sea porque muchas veces sus ideas han estado en contra de algunas ideologías políticas o sociales que manejo; sin embargo, allá afuera hay millones de personas, no todas quieren ser anarquístas utópicos como yo; otros quieren ser social cristianos, demócratas, chiitas o defensores del kurdistan; bien por ellos, los felicito por defender su diferenciación cultural, política e identidad étnico-religiosa; pero que ellos no se atrevan de manera absolutista objetar mis creencias, porque igualmente yo objetaré las suyas y realmente no es lo que queremos…

simplemente, queremos vivir en paz …

Si estas en contra de RMS, tal vez por como lleva a FSF, como toma acciones o como le pone nombre a las cosas o simplemente por la horrible voz que tiene para cantar; entonces simplemente ignoralo, toma tu camino y alejate de él.

simplemente defiende tu creencia de ataques, no ataques con tu creencia.

Hacer una protesta porque RMS llama a Linux GNU/Linux es como protestarle a los musulmanes que llamen a su dios Alá y no Dios.
y donde queda Visnú? …

La libertad que debe reinar en las sociedades del conocimiento libre es simple, toma tu lado y defiendelo, tienes la posibilidad de irte a cualquier parte y de creer en cualquiera, si no crees en ninguno, puedes crear tu propia filosofía, que varios como tú se unirán, no pidas unificación de criterios; estas cayendo en los terrenos del absolutismo y del talibanismo ideológico; yo no he obligado a nadie a usar Debian o Fedora, que nadie me obligue a usar Slackware o Gentoo, eso simplemente quiero.

A Gregory Aular: te encanta la idea de un Dios magnánimo llamado Patrick, que llena al S.O de cosas no GPL solo porque a EL le da la gana, porque el es el señor y la vida y una palabra suya bastará para instalar slackware?; bueno, bien por ti, pero no nos migres sus ideas absolutistas a los demás, que yo prefiero una distro mundana sin tanta organización y mucho menos sin tanta burocracia, algo como sabayon Linux.

A Octavio: a mi sinceramente no me gusta llamar al sistema GNU/Linux, entonces simplemente hago como Torvalds, lo llamo Linux a secas y sin apellidos,  sabes cuantas veces aparece la palabra GNU en la página principal de kernel.org?, 2 veces … y eso para describir el compilador, no a Linux.
Por ende, todos tenemos la libertad de escoger como queremos llamar a las cosas, como describirlas, como usarlas, de eso se tratan las reglas de la libertad y del conocimiento libre, no ejerzamos pues, acciones contrarias a llevar a la gente SOLO por el camino que nos gusta.
Te guste o no, el mundo funciona así … y me gustaría que siguiera funcionando así … el dia que no, me convierto en V of Vendetta y me pongo a matar facistas facinerosos.

Me parece pues que ya está bueno de guerras estúpidas sobre quien hace mejores eventos, viejos rencores sobre viejas organizaciones y viejas ideas pasadas de moda; que trabaje cada quien en su ámbito, en su área, con sus ideas en mano y deje de estar molestando las actividades e ideas de los demás, si vamos a llegar al nivel del boicot (los de unplug van a poner graffittis en los eventos de velug sabotearán los invitados de unplug que a ellos no le gusten) entonces mejor nos inscribimos todos en el Sinn Fein y creamos alas terroristas muy al estilo IRA y nos pasamos de atentado en atentado, les parece cool la idea?.
Tengo varios planos de bombas de fertilizante si les interesa …

Concluyo esperando que cada uno reflexione, tome conciencia de la posición en la que se encuentran, no son los chamitos de la esquina peleando por quien va a lanzar las chapitas y quien va a batear; tienen bajo ustedes grandes comunidades con miles de personas y sus actitudes de una u otra forma se filtran hacia abajo de la red creando y heredando un conflicto que ni nos compete ni nos interesa asumir.
Simple y claro, si siguen con esas actitudes de niños de quien recibió el mejor regalo de niño Jesús, dense por enterado que renuncio a cualquier participación de cualquier evento donde sus figuras públicas aparezcan (lease JUSOL, FLISOL, CNSL, etc) y ni se molesten en llamarme.

Al fin y al cabo, prefiero una vida tranquila y disipada, yendo de lugar en lugar migrando al Software Libre en distintas áreas donde he estado y colaborando (Mercal, IND, Ministerio Público, FUNDACITE, UNEXPO, UCLA, etc) y sin tanta alaraca publicitaria "miren, miren, migre un PC!, migre un PC!!! … ", que estar todos los días escuchando sus estupidas discusiones en público.

cada quien que asuma su ortodoncia a su manera …

PD: es como digo yo coño! … xD

A %d blogueros les gusta esto: