31 de enero de 2010

27 de enero de 2010

Copia diferencial de memoria USB al disco duro C:


Este es un archivo de ejecución por lotes en MS-DOS, o ejecutable .bat, que copia los archivos y directorios nuevos y/o modificados desde la última copia de seguridad de la memoria USB al disco duro C:
Un backup diferencial sencillito:

echo off
cls
echo.

echo ---------------------------------------
echo Programeja .bat que hace una

echo copia de usb/TS al disco duro c:
echo ---------------------------------------
echo (c)by pp))2010
echo.

set usb=%CD:~0,2%
echo.

echo -------------------Comprueba-el-disco-----
dir %usb%

echo ------------------------------------------
echo.

echo Haciendo copia de seguridad de %usb:~0,1%:\ a C:\USB-BCK
pause

xcopy usb:~0,1%:\ C:\USB-BCK\ /D /E /H /Y /K


echo.
echo Copia terminada ...!!!

pause

exit
Lo tengo en un archivo usb-bck.bat en el USB y lo ejecuto para hacer o actualizar la copia de seguridad al ordenador donde este conectada la memoria.
No borra en la copia C:/ los archivos que elimines o renombres en el USB.

ref.:
Variables de entorno de MS-DOS
Extraer caracteres de variables MS.DOS

Ay!! que recuerdos de unos comandos y unos tiempos que nunca volveran gracias a linux, o sí, nunca se sabe.

25 de enero de 2010

MySQL: Presentar parte de un campo


Presentar los 15 caracterss por la derecha o por la izquierda del campo2 en una base de datos de creada en MySQL:

SELECT campo1 LEFT(campo2,15), campo3 ... FROM tablaname; SELECT campo1 RIGHT(campo2,15), campo3 ... FROM tablaname;

En PostgreSQL esta función NO funciona.

Separar campos con awk


Para extraer palabras a modo de campos separados por espacios de una línea de texto con awk:

awk '1{print $1, $2, ... $n}'


Separados por tab

awk -F'\t' '{ print $3 }'

24 de enero de 2010

Bases de datos MySQL distribuidas en memoria USB


Supongamos que tenemos un servidor enanísimo (micra) y que además le hacemos currar de lo lindo teniendo que atender consultas PostgreSQL y MySQL de forma contínua además de muchas otras cosas.
Esto hace que tenga que acceder al disco constantemente ...

Se me ocurrió que se podría alojar físicamente la base de datos más consultada en una memoria usb, de este modo tal vez perdería algo de velocidad de busqueda pero optimizaría recusos del sistema al buscar y escribir datos en dispositivos diferentes.

Receta:
  1. Formateo USB con sistema de ficheros ext3
    # mkfs.ext3 /dev/sda1*

  2. Montamos en USB:
    # mount /dev/sda1 /mnt/USB_512MB

  3. Copio directorio y sus archivos con sus cracterísticas y permisos al USB
    # cp -rpf /var/lib/mysql/basededatos /mnt/USB_512MB/

  4. Borrar (o mejor mover hasta ver que todo funciona) el antiguo directorio de la base de datos en /var/lib/mysql
    # mv /var/lib/mysql/basededatos /backup/basededatos

  5. Hago un enlace simbólico del directorio de antiguo de la basesdedatos al nuevo de USB.
    # ln -s /mnt/USB_512MB/basededatos /var/lib/mysql/basededatos

  6. Cambiar el propietario del enlace simbólico a mysql:mysql
    # chown -h mysql:mysql /var/lib/mysql/basededatos

  7. Reiniciamos MySQL
    # /etc/init.d/mysql restart

  8. Realizamos una consulta SQL de prueba a basededatos ... y ... vemos como parpadea la lucecita del USB.

  9. Hay que tener cuidado que el USB este montado en punto de montaje correcto cuando se conecte o se reinicie el sistema, lo mejor es configurar fstab.

Mediante el uso de enlaces simbólicos también se puede tener bases de datos transportables en un pendrive USB pudiendo usarlas en varias máquinas.

Y de igual modo se puede distribuir físicamente bases de datos en varios discos duros del sistema optimizando el rendimiento.

Ref.:
Cambiar ruta de datos de MySQL

-------------------------------------------------------
... y para PostgreSQL,
¿Donde almacena los datos PostgreSQL?, pues en
/var/lib/postgresql/8.3/main/
Pero aqui esta toda la información junta de todas las bases de datos psql!!!
Cambiar la ubicación de mis bases de datos postgres 8.1

