miércoles, 26 de diciembre de 2007

Java: Anotaciones

Crear una anotacion

Para crear una anotacion es necesario crear un archivo cuyo nombre sea el de la anotacion y su extension .java. En el caso de la anotacion de ejemplo resulta que el archivo Ejemplo.java tendra el siguiente contenido:

package anotaciones;

public @interface Ejemplo {}


Aplicar politicas a la anotacion

Las anotaciones pueden emplearse para anotar codigo fuente, empleando procesadores de anotaciones, o para anotar clases en tiempo de ejecucion.
La anotacion de ejemplo se debera modificar de la siguiente manera para que sea utilizada por procesadores de anotaciones en tiempo de compilacion:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
public @interface Ejemplo {}


En caso que sea necesario acceder a la misma en tiempo de ejecucion, sera necesario emplear una politica de retencion diferente:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Ejemplo {}


En los ejemplos anteriores se usaron anotaciones de anotaciones, y son llamadas meta-anotaciones.

Restringir elementos a los cuales se aplica la anotacion

En los ejemplos anteriores tampoco se aplico limitacion alguno en cuanto al uso de la anotacion de ejemplo. Las anotaciones pueden ser aplicadas a clases, metodos, atributos, etc, siempre y cuando se indique cual es su objetivo.
La anotacion de ejemplo sera entonces empleada en tiempo de ejecucion, solo en metodos, con lo cual resultara:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ejemplo {}


Uso de anotaciones en tiempo de ejecucion

A continuacion se emplea el ultimo ejemplo de anotacion presentado antes.

domingo, 23 de diciembre de 2007

par2: Usando parchive en Linux

Instalacion de par2cmdline

$ gunzip par2cmdline-0.3.tar.gz

$ tar -xvf par2cmdline-0.3.tar

$ ./configure --prefix=/home/user/bin/par2cmdline-0.3

$ make

$ make install

Ejecutando par2cmdline

./par2cmdline

Vinculos:

nntp: Usando NZBGet en Linux

Configuracion de nzbget

$ ./nzbget -c nzbget.conf archivos.nzb

Ejecutando nzbget

[INFO] Downloading archivos/archivo.part01.rar [98/98]
[INFO] Successfully downloaded archivos/archivo.part01.rar [93/98]
[INFO] Successfully downloaded archivos/archivo.part01.rar [95/98]
[INFO] Successfully downloaded archivos/archivo.part01.rar [94/98]


Vinculos:

miércoles, 19 de diciembre de 2007

sfv: Verificacion de archivos con cfv en Linux

Preparar el paquete cfv

Descargue el paquete de codigo fuente de cfv, cuya ubicacion esta indicada en la seccion vinculos de este articulo, y luego descomprimalo en la ubicacion de su preferencia:

$ gunzip cfv-1.18.1.tar.gz
$ tar -xvf cfv-1.18.1.tar


Configuracion de la distribucion cfv

Antes de proceder a la contruccion de cfv, puede ser necesario modificar la configuracion por defecto de la distribucion. Para conocer la ubicacion de instalacion y otras opciones ejecute el comando make:

$ make

to install cfv, type make install or install-wrapper.
manpage will be installed to: /usr/local/man/man1

"make install" will install like a standard script in
/usr/local/bin

"make install-wrapper" will install a byte-compiled version in
/usr/lib/python2.4/site-packages
with a small wrapper script in /usr/local/bin
this allows for faster loading time since python does not need
to parse the entire script every load.

You may edit the Makefile if you want to install somewhere else.

Note that this method does not change how fast cfv actually runs,
merely the time it takes from when you hit enter till it actually
starts doing something. For processing lots of files, this amount
of time will be inconsequential.


Para instalar cfv en otra ubicacion es necesario modificar el archivo Makefile entonces:

$ vi Makefile

Habra que buscar la linea donde se definen e inicializan las variables bindir, mandir, install y modificar su valor:

bindir=/home/user/bin/cfv-1.18.1/bin
mandir=/home/user/bin/cfv-1.18.1/man
install=/home/user/bin/cfv-1.18.1 -c


En negrita se muestra el cambio efectuado.
Para verificar los cambios hechos en el archivo Makefile, ejecute el target foo:

$ make foo

y segun los cambios hechos aqui se obtiene:

to install cfv, type make install or install-wrapper.
manpage will be installed to: /home/user/bin/cfv-1.18.1/man/man1

"make install" will install like a standard script in
/home/user/bin/cfv-1.18.1/bin

"make install-wrapper" will install a byte-compiled version in
/usr/lib/python2.4/site-packages
with a small wrapper script in /home/user/bin/cfv-1.18.1/bin
this allows for faster loading time since python does not need
to parse the entire script every load.

Antes de comenzar con la instalacion es necesario asegurarse que el directorio donde sera instalado existe, de lo contrario se obtendra el siguiente mensaje:

make: /home/user/bin/cfv-1.18.1: Command not found
make: *** [/home/user/bin/cfv-1.18.1/bin] Error 127


Instalacion de cfv

Para instalar cfv debera ejecutar el target install:

$ make install

Creando un archivo de verificacion con cfv

Una vez instalado acceda al directorio donde se encuentran los archivos a verificar y ejecute cfv de la siguiente manera:

$ cd /home/user/files/
$ /home/user/bin/cfv-1.18.1/bin/cfv -C -L -v -t sfv archivo.part*


-C = Modo de creacion
-L = No resolver vinculos simbolicos
-v = Mostrar en pantalla el progreso
-t = Tipo de verificacion a crear

Como se observa en el ejemplo, resuelve expresiones con wildcards!

El archivo de verificacion generado tendra como nombre el del directorio desde el cual se ejecuta cfv, en este caso sera files.sfv. Lo unico que resta hacer, si este nombre no le satisface, es cambiarlo.

Verificando archivos con cfv

Si ya dispone de un archivo de verificacion, entonces debera realizar la prueba invocando cfv de la siguiente manera:

$ /home/user/bin/cfv-1.18.1/bin/cfv -T -v -t sfv -f archivo.sfv

-T = Realizar comprobacion de archivos
-v = Mostrar en pantalla el progreso
-t = Tipo de verificacion a realizar
-f = Nombre del archivo de verificacion

Opciones de cfv

Para ver el listado de todas las opciones disponibles, modos de ejecucion y tipos de verificaciones, ejecute:

$ ./cfv -h

Vinculos:

ftp: Enviar varios archivos en batch

Para enviar a un servidor ftp un conjunto de archivos en forma desatendida, como por ejemplo los siguientes:

archivo.part01.rar
archivo.part02.rar
archivo.part03.rar


es necesario:
  • Conectarse al servidor ftp con el modo interactivo deshabilitado, de forma que no pregunte por confirmacion al momento de enviar cada archivo:

    $ ftp -i -p 127.0.0.1

  • Verificar, mediante el comando glob, que la expansion de nombres de archivo para los comandos mget y mput esta habilitada:

    $ glob

  • Enviar los archivos empleando empleando el comando mput y utilizando una regular expression que represente sus nombres:

    $ mput archivo.part*

domingo, 16 de diciembre de 2007

perl: Actualizar la configuracion de perl en Linux

Al ejecutar el shell de perl, de la siguiente manera:

$ perl -MCPAN -e shell

perl detecta que es necesario actualizar su configuracion. Debido a esto apareceran una serie de preguntas que es necesario responder. La mayoria pueden ser resultas por la opcion default que se ofrece.
Una vez finalizada de configuracion, aparece el siguiente mensaje:

Please remember to call 'o conf commit' to make the config permanent!

Y se despliega el promt del shell de perl:

cpan shell -- CPAN exploration and modules installation (v1.90)
ReadLine support enabled

cpan[1]>


Es ahora cuando es conveniente guardar la configuracion para evitar tener que completarla nuevamente. Para hacerlo es necesario ejecutar el siguiente comando en el shell:

cpan[1]> o conf commit
commit: wrote '/home/.cpan/CPAN/MyConfig.pm'

cpan[2]> exit

perl: Instalar modulo Perl en Linux

Para hacer esto es necesario disponer de perl instalado. De esta manera existe en $HOME un directorio llamado .cpan. Es conveniente acceder a este directorio y desde alli realizar la instalacion de nuevos modulos:

$ cd ~/.cpan

o

$ cd $HOME/.cpan

Mediante el mismo comando perl es posible hacerlo:

$ perl -MCPAN -e "modulo"

Ejemplo:

$ perl -MCPAN -e "XML::DOM"

Tambien es posible hacerlo en forma interactiva usando el shell de perl:

$ perl -MCPAN -e shell

Luego es necesario indicarle al shell que hacer:

cpan> install modulo

Ejemplo:

cpan> install XML::DOM

Al iniciar la instalacion perl hara algunas preguntas relacionadas a su configuracion. La primera define la ubicacion del la ubicacion para construir modulos y cacheo:

I see you already have a directory
/home/.cpan
Shall we use it as the general CPAN build and cache directory?

CPAN build and cache directory? [/home/.cpan]


Si es correcta presionar ENTER y sino indicarla.
Lo mismo ocurre para la ubicacion de los fuentes:

Unless you are accessing the CPAN via the filesystem directly CPAN.pm
needs to keep the source files it downloads somewhere. Please supply a
directory where the downloaded files are to be kept. [/home/.cpan/sources]


Las restantes preguntas se listan a continuacion y la respuesta puede ser el default indicado entre corchetes:

Directory where the build process takes place? [/home/.cpan/build]

Always commit changes to config variables to disk? [no]

Cache size for build directory (in MB)? [100]

Let the index expire after how many days? [1] 7

Perform cache scanning (atstart or never)? [atstart]

Cache metadata (yes/no)? [yes]

Policy on building prerequisites (follow, ask or ignore)? [ask]

Parameters for the 'perl Makefile.PL' command?
Typical frequently used settings:

PREFIX=~/perl # non-root users (please see manual for more hints)

Your choice: []

Despues de actualizar la configuracion, perl intentara instalar el modulo. Primero lo descargara de alguno de los 'mirrors' configurados y luego lo construira y desplegara. En caso que el modulo se encuentre instalado y actualizado, aparecera el siguiente mensaje:

Going to read /home/.cpan/Metadata
Database was generated on Sun, 16 Dec 2007 10:37:55 GMT
XML::DOM is up to date (1.44)

perl: Listar modulos Perl instalados en Linux

Es muy sencillo, usando el comando instmodsh.

Al ejecutarlo:

$ instmodsh

Muestra la siguiente lista de opciones:

Available commands are:
l - List all installed modules
m - Select a module
q - Quit the program
cmd? 1


Al seleccionar la 1 y presionar ENTER, la lista de modulos instalados aparece:

Apache::Admin::Config
Authen::SASL
BSD::Resource
Business::OnlinePayment
Business::OnlinePayment::AuthorizeNet
Business::UPS
CGI
CPAN
Class::Std
...

sábado, 15 de diciembre de 2007

nntp: Cliente de consola para newsgroups en Linux

Descargar el software necesario

NZBGet
libxml2
libpar2
libsigc

Instalar la libreria libsigc

$ gunzip libsigc-2.0.a.tar.gz

$ tar -xvf libsigc-2.0.a.tar

$ ./configure --prefix=/home/user/bin/libsigc-2.0.a

$ make
$ make install

Instalar la libreria libpar2

Para obtener todas las opciones disponibles mediante el sistema de configuracion, ejecute:

$ ./configure --help

Luego configure el paquete libpar2 de la siguiente manera, indicando la ubicacion donde instalarlo:

$ ./configure --prefix=/home/user/bin/libpar2-0.2

Durante la configuracion, libpar2 intenta resolver la dependencia que tiene con libsigc, el no poder hacerlo reporta el siguiente error:

checking for SIGC... configure: error: Package requirements (sigc++-2.0 ) were not met:

No package 'sigc++-2.0' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SIGC_CFLAGS
and SIGC_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.


Entonces realice la configuracion del paquete libpar2 indicando, mediante las variable de entorno apropiadas, la ubicacion de la libreria libsigc compilada y sus fuentes:

$ ./configure --prefix=/home/user/bin/libpar2-0.2
SIGC_CFLAGS=/home/user/bin/libsigc++-2.0.18/include
SIGC_LIBS=/home/user/bin/libsigc++-2.0.18/lib


Ahora es momento de compilar los fuentes. Para esto ejecute make en la forma estandar:

$ make

Aparentemente, aun exiten problemas respecto a la ubicacion de los fuentes y librerias correspondientes a libsigc. El proceso de instalacion de la libreria libpar2 descansa en la herramienta pkg-config para resolver dependencias. Sin la correcta configuracion que la herramienta pkg-config requiere, el proceso de construccion falla:

make all-am
make[1]: Entering directory `/home/user/bin/libpar2-0.2-src'
...
Package sigc++-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `sigc++-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'sigc++-2.0' found


Primero es conveniente verificar que la herramienta pkg-config no encuentra la configuracion apropiada para encontrar los fuentes y librerias relacionadas a libsigc:

$ pkg-config --cflags --libs sigc-2.0

Obtendra, en caso de no encontrar la configuracion, el siguiente mensaje:

Package /home/user/bin/libsigc++-2.0.18/lib/libsigc-2.0.a was not found in the pkg-config search path.
Perhaps you should add the directory containing 'sigc-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'sigc-2.0' found


Otra forma, aun mas simple, de verificar si la herramienta pkg-config dispone de acceso a la configuracion apropiada es inspeccionando la variable de entorno PKG_CONFIG_PATH, que es empleada por pkg-config para buscar los package configuration files necesarios:

$ echo $PKG_CONFIG_PATH | grep 'sigc'

Si el resultado es vacio, entonces quiere decir que el package configuration file para libsigc no esta disponible en el entorno. Para agregarlo haga lo siguiente:

$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:
/home/user/bin/libsigc++-2.0.18/lib/pkgconfig/sigc++-2.0.pc


Ahora, al efectuar el control para la configuracion de libsigc mediante pkg-config, obtendra resultados positivos:

$ pkg-config --variable=prefix sigc++-2.0

