lunes, mayo 19, 2008

Mini: ¿Cómo Codificar archivos MP3 con LAME en GNU/Linux Debian?


Paso 1: Descargar el código fuente de LAME

Para quien nunca ha escuchado hablar de LAME, aquí transcribo la descripción brindada por Wikipedia:

"LAME LAME (acrónimo recursivo de LAME Ain't an MP3 Encoder, Lame no es un códec MP3) es un codificador (códec) de MPEG Audio Layer III (MP3) que puede ser usado con la mayoría de programas que convierten archivos WAV a archivos MP3 o desde otros formatos o soportes.

Destaca por su espectacular rapidez, por la posibilidad de elegir la tasa de bits (calidad, 128 Kbps, 160 Kbps, variable, ..) y el modo joint stereo. Este software tiene una licencia código abierto, lo cual permite que personas de todo el mundo trabajen en su desarrollo.

Este códec funciona por intérprete de órdenes o bien integrado en otras aplicaciones capaces de usarlo como: Audacity, AudioCrusher, Audiograbber, Text Aloud MP3, Easy CD-DA Extraction, CDex, ALF, etc."

LAME puede ser descargado de:

http://lame.sourceforge.net/download.php

Paso 2: Descomprimir LAME

denis@debian2:~/mp3debian$ ls
lame-3.97.tar.gz

denis@debian2:~/mp3debian$ tar -xvzf lame-3.97.tar.gz
lame-3.97/
lame-3.97/mac/
lame-3.97/mac/Precompile_Common.h
lame-3.97/mac/MacDLLMain.c
lame-3.97/mac/LAME_Classic_Final.pch
lame-3.97/mac/LAME_Classic_Debug.pch
.....
lame-3.97/acinclude.m4
lame-3.97/README
denis@debian2:~/mp3debian$

Paso 3: Compilar LAME

En este paso dentro de la carpeta recién descomprimida, ejecutar el script ./configure el cual revisará que se cumplan todos los requisitos de librerías y dependencias en nuestro sistema para poder proceder luego a compilar el código fuente, en este paso es probable que aparezcan mensajes de que nos falta X o Y programa o librería, estos tipos de problemas se solucionan fácil y rápido instalando el programa o librería necesaria y luego ejecutar nuevamente ./configure hasta que todo salga bien.

denis@debian2:~/mp3debian/lame-3.97$ ls
acinclude.m4 configure frontend lame.spec.in Makefile.am.global README.WINGTK
aclocal.m4 configure.in HACKING lame_vc6.dsw Makefile.in STYLEGUIDE
ACM COPYING include lame_vc7.sln Makefile.MSVC testcase.mp3
API debian INSTALL libmp3lame Makefile.unix testcase.wav
ChangeLog DEFINES INSTALL.configure LICENSE misc TODO
config.guess depcomp install-sh ltconfig missing USAGE
config.h.in Dll lame.bat ltmain.sh mkinstalldirs
configMS.h doc lame_projects_vc6.dsp mac mpglib
config.sub dshow lame.spec Makefile.am README


denis@debian2:~/mp3debian/lame-3.97$ ./configure
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
......
config.status: creating ACM/tinyxml/Makefile
config.status: creating lame.spec
config.status: creating mac/Makefile
config.status: creating config.h
config.status: executing depfiles commands
denis@debian2:~/mp3debian/lame-3.97$

Una vez ejecutado el script configure proceder a compilar LAME con "make"


denis@debian2:~/mp3debian/lame-3.97$ make
make all-recursive
make[1]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97'
Making all in mpglib
make[2]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97/mpglib'
......
make[2]: se sale del directorio `/home/denis/mp3debian/lame-3.97/mac'
make[2]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97'
make[2]: No se hace nada para `all-am'.
make[2]: se sale del directorio `/home/denis/mp3debian/lame-3.97'
make[1]: se sale del directorio `/home/denis/mp3debian/lame-3.97'


Paso 4: Instalar LAME

Si todo sale bien, estamos listos para instalar LAME en nuestro GNU/Linux Debian, para lo cual necesitamos estar como super usuario y ejecutar el comando: make install

denis@debian2:~/mp3debian/lame-3.97$ su
Password:
debian2:/home/denis/mp3debian/lame-3.97# make install
Making install in mpglib
make[1]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97/mpglib'
make[2]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97/mpglib'
make[2]: No se hace nada para `install-exec-am'.
make[2]: No se hace nada para `install-data-am'.
make[2]: se sale del directorio `/home/denis/mp3debian/lame-3.97/mpglib'
make[1]: se sale del directorio `/home/denis/mp3debian/lame-3.97/mpglib'
Making install in libmp3lame
make[1]: se ingresa al directorio `/home/denis/mp3debian/lame-3.97/libmp3lame'
Making install in i386
....
make[2]: No se hace nada para `install-exec-am'.
make[2]: No se hace nada para `install-data-am'.
make[2]: se sale del directorio `/home/denis/mp3debian/lame-3.97'
make[1]: se sale del directorio `/home/denis/mp3debian/lame-3.97'

Paso 5: Leer la ayuda de LAME

Una vez que está instalado posiblemente te gustaría leer la ayuda, lo cual puede lograrse usando "man" o con el parámetro --help del nuevo binario que se acaba de instalar llamado "lame".

debian2:/home/denis/mp3debian/lame-3.97# exit
exit
denis@debian2:~/mp3debian/lame-3.97$ man lame
lame(1) LAME audio compressor lame(1)

NAME
lame - create mp3 audio files

SYNOPSIS
lame [options]

DESCRIPTION
LAME is a program which can be used to create compressed audio files.
(Lame ainât an MP3 encoder). These audio files can be played back by
popular MP3 players such as mpg123 or madplay. To read from stdin, use
"-" for . To write to stdout, use a "-" for .

OPTIONS
Input options:
....

denis@debian2:~/mp3debian/lame-3.97$ lame --help
LAME 32bits version 3.97 (http://www.mp3dev.org/)

usage: lame [options] [outfile]

and/or can be "-", which means stdin/stdout.

RECOMMENDED:
lame -V2 input.wav output.mp3

OPTIONS:
-b bitrate set the bitrate, default 128 kbps
-h higher quality, but a little slower. Recommended.
-f fast mode (lower quality)
-V n quality setting for VBR. default n=4
0=high quality,bigger files. 9=smaller files
--preset type type must be "medium", "standard", "extreme", "insane",
or a value for an average desired bitrate and depending
on the value specified, appropriate quality settings will
be used.
"--preset help" gives more info on these

--longhelp full list of options

denis@debian2:~/mp3debian/lame-3.97$


Paso 6: Convertir un archivo wav en mp3

Dependiendo de la calidad con que la que usted desea convertir su archvo wav en mp3 las opciones pasadas al binario lame pueden variar. La forma más sencilla de convertir un archivo wav a mp3 usando las configuraciones por defecto de lame es: lame ruta_archivo.wav

El ejemplo mostrado a continuación convertirá un archivo wav en un mp3 con variable bit rate (tasa de bits variable).

denis@debdenis:~/Desktop/english/phrases_v2/lectura$ ls
frases.wav

denis@debdenis:~/Desktop/en$ lame -V 4 frases.wav
LAME 3.97 32bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 17249 Hz - 17782 Hz
Encoding frases.wav to frases.wav.mp3
Encoding as 44.1 kHz VBR(q=4) j-stereo MPEG-1 Layer III (ca. 10x) qval=3
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
2200/15779 (14%)| 0:09/ 1:05| 0:12/ 1:27| 6.2740x| 1:15
32 [ 0]
40 [ 0]
48 [ 0]
56 [ 2] *
64 [ 7] *
80 [ 121] ***************
96 [ 458] ******************************************************
112 [ 579] ********************************************************************
128 [ 372] ********************************************
160 [ 418] **************************************************
192 [ 205] *************************
224 [ 37] *****
256 [ 1] *
320 [ 0]
-----------05:54---------------------------------------------------------------
kbps MS % long switch short %
127.9 100.0 38.8 17.6 43.6

denis@debdenis:~/Desktop/english/phrases_v2/lectura$ ls
frases.wav frases.wav.mp3
denis@debdenis:~/Desktop/english/phrases_v2/lectura$


Lo aquí expuesto también ha sido probado en SuSE Linux, y no dudo que pueda funcionar de manera similar en otras distribuciones de Linux.

domingo, mayo 11, 2008

Como Instalar GNU/Linux Debian en Windows usando QEMU para Windows y Qemu Manager

¿Qué es una Máquina Virtual?

La wikipedia dice:

"En informática una máquina virtual es un software que emula a un ordenador y puede ejecutar programas como si fuese un ordenador real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del termino actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.

Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de este "ordenador virtual"."

Para mayor información leer:

http://es.wikipedia.org/wiki/M%C3%A1quina_virtual

¿Qué es QEMU?

La wikipedia dice:

"QEMU es un emulador de procesadores basado en la traducción dinámica de binarios (conversión del código binario de la arquitectura fuente en código entendible por la arquitectura huésped). QEMU también tiene capacidades de virtualización dentro de un sistema operativo, ya sea Linux, Windows, o cualquiera de los sistemas operativos admitidos (de hecho es la forma más común de uso). Esta máquina virtual puede ejecutarse en cualquier tipo de Microprocesador o arquitectura (x86, x86-64, PowerPC, MIPS, SPARC, etc.). Está licenciado en parte con la LGPL y la GPL de GNU."

Y yo agregaría:

Qemu es un software para crear máquinas virtuales. Lo que más me gusta de qemu es que no necesita de mucho espacio en el disco duro, en comparación con otros sistemas parecidos como VMware.

Para mayor información leer:

http://es.wikipedia.org/wiki/QEMU
http://fabrice.bellard.free.fr/qemu/

Qemu Manager v4.0

La wikipedia dice:

"QEMU manager es un programa escrito para Windows que hace las veces de interfaz gráfica para el emulador de máquinas virtuales QEMU. El programa permite definir diferentes máquinas virtuales a las que asocia una unidad física o virtual en la que buscar el sistema operativo que queremos emular, ya sean sistemas operativos que requieran instalación en disco duro o sistemas operativos que se puedan ejecutar sin guardar nada en unidades físicas (Live CD)."

Y yo agregaría:

QEMU manager es fácil de usar, disponible con traducción completa al español, si usted descarga "QEMU manager" no necesita descargar "QEMU" por separado, pues el primero ya lo incluye.

"QEMU manager" incluye:
  • QEMU Processor Emulator
  • QEMU Accelerator KQEMU
  • Un pequeño manual en PDF sobre QEMU manager

Para mayor información leer:

http://es.wikipedia.org/wiki/Qemu_manager

QEMU manager se puede descargar en:

http://www.davereyn.co.uk/

Acelerador KQEMU

Como en toda máquina virtual la velocidad y el desempeño de un sistema operativo ejecutado sobre QEMU, no es tan eficiente a como se lograría ejecutándolo nativamente, por lo que es recomendable antes de usar QEMU instalar el acelerador KQEMU.

KQEMU acelera la emulación de i386 en plataformas i386 hasta un nivel ligeramente inferior a la ejecución en modo nativo.

La siguiente comparación puede dar una idea más clara sobre la aceleración:

  • La ejecución de un sistema operativo sobre QEMU sin acelerador, es aproximadamente entre 5 y 10 veces más lento, que hacerlo de forma nativa.
  • Usando QEMU con el acelerador KQEMU, la ejecución es aproximadamente entre 1 y 2 veces más lento que de forma nativa.

Manos a la obra

* Descomprimir qemumanager40.zip
* Ejecutar (doble clic) en el archivo: QemuManager.exe

* Proceder a instalar el acelerador KQEMU, en el menú: Opciones >> Install KQEMU Accelerator

* El siguiente paso es crear una nueva máquina virtual, pulsando el botón señalado a continuación

* Aparecerá la ventana: "Asistente de creación de nueva máquina virtual", donde se pregunta el nombre que se asignará a dicha máquina virtual, para lo cual es necesario completar el campo: "Nombre de nueva máquina virtual", luego pulsar el botón siguiente.

* Luego es necesario seleccionar que sistema operativo instalaremos, entre las opciones disponibles están: DOS, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Linux Distribution, Power PC & Mac. Para instalar GNU/Linux Debian seleccionamos de la lista la opción: "Linux Distribution", al mismo tiempo debemos especificar, cuanta memoria RAM de la máquina ANFITRION (HOST) será destinada para uso de la máquina INVITADA (GUEST), esta selección dependerá de con cuanta RAM cuenta tu HOST y cuanta RAM necesita el Sistema Operativo Invitado para poder funcionar bien. Luego pulsar siguiente.



* En la siguiente ventana es necesario especificar "que disco duro utilizará la máquina virtual", es posible seleccionar entre estas opciones: Crear nueva unidad virtual, Usar unidad virtual existente, o Esta máquina virtual no requiere una unidad virtual. Para instalar GNU/Linux Debian crearemos una nueva unidad virtual, luego pulsamos Siguiente.



* Seguidamente se especifica el tamaño de la unidad de disco duro virtual a crear. Para quien no ha usado antes un emulador para máquinas virtuales, quiero aclarar: este disco duro es llamado virtual pues en realidad usted no necesita instalar otro disco duro "real" a su PC, qemu creará en su sistema de archivos existente, un archivo en donde se almacenarán los bytes como si fuera otro disco duro, por lo cual tampoco es necesario crear particiones nuevas. El tamaño a destinar para la unidad dependerá de: el espacio que usted tenga libre, y de que aplicaciones instalará en GNU/Linux Debian. Para obtener información sobre el espacio necesario para instalar GNU/Linux Debian visite su sitio oficial: http://www.debian.org

En esta ventana es también necesario selecciar el tipo de unidad a crear, las opciones disponibles son:

  • Qcow2 (QEMU Image Format): Es el formato más versátil, este tipo de imagen crea un archivo básico pequeño, el cual a medida que se necesita, puede ir creciendo hasta ocupar el tamaño máximo especificado. Soporta muchas características especiales de las cuales puede obtener más información en la página principal de qemu.
  • Qcow (QEMU Image Format): formato versión anterior a Qcow2.
  • Raw (Raw Disk Image File): Las imágenes de discos virtuales de este tipo, tiene la ventaja de ser simples y facilmente exportables a otros emuladores. Este tipo de imagen creará un archivo que ocupará desde el inicio todo el tamaño especificado.
  • vmdk (VMWare 3-4 Image Format): formato de imagen compatible con VMware 3 y 4.

En mi caso crearé 2 discos duros virtuales, cada uno de 4 GB, en formato Qcow2 (pensando en que luego quizás los queme en un par de DVD).

Nótese que en este momento sólo creamos un disco virtual, luego procederemos a crear el segundo.

Pulsar siguiente.



* La siguiente pantalla pregunta sobre la configuraciones de la máquina virtual (luego de pueden cambiar). Pulsar siguiente.


* En la siguiente pantalla, seleccionar: "Ver Opciones de configuración avanzada después de salvar" y finalizar pulsando el botón: "Salvar máquina virtual".


* Como seleccionamos la opción: "Ver Opciones de configuración avanzada después de salvar", aparecerá una ventana como la que se muestra a continuación, en la ficha (pestaña) "General" es muy recomendable habilitar el acelerador de qemu.

* En la ficha Red (de la misma ventana "Configuración de máquina virtual") es posible configurar las interfaces de red virtuales en la máquina virtual, por defecto aparece una. También es posible redireccionar puertos desde la máquina invitada hacia la máquina anfitrión, a como se muestra en la figura, donde se configura qemu para que la máquina anfitrión pueda ver el en el puerto de red 8085 el puerto de red 80 de la máquina invitada. Luego de configurar pulsar el botón Guardar.

* De los 2 discos virtuales, sólo hemos creado uno, para crear el segundo disco virtual, hacer clic en el menú: Opciones >> Crear nuevo disco virtual.

* En la pantalla "Crear nuevo disco duro virtual" nuevamente se pregunta sobre el tipo de unidad y el tamaño.

* Luego en la ventana de: "Configuración de máquina virtual" en la pestaña "Configuración de disco" cargar la imagen creada como disco duro hdb (o sea como D: en windows).

* Después de esto ya estamos casi listos para iniciar la instalación, en la misma ventana, pero en el segmento: "Unidades de cd-rom" seleccionar bootear desde un CD-ROM de la computadora. O también es posible bootear desde una imagen ISO.

* Luego en la ventana principal de "Qemu Manager" hacer clic en el icono de PLAY, y podrá iniciar la instalación de GNU/Linux Debian en su máquina virtual con 2 discos duros de 4GB cada uno.


También existen otras alternativas a QEMU, como es el caso de VirtualBox, aquí tengo un artículo sobre VirtualBox:

http://denisjtorresg.blogspot.com/2009/03/como-instalar-gnulinux-debian-en.html

También puedes leer más sobre VirtualBox en este artículo de alexio44 en su blog: http://alexio44.blogspot.com/2008/07/iniciando-la-virtualizacion.html

miércoles, abril 30, 2008

Instalar tsearsh2 en PostgreSQL con soporte español con ispell

Introducción

Este pequeño manual trata sobre la instalación, configuración y realización de una pequeña prueba del motor de búsqueda para texto[4] Tsearch2[3] usado en PostgreSQL[1][2] con soporte para diccionario Español usando ispell y codificación de caracteres iso-8859-1, este manual se basa en mi experiencia personal usando Tsearch2, como parte del proyecto de software libre HelpDesk fantASTIC[9]. Es importante destacar que actualmente (20 Abril 2008) Tsearch2 está integrado en PostgreSQL 8.3, por lo cual este gran parte de este manual será válido sólo para versiones inferiores a PostgreSQL 8.3, en mi caso he usado Tsearch2 usando ispell con idioma español con PostgreSQL 8.1 y supongo que este manual funcionaría perfectamente bien con PostgreSQL 8.0, al mismo tiempo estoy seguro que con PostgreSQL 8.2 presentará un problema, provocado por un bug presente en un paquete llamado snowball[5] usado por Tsearch2.

El ejemplo aquí descrito ha sido realizado en GNU / Linux Debian Etch 4.0 r0, pero no implica que no pueda ser posible su implementación en otras distribuciones de GNU / Linux o en otros sistemas operativos soportados por PostgreSQL (como en MS Windows).

Se recomienda leer un poco (aunque no es necesario para completar la realización de este ejemplo) el manual de Tsearch2 ubicado en: http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html

Instalar PostgreSQL en Debian Etch GNU/Linux

Aquí no hay mucho que decir:


#apt-get install postgresql-8.1 postgresql-contrib-8.1 postgresql-client-8.1



Importante: no olvidar instalar el paquete postgresql-contrib, pues es allí donde viene Tsearch2.

Descripción de Ejemplo

Como parte de esta explicación, expongo un pequeño ejemplo, el cual se trata del almacenamiento de "artículos" los cuales constan de un "nombre" y del "contenido" del artículo, el objetivo es poder hacer búsquedas por aproximación entre todos los artículos registrados (usando Tsearch2 y PostgreSQL).

Crear Base de Datos de Prueba

Una vez instalado PostgreSQL se ha creado en nuestro sistema un usuario llamado "postgres", el cual es el administrador del RDBMS, para crear la nueva base de datos, que se llamará: "articulos" es posible hacer:


#su postgres
$createdb articulos


Nota: De aquí en adelante voy a suponer que usted sabe usar alguna herramienta cliente básica de PostgreSQL, en este manual usaré psql, cabe destacar que también es posible utilizar las herramientas gráficas, como por ejemplo pgAdmin3.

Definir un nuevo lenguaje procedural en la Base de Datos

Para este ejemplo crearemos algunos scripts en PL/pgSQL, para lo cual es necesario que nuestra base de datos "articulos" tenga soporte para este lenguaje procedural.

Para instalar plpgsql, ejecutar desde una consola, estando siempre como usuario postgres (o cualquier usuario con los privilegios suficientes):


$createlang plpgsql articulos


También es posible hacer esto mismo desde una consola SQL dentro de PostgreSQL:


CREATE PROCEDURAL LANGUAGE plpgsql;


Diseño de Estructura de la Base de Datos (mi ejemplo)

Para ejemplo necesitamos sólo una tabla, la cual se llamará "articulo" y tendrá esta estructura:


Para hacer uso de Tsearch2, necesitamos crear un campo más en la tabla "articulo", este campo debe ser de tipo "tsvector" (este tipo de dato "tsvector" se instalará en nuestra base de datos cuando instalemos Tsearch2, algo que se describe más adelante). Tsearch2 usará este campo extra con el fin de crear una "especie" de índice de busqueda (no es un índice como tal a nivel de base de datos).

Nota: Mi proyecto HelpDesk fantASTIC[9], utiliza PEAR MDB2[6] como capa de abstracción de base de datos, MDB2 hace una especie de reconocimiento o revisión de los tipos de datos de los campos de las tablas que se acceden por medio de él, el tipo de dato "tsvector" no es reconocido por PEAR MDB2[6], lo cual genera un error al intentar acceder por medio de este a tablas que contengan campos con este tipo de datos, razón por la cual sugiero crear una tabla extra para almacenar los índices de Tsearch2, y mediante un trigger mantener ambas tablas sincronizadas, en lugar de crear un campo extra dentro de la tabla.

Supongo que este problema (el no reconocimiento de los tipos de datos especiales como "tsvector") también se podría presentar al usar cualquier otro framework de acceso a base de datos, que revise los tipos de datos de los campos y no tenga soporte para el tipo "tsvector", en caso contrario (ya sea que el tipo de datos de los campos no sea de importancia o de que sí exista soporte, para el tipo de datos "tsvector") este modelo seguiría siendo siempre funcional.

A continuación se presenta el modelo DER versión 2 a utilizar en este ejemplo:




La tabla "pg_ts_articulo" almacenará el índice "tsvector", para cada artículo en el campo "articulo_tsearch_idx" de tipo "tsvector".

Cada ves que un artículo se cree, modifique o borre en la tabla "articulo" un trigger se disparará y hará los cambos pertinentes en la tabla "pg_ts_articulo", para que el índice siempre esté actualizado.

Instalar Tsearch2 en la Base de Datos "articulos"

Para instalar Tsearch2 en nuestra base de datos, utilizamos el archivo sql provisto por el paquete "postgresql-contrib", el cual se encuentra en la siguiente ruta:

/usr/share/postgresql/<'version'>/contrib/tsearch2.sql

En mi caso estoy usando PostgreSQL 8.1, por lo cual ejecuto como usuario con privilegios sobre la base de datos "articulos":


$psql -d articulos -f /usr/share/postgresql/8.1/contrib/tsearch2.sql


Aparecerán mensajes como este:


SET
BEGIN
psql:/usr/share/postgresql/8.1/contrib/tsearch2.sql:13: NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «pg_ts_dict_pkey» para la tabla «pg_ts_dict»
CREATE TABLE
CREATE FUNCTION
CREATE FUNCTION
...
CREATE OPERATOR
CREATE OPERATOR
CREATE OPERATOR CLASS
COMMIT


Si todo sale bien, se han agregado las siguientes tablas a la base de datos "articulos":

pg_ts_cfg
pg_ts_cfgmap
pg_ts_dict
pg_ts_parser



Estas tablas son usadas para configurar y parametrizar Tsearch2.

Instalar soporte a lenguaje español de Tsearch2 con ispell usando codificación iso-8859-1

En la página Web de Tsearch2[3] podrá encontrar el archivo tsearch2_espanol.tar.bz2 el cual contiene lo necesario para que Tsearch2 soporte el lenguaje español mediante ispell usando codificiación iso-8859-1. En la página Web de Tsearch2 busque:

tsearch2_espanol.tar.bz2 - spanish ispell dictionary in iso-8859-1 encoding (Denis Torres) [10]

Descargue el archivo y descomprímalo, encontrará los siguientes archivos:

"espanol.aff", fichero de afijos, si desea conocer más sobre estos archivos puede visitar aquí [7].
"espanol.dict", diccionario de palabras en español, si desea conocer más sobre estos archivos puede visitar [7].
"espanol.stop", lista de palabras que no serán indizadas por Tsearch2.[8]
"default_spanish.sql", script sql que parametriza las opciones correspondientes en las tablas de configuración de Tsearch2, para agregar una nueva configuración de diccionario para Tsearch2 llamada "default_spanish".

Copie los siguientes archivos en /usr/local/pgsql/share/contrib/, (si la ruta no existe puede crearla):

espanol.aff
espanol.dict
espanol.stop

Nota: en debian no sería la mejor opción instalar estos archivos en la ruta /usr/local/pgsql/share/contrib/, si usted desea puede copiar estos archivos en otro lugar, pero asegúrese de ajustar el archivo "default_spanish.sql" antes de ejecutarlo.

Luego ejecute el script "default_spanish.sql", en la base de datos "articulos"


$psql -d articulos -f {ruta_al_script}/default_spanish.sql


Crear estructura de datos Diseñada

Aquí no hay mucho que explicar, supongo que el lector sabe crear tablas en SQL. En otras palabras crear las tablas "articulo" y "pg_ts_articulo".


CREATE TABLE articulo(
id_articulo serial NOT NULL,
nombre text NOT NULL,
contenido text,
primary key (id_articulo)
);

CREATE TABLE pg_ts_articulo (
id_articulo integer NOT NULL,
articulo_tsearch_idx tsvector,
PRIMARY KEY (id_articulo)
);

CREATE INDEX idx_articulo_tsearch
ON pg_ts_articulo USING gist (articulo_tsearch_idx);

ALTER TABLE pg_ts_articulo ADD FOREIGN KEY (id_articulo) REFERENCES articulo (id_articulo) ON UPDATE RESTRICT ON DELETE CASCADE;


Es importante hacer notar:

1- Se ha creado para el campo "articulo_tsearch_idx" un índice a nivel de base de datos de tipo: "gist". (Leer el manual de Tsearch2 para obtener detalles sobre los indices GIST).
2- Se ha agregado una relación entre los campos "id_articulo" desde la tabla "articulo" hacia "pg_ts_articulo" con la restricción: ON DELETE CASCADE para que al momento de borrar un "articulo" se borre también su registro relacionado en "pg_ts_articulo".

Crear trigger para la sincronización de los artículos con campo de índice de Tsearch2

Cada vez que se actualice la tabla "articulo" debería actualizarse el índice de Tsearch2 en la tabla "pg_ts_articulo", este trabajo lo hará el siguiente trigger:


CREATE OR REPLACE FUNCTION actualizar_indice_tsearch2() RETURNS "trigger" AS $$
BEGIN

DELETE FROM pg_ts_articulo WHERE pg_ts_articulo.id_articulo = NEW.id_articulo;
INSERT INTO pg_ts_articulo
VALUES (NEW.id_articulo, to_tsvector('default_spanish', coalesce(NEW.nombre) || ' ' || coalesce(NEW.contenido)));

RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE TRIGGER tsvectorupdate AFTER UPDATE OR INSERT ON articulo
FOR EACH ROW EXECUTE PROCEDURE actualizar_indice_tsearch2();


Nota: El indice insertado en "pg_ts_articulo" abarca no sólo el "contenido" sino también el "nombre" del "articulo" para que al momento de realizar una búsqueda se evalúen ambos campos[coalesce(NEW.nombre) || ' ' || coalesce(NEW.contenido)].

Introducir algunos datos de pruebas


INSERT INTO articulo (nombre,contenido) VALUES ('Función echo', 'Muestra todos sus parámetros por la salida definida. echo() no es realmente una función (es una sentencia del lenguaje) de modo que no se requiere el uso de los paréntesis. De hecho, si se indica más de un parámetro, no se pueden incluir los paréntesis.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función sin', 'Devuelve el seno de arg en radianes.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función print_r', 'print_r -- Imprime información legible para humanos sobre una variable.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función print', 'Muestra el valor de cadena por la salida definida. Siempre devuelve el valor 1. print() no es realmente una función (es una sentencia del lenguaje) de modo que no se requiere el uso de los paréntesis.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función array_pop', 'array_pop() extrae y devuelve el último valor de la matriz, acortando la matriz en un elemento. Si matriz está vacía (o no es una matriz), se regresará NULL.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función array', ' Devuelve una matriz con los parámetros que se le pasan. A dichos parámetros se les puede dar un índice usando el operador =>. Lea la sección sobre los tipos de matrices para más información sobre matrices. Nota: array() es una construcción del lenguaje que se utiliza para representar matrices literales, no una función regular. La forma "índice => valor" separada por comas, define índices y valores. el índice puede ser de tipo cadena o numérico. Cuando el índice es omitido, se genera automáticamente un índice numérico, empezando en cero. Si el índice es un entero, el siguiente índice generado será igual al índice con número mayor + 1. Note que cuando se definen dos índices idénticos, el último sobre escribe al primero.Tener una coma después del último elemento de la matriz, aunque inusual, es sintácticamente valido. El siguiente ejemplo demuestra cómo crear una matriz bidimensional, cómo especificar claves para matrices asociativas, y cómo especificar índices no consecutivos en matrices normales.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función cos', 'cos() devuelve el coseno del parámetro arg. El parámetro arg está en radianes.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función tan', 'Devuelve la tangente de arg en radianes.');
INSERT INTO articulo (nombre,contenido) VALUES ('Función array_rand', 'array_rand() es bastante útil cuando desea elegir una o más entradas aleatorias de una matriz. Recibe una matriz de entrada y un argumento opcional num_req que especifica cuántas entradas desea seleccionar; si no se precisa éste argumento, recibe un valor por defecto de 1. Si está eligiendo únicamente una entrada, array_rand() devuelve la clave de una entrada al azar. De lo contrario, devuelve una matriz de claves para las entradas aleatorias. Esto se ha hecho de esta forma para que usted pueda elegir claves al igual que valores al azar de la matriz. ');


Probar actualizaciones en ambas tablas

Primero:

SELECT * FROM articulo;


Luego:


SELECT * FROM pg_ts_articulo;


Ambas tablas deben contener datos.

Crear función plpgsql para realizar las búsquedas


CREATE TYPE respuesta_buscar_articulo AS (id_articulo int, nombre text,contenido text, puntaje real);

CREATE OR REPLACE FUNCTION buscar_articulo(text) RETURNS SETOF respuesta_buscar_articulo AS $$
DECLARE
AGUJA ALIAS FOR $1;
RESPUESTA RECORD;
BEGIN

FOR RESPUESTA IN (
SELECT
articulo.id_articulo,
headline('default_spanish',articulo.nombre,tsq) AS nombre,
headline('default_spanish',articulo.contenido,tsq) AS contenido,
rank(articulo_tsearch_idx,tsq) as puntaje
FROM
pg_ts_articulo,
to_tsquery('default_spanish',AGUJA) tsq,
articulo
WHERE
articulo.id_articulo = pg_ts_articulo.id_articulo
AND
articulo_tsearch_idx @@ tsq
ORDER BY puntaje DESC )
LOOP
RETURN NEXT RESPUESTA;
END LOOP;

RETURN;
END;
$$
LANGUAGE plpgsql;


Hacer búsquedas de prueba

A continuación sólo debemos hacer algunas pruebas:

1- Coincidir sólo una palabra:


select * from buscar_articulo('función');


2- Coincidir 2 (ambas a la vez) palabras:


select * from buscar_articulo('función & matriz');


3- Coincidir cualquiera de 2 palabras:


select * from buscar_articulo('función | seno');






Notar que en esta última búsqueda los artículos que involucran ambas palabras "función" y "seno" tienen mayor puntaje.

Enlaces
[1] http://www.postgresql.org
[2] http://es.wikipedia.org/wiki/Postgresql
[3] http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
[4] http://en.wikipedia.org/wiki/Full_text_search
[5] http://archives.postgresql.org/pgsql-general/2007-09/msg00794.php
[6] http://pear.php.net/package/MDB2
[7] http://www.datsi.fi.upm.es/%7Ecoes/espell_leame/espell_leame.html
[8] Se agradece a las personas que colaboraron para la elaboración de esta lista de palabras: https://lists.ubuntu.com/archives/ubuntu-ni/2007-August/001921.html
[9] http://sourceforge.net/projects/fantastic/
[10] http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/dicts/ispell/tsearch2_espanol.tar.bz2

miércoles, abril 23, 2008

Instalar la Base de Datos Oracle Express Edition en Debian Etch GNU/Linux

Dice esta Web

http://www.oracle.com/technology/products/database/xe/index.html




Que: Oracle Database 10g Express Edition es Gratis! para desarrollar, desplegar y distribuir.

"Oracle Database 10g Express Edition (Oracle Database XE)" es una base de datos BÁSICA, basada en la "Oracle Database 10g Release 2" se permite de forma gratuita desarrollar, desplegar y distribuir el código básico; es simple de administrar.

Según la Web de Oracle, la Base de Datos Oracle XE se puede ser utilizada por:

* Desarrolladores que trabajan con PHP, Java, .NET, XML, y aplicaciones Open Source
* DBAs que necesiten una base de datos gratis, para iniciar su entrenamiento
* Instituciones educativas y estudiantes que necesitan poner Oracle en su curriculum

Sobre la instalación resume de forma rápida:

Oracle Database XE puede ser instalada en máquinas de distintas prestaciones, con cualquier número de CPUs (una base de datos por máquina), pero (Oracle la ha puesto a disposición de forma gratuita, como ustedes de seguro ya se imaginaban hay peros) pero XE almacenará hasta 4GB de datos de usuario, usará hasta 1GB de memoria, y usa sólo un CPU de la computadora.

Hay buenos manuales de instalación y uso, en la Web que les mencioné arriba. Es interesante mencionar también que según la Web de Oracle esta edición de Oracle XE ha ganado el "LinuxWorld Product Excellence Award for Best Database Solution" (http://www.oracle.com/corporate/press/2006_apr/oraclexe-lw-award-041306.html).

Ok, no mas "wiri wiri", empecemos a instalar:

Nota: hagan suficiente espacio en su partición /usr

En el caso de debian también es necesario descargar el paquete "libaio" para que funcione Oracle XE (en la web de Oracle encontrarán también un enlace para descargar este deb). Después de descargar oracle-xe_10.2.0.1-1.1_i386.deb y libaio_0.3.104-1_i386.deb, procedemos con la instalación:

denis@debdenis2:/media/cdrom1$ ls -lh
total 486M
-r-xr-xr-x 1 root root 5.9K 2005-06-21 18:02 libaio_0.3.104-1_i386.deb
-r-xr-xr-x 1 root root 211M 2006-05-25 02:19 oracle-xe_10.2.0.1-1.1_i386.deb
-r-xr-xr-x 1 root root 25M 2006-05-25 02:18 oracle-xe-client_10.2.0.1-1.2_i386.deb
-r-xr-xr-x 1 root root 251M 2006-05-25 02:20 oracle-xe-universal_10.2.0.1-1.1_i386.deb



Proceder con la instalación de libaio

denis@debdenis2:/media/cdrom1$ su
Password:
debdenis2:/media/cdrom1# dpkg -i libaio_0.3.104-1_i386.deb
Seleccionando el paquete libaio previamente no seleccionado.
(Leyendo la base de datos ...
34485 ficheros y directorios instalados actualmente.)
Desempaquetando libaio (de libaio_0.3.104-1_i386.deb) ...
Configurando libaio (0.3.104-1) ...



Instalar oracle-xe

debdenis2:/media/cdrom1# dpkg -i oracle-xe_10.2.0.1-1.1_i386.deb
(Leyendo la base de datos ...
22908 ficheros y directorios instalados actualmente.)
Preparando para reemplazar oracle-xe 10.2.0.1-1.1 (usando oracle-xe_10.2.0.1-1.1_i386.deb) ...
Desempaquetando el reemplazo de oracle-xe ...
Configurando oracle-xe (10.2.0.1-1.1) ...
Executing Post-install steps...

You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.



Ultimo paso: configurar oracle-xe respondiendo unas sencillas preguntas


debdenis2:/media/cdrom1# /etc/init.d/oracle-xe configure

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press Enter to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:8086

Specify a port that will be used for the database listener [1521]:

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:
Confirm the password:

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:y

Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to "http://127.0.0.1:8080/apex"


Como habrán notado la configuración es suficientemente intuitiva y no necesita de mucha explicación, en mi caso el puerto 8080 ya lo tenía ocupado por lo cual seleccioné otro.

Listo!




Oracle XE también está disponible para estas distribuciones de Linux a 32-bit: Mandriva Linux 2006 Power Pack+, SUSE Linux Enterprise Server 9 y SUSE Linux 10 de Novell, Red Hat Enterprise Linux 4, Fedora y Ubuntu, ah! también sacaron una versión para Windows.

lunes, marzo 31, 2008

Problema para Instalar Debian Etch en un PC DELL Optiplex 320 con Disco Duro SATA

English Version

Mi amigo Cesar, estaba intentando instalar Debian Etch en su computadora nueva, un PC DELL Optiplex 320, pero el instalador de Debian le decía:

"No se detectó ninguna unidad de disco. Puede seleccionar el controlador de la lista si conoce el nombre del que necesita la unidad de disco."

El disco duro de la PC es SATA, yo ya había escuchado antes que algunas versiones viejitas de Linux daban problema al intentar detectar estos discos duros, pero no se me ocurrió que Debian Etch (el actual Debian estable) también daría dicho problema.

Como no teníamos idea de que hacer, publiqué mi duda en varias listas de usuarios de Debian GNU/Linux a las cuales estoy suscrito, redacté mi duda de la siguiente manera:

"Hola

Tengo problema para instalar debian etch 4 r0, en un PC DELL con disco duro SATA, el instalador no reconoce el disco duro, ¿que puedo hacer?.

¿Alguien ha tenido una experiencia parecida?

Gracias."

La respuesta que solucionó nuestro problema fue de:

Marcelo - marcelo.magallon at gmail.com

"Optiplex 320.

Pareciera ser que varias personas han reportado problemas con esa máquina. La solución parece ser utilizar la opción pci=nomsi

Cuando aparece la pantalla de instalación, en lugar de presionar enter escribes esto:

install pci=nomsi

Ahora, cuando llegas a la pantalla que te dice que va a instalar "GRUB" en el master boot record (MBR), te devuelves (seleccionas "back" o "atrás") y seleccionas la opción que dice que quieres utilizar "LILO". Esto porque GRUB parece tener problemas en esta máquina en particular."

Otras buenas respuestas fueron:


Israel - neflyte49 at gmail.com

Simple: andate al BIOS y ponelo en modo PATA+SATA o modo LEGACY.

Luis Roberto Castro Silva - rcswrc at gmail.com

He visto que a algunas computadoras hay que cambiarle en el BIOS la forma de ver los discos duros pues se implemento el AHCI para Windows Vista, de manera que hay que cambiarlo de AHCI a SATA.

Walter Pérez Aráuz - walternrg4u at gmail.com

Quizás te pueda servir:

http://wiki.osuosl.org/display/LNX/Debian+on+Dell+Servers?showComments=false

Saludos!

Rodrigo Castro - rodrigo.b.castro at gmail.com

Yo tuve unos problemas similares con unas máquinas Dell no las tengo cerca como para decirte paso a paso como lo resolví.

Lo que hice fue irme a la configuración del BIOS, en la sección del HDD SATA y le das que utilicé OLD SATA CONTROLLER.

Curiosamente con Ubuntu ni con Mandriva no me daba ese problema.

Saludos,

Zenón Monge - zmonge at gmail.com

No sé si el instalador de DEBIAN contiene algún kernel con soporte para SCSI, que es como Linux reconoce los discos SATA.

Acá http://www.debian.org/releases/stable/i386/ch05s01.html.en esta la forma de revisar las opciones de arranque y allí debería estar listada la opción para arrancar con soporte a dispositivos SCSI.

--
Saludos,

Zenón Monge


Eric de la Goublaye de Menorval - menorval at gmail.com

¿Porqué no pruebas con la última versión de DEBIAN? --> Debian GNU/Linux 4.0r3

http://www.debian.org/releases/


Y por supuesto no faltaron las respuestas cómicas:


Richard Mena - rmendoza85 at gmail.com

Instala SUSE hombre!
Ya trae soporte para discos SATA jejeje...


Llegando al final del hilo de la discusión decía:

Rodrigo Castro - rodrigo.b.castro at gmail.com

Denis envió la pregunta a múltiples listas, parece que ya en una le respondieron en una de ellas y arregló el problema:

> Gracias a todos, con la instrucción
> install pci=nomsi (en LILO)
>funcionó a la perfección! Gracias!

Denis Torres - denisjtorresg at gmail.com

En efecto Rodrigo, esa instrucción es la que me funcionó, pero es bueno aprender las otras experiencias que han adquirido los demás compañeros de la lista, gracias a todos!

No me cabe duda que la comunidad de DEBIAN (en cualquier parte del mundo) es de las más activas y experimentadas, por eso no me cambio a otra distro!

En efecto estoy inscrito en varias listas, me gusta aprender de la experiencia compartida de los demás!

Saludos desde Nicaragua!

Conclusión personal:

Con este artículo, más que explicar como "Instalar Debian Etch en un PC DELL Optiplex 320 con Disco Duro SATA", intento demostrar que el hecho de participar en las listas GUL, es ampliamente beneficioso en cuanto que toda una comunidad de experiencias se unen, para dar un completo soporte a todos los que tenemos dudas o problemas.

Gracias a todos los amigos de:

* Grupo de usuarios de Debian de Nicaragua:
** debian-ni@googlegroups.com
* Grupo de usuarios de Debian de Costa Rica:
** debian-user-cr@cr.debian.net
* Grupo de usuarios de Debian de El Salvador:
** debian-sv@lists.debian.org.sv
* Grupo de usuarios de Linux de Nicaragua:
** gul-nic@linux.org.ni
* Red Costarricense de Software Libre:
** csl-tec@softwarelibrecr.org
* Grupo de usuarios de Linux de Costa Rica:
** gulcr@listas.linux.or.cr

martes, marzo 04, 2008

Validar números de cédulas de Nicaragua con JavaScript

A continuación comparto un pequeño código JavaScript para validar si una cadena de texto es un número de cédula válido en Nicaragua.

Siéntanse en la libertad de usarlo, modificarlo, copiarlo o compartirlo. Se ha liberado como L-GPL3.

http://sites.google.com/site/denisjtorresg/validar_cedula_js.zip

Ver versión para Java.

viernes, febrero 22, 2008

The last lunar eclipse in this decade

Versión en Español

Last Wednesday February 20, 2008, a lot of Nicaraguans got an amazing "sky show", when Sun, Moon and the planet where We walk on every day, the Earth got together in a perfect dance.

Early in the afternoon in Granda, Nicaragua (my point of view), I didn't see the Moon by cause of a cloudy sky, about 7:30 PM it started to rain, so I decided to install in my computer this program: Stellarium, because I didn't want to lose the eclipse by cause of the bad weather.

Stellarium is a free (libre) software, you can download it from its official home page: http://www.stellarium.org/, it works on Windows, Linux and Mac OS X. If you have played any 3D game, you will learn easy how to use it.

If you didn't see the eclipse, don't worry, at same time that Stellarium can send you around the world, it can work like a "time machine", that means you can "go back in time" and see the eclipse step by step, in virtual form.

Fortunately in Granada, near to 8:20 PM, the sky cleared and the rain stopped, and I could see in the real world the last lunar eclipse in this decade!.

By the way, I realized through this great software, Stellarium, that the shining star near to the Moon was not a star, but it really was Saturn planet, I learned it thanks to Stellarium, you can see about it on next image.















Please excuse my english, english is not my first language, but I'm learning.
Linux Tour Nicaragua 2008 Begins

Versión en Español

Linux Tour is an initiative from the community of GNU/Linux users in Nicaragua, to promote the usage of free (libre) software and open source in our country.

This next 22 friday at 3:00 PM, will start the Linux Tour 2008 in the main auditorium of the Universidad de Ciencias Comerciales (UCC).

If you want to know more about it, you can visit the official site: http://www.linuxtour.org




Please excuse my english, english is not my first language.
Inicia el Linux Tour 2008 - Nicaragua

English Versión

El Linux Tour es una iniciativa de la comunidad de usuarios GNU/Linux de Nicaragua destinada a promover el uso de alternativas libres y de código abierto en nuestro país.

El próximo viernes 22 de febrero a las 3:00 PM, dará inicio el Linux Tour 2008 en el auditorio mayor de la Universidad de Ciencias Comerciales (UCC).

Para mayor información visitar el sitio oficial: http://www.linuxtour.org

jueves, febrero 21, 2008

El último eclipse lunar de esta década

English Version

El día de ayer, Miércoles 20 de Febrero del año 2008, muchos Nicaragüenses disfrutamos el maravilloso espectáculo realizado en el teatro celestial, donde las "estrellas" nos fascinaron, en una perfecta danza ejecutada entre el Sol, la Luna, y el planeta que pisamos a diario: la Tierra. Según las noticias era el último eclipse lunar de esta década.

Al inicio, en Granada Nicaragua (mi punto de observación), un cielo medio nublado, no dejaba contemplar completamente la luna, luego como a eso de las 7:30 PM de forma repentina los cielos dejaron caer una lluvia que tardó aproximadamente 20 minutos, por lo cual se me ocurrió instalar este programa en mi computadora: Stellarium, para no perderme por el mal clima el eclipse que estaba pronto a iniciar.

Stellarium es sofwtare libre, pueden descargarlo desde su sitio oficial en: http://www.stellarium.org/, hay versiones para Windows, Linux, y Mac OS X. Si han jugado cualquier juego 3D, no se les va a hacer complicado empezar a utilizarlo.

Si se perdieron del eclipse, no se preocupen Stellarium no sólo puede llevarlos a ver el cielo desde distintos lugares del mundo, sino también permite viajar en el tiempo (fecha y hora), con lo cual podrían "volver al pasado" y apreciar, de forma virtual, el eclipse paso a paso.

En Granada, como a eso de las 8:20 PM, por suerte las nubes se fueron, la lluvia no siguió, y puede apreciar en vivo y a todo color (en el mundo real) del último eclipse lunar de esta década!.

Por cierto ayer me dí cuenta mediante este excelente programa Stellarium, que la "estrella" brillante que estaba un poco abajo de la luna no era una estrella, sino que era el planeta Saturno, está información también la pude obtener gracias a Stellarium, a como se aprecia en la imagen a continuación.

viernes, febrero 15, 2008

Run JavaScript code, step by step using Firebug

Versión en Español

Before I know about Firebug, to debug javascript code was very complicated for me, I had to add a lot of 'alert' sentences in each point that I wanted to check, but later I found Firebug.

Firebug show us each javascript error code, give us a brief description about each error and the best part is that let us run step by step the javscript code, at same time we can watch each variable value, create break points, and follow the secuence of code.

If you want to start using Firebug, you should download:

Firefox
Firebug

Fast How To:

1- Open Firebug



2- Activate "Script" tab, then select one file to debug, from "Inspect" list.



3- Put break points on the javascript source



4- Trigger off the event to start the javascript code execution, then you can use the watch window


Please excuse my english, english is not my first language.

jueves, febrero 14, 2008

Ejecutar código JavaScript paso a paso con Firebug

English Version

Antes de conocer Firebug, corregir un error en un código javascript me era complicado, tenía que agregar muchas sentencias 'alert' en distintos lugares del código, para descubrir donde estaba el error que buscaba, pero después encontré Firebug y todo cambio.

Firebug encuentra y enumera los errores de código javascript, brinda una descripción de cada error y lo mejor de todo es que permite ejecutemos paso a paso el código, inspeccionar los valores de las variables, crear 'break points', y seguir la secuencia del código javascript paso a paso.

Herramientas Necesarias:

Descargar Firefox
Descargar Firebug

Pasos Rápidos:

1- Abrir Firebug



2- Activar la ficha "Script" y seleccionar el archivo correspondiente en el selector "Inspect"



3- Ubicar los break points en el código javascript



4- Disparar el evento que ejecute el código y usar los controles de ejecución y el inspector de variables

miércoles, febrero 13, 2008

Validar números de cédulas de Nicaragua con Java

Validar números de cédulas de Nicaragua con Java

A continuación comparto un pequeño código Java para validar si una cadena de texto es un número de cédula válido en Nicaragua.

Siéntanse en la libertad de usarlo, modificarlo, copiarlo o compartirlo. Se ha liberado como L-GPL3 y software de dominio público.

Esta es la versión del 10 de agosto del 2013. Con el aporte de Filgrados Correos.

http://sites.google.com/site/denisjtorresg/cedula.zip

Ver versión para JavaScript.


package denisjtorresg.info;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

/**
 * Validador de Número de Cédula Nicaraguense
* Este programa es software libre: usted lo puede redistribuir y/o modificar * bajo los términos de la GPL version 3 y/o software de dominio público.
* * blog.denisjtorresg.info * * Con colaboración de: * - Filgrados Correos. *
* * @autor: denisjtorresg@gmail.com * @version: 10/08/2013 * * */ public class ValidarCedula { private final String LETRAS = "ABCDEFGHJKLMNPQRSTUVWXY"; private String cedula = null; /** * Para Pruebas * @param args */ public static void main(String[] args){ String tempo = null; boolean gui = false; ValidarCedula cedula = new ValidarCedula(); if(args.length==0){ cedula.setCedula(JOptionPane.showInputDialog( "Indique la cédula a validar" )); gui = true; } else cedula.setCedula(args[0]); tempo = "Cédula a Validar: " + cedula.getCedula() + "\n"; tempo+= "Prefijo a Validar: " + cedula.getPrefijoCedula()+ "\n"; tempo+= "Fecha a Validar: " + cedula.getFechaCedula()+ "\n"; tempo+= "Sufijo a Validar: " + cedula.getSufijoCedula()+ "\n"; tempo+= "Letra a Validar: " + cedula.getLetraCedula()+ "\n"; tempo+= "¿Es Cédula Válida?: " + (cedula.isCedulaValida()?"SI":"NO")+ "\n"; tempo+= "¿Es Prefijo Válido?: " + (cedula.isPrefijoValido()?"SI":"NO")+ "\n"; tempo+= "¿Es Fecha Válida?: " + (cedula.isFechaValida()?"SI":"NO")+ "\n"; tempo+= "¿Es Sufijo Válido?: " + (cedula.isSufijoValido()?"SI":"NO")+ "\n"; tempo+= "¿Es Letra Válida?: " + (cedula.isLetraValida()?"SI":"NO")+ "\n"; tempo+= "La letra esperada es: " + cedula.calcularLetra() + "\n"; if(gui) JOptionPane.showMessageDialog(null,tempo); else System.out.println(tempo); } /** * Retorna true si la cédula es válida * false en caso contrario * * @return */ public boolean isCedulaValida(){ if(!isPrefijoValido()) return false; if(!isFechaValida()) return false; if(!isSufijoValido()) return false; if(!isLetraValida()) return false; return true; } /** * Retorna true si el prefijo de la cédula es válida * false en caso contrario * * @return */ public boolean isPrefijoValido(){ String prefijo = this.getPrefijoCedula(); if(prefijo==null) return false; Pattern p = Pattern.compile("^[0-9]{3}$"); Matcher m = p.matcher(prefijo); if (!m.find()) return false; return true; } /** * Retorna true si la fecha de la cédula es válida * false en caso contrario * * @return */ public boolean isFechaValida(){ String fecha = this.getFechaCedula(); if(fecha == null) return false; Pattern p = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])([0-9]{2})$"); Matcher m = p.matcher(fecha); if (!m.find()) return false; // verificar si la fecha existe en el calendario try { DateFormat df = new SimpleDateFormat("ddMMyy"); if(!fecha.equals(df.format(df.parse(fecha)))){ return false; } } catch (ParseException ex) { return false; } return true; } /** * Retorna true si el sufijo de la cédula es válida * false en caso contrario * * @return */ public boolean isSufijoValido(){ String sufijo = this.getSufijoCedula(); if(sufijo == null) return false; Pattern p = Pattern.compile("^[0-9]{4}[A-Y]$"); Matcher m = p.matcher(sufijo); if (!m.find()) return false; return true; } /** * Retorna true si la letra de la cédula es válida * false en caso contrario * * @return */ public boolean isLetraValida(){ String letraValida = null; String letra = this.getLetraCedula(); if(letra == null) return false; letraValida = String.valueOf(this.calcularLetra()); return letraValida.equals(letra); } /** * Retorna un entero que representa la posición en la cadena LETRAS * de la letra final de una cédula * * @return */ public int getPosicionLetra(){ int posicionLetra = 0; String cedulaSinLetra = this.getCedulaSinLetra(); long numeroSinLetra = 0; if(cedulaSinLetra == null) return -1; try{ numeroSinLetra = Long.parseLong(cedulaSinLetra); }catch(NumberFormatException e){ return -1; } posicionLetra = (int)(numeroSinLetra - Math.floor((double)numeroSinLetra/23.0) * 23); return posicionLetra; } /** * * Calcular la letra al final de la cédula nicaraguense. *
* Basado en el trabajo de: Arnoldo Suarez Bonilla - arsubo@yahoo.es *
* http://espanol.groups.yahoo.com/group/ptic-nic/message/873 * Mie, 6 de Feb, 2008 2:39 pm *
* Es correcto, los ultimos 4 numeros de la cédula son un consecutivo de las personas que nacen en la misma fecha y municipio. * La letra se calcula con el siguiente algoritmo (yo se los envío en SQL). *
*
     * declare  @cedula      varchar(20),
     *          @val         numeric(13, 0),
     *          @letra       char(1),
     *          @Letras      varchar(20)
     *          
     *          select @Letras = 'ABCDEFGHJKLMNPQRSTUVWXY'
     *          select @cedula = '0012510750012' --PARTE NUMERICA DE LA CEDULA SIN GUIONES
     *          --CALCULO DE LA LETRA DE LA CEDULA   
     *          select @val = convert(numeric(13, 0), @cedula) - floor(convert(numeric(13, 0), @cedula) / 23) * 23
     *          select @letra = SUBSTRING(@Letras, @val + 1, 1)
     *          select @letra
     * 
* @return Letra válida de cédula dada */ public char calcularLetra(){ int posicionLetra = getPosicionLetra(); if(posicionLetra <0 posicionletra="">= LETRAS.length()) return '?'; return LETRAS.charAt(posicionLetra); } /** * Fiajr el Número de Cédula * * @param cedula Número de Cédula con o sin guiones */ public void setCedula(String cedula) { cedula = cedula.trim().replaceAll("-",""); if(cedula == null || cedula.length() != 14) this.cedula = null; else this.cedula = cedula.trim().replaceAll("-","").toUpperCase(); } /** * Retorna el Número de Cédula * @return */ public String getCedula() { return cedula; } /** * Retorna el prefijo de la cédula * @return */ public String getPrefijoCedula(){ if(cedula!=null) return cedula.substring(0,3); else return null; } /** * Retorna la fecha en la cédula * @return */ public String getFechaCedula(){ if(cedula!=null) return cedula.substring(3,9); else return null; } /** * Retorna el sufijo en la cédula * @return */ public String getSufijoCedula(){ if(cedula!=null) return cedula.substring(9,14); else return null; } /** * Retorna la letra de la cédula * @return */ public String getLetraCedula(){ if(cedula!=null) return cedula.substring(13,14); else return null; } /** * Retorna la cédula sin la letra de validación * @return */ public String getCedulaSinLetra(){ if(cedula!=null) return cedula.substring(0,13); else return null; } }