23 enero 2005

Tutorial de rmi

Acabo de corregir el tutorial de rmi. Sigue habiendo cosas que no tengo muy claras, como el formato exacto de los nombres que hay que poner en los sitios que se admiten URL o si no es necesario que el objeto remoto herede de UnicastRemoteObject.

En este último caso, parece que se puede hacer llamando a UnicastRemotObject.exportObject(), pero tendría que probarlo para saber seguro cómo funciona el tema.

El tutorial está en http://www.geocities.com/chuidiang/java/rmi/rmi.html

14 enero 2005

Algunas cosas de rmi

He estado revisando lo de rmi y he aprendido varias cosas

La primera es que los objetos remotos en teoría deben implementar Remote, pero en la práctica, veo que deben heredar de RemoteObject y lo normal es que lo hagan heredando de UnicastRemoteObject. Si símplemente se implementa la interface Remote, cuando el servidor de rmi registra el objeto, símplemente lo registra y luego termina. Si heredamos de UnicastRemoteObject, el objeto se registra, pero el servidor se queda corriendo. De esta forma, cuando llamemos remotamente al objeto, se ejecuta en este servidor que queda vivo.

Otra opción que he leido pero no probado, es que si no queremos heredar de RemoteObject o UnicastRemoteObject, se puede simplemente implementar la interface Remote, pero entonces debemos llamar a alguno de los métodos UnicastRemoteObject.exportObject()

Una vez compilado el objeto remoto (supongamos que es ObjetoRemoto.class), es necesario pasarle la herramienta rmic de java. A esta herramienta se le pasa la clase ObjetoRemoto y genera un ObjetoRemoto_Stubs.class y ObjetoRemoto_Skel.class. Este último sólo sirve para versiones de clientes rmi con versión de java anteriores a la 1.2

¿Para qué sirve el ObjetoRemoto_Stubs?. Cuando un cliente quiere llamar remotamente a un método de ObjetoRemoto, en realidad java tiene que hacer varias cosas. Debe traducir todos los parámetros del método a un "formato de red" estandard, de forma que independientemente de dónde corran el cliente y el servidor, sus versiones de java, etc, entiendan ese parámetro. También debe enviar algún tipo de mensaje por red al servidor de rmi indicándole que método de ObjetoRemoto debe ejecutarse y pasarle los parámetros.

ObjetoRemoto_Stubs hace todo eso, de forma que cuando nuestro cliente rmi pide un ObjetoRemoto, en realidad le pasan un ObjetoRemoto_Stubs. Cuando nuestro cliente rmi llama a un método de ObjetoRemoto_Stubs, este se encarga de formatear los parámetros, enviar el mensaje por red al servidor de rmi, esperar la vuelta, formatear la vuelta de formato red al formato específico del sitio en el que corre el cliente.

El cliente necesita ver en su classpath la Interface remota del objeto remoto, que es la Interface que contiene los métodos remotos a los que se puede llamar. También necesita ver al ObjetoRemoto_Stubs, que es el que en realidad recibe cuando pide el ObjetoRemoto.

En cuanto al tema del fichero de permisos java.policy, he visto que tengo problemas que no sé muy bien a qué se deben. En teoría, colocando este fichero en el home del usuario (en mi caso c:\documents and settings\chuidiang), debería encontrarlo. No sé muy bien a qué es debido, pero hay veces que me da problemas y es como si no lo encontrara.

La solución que he dado de momento, es cambiar la propiedad java.security.policy, en la que se puede especificar el fichero. La llamada sería algo como esto

System.setProperty ("java.security.policy", "mi_path/java.policy");

Todo esto está comentado y con un ejemplo sencillo de código en mi página http://www.geocities.com/chuidiang/java/rmi/rmi.html

09 enero 2005

Ejemplos de Timer en java

En mi página http://www.geocities.com/chuidiang/java/timer/timer.html acabo de poner un par de ejemplos de uso de javax.swing.Timer y java.util.Timer.

El ejemplo consiste en un simple reloj digital que aparece en un applet. LLevo un montón de tiempo con el ejemplo, pero no lo había terminado por falta de tiempo.

Cifrado de archivos en windows

He estado mirando el cifrado de archivos en windows. Si un disco es NTFS (se puede mirar al pinchar en "MI PC", "disco c:", "propiedades"), se puede cifrar un directorio y todo su contenido de forma que nadie puede verlo salvo el usuario que lo ha cifrado.

Para ello, en "mi pc" vamos al directorio en cuestión. Con el botón derecho pulsamos "propiedades" y dentro de "avanzado" hay un "check" para cifrar. Al hacerlo, nos pregunta si queremos cifrar también también todos los subdirectorios y demás.

El problema que he visto es que el usuario "administrador" puede ver los ficheros aunque estén cifrados y que los demás usuarios, estén o no cifrados, no tienen acceso a ellos. El resumen es que no veo demasiado sentido a este tema. Quizás para usuarios que estén en el mismo grupo.

Para que el administrador no pueda ver los ficheros de forma fácil, se puede denegar el permiso al administrador para acceder a los ficheros (nuevamente en "propiedades", en la pestaña de "seguridad"). De todas formas esto no garantiza la privazidad, porque el administrador puede cambiar el propietario del fichero para así poder verlo.

Bueno, al menos parece que sirve para que no vean los ficheros por error, aunque si quieren verlos, pueden.


05 enero 2005

rmi en java

En http://www.osmosislatina.com/java/rmi.htm hay un tutorial que explica los conceptos de rmi, sin ejemplos. Es adecuado para entender que es el stubs, el skeleton, etc.

En http://www.programacion.com/java/tutorial/rmi/ hay un tutorial más típico. Explica menos, pero va siguiendo los pasos en código para hacer un ejemplo.


Gráficos en java

Tengo que echarle un ojo a JTGL, que parece que es un paquete para pintar gráficos en java, pensado para juegos. Se supone entonces que será eficiente y quizás me sirva para gráficos de espectros, señales y demás.

http://www.jtgl.org/modules/news/


Paso de vhs a dvd

Por lo que he estado mirando, es necesario el compresor de mpeg2 para poder grabar en dvd.

Mirando las tarjetas de pinnacle pc tv stereo que permite la captura de video además de ver la tele, he visto que el compresor de mpeg2 va aparte, hay que pagar por internet para activarlo, después de haber comprado la tarjeta, para habilitarlo. Creo que eso ya no me gusta, además en ningún lado pone cuánto hay que pagar. (http://www.pinnaclesys.com/ProductPage_n.asp?Product_ID=1480&Langue_ID=5&division_id=) El precio es de unos 60 euros, más lo que haya que pagar en internet. Es cuestión de preguntar cuánto.

Otra de pinnacle que tiene buena pinta es la pinnacle moviebox usb, http://www.pinnaclesys.com/ProductPage_n.asp?Product_ID=1885&Langue_ID=5, pero vale unos 300 euros y no deja ver la tele. El problema es que incluye el software de edición pinnacle studio 9 que vale unos 90 euros, así que creo que estaré pagando por algo que casi no voy a usar.

He visto una tarjeta aver media que no permite ver la televisión, pero lleva el compresor de mpeg2 en hardware, con lo que haría falta un pc menos potente. La pega es que no deja ver la tele... http://www.avermedia.es/cgi-bin/ezmakerpropci.asp. Creo que el precio también es de unos 100 euros.

Seguiré mirando

02 enero 2005

Algunos enlaces

En http://www.programacion.com/blogs/ he encontrado blogs sobre programación. Quizás debería pasar este blog allí ...

En http://www.iespana.es/heberg/ y en www.iespanapro.com he encontrado un par de ofertas intesantes sobre webhosting con dominio incluido, no muy caras. Es algo que tengo que pensar.

Otro enlace que alguien ha puesto en mi página de enlaces es http://www.starlinux.net. Tiene un foro de programación en linux.

01 enero 2005

Programación orientada a aspectos

La programación orientada a aspectos básicamente consiste en una herramienta (que se añade al compilador) que nos permite, durante la ejecución del programa, capturar la llamada a los métodos de nuestro programa, de forma que podemos hacer algo antes o después de que se ejecuten, incluso podemos hacer que el método no se llame o devuelva una cosa distinta.

Típicamente se puede usar para cosas del siguiente estilo:
  • Hacer una traza de nuestro programa. Podemos capturar la llamada a los métodos e ir escribiendo en pantalla, según se van llamando, "llamado al método tal con tales parámetros".
  • Persistencia en base de datos. Podemos capturar los métodos del tipo "tomaDato()" para hacer que antes o después de que se ejecute, escribir ese dato en base de datos.
  • Privilegios. Capturando determinados métodos y en función del usuario que somos, podemos permitir la ejecución normal del método o denegarla.

El proceso normalmente consiste en hacer nuestro programa de una forma normal, sin preocuparnos de este tipo de temas (trazas, persistencia, privilegios, etc). Luego hacer una serie de clases especiales a las que la herramienta llamará cada vez que se ejecute uno de los métodos que digamos. En esas clases especiales hacemos la traza, persistencia o lo que sea.

En un fichero xml se dice qué métodos se quieren capturar y a cuales de nuestras clases especiales hay que llamar.

Luego se compila todo con unas opciones especiales de la herramienta de programación orientada a aspectos y se ejecuta el programa.

Todavía no he hecho ninguna prueba sobre el tema, pero todo se andará.