La salida estandar mostrara la ubicacion en la cual libsigc se encuentra instalado:

/home/user/bin/libsigc++-2.0.18

Finalmente es necesario ejecutar el proceso de instalacion, invocando nuevamente a make:

$ make install

Instalar la libreria libxml2

$ gunzip libxml2-2.6.30.tar.gz

$ tar -xvf libxml2-2.6.30.tar

$ ./configure --help

$ make
$ make install

Instalar NZBGet

$ gunzip nzbget-0.3.0.tar.gz

$ tar -xvf nzbget-0.3.0.tar

$ ./configure --disable-curses --enable-parcheck \
--with-libpar2-includes=/home/user/bin/
libpar2-0.2/include/libpar2 \
--with-libpar2-libraries=/home/user/bin/
libpar2-0.2/lib \
--with-libsigc-includes=/home/user/bin/
libsigc++-2.0.18/include/sigc++-2.0 \
--with-libsigc-libraries=/home/user/bin/
libsigc++-2.0.18/lib \
--with-libxml2-includes=/home/user/bin/libxml2-2.6.30/include/libxml2 \
--with-libxml2-libraries=/home/user/bin/libxml2-2.6.30/lib

$ make

$ make install

Publicando las librerias compiladas

Al intentar ejecutar nzbget:

$ ./nzbget -c nzbget.conf archivo.nzb

Ocurre el siguiente error:

$ ./nzbget: error while loading shared libraries: libpar2.so.0: cannot open shared object file: No such file or directory

Primero es conveniente verificar cuales son las librerias compartidas que nzbget no encuentra. Para esto ejecute:

$ ldd nzbget

en la salida estandar podra observar algo similar a lo siguiente, donde en negrita se resaltan los errores:

libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00000000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00000000)
libpar2.so.0 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00000000)
libm.so.6 => /lib/libm.so.6 (0x00000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
libc.so.6 => /lib/libc.so.6 (0x00000000)
libsigc-2.0.so.0 => not found
libdl.so.2 => /lib/libdl.so.2 (0x00000000)
libz.so.1 => /usr/lib/libz.so.1 (0x00000000)
/lib/ld-linux.so.2 (0x00000000)


Lo que sucede es que nzbget busca las librerias compartidas en la ubicacion estandar en Linux, que es /usr/lib. Como las librerias de las cuales nzbget depende fueron construidas en otras ubicaciones, es necesario hacerlas disponibles desde /usr/lib mediante vinculos simbolicos:

$ ln -s /home/user/bin/libpar2-0.2/lib/libpar2.so.0 /usr/lib/libpar2.so.0
$ ln -s /home/user/bin/libsigc++-2.0.18/lib/libsigc-2.0.so.0 /usr/lib/libsigc-2.0.so.0


Claro esta que este ultimo paso no es necesario si las librerias fueron instaladas en la ubicacion estandar.

Vinculos:

jueves, 13 de diciembre de 2007

miércoles, 12 de diciembre de 2007

domingo, 2 de diciembre de 2007

Usuarios, roles y privilegios

El modelo RBAC

RBAC es la abreviatura para Role-Based Access Control.

Vinculos

sábado, 1 de diciembre de 2007

maven: Integracion de Maven2 con Eclipse

1. Instalar AspectJ para Eclipse
Solo es necesario hacerlo en caso que no este instalado aun. La distribucion Europa de Eclipse actualmente lo incluye, pero versiones anteriores no. Para llevar a cabo la instalacion, seleccione la opcion 'Help -> Install New Software...' del menu principal:



Una vez seleccionado el plug-in del listado, es necesario aceptar los terminos y condiciones:

Luego de esto solo queda definir la ubicacion donde se instalara el plug-in. Una vez finalizada la instalacion sera necesario reiniciar Eclipse.

2. Intalar el plug-in de Maven 2 para Eclipse
Para realizar la instalacion del plug-in de Maven2 para Eclipse, seleccione la opcion 'Help -> Install New Software...' del menu principal:

Como se trata de un nuevo plug-in, debera elegir la opcion para agregar nuevas caracteristicas. Luego es necesario especificar la ubicacion en la cual Eclipse encontrara el plug-in presionando el boton New Remote Site:

Actualmente el sitio de actualizacion para m2eclipse es:
http://m2eclipse.sonatype.org/sites/m2e
De la lista de sitios, debera seleccionar solo el que acaba de agregar, que es el correspondiente al plug-in de Maven para Eclipse:

De la lista de features obtenidas desde el sitio de actualizacion, seleccione las que son de su interes, que para el caso del plug-in de Maven para Eclipse la unica que no se necesita es la correspondiente a subclipse:

Para finalizar, debera aceptar los terminos y condiciones y, luego de finalizada la descarga, el plug-in quedara instalado disponible para su uso:

Vinculos: