jueves, marzo 04, 2010

Acceso a un application module sin usar el panel binding

En caso de necesitar acceder a un application module sin tener acceso al panel binding, la forma de hacerlo sería usando el método createRootApplicationModule de la clase Configuration.

Los parámetros que tenemos que pasar son el nombre del AppModule, como aparece en la ventana de Application Navigator, en este caso "com.thalesgroup.rss.ctc.ctc1000.forms.model.GRP", y el nombre de la configuración que aparece en la entrada en el fichero bc4j.xcfg de ese AppModule.

Los business components que se obtengan de esta forma, por ejemplo las filas que resultan de ejecutar la query de una vista, estarán disponibles sólamente hasta que se llame al releaseRootApplicationModule.


/**
* Este metodo obtiene el modulo de aplicacion GRP en el que está
* la vista que nos permite obtener la información de configuraciones
* y rellena el Map de configuraciones.
*
* @return El Map con la configuracion.
*/
private static Map
obtenerDatosDeConfiguracion() {
Map
listaDeValoresDeConfiguracion;
// El modulo de aplicacion con el que accedemos a la
// configuracion del GRP.
String amDef = "com.thalesgroup.rss.ctc.ctc1000.forms.model.GRP";
// La definicion de la configuracion de es appModule a la que vamos
// a acceder (AppModuleConfig name="GRPLocal" en el fichero bc4j.xcfg)
String config = "GRPLocal";

// 1. Adquirimos la instancia del application module,
// y hacemos un cast al interfaz que usamos.
GRPImpl appModule = (GRPImpl) Configuration.createRootApplicationModule(amDef, config);

listaDeValoresDeConfiguracion = appModule.getConfiguracion();

// Si no se ha obtenido la informacion deseada se devuelve una lista vacia.
if ((listaDeValoresDeConfiguracion == null) || (listaDeValoresDeConfiguracion.size() == 0)) {
log.error("No se ha podido obtener la lista de valores de configuracion "
+ "o no tiene elementos");
listaDeValoresDeConfiguracion = new HashMap
();
}

// Es necesario liberar el appModule despues de haberlo usado.
// Cuidado, todos Business Components obtenido a traves de este
// appModule se liberan tambien.
Configuration.releaseRootApplicationModule(appModule, true);
return listaDeValoresDeConfiguracion;
}




Etiquetas:

miércoles, mayo 27, 2009

Error accediendo con el driver OCI a una tabla de Oracle

Tras poner el driver OCI en lugar del thin para acceder a una base de datos de Oracle, me apareció la siguiente excepción en la aplicación:
ORA-01406 WHEN RETRIEVING RESULTSET ROWS ONLY WITH OCI DRIVER

Este error desaparece al volver al driver thin JDBC.

En Metalink hay un bug que hace referencia a este mismo error pero no indica nada de como resolverlo.

Al final la solución ha sido modificar los valores definidos para los varchar en los XML de la entidad en la que me estaba dando el fallo. Aunque la columna era de VARCHAR2(30), lo cambié a VARCHAR2(40) y con eso dejó de fallar.

Etiquetas:

martes, mayo 27, 2008

Configuración de acceso a bbdd de Oracle ADF

Para configurar la base de datos a la que debe acceder los componentes de acceso a datos de Oracle ADF tenemos que modificar el fichero bc4j.xcfg. En ese fichero se define el servidor, el usuario a utilizar, la password (encriptada, el SID, etc.

Etiquetas:

lunes, mayo 26, 2008

Para poner la fecha de hoy como valor por defecto en una entidad de Oracle ADF hay que sobreescribir el método create de la implementación de la entidad.

public class HorariosGeneralesImpl extends EntityImpl {
.
.

.

  /**

  *Add attribute defaulting logic in this method.

  */

  protected void create(AttributeList attributeList) {

super.create(attributeList);

    /* Inicializamos el campo ValidezDesde con la fecha de hoy. */

    setAttributeInternal(VALIDEZDESDE,

    Utilidades.convertirTiposDeFechas(new
java.util.Date()));
  }

.

.
.
}

jueves, mayo 22, 2008

Script para buscar ficheros modificados en fechas determinadas

Es un script que he encontrado para buscar ficheros que hayan sido modificados entre unas fechas determinadas. La idea del script es crear dos ficheros con las fechas que se pasan como parámetros y luego usar el find para hacer la busqueda.

Se podría mejorar de varias maneras:
- Comprobando que se pasan todos los parametros necesarios.
- Poniendo valores por defecto.
- Para la fecha "hasta" habria que poner como valor por defecto la fecha de hoy.
- Si no se pone la fecha completa habria que completarla: 2008 = 200801010000

Este es el script:

# more findBetweenDates
echo "Example of use: findBetweenDates /home/user yyyyMMddhhmm yyyyMMddhhmm"


echo "Searching: findBetweenDates $1 $2 $3"
path=$1
olddate=$2
newdate=$3
oldfile=/tmp/tmpoldfile${2}
newfile=/tmp/tmpnewfile${3}
touch -t $olddate $oldfile
touch -t $newdate $newfile
find $path -type f -newer $oldfile ! -newer $newfile
rm $oldfile
rm $newfile

miércoles, mayo 14, 2008

Ratón y teclado no funcionan en Linux después del arranque

Un problema que me ha llevado todo el día de ayer y parte del de hoy.

El problema es que, al arrancar el equipo en, por lo menos, la mitad de las ocasiones no funciona ni el ratón ni el teclado PS/2. Eso no sucede si lo que conectamos un ratón y un teclado USB, pero para nosotros es obligatorio usar PS/2 porque usamos extensores KVM.

Al hacer un shutdown del equipo aparecen multitud de errores del tipo “psmouse.c: bad data from KBC - timeout bad parity”. Esos mismos mensajes se podían ver en /var/log/messages

También sucedía que al seleccionar la opción de apagar o reiniciar el equipo, al final de todo nos mostraba el error “i8042.c Can't restore CTR. Acpi_power_off called” y el equipo no se apagaba.

Estos son los datos del equipo.

Equipo: HP xw6600 workstation con tarjeta de vídeo NVidia Quadro NVS 440.

Ratón: Logitech PS/2

Teclado: Logitech PS/2

Sistema operativo: Red Hat Enterprise Linux 4 Update 3

Kernel: 2.6.9-34


Solución:
El problema está en alguna incompatibilidad entre la distribución elegida y la tarjeta NVidia. La solución, obtenida de uno de los foros de NVidia después de hacer multitud búsquedas y de pruebas ha sido añadir en el arranque de Linux la opción
pci=nommconf

Para ello hemos editado el fichero de configuración de grub, /etc/grub.conf que queda como sigue:

[root@atopuabpsg1 bin]# more /etc/grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You have a /boot partition. This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00

# initrd /initrd-version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux ES (2.6.9-34.ELsmp)

root (hd0,0)

kernel /vmlinuz-2.6.9-34.ELsmp ro root=/dev/VolGroup00/LogVol00 rhgb quiet pci=nommconf

initrd /initrd-2.6.9-34.ELsmp.img

miércoles, febrero 20, 2008

Acceso por rsh desde Linux con un usuario distinto de root

Teníamos un problema por el cual desde un equipo con Red Hat Linux 4 Update 3 no nos dejaba acceder mediante rsh a otros equipos, excepto cuando lo intentábamos con el usuario root.

El problema estaba en que faltaba el suid en el rsh.

Antes:
# ll /usr/bin/rsh
-rwxr-xr-x 1 root root 8692 feb 15 2005 /usr/bin/rsh

Después:
# chmod u+s /usr/bin/rsh
# ll /usr/bin/rsh
-rwsr-xr-x 1 root root 8692 feb 15 2005 /usr/bin/rsh

jueves, abril 12, 2007

Variables necesarias para acceder a Tibco

Para que desde nuestra aplicación se pueda enviar/recibir información mediante Tibco Rendezvous se necesita añadir un par de rutas a las variables de entorno LD_LIBRARY_PATH y PATH.

export LD_LIBRARY_PATH= ${LD_LIBRARY_PATH}:/usr/tibco/tibrv/lib
export PATH= ${PATH}:/usr/tibco/tibrv/bin

martes, junio 27, 2006

Uso de ssh para invocar a un comando de Linux desde Windows

Para invocar un comando con ssh desde Windows a una máquina Linux necesitamos OpenSsh.

OpenSsh viene por defecto en Linux, mientras para Windows lo podemos tener con Cygwin. (http://www.cygwin.com/) La mejor forma de instalarlo es utilizando el programa de setup. (http://pigtail.net/LRP/printsrv/cygwin-ssh.html)

Un par de definiciones básicas:
  • El cliente será el sistema desde el que vamos a lanzar el comando ssh.
  • El servidor será el equipo al que se conectará la sesión ssh.
En nuestro caso el cliente será el equipo con Windows y el servidor el equipo con Linux.

En el servidor tenemos que crear en el HOME del usuario al que nos vamos a conectar un directorio de nombre .ssh y darle los permisos adecuados. Es importante el tema de los permisos, porque si se le dan más permisos de los adecuados no funcionará de forma adecuada, es decir, nos pedirá la password al intentar ejecutar el comando de forma remota.

$ mkdir -p $HOME/.ssh
$ chmod 0700 $HOME/.ssh


En el cliente usamos el comando
ssh-keygen para crear el par de claves DSA privada y pública.
C:\cygwin\bin> ssh-keygen -t dsa

Ese comando crea dos ficheros en el directorio .ssh del usuario.
D:\Documents and Settings\e88815a\.ssh
id_dsa
id_dsa.pub


Después hay que copiar la clave pública al servidor id_dsa.pub.

En el servidor se debe agregar el fichero con la clave pública al fichero de claves autorizadas del usuario, asegurándonos de que mantiene los permisos adecuados.
$ cat id_dsa.pub >> $HOME/.ssh/authorized_keys2
$ chmod 0600 $HOME/.ssh/authorized_keys2

Por último probamos a ejecutar el comando que queríamos lanzar.
C:\cygwin\bin> ssh -i /home/tsad/.ssh/id_dsa tsad@159.23.83.181 /tmp/LanzarGui.sh

jueves, abril 27, 2006

Pruebas de sockets

He encontrado una utilidad que desconocía y que me ha resultado muy útil para las pruebas relacionadas con sockets. Su nombre es nc y permite abrir sockets tcp o udp, hacer que escuchen o que envíen texto.

Un ejemplo para enviar datos mediante udp al puerto 12345 del host 159.23.83.52.

nc -uv -v 159.23.83.52 12345

viernes, abril 07, 2006

[UNIX] Formatear la fecha

Un ejemplo de como formatear la fecha entre otras cosas para usarla en la extensión de un fichero

echo "Hola" >> $D_PROY_OFI/out/ControlDeMemoriaDelServidorGui.out.`date +"%y%m%d"`

[UNIX] Sustitución de blancos en la shell

La shell elimina el exceso de blancos al realizar la sustitución de una variable. Para evitarlo, hay que delimintar la sustitución de la variable entre comillas dobles.

hola="Hola mundo"
echo "$hola"

[UNIX] ps ordenado por consumo de memoria

Podemos ordenar un ps para que nos muestre los procesos ordenados por su ocupación de memoria. Ejemplo:

ps -eo pmem,vsz,pcpu,state,pid,systime,time,command | grep exe | grep ATO | sort -n
0.8 15.1M 0.0 R 489920 0:30.29 1:01.89 /usr/ctc/ato/ofi/bin/servidor_gui.exe
0.9 36.1M 0.0 S 386836 0:00.82 0:06.27 /usr/ctc/ato/ofi/bin/logcont.exe
1.5 30.6M 0.2 S 386843 50:39.83 02:33:43 /usr/ctc/ato/ofi/bin/bstr_map.exe
3.5 40.4M 0.0 I 386837 0:40.26 0:45.21 /usr/ctc/ato/ofi/bin/chserver_svc.exe
4.0 112M 0.0 R 386855 1:11.16 4:26.95 /usr/ctc/ato/ofi/bin/Alarmas_Horarios.exe

jueves, marzo 16, 2006

Error al instalar MediaWiki

Al ejecutar el script de instalación de MediaWiki en mi ordenador me salió el siguiente error reportado por la base de datos:
251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client.

Lo que hice para solucionarlo fue:

* Di de alta un nuevo usuario con permisos para la creación de nuevos usuarios:

GRANT ALL PRIVILEGES ON *.* TO 'jcampoamor'@'localhost' IDENTIFIED BY 'somepass' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'jcampoamor'@'%' IDENTIFIED BY 'somepass' WITH GRANT OPTION;

* Después cambié la clave del usuario al viejo estilo (como se dice en la web de MySql):

SET PASSWORD FOR 'jcampoamor'@'localhost' = OLD_PASSWORD('somepass');
SET PASSWORD FOR 'jcampoamor'@'%' = OLD_PASSWORD('somepass');

* Finalmente usé el nuevo usuario como SuperUser en la parte inferior de la página de instalación de MediaWiki.

RMI - Compilación y ejecución

El código que he utilizado para mis pruebas con RMI es el que está en el tutorial de Java de Sun en la sección correspondiente al Trail: RMI.

El primer punto a tener en cuenta es que no conviene utilizar rutas con espacios en blanco. Si estamos trabajando con una ruta como por ejemplo "D:\Documents and settings\e88815a\My documents\Proyectos\PruebasRMI", es mejor que copiemos todo a "D:\Proyectos\PruebasRMI".

Empezamos cambiándonos al directorio en el que está el proyecto.
cd D:\Proyectos\PruebasRMI\src

Compilamos las clases del interfaz y
generamos un jar con las clases compiladas.
javac compute\Compute.java
javac compute\Task.java
jar cvf compute.jar compute\*.class

Compilamos la implementación del servidor.
set CLASSPATH=D:\Proyectos\PruebasRMI\src;D:\Proyectos\PruebasRMI\src\compute.jar
javac engine\ComputeEngine.java


Generamos el stub correspondiente a la clase creada (el rmic solo crea el stup no el skeleton).
rmic -d . engine.computeEngine

Compilamos el cliente.
javac client\ComputePi.java
javac client\Pi.java

Ejecutamos desde una nueva ventana en la que no esté definido el CLASSPATH el registro de RMI.
cd c:\jdk1.5.0_03\bin\
rmiregistry


Necesitamos tener el fichero java.policy con la información que se define en el tutorial en la ruta de las aplicaciones que vamos a ejecutar (
D:\Proyectos\PruebasRMI\src).

Desde otra ventana ejecutamos el servidor que hemos creado.
java -Djava.rmi.server.codebase=file:/D:\Proyectos\PruebasRMI\src/ -Djava.rmi.server.hostname=localhost -Djava.security.policy=java.policy engine.ComputeEngine

Nos tiene que mostrar el mensaje:
ComputeEngine bound

Y desde una última ventana ejecutamos el cliente.
set CLASSPATH=D:\Proyectos\PruebasRMI\src;D:\Proyectos\PruebasRMI\compute.jar
java -Djava.rmi.server.codebase=file:/D:\Proyectos\PruebasRMI\src/ -Djava.security.policy=java.policy client.ComputePi localhost 20


Cuya salida será el valor de PI.
3.14159265358979323846

Si sale el valor de PI es que ha funcionado y desde el cliente se ha invocado el método de RMI correspondiente obteniendo el resultado adecuado.

lunes, enero 30, 2006

Dar formato a un campo de texto con JFormattedTextField

Para formatear la entrada de un textfield en Java:

JFormattedTextField usuario = new JFormattedTextField();

try{
//máscara 10 caracteres

String mask = "**********";

javax.swing.text.MaskFormatter format_textField = new
javax.swing.text.MaskFormatter(mask);


format_textField.setValidCharacters("AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789");

usuario =
new javax.swing.JFormattedTextField(format_textField);

}catch (Exception e){};

lunes, enero 23, 2006

Red en alta disponibilidad

Estoy buscando como configurar el servidor de Red Hat para poder tener dos tarjetas de red configuradas con la misma dirección IP de tal forma que aunque una de las tarjetas se averíe, las aplicaciones no dejen de funcionar. Se que eso lo han hecho mis compañeros con Tru64 y funciona. Ahora habría que buscar lo mismo para Red Hat

He visto en un manual de Red Hat que algo similar a lo que busco y en principio parece que es posible. A esta opción le llaman Bonding. Confío en poder probarlo en un par de días para ver si funciona correctamente.

miércoles, diciembre 14, 2005

Configuración hw de los equipos

HP Proliant DL360 G4
2 Intel Xeon 3.00 GHz (1MB-L2)
1HD 80GB
2GB RAM
4 GigaEthernet

Como tarjeta de vídeo para poder tener 4 monitores con una única tarjeta, podríamos utilizar una NVIDIA Quadro que ya hemos probado satisfactoriamente.

martes, diciembre 13, 2005

Gestión de sesiones con Hibernate

He encontrado que la gestión de sesiones de Hibernate con el LazyLoading y utilizando Swing como interfaz de usuario puede ser un problema. Me da la impresión de que Hibernate se ha diseñado orientado al desarrollo en entorno web con J2EE.

El problema que me encuentro es el siguiente:
  1. Con lazy=false Hibernate me carga todos los objetos en el momento del arranque, ralentizando una barbaridad el arranque porque alguna de las tablas tiene muchas entradas (varios cientos de miles de registros).
  2. Con lazy=true tengo el problema de que en el momento de que me pide uno de los objetos solicitados salta una excepción porque la sesión ya se ha cerrado.

En este blog ya se hace un análisis de la situación y de por donde van los tiros, dando información de como se haría el tratamiento con Hibernate+Spring o con Hibernate3. En una página de Hibernate hablan del problema de unir Hibernate y Swing.

Con el nuevo esquema de gestión de sesiones de Hibernate 3.1 se necesita un TransactionManager obligatoriamente, por lo que o se ejecuta la aplicación dentro de una servidor de aplicaciones o añadimos uno externo (JTOM), aunque en este thread del foro de Hibernate (que discute sobre el error que se se produce usando el esquema de DAOs que se usa en la última versión del CaveatEmptor cuando se ejecuta sin JTA) se dice que en una proxima entrega de Hibernate 3.1 ya no será obligatorio la utilización de JTA. El caso es que yo me he bajado la última versión de Hibernate y me sigue saliendo la excepción.

También he leido una página de Hibernate que explica como tratar con sesiones y transacciones.

Otra opción sería analizar el uso de la pre-versión de EJB 3.0 de Hibernate como se describe en este blog, aunque necesitaría informarme de las complicaciones que podría añadir.

miércoles, diciembre 07, 2005

Lanzamiendo remoto de aplicación X

De nuevo he tenido que dedicar más tiempo del que era previsible a una tarea que en principio parecía simple.

Estoy acostumbrado a que en otros UNIXes el exportar el display o ejecutar el rsh es algo trivial, y estoy viendo que en Linux nada es tan sencillo. Quizás las medidas de seguridad que toman sean convenientes, pero para mí que no soy un experto me traen por la calle de la amargura.

El último problema con el que me he encontrado ha sido lanzar desde una estación de trabajo una aplicación en un servidor y que el interfaz gráfico de dicha aplicación se mostrarse en la estación de trabajo.

Para ejecutar el rsh, he tenido que:
- añadir el servicio de rsh con /usr/sbin/serviceconf que se encontraba instalado pero inhibido.
- reiniciar el demonio xinetd /sbin/service xintd restart
- incluir la dirección de la estación de trabajo en el fichero /etc/hosts.equiv

Para que al exportar el display me saliera la aplicación en el equipo elegido he tenido que ejecutar en el mismo escritorio desde el cual iba a lanzar la aplicación el comando xhosts +. No vale con hacerlo desde otro escritorio.

Quizás esto deje agujeros de seguridad, pero ahora estamos haciendo solo pruebas de validez del concepto y por ahora nos vale. Antes de pasar al entorno de producción tendremos que volver a analizar la forma de implementarlo.