???
en construcción...

Condicional if grep


#!/bin/bash
if grep -q textoabuscar archivo
then
echo "texto esta en el fichero"
else
echo "texto NO esta en el fichero"
fi
exit 0


Ref.:
if condition and grep

MySQL: Contar registros


3.3.4.8. Contar registros

Una pregunta frecuente que deben responder las bases de datos es: “¿qué tan a menudo aparece en la tabla un cierto tipo de dato?” Por ejemplo, se podría querer averiguar la cantidad de mascotas de que se dispone, o cuantas mascotas tiene cada propietario, o varios otros recuentos sobre los animales.

Contar la cantidad total de animales es la misma pregunta que “¿cuántos registros hay en la tabla pet?”, ya que hay un registro por mascota. COUNT(*) cuenta el número de filas, por ello, la consulta para contar animales luce así:

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

Anteriormente se recuperaban los nombres de la gente que poseía mascotas. Se puede usar COUNT() para hallar cuantas mascotas tiene cada propietario:

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+

Observe el uso de GROUP BY para agrupar todos los registros de cada propietario. Sin dicha cláusula, todo lo que se hubiera obtenido sería un mensaje de error:

mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),
COUNT(),...)
with no GROUP columns is illegal if there is no GROUP BY clause

COUNT() y GROUP BY son útiles para presentar datos en varias formas. Los siguientes ejemplos muestran diferentes operaciones:

Cantidad de animales por especies:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+

Cantidad de animales por sexo:

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+

(En esta salida, NULL indica "sexo desconocido")

Cantidad de animales por combinación de especies y sexo:

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY
species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+

No es necesario examinar una tabla entera cuando se emplea COUNT(). Por ejemplo, la consulta anterior, se podria limitar a perros y gatos de esta manera:

mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = 'dog' OR species = 'cat'
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+---------+------+----------+

O si desea la cantidad de animales de cada sexo contando solamente los que tienen sexo conocido:

mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+

Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

21 de enero de 2010

Inkscape y tablet Wacom Graphire4


La tableta wacon Graphire4 no me funciona bien con Inkscape en Windows XP poffesional , puedo acceder a las herrmientas del menu pero no puedo dibujar sobre el lienzo, ...??? .

1) Mi actual driver para la tableta wacom es el: 4.90-3
Instalo el 4.97-6 wacom driver
y ... NO soluciona el problema, parce más una cuestión de configuracion del Inkscape.

2) Cambio la configuración de Inkscape:
Menú Archivo/Preferencias de Inkscape ...
Desactivar la opción: Utilizar una tableta sensible a pa presión.
Reinicio Inkscape y ... la tableta wacom FUNCIONA sin problemas.


Lo que ha veces me ocurre es que inkscape no siempre salva esta configuración, desconozco la causa o si es un bug, y hay que volver a configurar la opción y reiniciar el programa.

Variables interpoladas en BashScript



Si queremos definir el nombre de una variable usando otra variable ... !!!
Lo podemos hacer con eval y llaves $ { }

Un ejemplo:
#!/bin/bash
#####################################################
# (C)by pp 2010 for www.misnotaslinux.blogspot.com #
#####################################################

for TIPO in http socks4 socks5
do
eval ${TIPO}_TXT=1
echo "---------------"
echo "http_TXT="$http_TXT
echo "socks4_TXT="$socks4_TXT
echo "socks5_TXT="$socks5_TXT

http_TXT="" ; socks4_TXT="" ; socks5_TXT=""
done
echo "---------------"
exit 0

Ref:
Variable within a variable name
Introducción a las variables y parámetros

17 de enero de 2010

Dibujo Vectorial


Herramienta GNU para Dibujo Vectorial: Inkscape


Inkscape: Tutorial Básico
Inkscape: Tutorial Avanzado
Inkscape: Tutorial Caligrafía

MySQL: Comandos básicos de la consola mysql


mysql> STATUS;

mysql> SHOW DATABASES;

mysql> USE databasename;

mysql> SHOW TABLES;

mysql> DESCRIBE tablename;

mysql> QUIT;

mysql> CREATE DATABASE databasename;

mysql> DROP tableordatabasename;

mysql> CREATE TABLE tablename (campo1 tipo características, campo2 tipo características, ...);

mysql> INSERT INTO tablename (field1, field2, field3 ... )
values ('data1', 'data2', 'data3', ...);

mysql> SELECT * FROM tablename WHERE field1="data";

mysql> SELECT COUNT(*) FROM tablename WHERE field1="data";

mysql> DELETE FROM tablename WHERE fieldname="data"

mysql> DELETE FROM tablename;

Ejecutar sentencias mysql desde la línea de comandos:
mysl -u [usename] -D [databasename] -p(pasword) -e "mysql_commands;"



Almacenar direcciones IP en MySQL y PostgreSQL

En PostgreSQL está el tipo de variable "net", especial para direcciones ip en formato octal.
Pero en MySQL no he encontrado este tipo de variable.

De modo que en MySQL el campo para almacenar una dirección ip pueden ser una variables del tipo: varchar(15)

ip=xxx.xxx.xxx.xxx = max. 15 caracteres.

En MySQL la transformación de octal a decimal parece sencilla, pudiendo almacenar y trabajar con la direcciones ip de forma decimal:

The best way to store an IP addresses in a RDBMS is by converting it into an INT.
MySQL is especially nice because it will do the conversion between INT and
dotted quad for you.
See the INET_ATON and INET_NTOA functions.
You'll find queries like this all over in my code:
SELECT INET_NTOA(ip) from ips;
or
INSERT INTO ips SET ip=INET_ATON('1.1.1.1');

http://dev.mysql.com/doc/refman/5.1/en/char.html

Otro ejemplillo:

mysql> select INET_ATON('100.100.100.100');
+------------------------------+
| INET_ATON('100.100.100.100') |
+------------------------------+
| 1684300900 |
+------------------------------+
1 row in set (0.00 sec)

mysql> select INET_NTOA(1684300900);
+-----------------------+
| INET_NTOA(1684300900) |
+-----------------------+
| 100.100.100.100 |
+-----------------------+
1 row in set (0.00 sec)


MySQL: Instalación en debian


  • Instalar paquetes debian de MySQL y MySQL-Admin (consola para manejar mysql)

#aptitude install mysql-server mysql-admin

  • Para acceder a la consola mysql:

# mysql -u root -p
passsword: xxxx
mysql>

  • PhpMyAdmin es aplicación gráfica para la gestion remota de bases de datos de MyQSL basada en PHP y que se puede acceder con el navegador web. Hay que tener instalado PHP y Apache2:

# aptitude install phpmyadmin

Para acceder desde el navegador Firefox
http://(ip)/phpmyadmin


Google public DNS server


Una de las cosas que nunca consigo recordar son las direcciones DNS, aunque si se me olvida esta de Google tendré que empezar a preocuparme ...

8.8.8.8
8.8.4.4

ref.: Google Public DNS Servers Launched

Update: Despues de probarlo y usarlo como forwarders en la configuración de bind9 como DNS cache de mi servidor micra ... va MAS LENTO que las DNS de telefóñica:
80.58.61.250
80.58.61.254

Para probarlo que mejor que usar dig:
# dig @8.8.8.8 www.google.com
...
;; Query time: 339 msec

# dig @80.58.61.250 www.google.com
...
;; Query time: 53 msec

y el dig-algodón no engaña

12 de enero de 2010

PostgreSQL: Actualizar registros


Actualizar Todos los registros del campo1:
psql=>UPDATE table SET campo1='pp';

Varias campos de todos los registros:
psql=>UPDATE table SET campo1='pp1', campo2='pp2', campo3='pp3';

Actualiza solo los registros que cumplen la condición:
psql=>UPDATE table SET campo1='pp' WHERE campo1='mm';

PostgreSQL: Buscar registros repetidos en una tabla.


http://www.postgresql.org/media/img/feature/feature_elephant.pngPara ver si tenemos datos repetidos en una tabla de una base de datos PostgreSQL lo podemos hacer mediante una consulta que nos agrupe los diferentes registros y nos cuenta cuantos hay de cada uno de ellos:

SELECT pp, COUNT (pp) FROM table GROUP BY pp ORDER BY COUNT DESC;

Y en la primeras tupla nos apareceran los registros repes y el número de repeticiones.

10 de enero de 2010

PostgreSQL&Perl. Asignar datos de una consulta a matriz bidimensional


Un ejemplo:

#!/usr/bin/perl -w

use DBI;
use strict;

my $dbh = DBI->connect("dbi:Pg:dbname=ipuniverse",'user');
my $sth = $dbh->prepare("SELECT scann2.ip,scann2.pais,scann2.ciudad FROM scann2 LIMIT 5");

$sth->execute;

my $table = $sth->fetchall_arrayref;
my ($lin, $col);

for $lin ( 0 .. $#{$table} ) {
for $col ( 0 .. $#{$table->[$lin]} ) {
print "$table->[$lin][$col]\t";
}
print "\n";
}

$sth->finish;
$dbh->disconnect;
exit;


Ref:
Manual de referencia de DBI/DBD

9 de enero de 2010

Exo-RedPill-Compilación del Kernel 2.6.32.3 para Micra


En mi micro-servidor micra tengo instalado Debian 5.0-lenny y funciona muy bien, solo la wifi rt73 me da algunos problemillas:
  • Error wifi del kernel con mensages constantes a los ficheros logs.
  • Problemas en la configuración simultanea de la ethernet y wifi provocando desconexiones y teniedo que hacer netwoks restart.
  • No me funcionan los puentes de red ni la funcion AP de la wifi.
El kernel actual que tiene Lenny es el 2.6.26 y la última versión estable a día de hoy del kernel es la 2.6.32.3 que presenta interesantes mejoras.
Ha llegado el momento de recompilar el kernel de micra para actualizarlo y ver si puedo solucinar los problemillas de la red.

Y para dar ejemplo me aplicaré mis propias recetas:
- Recompilar el kernel mediante la píldora roja.
- Exo-recomplación del kernel para micra en lenny: un pentium2800MHz.

Pasos:
1) Descargamos el kernel 2.6.32.3 en lenny:/usr/src/.
Descompresión, Creamos el enlace simbólico linux a la carpeta del nuevo kernel.

2) Configuración:
Copiamos el fichero de configuración actual de micra:/boot/config-linux-2.6.26-486 a lenny:/usr/src/linux/

3) Compilamos el kernel 2.6.32.3:
La compilación no finaliza ya que me da un error de compilación:
...
make[1]: se sale del directorio `/usr/src/linux-2.6.32.3'
/usr/bin/make EXTRAVERSION=.3-pp01 ARCH=i386 \ -C Documentation/lguest make[1]: se ingresa al directorio `/usr/src/linux-2.6.32.3/Documentation/lguest' cc -m32 -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include -U_FORTIFY_SOURCE lguest.c -o lguest lguest.c:21:25: error: sys/eventfd.h: No existe el fichero o el directorio lguest.c: In function 'create_thread': lguest.c:1027: warning: implicit declaration of function 'eventfd' make[1]: *** [lguest] Error 1 make[1]: se sale del directorio `/usr/src/linux-2.6.32.3/Documentation/lguest' make: *** [debian/stamp/build/kernel] Error 2


Consultamos al oráculo: www.google.com
Posible problema (1):
http://www.debianadmin.com/step-by-step-tutorial-howto-compile-kernel-in-debian-5-0-lenny.html
http://www.esdebian.org/foro/27925/error-compilar-kernel-2626

Parece ser puede surgir este error sin no está instalada la librería zlib1g-dev.
Veamos si tenemos instalada la librería zlib1g-dev:

lenny:# dpkg -l|grep zlib1g-dev ii zlib1g-dev - 1:1.2.3.3.dfsg-12 - compression library - development

Pues esta correctamente instalada, esto no es la causa del error, a seguir buscando.

Posible problema (2), esta es la solucción:
Error al compilar Kernel 2.6.31.5: lguest / eventfd
2.6.31 for Debian 5/Lenny

Parece ser que hay un problema con libc-dev al instalar lguest.
Recomienda solcionarlo del siguiente modo:

lenny:# nano /usr/src/linux/Documentation/lguest/Makefile
-Cambiamos- "all: lguest" por "all:"

Y vuelta a realizar los pasos 1), 2), 3) .. y funciona!!!
generando los paquetes debian

linux-kernel-26-32-3-pp01.deb
linux-headers-2-6-32-3-pp01.deb

4) Instalación del paquete en micra.
micra:# dpkg -i linux-kernel-26-32-3-pp01.deb
micra:# dpkg -i linux-headers-26-32-3-pp01.deb

5) micra reboot
Funciona a la perfección.

Y ha solucionado el problema con la wifi rt73 de la generación de errores que llenaba warnings el kern.log

Ref:
Caracteristicas del Kernel 2.6.32

Control del scroll en PostgreSQL


Primera e-carta de frank a los corintios usuarios de psql ...

pp wrote:
Hola Frank,
otra cosa que se me olvidó ....
Hay alguna forma para que una consulta desde la consola >psql NO haga un scroll hasta el final,
¿¿¿????
pp))

frank wrote:
Si entras en modo consola prueba con:
\pset pager on
Hay varias opciones para controlar el formatode salida, mira en la ayuda '\?'
Si lo llamas desde un script prueba con hacer antes
export PAGER=more
pero esto hará que tengas que pasar página a página (con la tecla espacio) de manera interactiva.
export PAGER=head -n 50
te mostrará solo las 50 prijmeras líneas.

Bueno, a ver si nos vemos y nos enseñas ese mega sistema que estas creando.
---
Podeis consultar en paz ...
... demos gracias a frank.

Exo-Recompilación del Kernel


En máquinas antiguas y lentitas, la recopilación del kernel puede ser una tarea lenta y penos, de horas o incluso días!!!.
Recuerdo que mi arcaico p90 con su intel pentium 90MHz y sus 32MB de RAM estuvo toda una noche y creo que no llegó a terminar la compilación del kernel 2.6.31. Eso si, lo intento con todo su entusiasmo y cpu.

Es posible compilar el nuevo kernel al estilo debian o red pill en otrá máquina que tengamos, con el sistema debian instalado y que sea más rápida. Pudiendo compilar el kérneles por un lado y probándolos en la maquina antigua simultaneamente !!!.

Howto: -seguir el howto de debian red pill pero con dos máquinas-
  • Descargar el nuevo kernel en la new-maquina (compiladora).
  • Configurar en nuevo kernel en la new-maquina con el archivo de configuración del kernel actual de la old-maquina (al que vamos a actualizar el kernel).
  • Compilar el new-kernel la new-maquina.
  • Instalar el paquete debian del new-kernel en la old-maquina.
... más vale una imagen de gimp que mil palabras:

.. o al menos eso dicen.

8 de enero de 2010

Recompilar el Kernel al estilo Debian: La Píldora Roja


Compilar el Kernel de Linux no es tan terrible como suena y se puede hacer de una forma conservadora manteniendo el anterion kernel por si las moscas.
En debian hay un método de recompilación del kernel que genera un paquete .deb instalable y desinstalable con apt o aptitude.
Tambien es posible recompilar el kernel en una máquina diferente a la que va destinada, esto está especialmente indicado en ordenatas antiguos, pudiendo luego instalarlo en la máquina carca como un paquete debian sin más.
Este método lo vi por algún sitio denominado como: La Píldora Roja.

Y ahora paso por paso:

1) Descargamos el Kernel y Patches: en www.kernel.org
La última versión estable o la que queramos con sus patches si los tuviera.

-lo descargamos en la carpeta /usr/src/ y lo descomprimimos-


# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.3.tar.bz2
# tar xvf linux-2.6.32.3.tar.bz2

- Hacer el enlace simbólico a la carpeta del nuevo kernel-
- Es recomendable borrar otros enlaces simbólicos de kernels anteriores que hubiera-

# ln -s linux-2.6.32.3 linux


2) Paquetes Debian necesarios:


# aptitude update
# aptitude install kernel-package build-essential libncurses5-dev fakeroot initramfs-tools zlib1g-dev

-aptitude se encargará de revisar los paquetes instalados, sus dependencia y si faltara algún otro paquete-

3) Configurando el Kernel:

Este es el paso clave. Aquí es donde se pueden hacer virguerias simplificando el kernel, quitando módulos que no sean necesarios y/o poniendo nuevos modulos necesarios para el hardware del equipo. Aqui es donde hacemos que no funcione ni a tiros o cuando el kernel se adapta angelicalmente a las especificaciones de nuestro hardware.
Para la gente normal hay dos opciones asumibles:
  • Usar la configuración por defecto del nuevo kernel.
  • Si ya hay un sistema linux funcionando en la máquina podemos usar la configuración de nuestro kernel actual, pero ojo puede que las mejoras del nuevo kernel no se configuren correctamente e incluso que no funcione si son versiones muy distantes.
Vamos con la configuración:
-limpiamos configuraciones de anteriores compilaciones del kernel-

# cd linux
# make clean && make mrproper


Hay varias formas de configurar el kernel:
  • make defconfig; configuración por defecto.
  • make oldconfig; toma el antiguo config y pregunta las cosas nuevas.
  • make xconfig; menus basados en X.
  • make gconfig; menus para gnome.
  • make localmodconfig; nuevo sistema de configuración en 2.6.32.
  • make menuconfig; menus basados en ncurses.

-Para usar la configuracion del kernel actual: Copiamos el fichero de configuración del kernel actual al directorio del nuevo kernel con el nombre .config-


# cp /boot/config-2.6.26-2-486 /usr/src/.config

-Creamos el menu de configuración-

# make menuconfig

... y aqui tenemos el sancta sanctorum del kernel, que podemos curiosear, revisar, cambiar y escojer la mejor configuración para nuestro hardware.

- Seleccionamos "Load alternate Configuration File"
- Y nos aparace en el siguiente menu el archivo que hemos copiado ".config"
- Aceptamos todo y salimos del menú de configuración.

4) Compilando el Kernel:

# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-pp01 kernel_image

Se puede y/o compilar también las cabeceras del kernel añadiendo al final del comando anterior: kernel_headers

Y ahora ... paciencia, ya que esto lleva su tiempo, tiempo, y tiempo de compilación.
En pantalla iran apareciendo los módulos que se van compilando.

Comprobar que no aparecen errores de compilacion: en este caso hay que encomendarse a san google para ver si hay algún otro incauto le haya ocurrido lo mismo, intentar corregirlo y vuelta a empezar.

Finalmente obtendremos los paquetes debian:

kernel-linux-image.deb
kernel-linux-headers.deb (si hemos puesto la opción kernel_header)

5) Instalación del nuevo kernel:

# dpkg -i kernel-linux-image.deb

La instalación hace todos los cambios necesarios para el funcionamiento del nuevo kernel, incluso cambia el menu de arranque de grub /boot/grub/menu.lst poniendo como arranque por defecto el nuevo kernel, cosa que convien revisar ya que a veces no acierta.
Comprobar tambien que se ha creado la carpeta /lib/modules/linux-2.6.32.3 con los nuevos módulos correspondientes.

y solo queda...

# reboot

No es de extrañar que la cosa no funcione a la primera, don't panic ... lo podemos desinstalar y el sistema volverá, ó debe volver!, a su estado anterior :))

# dpkg -r kernel-linux-image.deb


webRef:

-Tutoriales-
Kernel_Compilation_From_Source
Compilar-kernel-estilo-debian

-Optimizar el kernel 2.6.32-
Nueva opción de configuración: # make localmodconfig
http://preguntas.barrapunto.com/preguntas/10/01/04/2254250.shtml

Debian 5.0 Lenny con el kernel 2.6.32


El kernel actual de Debian Lenny es el 2.6.26, y segun este Brief Updates on Debian Project hay una imagen con el kernel 2.6.32.
Uuummh... esto puede ser interesante para ver si arreglo los problemas de la wifi rt73 de micra:

http://kmuto.jp/debian/d-i/

i386
  • lenny-custom-1230.iso - kernel version 2.6.32 ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: d7c6faec22bac62e6ca0ec6bc29a462e Size: 256 MB (268632064 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

  • lenny-custom-0627.iso - kernel version 2.6.30 + linux-firmware + ext4 support ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: 41d2cf9a3f03b067c97b7576eef0d856 Size: 228 MB (239527936 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

  • lenny-custom-0302.iso - kernel version 2.6.28 + WPA support + Ubuntu linux-firmware ... (more details)
    [ download from JP or FR (usually faster) ]
    MD5: cf6ef8f345d4ef259de8f69002529026 Size: 217 MB (228560896 bytes)
    [ hd-media: boot.img.gz (512MB USB image), netboot.tar.gz (TFTP boot) ]

5 de enero de 2010

Copiar, borrar, mover archivos en Perl


Para manejar archivos en perl tenemos el módulo: File::Copy

#!/usr/bin/perl
use File::Copy;

Copiar un archivo:
copy ("$file1","$file2") or die "Copy failed: $!";

Borrar una archivo:
unlink ($file2);

Mover archivo:
move ("$file1","$file2");

3 de enero de 2010

Como terminar un proceso con Perl

Pues con kill.
kill ( 'SIGNAL' , PID );

Lista de señales:

Signal
Number
Description
SIGHUP
1
On hangup
SIGINT
2
On interrupt
SIGQUIT
3
On Quit key
SIGILL
4
Illegal instruction
SIGTRAP
5
Trap instruction
SIGABRT
6
Abort message
SIGIOT
6
Input/output transfer
SIGBUS
7
Bus error
SIGFPE
8
Floating-point error
SIGKILL
9
Kill signal from system
SIGUSR1
10
User defined
SIGSEGV
11
Segmentation violation
SIGUSR2
12
User defined
SIGPIPE
13
Pipe fault (broken pipe)
SIGALRM
14
Alarm
SIGTERM
15
Termination
SIGSTKFLT
16
Stack fault
SIGchLD
17
Signal from child
SIGCONT
18
Continuing a stopped process
SIGSTOP
19
Stopping a process
SIGTSTP
20
Stopping a process from terminal
SIGTTIN
21
Stopping a process reading from controlling terminal
SIGTTOU
22
Stopping a process writing to controlling terminal
SIGURG
23
Urgent condition
SIGXCPU
24
Excessive CPU limits reached
SIGXFSZ
25
Excessive file size limits reached
SIGVTALRM
26
Virtual interval timer expired
SIGPROF
27
Profiling interval timer expired
SIGWINch
28
Window size changed by background process
SIGIO
29
Asynchronous I/O
SIGPWR
30
Power failure
SIGUNUSED
31
Unused

ejemplo:
kill ('KILL' , $PID);

REF:
http://ods.com.ua/win/eng/program/Perl5Unleashed/ch14.phtml#Signals

2 de enero de 2010

txt2regex, el consejero para las expresiones regulares

txt2regex: este programilla en modo texto resulta muy útil para crear y verificar Expresioner Regulares.
Funciona como un wizard, con preguntas directas que ayudan a crear la expresión regular requerida.

Para instalar el paquete debian:
#apt-get install txt2regex

Tiene unos menús para ir diseñando la expresión regular:


Tiene muchas opciones ...


y para muchos lenguajes de programación.

Ejecutar Perl scripts en background

Existe unos módulos específicos para esto.
Proc::Daemon
Este es un módulo de control de procesos:
Proc::PID::File

Instalacion en Debian:
# apt-get install libproc-daemon-perl libproc-pid-file-perl

Ejemplo de script en perl demonizado:
#!/usr/bin/perl
#Crea un archivo con registros del localtime cada 2 segundos
#bypp2010
use Proc::Daemon;
use Proc::PID::File;
use File::Copy;
Proc::Daemon::Init;
$c = 0;
unlink("./perl_daemon.txt"); #borra el archivo anterior
while ( 1 == 1 ) {
my $c = $c + 1;
open (FILE, ">>./perl_daemon.txt");
print FILE localtime(time);
print FILE "\n";
close (FILE);
sleep(2);
}

Estos script demonizados se puedes ejecutar desde otros scripts de perl usando
system (ruta del perl daemon);

ref:
http://misnotaslinux.blogspot.com/2010/01/ejecuntando-comamdos-linux-desde-perl.html
http://www.perladvent.org/2004/9th/

1 de enero de 2010

Ejecuntando comamdos Linux desde Perl

system("comando");
No captura la salida ni la entrada estandar.
Perl espera hasta que termina el comando linux.

exec("comando");
El control nunca retorna al programa Perl.
Termina perl y se ejecuta el comando.
 
open(handle, comando);
Sirve para abrir ficheros pero también para ejecutar comados Linux y capturar en el handle la entrada y/o salida estandard.

my $variable = `comando`;
La salida estandar del comado se asigna a la variable.

PostgreSQL & Perl

Perl permite una conexión directa a las bases de datos PostgreSQL mediante el interface generico DBI, el de PostgreSQL es el DBD::Pg que se conecta a la BDD como cliente tomando las filas, columnas y datos para usarlos en el programa perl.


0) Instalar el módulo DBD::Pg en Debian:
#apt-get install libdbd-pg-perl

1) Comprobar que el modulo DBD::Pg está correctament instalado, accediendo a una bsas de datos psql:

#!/usr/bin/perl
use DBI;
my $VAR01 = DBI->connect("dbi:Pg:databasename",'user','password');
my $VAR02 = $VAR01->disconnect();

-Si sale algun error es que no esta correctamente instalado el módulo perl-

1) Conexion a una BDD psql desde perl:

use DBI; # módulos que vamos a usar

use DBD::Pg; # esto no haría falta

my $DBI = DBI->connect("dbi:Pg:dbname=nombredelabasededatos");
my $dbh = DBI->connect("dbi:Pg:dbname=template1", 'nombreusuario', 'clave');



2) Extraer tuplas con perl de una BDD psql:
Usando los ciclos de preparacion, ejecución y extracción de datos.

#!/usr/bin/perl
use DBI;
use strict;
my $dbh = DBI->connect("dbi:Pg:dbname=ipuniverse",'USER');
$dbh->{RaiseError} => 1; #ref

my $sth = $dbh->prepare("SELECT * FROM scann2 WHERE scann2.px='O' AND scann2.yy='0' LIMIT 1");
$sth->execute;
my @row;
@row = $sth->;fetchrow_array or die "No match for query";

my $var1 = $row[0];
my $var2 = $row[1];
my $var3 = $row[2];
my $var4 = $row[3];

print "$row[0] $row[1] $row[2] $row[3]\n";
print "$var1 $var2 $var3 $var4\n";

$sth->finish;
$dbh->disconnect;
exit;

Con este script hemos extraido los registros de una tupla de una BDD de PostgreSQL y los hemos asignado a las varables en perl.

INSERTando segistros en PostgreSQL desde Perl:
Se recomienda usar el método secuencial de preparación y ejecución por motivos de rendimento especialmente si hay busquedas en la bdd.
También esta el método directo, prepare+execute todo en uno.
Un ejemplo de ambos métodos:

#!/usr/bin/perl
use DBI;
use strict;
#conectamos con la BD
my $dbh = DBI->connect("dbi:Pg:dbname=ipuniverse",'USER');
$dbh->{RaiseError} => 1;

#metodo directo
$dbh->do("INSERT INTO table VALUES ('valores','$variables')");

#método secuencial
my $sth = $dbh->prepare("UPDATE table SET campo1='valor o variable' WHERE campo2='valor o variable'");
$sth->execute;
$sth->finish;

$dbh->disconnect;

REF:

http://www.arsys.info/programacion/bases-de-datos/perl-y-dbi/
http://flanagan.ugr.es/dbi/manual.htm
http://geneura.ugr.es/~jmerelo/tutoriales/bd-sql/
Ejemplos de instrucciones perl-postgresql:
http://linuxbloggers.org/create-insert-select-update-perl-script-and-postgresql-database-examples/
Tutorial PSQL desde Perl:
http://www.felixgers.de/teaching/perl/perl_DBI.html


La fecha en Perl: time() y localtime()

time()
Este número representa la cantidad de segundos que han transcurrido desde una fecha en específico, en la mayoría de los sistemas esta fecha es el 1º de Enero de 1970 a las 0 horas GMT, una excepción de estos sistemas es la Mac, que cuenta los segundos desde el 1º de Enero de 1904 en la zona horaria del sistema:
1262363355 

localtime(time)
Toma este número y lo transforma en un número formado por:

#   0,    1,   2,   3,    4,    5,   6,    7,     8
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
 
$sec(segundos), $min(minutos), y $hour(horas), representan la hora de la fecha especificada por time.
$mday es el día del mes y $mon es un número del 0 al 11 que representa el mes, donde 0 es Enero y 11 es Diciembre.
$year es la cantidad de años desde 1900 a la fecha. Así que para 2007 este elemento tendrá un valor de 107.
$wday es el día de la semana, representado con un número del 0 al 6, donde 0 es Domingo y 6 es Sábado.
$yday es el número del día del año, este número está en el rango del 0 al 364 y hasta 365 en años bisiestos.
Finalmente $isdst es verdadero en el caso de que la fecha esté dentro del horario de verano, también conocido como Daylight Saving Time, será falso de lo contrario.

Script para la fecha en perl:
#!/usr/bin/perl
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
print "$mday/$mon/$year $hour:$min:$sec\n";

Script para el formato: yyyymmddhhmmss:

#!/usr/bin/perl
#bypp2010

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = $year + 1900;
$mon++;
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($mon < 10) { $mon = "0$mon"; }

print "$year\n";
print "$mon\n";
print "$mday\n";
print "$hour\n";
print "$sec\n";

my $FECHA = $year . $mon . $mday . $hour . $min . $sec;

Tutorial PostgreSQL y PSQL desde Perl

Un tutorial resumido y al grano para PostgreSQL:
http://geneura.ugr.es/~jmerelo/tutoriales/bd-sql/