20 septiembre 2005

Los punteros de java

Hay un par de ideas sobre java muy extendidas: java no tiene punteros y en java todo se pasa por referencia.

La realidad, es que java se entiende mucho mejor si lo pensamos exactamente al revés. En java sólo hay punteros (con excepción de los tipos primitivos) y en java todo se pasa por valor (por copia).

Por ejemplo, en C++ hacemos esto

MiClase a;

y ya está todo correcto. La variable a está perfectamente inicializada. Si en java hacemos eso, tenemos una variable a sin inicializar. Es necesario hacerle un new, exactamente igual que un puntero en C++

MiClase a = new MiClase(); // Esto en Java
MiClase *a = new MiClase(); // Esto en C++

// o este otro tipo de inicialización extrañamente parecida ...

MiClase a = null; // en java
MiClase *a=NULL; // en C++

La única diferencia es la notación con el asterisco. Si pensamos que en java TODO son punteros, no es necesario poner el asterisco para distinguir lo que es puntero de lo que no lo es, por lo que símplemente lo han quitado.

Ahora imaginemos un método que recibe una clase y que le hacemos una llamada

// en java...
void medodo (MiClase a)
{
a = new MiClase();
}
...
MiClase b = null;
metodo (b);

Bueno, pues cuando salimos del método b sigue valiendo null, "apuntando a null". Eso quiere decir que a y b son variables disintas, es decir, se ha pasado la variable b por valor al método.

¿Cómo podemos crear una nueva instancia y devolverla?. En java no queda más remedio que hacerlo en el return, es imposible hacerlo a través de parámetros. Sin embargo, en C++ tenemos más posibilidades. Podemos usar un puntero al puntero, es decir, hacer esto

void metodo (MiClase **a)
{
*a = new MiClase();
}
...
MiClase *b=NULL;
metodo (&b);

o bien, incluso usar referencias de verdad

// El & en la declaración es lo que hace que realmente sea una referencia.
void metodo (MiClase * &a)
{
a=new MiClase();
}
...
MiClase *b=NULL;
metodo (b);
// Aqui b apunta al MiClase creado dentro del método.

Haciéndolo así, el puntero b de fuera del método y el puntero a del parámetro son exactamente la misma variable. Ojo, no quiero decir que sean dos punteros distintos que apunten al mismo lado, sino que son realmente el mismo puntero. Cuando hacemos que a apunte a otro sitio, b también apuntará al mismo sitio. Esto es lo que yo entiendo realmente por referencia.

Vemos en este sentido que C++ nos da más posiblidades que java.

19 septiembre 2005

Memorias de un aprendiz de PHP

En http://www.rinconastur.net/php/index1.php hay una especie de tutorial de apache, php y mysql.

Tiene bastante buena pinta y comienza desde el principio, instalando estos programas en windows.

El autor advierte que no es un manual sino que "estas «Memorias» solo son apuntes a pie de obra..., notas que he ido confeccionando día a día a medida que intentaba ir aprendendiendo."

17 septiembre 2005

Uso rápido del JTable

Veo en muchos foros que la gente pregunta cómo manejar el JTable. Voy a tratar de contar el uso más sencillo que deja libertad para modificar luego los datos sobre la marcha.

Para usar tablas, hay que distinguir dos cosas. Por un lado tenemos el JTable, que es lo que vemos. Por otro lado tenemos los datos, que es lo que queremos pintar en el JTable. Los datos pueden guardarse en cualquier clase que implemente TableModel. Java nos ofrece DefaultTableModel, una clase que implementa TableModel y nos permite añadir, modificar y borrar esos datos.

La forma sencilla de juntar todo esto es

DefaultTableModelo datos = new DefaultTableModel();
JTable tabla = new JTable(datos);

y ya está.

Ahora podemos añadir columnas a nuestros datos llamando a

datos.addColumn ("Nombre columna");

y podemos añadir, borrar y modificar

datos.addRow ( arrayConLosDatosParaUnaFila );
datos.removeRow ( fila );
datos.setValueAt (dato, fila, columna);

Echando un ojo en la API de DefaultTableModel, veremos muchos más métodos que pueden ser útiles.

Tengo un tutorial más completo sobre el modelo de datos en http://www.chuidiang.com/java/tablas/tablamodelo/tablamodelo.php

También se puede cambiar el cómo pintar los datos o cómo editarlos. De esta forma podremos poner iconos en las celdas, hacer que salgan coloreadas o bien que al hacer doble click sobre ellas se editen con un JComboBox o cualquier otra ventana que se nos ocurra.

16 septiembre 2005

Un pequeño problema con Swing

Conozco a varias personas, incluida yo, que han tenido un pequeño problema con las tablas de Swing.

Supongamos que tenemos nuestro JTable y nuestro TableModel, bien el DefaultTableModel o bien uno hecho a medida. Como es natural, cuando modificamos datos en nuestro TableModel, se actualiza automáticamente el JTable. Esto se debe a que los TableModel implementan un mecanismo de suscripción a cambios. El JTable se suscribe a cambios en el TableModel, se entera cuando éste cambia y se refresca en pantalla.

Los repintados en pantalla se hacen todos en un hilo (thread) aparte, llamado hilo de awt. Cuando el JTable necesita ser repintado, por algún cambio en el TableModel, el hilo de awt comienza a preguntar al TableModel por sus datos para pintarlos en el JTable.

Ahora supongamos que tenemos un hilo independiente, lo voy a llamar hilo A, que se dedica de forma más o menos rápida a añadir y borrar datos del TableModel. Puede pasarnos y de hecho a veces lo hace, que ocurre la siguiente secuencia:
  • El JTable necesita ser repintado. El hilo de awt le pide al TableModel cuántos elementos tiene. Este, por ejemplo, dice que tiene 10.
  • El hilo de awt se mete en un bucle de i=0; i<10;>
  • El hilo independiente A, cuando el hilo de awt está en medio del bucle, le da por borrar el elemento número 9. El TableModel avisa por medio del mecanismo de suscripcion y el evento de cambio queda encolado hasta que el hilo de awt pueda atenderlo
  • El hilo de awt sigue con su bucle y cuando llega al tableModel.getValueAt (9, j), le salta una excepción de indice fuera de rango, el elemento 9 ya no existe. En la ventana el JTable puede quedarse en estado catatónico
Este problema pude comprobar que pasaba también con JList y DefaultListModel y supongo que es general. De hecho, se advierte que las clases de Swing no son seguras con multihilo.

Los synchronize no sirve de nada, puesto que el hilo de awt está en un bucle y hace varias llamadas al modelo, bloqueándolo y liberándolo consecutivamente. El hilo A puede colarse entre medias y borrar.

¿Cual es la solución?.

Solución 1.

La primera solución que se le ocurre a todo el mundo es que el hilo A añada y borre elementos usando SwingUtilities.invokeLater(). Esto hace que el añadido y borrado de elementos en el TableModel se encole para que lo haga el hilo de awt. Si el hilo de awt está en su bucle refrescando el JTable, no va a añadir ni borrar elementos hasta que termine.

Esta solución no me gusta demasiado. Hay que llenar el código de SwingUtilities.invokeLater() por todos lados y acordarse de hacerlo siempre. Además, el parámetro de éste método es un Runnable, por lo que todavía es más incómodo llamarlo.

Solución 2.

La solución que más me gusta es duplicar el modelo. Los datos no se duplican, así que no es un gasto excesivo de memoria. A uno lo llamo modelo_real y al otro modelo_awt. Una clase hecha una sola vez, se suscribe a cambios en modelo_real y los replica, usando SwingUtilities.invokeLater() en modelo_awt. El modelo_awt es el que se pasa al JTable y queda más o menos oculto para todo el mundo. El hilo A y cualquier otro sitio del código, deben trabajar con el modelo_real.

La ventaja de esta solución es que haciéndo una clase una sóla vez y quizás un TableModel para que nos haga de modelo_awt, ya no tenemos que volver a tirar código. Luego nadie debe acordarse de llamar al SwingUtilities.invokeLater().

La pega es que si alguien le pide el modelo al JTable, va a obtener un modelo que no es el de trabajo del resto del código y puede haber algun problema.

De hecho, me he hecho mi propia versión de JTable que redefine los métodos que tienen que ver con el TableModel (incluidos constructores). Yo uso mi JTable y le paso mi modelo_real. Mi JTable se encarga de instanciar la clase de réplica y el modelo_awt. El método getModel() devuelve el modelo_real. Ahora casi nunca uso un JTable directamente, sino MiJTable.

Métricas para eclipse

Me he instalado el JDepend4eclipse, un plug-in que da métricas sobre paquetes java.

Está bien en el sentido de que nos da las dependencias entre paquetes, y así podemos ver si nuestros paquetes están muy enrevesados (todos tiran de todos) o llevan más o menos una estructura de árbol en sus dependencias (hay paquetes independientes que no dependen de nadie, otros más complejos que dependen de los independientes y otros más complejos aun que dependen de los anteriores), que es lo lógico.

Sin embargo JDepend no da más métricas de clases ni las típicas de código (complejidad ciclomática, número de líneas, relacion código/comentarios, etc, etc), por lo que de momento lo veo un poco limitado.

Existe también un JDepend independiente de java, que me he instalado, pero da incluso menos información que el plug-in de eclipse. Realmente da la misma información que el plug-in, pero en el plug-in aparece además un gráfico grado de abstraccion/inestabilidad del paquete, que en JDepend no aparece. En dicho gráfico aparece cada paquete como un puntito verde, negro o rojo. Supongo que verde es que el paquete está más o menos en una zona adecuada, negro es una zona intermedia y rojo que ese paquete es desastroso.

15 septiembre 2005

Ejemplos de java

Cortesía de un compañero de trabajo, una página con muchos ejemplos de java, tanto j2ee, jsp, servlets, swing, patrones, etc, etc.

14 septiembre 2005

Propiedades de System.getProperty()

Hay muchas cosas relativas al sistema operativo que podemos obtener desde java.

En la API, si miramos la clase System y dentro de ella el método getProperties() tenemos un listado de unas cuantas.

Reproduzco aquí el listado de la version 1.4.2 de java, con algún comentario mio de los más útiles

java.version Java Runtime Environment version
java.vendor Java Runtime Environment vendor
java.vendor.url Java vendor URL
java.home Java installation directory
java.vm.specification.version Java Virtual Machine specification version
java.vm.specification.vendor Java Virtual Machine specification vendor
java.vm.specification.name Java Virtual Machine specification name
java.vm.version Java Virtual Machine implementation version
java.vm.vendor Java Virtual Machine implementation vendor
java.vm.name Java Virtual Machine implementation name
java.specification.version Java Runtime Environment specification version
java.specification.vendor Java Runtime Environment specification vendor
java.specification.name Java Runtime Environment specification name
java.class.version Java class format version number
java.class.path Java class path
java.library.path List of paths to search when loading libraries
java.io.tmpdir Default temp file path Util para crear ficheros temporales en /tmp o c:\tmp
java.compiler Name of JIT compiler to use
java.ext.dirs Path of extension directory or directories
os.name Operating system name Nombre del sistema operativo
os.arch Operating system architecture
os.version Operating system version
file.separator File separator ("/" on UNIX) Separador de los directorios (unix es /, windows es \). De todas formas java entiende cualquiera de ellos
path.separator Path separator (":" on UNIX) Cuando en una variable, por ejemplo PATH, ponemos varios valores, el separador en unix de estos path es : mientras que en windows es ;
line.separator Line separator ("\n" on UNIX) Fin de linea. \n en unix, \r\n en windows.
user.name User's account name Nombre del usuario.
user.home User's home directory Directorio por defecto del usuario.
user.dir User's current working directory Directorio en el que está corriendo el programa java. Util para poner path relativos.

Tortoise CVS

Tortoise CVS es un programita que se integra con el explorador de windows.

Una vez instalado, cuando abramos nuestros directorios con el explorador de windows y navegemos por ellos, veremos que nuestros iconos de fichero están modificados. Esta modificación indica si el fichero está en cvs, si está actualizado, modificado, etc.

Pulsando con el botón derecho sobre el icono para ver el menú, saldrán más opciones de las habituales, dándonos opción a meter el fichero en CVS, editarlo, etc, etc.

Una herramienta que nos puede ayudar a los que trabajamos con CVS sobre windows.

Programación de C en unix

En http://www.cs.cf.ac.uk/Dave/C/ hay un tutorial (casi un libro) que explica la programación en C sobre unix.

Comienza explicando C, desde su historia hasta las funciones más tontas, pasando por los if ,for, punteros, etc, etc.

Luego comienza lo interesante, trata todos los temas específicos de unix, como IPC (semáforos, colas y memoria compartida), sockets, rpc, hilos, etc.

En fin, un buen tutorial en perfecto inglés.

13 septiembre 2005

Entrada standard en java

En java, para leer la entrada standard (la del teclado) contamos con System.in

Sin embargo, System.in es un InputStream, que cuenta con pocos métodos útiles para leer el teclado. De hecho, sólo tiene métodos para leer bytes. Si en el teclado escribimos una A mayúscula, System.in nos devolverá un byte 65.

Afortunadamente en java hay muchas clases ya preparadas. Tenemos clases InputStreamReader, BufferedReader, FileReader, etc. Estas clases tienen como misión leer un "flujo" de bytes o de caracteres y darnos métodos que nos faciliten la lectura.

Hay básicamente dos tipos de clases. Las más básicas son las InputStream, que son clases que leen bytes. Sobre ella se construyen los Reader, que son clases que leen caracteres (transforman los bytes a caracteres). Para convertir de una a otra, tenemos el InputStreamReader.

Un InputStreamReader recibe un InputStream en el constructor y se comporta como un Reader, es decir, lector de caracteres. La clase InputStreamReader tiene métodos que nos permite leer char o arrays de char.

Bien, con este trozo de código

InputStreamReader isr = new InputStreamReader(System.in);

ya tenemos un InputStreamReader asociado al teclado y del que podemos leer directamente caracteres, en vez de bytes. Cuando escribamos una A, leeremos una 'A' y no un byte 65.

La siguiente clase que podemos usar es BufferedReader. Esta clase recibe un Reader en el constructor (podemos pasarle nuestro InputStreamReader) y tiene un método para leer una línea completa de teclado, de forma que nos devuelve un String.

BufferedReader bf = new BufferedReader (isr);
String lineaTeclado = bf.readLine();

Estupendo, ya podemos leer líneas de teclado.

El problema ahora es si escribimos un 123, obtendremos "123" como String. Seguramente queramos convertirlo a int, o float o lo que sea. Para ello no nos queda más remedio que analizar la cadena y convertirla al valor que queramos. Por ejemplo, para convertirla a un int, podemos hacer esto

int valor = Integer.parseInt (lineaTeclado);

Por supuesto, se supone que hemos escrito un entero en esa línea y sólo un entero, o saltará una excepción.

El siguiente es un código de ejemplo con todo esto junto:

// Creación de BufferedReader para facilitar la lectura.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

try
{
// Lectura de un entero
System.out.print ("Introduce un número entero : ");
String cadena = br.readLine();
int valor = Integer.parseInt(cadena);
System.out.println ("Has escrito "+valor);

// Lectura de un double
System.out.print ("Escribe ahora un numero flotante : ");
cadena = br.readLine();
double valor2 = Double.parseDouble(cadena);
System.out.println ("Has escrito "+valor2);

} catch (Exception e)
{}

Entendiendo make y los archivos Makefiles

En http://www.ubiobio.cl/~gpoo/documentos/make/ hay un tutorial sobre los makefile.
Parece bastante clarito y va paso a paso.
Yo, por mi parte, tengo mi propia versión, un poco menos bonita y menos explicada en http://www.geocities.com/chuidiang/herramientas/makefile.html

Comandos de bash linux

En http://www.ss64.com/bash/index.html he encontrado un listado de comandos de bash de linux.
Pinchando en el comando aparece una ayuda sobre dicho comando.
Lástima que esté en inglés.

Notepad++ y gvim

He encontrado el Notepad++

Es el notepad de windows de siempre, pero mejorado para programación. En función de la extensión del fichero (.cpp, .java, .php, etc) es capaz de colorear las palabras reservadas del lenguaje, autosangrado, etc, etc.

Dicho de otra forma, una versión mejorada del notepad para programación.

De todas formas, vengo del mundo unix y el editor que más me gusta con diferencia es el vi (en sus versiones mejoradas, vim y gvim). También hay gvim para windows, entiende bastante más lenguajes de programación que el notepad++. Incluso es posible, por medio de ficheros de configuración (al menos en unix), crear tus propios lenguajes y coloreados (aunque no parece una tarea sencilla).

Dentro de linux/unix, con ayuda del comando ctags, se puede incluso navegar con el gvim dentro del código.

Actualmente programo con eclipse en java en entorno windows. Sin embargo, para muchas tareas de edición sigo abriendo el gvim, ya que tiene muchos comandos que echo de menos en los editores estilo windows.

Entiendo, sin embargo, que el vi es un editor odioso cuando se empieza y que para la gente acostumbrada al mundo windows, el notepad++ puede ser una buena alternativa.

Technorati: Home

En Technorati: Home he encontrado un buscador que busca en www.blogger.com. Ordena los resultados de búsqueda del más reciente al más antiguo.

La intención de este buscador es, por lo visto, que podamos ver las entradas más recientes sobre un determinado tema, para ver qué opina la gente o qué se cuece en la red.

12 septiembre 2005

firmar un jar

En http://www.vistoynovisto.com/vistoynovisto/Tutorial/Javatut2/jar/sign/index.html he encontrado un pequeño tutorial sobre como firmar y verficar ficheros jar firmados.

Es algo más detallado que la página de merenciano y supongo que la idea para los applets es muy similar.

Does XML Suck?

En su día, tras oir hablar continuamente de XML, decidí enterarme de qué era. Compré una guia de anaya, de esas baratas, titulada XML.

Tras enterarme qué era y aprovechando que en el trabajo empezabamos con java, me enteré de cómo se leen ficheros XML en java. De hecho, hay clases Java que vienen con el compilador para la lectura de dicho tipo de ficheros.

Dicho y hecho, nos pusimos a hacer código y en cuento teníamos posiblidad, usabamos ficheros XML.

Sin embargo, tras unos cuantos experimentos, empezó a entrarme la duda. ¿Realmente me aporta algo XML?. Me resultaba más fácil escribir mis ficheros en otro formato de texto (el que siempre había usado cuando trabajaba en C++) y tener mi clase java ya preparada para ese formato (al igual que la preparé en su día en C++).

Buscando por internet, he encontrado esta página (en perfecto inglés). En ella hay un articulo diciendo que XML es un asquito. Ese articulo ha ido evolucionando y al final dice que sigue siendo un asquito, pero se puede trabajar con él y hay que hacerlo porque todo el mundo lo hace. Hay las tres versiones del artículo mostrando la evolución en esa página.

En fin, salvo que me vea obligado o vea una ventaja clara, seguiré haciéndome mis ficheros de datos de la forma que más cómoda me resulte.

08 septiembre 2005

Primer mes sin wanadoo

Parece que he conseguido darme de baja de Wanadoo.

El mes de Julio me llegó una factura a medias (teóricamente de los días que estuve de alta en Junio hasta que me dieron efectivamente de baja).

Este mes de Agosto no me ha llegado factura de ellos.

07 septiembre 2005

Google Earth - Products

Acabo de descubrir GoogleEarth.

Es una aplicación que nos bajamos de http://earth.google.com/earth.html y nos presenta un mapa mundo desde lejos. Podemos acercarnos a cualquier punto del planeta hasta ver la foto por satélite de la zona.

Tenemos botones para girar e incluso tumbar la cámara. Si una vez tumbada avanzamos, es como si fueramos volando en avión sobre el mapa.

Además tiene el perfil del terreno, por lo que veremos las elevaciones del terreno.

Eso sí, se baja los mapas de internet sobre la marcha, según lo vayamos viendo, así que necesitamos una conexión rápida.

06 septiembre 2005

Me estoy quedando obsoleto

El otro día me instalé cygwin y ya de paso el gcc.

Me puse a hacer un típico "Hola mundo" en C++ y ¡sorpresa!, me da un warning de que

#include <iostream.h>

esta obsoleto, que en su lugar use

#include <iostream>

sin el .h del final.

Me pongo a hacerlo y me falla. Me lio a buscar en internet y resulta que hay que poner un "using namespace std" o bien un "std::cout".

En fin, el C++ va cambiando y yo me quedo atrás....

Merenciano.tk :: Ver tema - ¿Como firmar un Applet?

En http://usuarios.lycos.es/fady/foro/viewtopic.php?t=58&sid=3429077c5bc0afda79734122e41f17a3 he encontrado la forma de firmar un applet.

Los comandos que aparecen (keytool y jarsigner) son de java, así que no debería haber ningún problema.

Teóricamente un applet firmado tiene permiso para hacer más cosas que un applet sin firmar (siempre que le digamos al navegador que confíe en esa firma). De esta forma se pueden hacer applets que accedan al disco del usuario para guardar o consultar datos. Es algo que tendré que probar algún día.

Ya puestos, el foro de java en esa misma página tiene resueltas algunas de las dudas más comunes que aparecen en otros foros, por ejemplo, cómo empezar con java, crear un exe, etc.

03 septiembre 2005

cygwin

Yo siempre he trabajado en entorno unix. Me manejo mucho mejor con una shell de unix que con la ventana de ms-dos y para determinadas tareas, incluso mejor que con el ratón y el escritorio de windows.

Por ejemplo, cuando trabajo en java sin el entorno de desarrollo, echo mucho de menos el comando "find" de unix. Para compilar todos los fuentes de un directorio y sus subdirectorios, desde la shell hago algo como esto

javac `find . -name *.java`

Esto no se puede hacer en ms-dos, no queda más remedio que hacer cosas como

javac paquete1\subpaquete1\*.java
javac paquete1\subpaquete2\*.java

y así sucesivamente.

Por todo ello decidí bajarme una shell de unix para windows y así olvidarme, dentro de lo posible, de la ventana de ms-dos.

Me decidí por instalar cygwin, que en realidad es un entorno unix para windows. En esa página me bajé el setup e instalé lo que el me dijo por defecto. Con esto ya tengo una shell "bash".

Luego, corriendo nuevamente el setup, me bajé el ddd (debugger para C) y el gcc/g++ y el vim (el editor). Me arreglo mucho mejor con este compilador de C y el gvim que con el Visual C++.

Como conectar Java y Access

En un foro mencionan este artículo para conectar java con access.

El "truco" es establecer un DSN (Data Source Name), sabe Dios qué es eso.

Una vez hecho, el resto en nuestro programa java es como siempre. El driver a usar es "sun.jdbc.odbc.JdbcOdbcDriver" y la forma de obtener la conexion con

Connection con = DriverManager.getConnection("jdbc:odbc:Nombre_Perfil_DSN", "Nombre_Usuario", "Contraseña");

31 agosto 2005

Using HTML in Swing Components

En los JLabel, JButton y demás se puede poner una etiqueta normal de texto o bien código html.

El siguiente ejemplo:

import javax.swing.*;

public class prueba
{
public static void main(String[] args)
{
JFrame ventana=new JFrame();
JButton boton = new JButton ("<html>a<br>b/<html>");
ventana.getContentPane().add(boton);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ventana.pack();
ventana.setVisible(true);
}
}

pinta una ventana con un botón con dos lineas de texto.

Hay un pequeño tutorial de esto aquí:

Using HTML in Swing Components

GMail API For Java (g4j)

Cortesía, nuevamente, de un compañero de trabajo, aquí hay un paquete de java que permite conectarse a gmail para ver el correo y demás.

http://g4j.sourceforge.net/

No lo he probado y no sé muy bien para qué puede servir (salvo para hacerse un cliente especifico de correo para gmail, que ya viene con la aplicación), pero bueno, no deja de ser una cosa curiosa.

Basándose en esta api, hay un plug-in para eclipse que permite desde eclipse ver el correo de gmail. Dice además que usa el puerto 80, con lo que podemos saltar cortafuegos que nos limiten los puertos. Yo por ejemplo, desde mi Thunderbird no puedo ver en el trabajo el correo de gmail porque gmail usa un puerto no standard y el cortafuegos de la empresa no me deja abrir esta dirección.

Administración de Sistemas Operativos

Echando un ojo en google me he encontrado un tutorial sobre socket, rpc.

Me ha gustado ver que han utilizado los tutoriales de mi página como referencia. Los han mejorado añadiendo figuras, eliminando mucha paja y algunos datos de interés más.

Se les puede echar un ojo para ver otra versión más seria y algo más completa de los que puse un día en mi página.

También tienen un tutorial sobre rmi, pero ese no parece tener mucho que ver con el que hice yo.

29 agosto 2005

Ficheros de inicio de unix

En un foro encontré un link bastante interesante:

http://www.cs.sonoma.edu/~rmamer/shells_and_init_files.html

En él está los ficheros de inicio que utilizan los distintos unix. Son los ficheros en los que debemos poner las variables de entorno que nos interesen, en función de si queremos que afecten a todos los usuario, sólo a un usuario etc.

Aparecen ksh de solaris, csh de solaris, bsh de solaris, tcsh de solaris, ksh de linux, csh de linux, bash de linux y tcsh de linux.

Básicamente se ejecuta un fichero en /etc/ que es el que afecta a todos los usuarios. Según la shell que sea, puede ser profile, .login, chs.cshrc o csh.login. Luego se ejecuta uno en el HOME del usuario y sólo le afecta a él. Según la shell que sea, puede ser .profile, .cshrc, .login, .bash_profile, .bashrc, etc.

En el link mencionado tienes una lista completa.

23 agosto 2005

http://www.java-source.net/

Un compañero de trabajo me ha mandado esta página: http://www.java-source.net/

En ella hay un montón de programas java gratuitos bastante interesantes.

Aparecen varios IDE de java, como eclipse y netbeans además de otros (JEdit, BlueJ, etc, etc). Hay servidores de chat, de foros, clientes de bases de datos, etc, etc, etc.

En fin, una página interesante de consultar cuando necesitemos algún programa gratis.

20 agosto 2005

Internacionalización de java

En http://www.programacion.com/java/tutorial/i18n/ hay un tutorial sobre la internacionalizacion de java que tiene buena pinta.

El problema básico de la internacionalización consiste en conseguir que nuestro programa muestre los textos en español, en inglés, en frances, etc en función de quién los esté leyendo. Esto también incluye el presentar los números con coma decimal o punto, unidades monetarias, etc, etc.

Si mostramos los textos directamente en código, para cambiar de idioma deberíamos rehacer y recompilar el código. Esto, por supuesto, es bastante engorroso.

La solución que propone java es escribir todos esos textos en un fichero de propiedades, es decir, un fichero de texto que contiene algo parecido a esto para español

saludo=hola
despedida=adios

o a esto en inglés

saludo=hello
despedida=bye

El programa java debe leer el fichero adecuado según el idioma y mostrar los textos que en él se indican, el de saludo y el de despedida en este caso.

Java, con sus clases ResourceBundle y asociadas facilita todas estas tareas, de forma que el ficheor de propiedades adecuado se puede cargar automáticamente en función del idioma elegido para el sistema operativo (windows o el que sea) y se muestran automáticamente los textos en dicho idioma.

12 agosto 2005

Ocultar IP

Un problema que me han planteado es el de ocultar la ip mientras navegamos, de forma que podamos engañar a esas páginas que recogen estadísticas de las ip que las visitan.

En http://www.comodescargar.com/trucospc/ocultar-ip-manual.html hay un pequeño manual que indica varias posibilidades.

Básicamente ha visto que consiste en navegar usando un proxy, de forma que en la página web que visitamos se ve la dirección ip del proxy y no la nuestra. En internet existen proxy gratuitos con los que nos podemos enchufar (por ejemplo, 212.7.14.177 en el puerto 80, que es una dirección de Estonia).

El programa "Hide ip Platinum" lo que hace es precisamente eso, configurar nuestro navegador (internet explorer) para que use un proxy. Incluso cambia de proxy a petición, de forma que en varias visitas sucesivas podriamos aparentar ser ip disitintas. De todas formas, me he descargado el programa y he tenido problemas al navegar con algunas de los proxy que me ponía. Supongo que eso no es culpa del programa, sino de la disponibilidad del proxy en cuestión.

También he probado a desinstalar el programa "hide ip platinum" y configurar el navegador a mano con uno de los proxys y funciona también.

10 agosto 2005

Cargar imagen de un jar

En http://www.javahispano.org/faq.thread.action?forum=108&thread=1969990118&id=1969990118 hay una contestación en un foro sobre como cargar una imagen de un fichero jar desde un programa java.

Por supuesto, tal cual esta vale si imagen.gif esta en el "directorio raiz" del jar, es decir, si no está empaqueta en algún subdirectorio.

Si hemos creado dentro del jar un subdirectorio iconos o imagenes para meter la imagen, deberemos poner el path.

Image miImagen = getImage (getClass().getResource ("imagenes/imagen.gif"));

También es importante que la clase en la que hagamos el getClass() esté dentro del mismo jar.

28 julio 2005

jace

En el foro de linux de la web del programador, "El Mogur" comenta la existencia de JACE, una librería de C++ standard que hace mucho más fácil el uso de JNI.

Nos la podemos bajar de http://sourceforge.net/projects/jace/ y tenemos documentación sobre ello en http://reyelts.dyndns.org:8080/jace/release/docs/guide/guide0.html

Bueno, otra cosa más pendiente de que le eche un ojo en algún momento.

27 julio 2005

Wanadoo

Parece que sí estoy dado de baja de wanadoo. Aparte de que me lo han confirmado telefónicamente, este mes me ha llegado una factura parcial de ellos, correspondiente al 1 de Junio al día que ellos dicen que me han dado de baja, 19 de Junio.

No sé si he tenido suerte o que la nueva normativa parece que se la tienen que tomar algo más en serio.

QT

Me han mandado un correo preguntando sobre un tutorial de socket para QT. Desgraciadamente no he podido contestar, no conozco ninguno.

Sin embargo me he puesto a mirar qué es eso de QT. Parece que es un entorno de desarrollo de C++ que permite ejecutar los programas en plataformas distintas. Es decir, podemos hacer nuestro programa con QT en windows y luego ejecutarlo en linux. Supongo que habrá que tener instalado QT en ambas plataformas, o como mínimo su versión de runtime, si es que la tiene.

El entorno de desarrollo es de pago, pero creo que merece la pena echarle un ojo. Es una nueva tarea que me apunto como pendiente....

14 julio 2005

Una tontería de C en linux

Viendo una pregunta en un foro, recordé un pequeño problema que tuve en su momento con C en Solaris (unix de Sun) y que nos trajo de cabeza a mí y a unos compañeros mios bastante tiempo.

El problema es que los decimales desaparecian al echar cuentas. Un programa tan tonto como este

main()
{
double a=5.4;
double b=0.1;
cout << a-b << endl;
}

daba de resultado 5, en vez de 5.3. Los decimales desaparecían. El problema era la variable de entorno LANG. Estaba definida por defecto a es (de español)

LANG=es;
export LANG;

Esto hacía que el compilador se liara. Consideraba que el punto decimal debía ser la , en vez de el . y de alguna forma, ignoraba los decimales.

Simplemente cambiándola por

LANG=c
export LANG;

y volviendo a recompilar el programa... ¡Todo arreglado!

log4j

He empezado a utilizar log4j.

Es una librería que permite escribir textos en pantalla, de forma similar a System.out.println(), desde un programa java. Sin embargo, va más allá. Luego, sin andar tocando por todo el código donde hemos escrito un texto, podemos hacer que determinados textos no salgan en pantalla, o que salgan por otro sitio (escribirse en una base de datos, salir en una ventana, etc).

Por ejemplo, si hacemos un algoritmo matemático en java y queremos ver resultados parciales en pantalla, podemos sacarlos usando esta librería e indicando que son de "depuración". Cuando alguna cuenta no nos cuadre, podemos sacar el texto indicando que es un "error". Podemos a la vez sacar mensajes parciales para el pintado de un gráfico, también como "depuración". Luego, al ejecutar y sin tocar código, podemos hacer que solo se vean los de "depuración", o sólo los de "error" o sólo los del algoritmo matemático, sean de "error" o de "depuración", pero no los del gráfico.

El filtrado puede ser más fino incluso. Podemos querer ver sólo los mensajes de "error" que escribe una determinada clase.

Para el uso de esta librería, además de bajarnos el jar correspondiente y añadirlo en nuestro classpath, debemos, en el main(), inicializar el "logger" con algo como esto:

PropertyConfigurator.configure ("fichero_configuracion");

Luego, en el código, para escribir mensajes, en vez de System.out.println(), escribimos cosas como esta:

Logger.getLogger(MiClase.class).debug("Esto es un mensaje de depuracion");
Logger.getLogger(OtraClase.class).error("Esto es un mensaje de errror");

El fichero de configuración que pasamos al principio es un fichero de propiedades de los de java y en él es dónde se indican qué mensajes se quieren ver: de qué clases, si los de depuración, los de error, los warning, etc.

En fin, igual de cómodo pero mucho más versátil que el System.out.println().

08 julio 2005

consulta de sql

Un pequeño truco tonto que he aprendido.
A veces tenemos dos consultas a bases de datos sobre tablas distintas, pero que nos dan bastantes campos comunes. Sin embargo, en una de las consultas aparecen, por ejemplo, un par de campos distintos que en la otra.
Supongamos que queremos una tabla de deportistas. Los datos de ellos son comunes, pero la mejor marca es distinta en función del deporte que hagan: para corredores, la mejor marca va en segundos, en minutos, etc. Para los saltadores de longitud y altura, va en metros y para los gimnastas son puntos. Imaginemos que los select que hay que hacer son de este estilo

select nombre, deporte, mejor_tiempo... para los deportistas
select nombre,deporte,mejor_distancia... para los saltadores
select nombre,deporte,mejor_puntuacion para los gimnastas

Imaginemos también que queremos meter todo esto en la misma tabla y que nos interesaría que los ResultSet que devuelve java tuvieran las mismas columnas, para tratarlos igual.

El truco consiste en que podemos poner null en los campos seleccionados en la consulta, de forma que nos devolverá null en esas columnas. De esta forma, con estas consultas

select nombre, deporte, mejor_tiempo,null,null ...
select nombre,deporte,null,mejor_distancia,null ...
select nombre,deporte,null,null,mejor_puntuacion ...


Nos devolverán el mismo tipo de ResultSet, pero con los "huecos" ya preparados cuando un determinado campo no tiene sentido. Los tres ResulSet podemos tratarlos con el mismo código y añadirlos fácilmente a la misma tabla.

Por supuesto, este "truco" tiene sentido si mejor_tiempo, mejor_distancia y mejor_puntuacion pertenecen a tablas de base de datos distintas que estén ligada a la tabla de deportistas. Si todo fueran campos de la misma tabla, los huecos ya estarían en la tabla y lo arreglaríamos fácilmente con una única consulta

select nombre,deporte,mejor_tiempo, mejor_distancia, mejor_puntuacion ...

21 junio 2005

Wanadoo

Después del nuevo reglamento para las operadoras telefónicas y de internet, decidí dar una segunda oportunidad a los de wanadoo para darme de baja.

Envíe el 2 de Junio un segundo fax al 90201009 solicitando la baja del servicio de tarifa plana que tenía con ellos (heredado de auna y a su vez heredado de retevisión).

Quince días después de enviar el fax, plazo en el que se supone que deben darte de baja, y al ver que sus teléfonos de consulta dejaron de ser de tarificación adicional (los 902 son de pago, pero a coste similar al de llamada local), decidí llamar para ver cómo iba el tema de la baja.

La primera sorpresa es que me atendieron relativamente rápido. Tuve que esperar un poco con la musiquita de marras, pero apenas fue un minuto. Según el operador que me atendió, me han dado de baja desde el 19 de Junio. Debe llegarme un recibo en Julio con el servicio correspondiente a Junio, desde el 1 al 19.

En fin, a ver si se es verdad que me llega ese mini-recibo y no me llegan más. Espero que con la nueva regulación hayan, por fin, empezado a mejorar las cosas.

Por cierto, desde que envíe el primer fax (en Febrero) solicitando la baja, me llamaban día sí, día también los de wanadoo para ofrecerme adsl. Cuando por Abril empecé a cabrearme con el tema, aproveché para echar la bronca a todos los de Wanadoo que me llamban para ofrecerme ADSL.

ant

Ant es una herramienta que ayuda al compilado de programas java, así como a realizar varias tareas como generar el javadoc, limpiar, llevar los jar a su sitio para la ejecución, etc, etc.

Con proyectos grandes (alrededor de 4000 clases) he tenido el problema de que al compilar con ant me daba un OutOfMemory error. Mirando en internet, encontré esta página http://confluence.public.thoughtworks.org/display/CC/OutOfMemoryError, en la que encontré una solución que me funcionó.

Basta con poner una variable de entorno ANT_OPTS con valor -Xmx1024m, de esta forma a la máquina vritual que usa ant se le da un giga de memoria, en principio más que de sobra.

10 junio 2005

eclipse

LLevo un tiempo programando con eclipse y mis conclusiones son las siguientes:

Por un lado, tiene muchas cosas buenas y útiles. Me gusta que arregle los import, eliminando los que no sirven. También que los añada automáticamente. Que cuando haya un error dé opciones de arreglo, de forma que eligiendo una se hace el arreglo solo. Tiene historia de los cambios que hemos ido haciendo, así podemos volver a una versión anterior sin CVS, etc, etc.

Sin embargo, sigue sin gustarme la forma de hacer los proyectos. No me acaba de convencer el compilado automático, no por el compilado en sí, sino porque a veces no hay forma de que recompile. Pulsando "clean" no hace caso. Mirando, mirando, acabé descubriendo que se debe a un error en la forma de crear el proyecto, pero por ningún lado sale el aviso indicándolo.

También me sucede con cierta frecuencia que se va la memoria y me toca reiniciar eclipse (el proyecto que manejo es grande).

Seguiré de momento con eclipse, puesto que arranca bastante más rápido que netbeans y me siguen gustando más las opciones de edición que me da. De todas formas, me han comentado de otro entorno, intellij idea, que miraré a ver qué tal.

03 junio 2005

UML y desarrollo orientado a objetos

Un link que parece interesante sobre uml y una metodología de desarrollo orientado a objetos.

Es un pdf en el que hay un resumen bastante explicado sobre UML y qué pasos dar para desarrollar un proyecto.

Aunque leí el libro "UML y patrones. Introducción al análisis y diseño orientado a objetos" de Craig Larman hace tiempo, la parte del pdf que habla de desarrollo de un proyecto parece un resumen de dicho libro.

wanadoo

He intentado darme de baja en wanadoo. Mandé el dichoso fax en Marzo y todavía siguen pasandome recibos.
Aprovechando que con la nueva normativa los teléfonos de consulta ya no son 800 de pago, llamé por teléfono. Me dicen que no habían recibido el fax, que lo volviera a enviar.
Lo volví a a enviar ayer, esperaré quince días (es el plazo que dicen ellos que tardan en darte de baja) y volveré a llamar. Si esta vez tampoco "lo han recibido", iré directamente al banco a decir que no paguen más.

01 mayo 2005

eclipse

Muy a pesar mio, me he pasado de netbeans a eclipse.

Aunque me gustaba mucho más la forma de "montar" proyectos de netbeans, un compañero de trabajo empezó a usar eclipse y viéndolo trabajar con él, he visto que tiene bastante más cosas que netbeans.

Tarde una mañana en conseguir montar mi proyecto adecuadamente. Como ya indiqué en algún comentario anterior de este diario, todo es muy fácil si empiezas de cero y pones tus fuentes donde te dice el entorno de desarrollo, pero es muy dificil si ya tienes tus fuentes creados y en una estructura que no se parece a la que necesita el entorno de desarrollo. Es posible hacerlo, pero me costó encontrar las opciones ocultas en los miles de ventanas con miles de pestañas que hay para configurar un proyecto.

Algunas de las cosas que me han gustado:
  • Indica qué imports no se utilizan, aparte de que si se le pide los pone automáticamente según vamos utilizando clases.
  • Permite corregir más rápido las cosas, por ejemplo, pinchando sobre el error nos da una lista de posibles correcciones y seleccionando una de ellas se realiza automáticamente.
  • Permite tener varias configuraciones para el arranque de cada programa, variables de entorno, parámetros que se pasan a la máquina virtual, etc, etc. De esta forma se puede arrancar el mismo programa con varias configuraciones.
En fin, seguiré con él de momento y a ver qué tal.

26 abril 2005

Turbo C en linux

Leyendo en un foro de www.lawebdelprogramador.com , un tal vassagus mencionó una página en la que hay una librería para linux que permite compilar con gcc los programas hechos con turbo c en windows. Es decir, nos da el conio.h, el graphics.h y demás ficheros de cabecera y librerías correspondientes propias de turbo c.

La página en cuestión es http://www.sandroid.org/TurboC/

No lo he probado, pero puede ser una solución a mucha gente que en los foros anda preguntando que dónde consigue conio.h y graphics.h

23 abril 2005

validar entradas en un JTextField

Haciendo el editor numérico en java según comenté en http://chuidiang.blogspot.com/2005/04/patrn-estrategia.html, me encontré con el problema de que opcionalmente quería que el editor no perdiera el foco mientras no fuera correcto su valor. Investigando por internet encontré una página en la que pone varias formas de verificar la entrada de datos.

Básicamente son estas:
  • Añadir un KeyListener, de forma que cada vez que se pulse una tecla en el JTextField, nosotros digamos si vale o no. De esta forma se consigue, por ejemplo, si estamos pidiendo un número, descartar todas las letras.
  • Algo similar se consigue añadiendo un Document. En el Document se nos avisará de cada cosa que se quiera insertar en el editor y diremos si se puede o no insertar.
  • Añadir un FocusListener. Con esto en el JTextField se podrá meter cualquier cosa, pero cuando el JTextField pierda el foco, se nos avisará y podremos validar la entrada.
  • De la misma forma se puede hacer añadiendo un InputVerifier. Al InputVerifier se le preguntará si se puede o no perder el foco. Basta con que devolvamos no si la entrada no es correcta.
  • Aunque creo que la página no lo menciona, también es posible usar un JFormattedTextField, que tiene montones de opciones para añadir máscaras, qué caracteres son válidos y Formatters, que verifican si la entrada es válida o no.
El link de esta página es http://www.programacion.net/java/articulo/tt1120/.

20 abril 2005

InputVerifier de java

Estoy haciendo un editor, heredando de JFormattedTextField y basado en el patrón estrategia. Quería que mientras la entrada no fuera correcta, el editor no dejara perder el foco, que el cursor no se pudiera sacar del editor.

Investigando por la API he encontrado el tema del InputVerifier. Todos los JComponent de java colaboran entre ellos a la hora de pasarse el foco de uno a otro. Cuando el foco va a pasar del JComponent A al JComponent B, B le pregunta a A si puede perder el foco. Si A contesta que sí, el foco pasa sin problemas de A a B. Si A contesta que no, el foco se queda en A.

Cuando se le pregunta a A, internamente A le pregunta a una clase que tiene guardada dentro, (una clase hija de InputVerifier) si puede o no perder el foco, llamando al método verify() de dicha clase.

Nosotros podemos hacernos una clase hija de InputVerifier (por ejemplo, ComprobadorEntrada) de forma que en el método verify() leemos lo que ha escrito el usuario en el JTextField, vemos si es correcto y devolvemos true si es correcto o false en caso contrario.

Luego tenemos que meter nuestro ComprobadorEntrada en el JTextField, usando su método setInputVerifier(). El resultado es que si el usuario escribe algo en el JTextField e intenta sacar el foco de ahí (pulsando un botón, yendo al siguiente campo a rellenar o cualquier otra cosa), antes de que el JTextField pierda el foco, se llamará a nuestro método ComprobadorEntrada.verify(). Si devolvemos false, el foco no saldrá de nuestro JTextField.

17 abril 2005

¡¡Por fin!!

He leido en "El Pais" del 17 de Abril que el gobierno, POR FIN, se va a meter con las operadoras telefónicas, obligándolas a dar un buen servicio y sobre todo, haciéndo que dejen darse a la gente de baja. Dice "El Pais" que el nuevo reglamente YA está aprobado.

Después de mucho tiempo sufriendo a esta gente, que te dan de alta sin pedirlo, que se estropea el servicio que te dan, no te lo arreglan, te siguen cobrando y además debes protestarlo a través de un teléfono de pago en el que te dejan escuchando musiquita. Y el peor de los temas, darse de baja, en el que te piden hasta la foto de la primera comunión para no hacer nada y seguir cobrándote. Al final acabas metido en la lista de morosos. Nuestro "agil" gobierno, por fin ha decido meter baza en el asunto.

A ver qué caso le hacen las operadoras y qué mano dura aplica si no se le hace caso...

Yo estoy en ello. Tengo internet por teléfono con wanadoo. Como me quiero pasar a ADSL y no me apetece con ellos, lo primero que he hecho es darme de baja. He mandado el dichoso fax a finales de febrero y estoy a la espera a ver si me han hecho caso (a ver si me llega otro recibo al banco, que de momento es la única foma de enterarse si te han dado de baja.)

16 abril 2005

Dominios vg

En http://www.dominios.es.vg/index.shtm dan dominios .es.vg gratis. Si te registras, te dan el dominio y lo redirigen a la página web que tú digas.

Yo, para probar, he metido mi página en http://www.chuidiang.es.vg

En general, estas cosas no me gustan mucho. Por un lado meten propaganda, con lo que entre la de estos y la de geocities, tengo más propaganda que página.

Por otro lado, los contadores como nedstat y onestat suelen tener problemas, y no registran bien las visitas.

Además, en cierta ocasión me di de alta, gratis en www.chuidiang.tk. Después de un tiempo, me mandaron un correo diciendo que tenía que pagar y si no el dominio quedaría otra vez disponible. El dominio está otra vez disponible.

14 abril 2005

Patrón estrategia

Aprovechando que con el libro de "Head First Design Patterns" me he vuelto a emocionar con el tema de patrones, he puesto en mi página web un pequeño tutorial sobre el patrón estrategia.

Me llamó la atención al leerlo en el libro, porque antes entendía dicho patrón, pero el libro me hizo ver que tiene muchas más posiblidades que las que a mí se me habrían ocurrido.

De hecho, en el trabajo vamos a hacer un editor numérico (un JTextField que devuelve números) y pensabamos hacerlo aplicando este patrón... sin saber que era este patrón.

12 abril 2005

Jalopy

Jalopy es un formateador de código para java, que lo deja bonito, bien indentado y demás.

Existe como plug-in para netbeans y para eclipse, con lo que se puede integrar en la herramienta de desarrollo, pero también puede ejecutarse por separado.

Es uno de los mejores que he visto. Permite incluso añadir a todo el código automáticamente los comentarios, tanto de métodos, como de atributos, como el comentario de clase, añadiendo los @param tan engorrosos. Por supuesto, el comentario en sí debemos ponerlo nosotros.

Otra cosa buena que tiene es que no respeta las líneas en blanco que nosotros dejemos, dando un aspecto más uniforme al código. Tiene montones de opciones de configuración y ordena los atributos, métodos, constructores y demás, haciendo que aparezcan primero dentro de la clase los que nosostros queramos (por ejemplo, los métodos públicos primero, luego los atributos públicos, etc, etc).

11 abril 2005

Conexión a MySQL desde java

Una vez instalado MySQL http://chuidiang.blogspot.com/2005/03/intalacin-de-mysql-apache-y-php.html , para poder conectarme desde java, tuve que bajarme el driver correspondiente. En la misma ayuda de MySQL pone de dónde bajárselo. Yo lo bajé de aquí: http://dev.mysql.com/downloads/connector/j/3.1.html y desempaqueto el zip.

De todo lo que hay en el zip, lo importante es el fichero mysql-connector-java-3.1.7-bin.jar. Este jar hay que ponerlo en el classpath de compilación y de ejecución. En mi caso, como uso netbeans, simplemente monto el jar en el árbol de clases/paquetes.

Para la prueba, me he creado una base de datos, una tabla y un registro con los siguientes comandos de SQL:

mysql> create database prueba;
mysql> use prueba;
mysql> create table persona (id smallint auto_increment, nombre varchar(60), nacimiento date, primary key(id));
mysql> insert persona values (NULL, 'Pedro', '1995-09-12');

El siguiente programita java me permite conectarme y consultar el registro recién creado:

package chuidiang.ejemplos.base_datos;

import java.sql.*;

/**
* @author Chuidiang
*/
public class PruebaMySQL
{

/** Creates a new instance of PruebaMySQL */
public PruebaMySQL() {
try
{
// Este driver está en el jar que hemos bajado de mysql.
DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

Connection conexion = DriverManager.getConnection (
"jdbc:mysql://localhost/prueba","root", "la_password");

Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery ("select * from persona");

while (rs.next())
{
System.out.println (rs.getString (2));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new PruebaMySQL();
}
}

El resultado es el esperado.

Libro de patrones

En el trabajo me han dejado "Head First Design Patterns" de "Eric Freeman" y "Elisabeth Freeman", editorial O'Reilly, en perfecto inglés.

Es un libro gordo, de 638 páginas. Aparte de unos capítulos de introducción y de otras cosas al final (como patrones de patrones o patrones en el mundo real), únicamente cuenta 10 patrones, uno por capítulo.

En cada capítulo se extiende un montón, contando el patrón poco a poco y con mucho detalle, con ejemplos sencillos y bastante completos. En ese sentido, es un buen libro, dejando muy claros los patrones que explica y se pueden sacar muchas ideas de cómo usar el patrón. De hecho, yo entendía bien el patrón estrategia, pero después de leer el capítulo dedicado a él, sin aprender nada nuevo, he comprendido que se puede aplicar en muchos más casos de lo que se me habría ocurrido nunca.

Sin embargo, el libro está hecho como para tontos, lo que quiere decir que cada hoja tiene muy poco texto y muchos dibujos o que una idea simple, se explica en varias hojas, simulando la conversación entre un programador novato, que va dando sus ideas, y un gurú, que le va guiando para llegar al patrón en cuestión; haciendo entrevistas al patrón; con crucigramas con las palabras importantes del capítulo; etc, etc.

No tengo ni idea de lo que cuesta el libro, pero con más de seiscientas páginas de un tema técnico no puede ser barato. El patrón está bien explicado, pero de forma demasiado "para tontos". Estas dos cosas juntas me hacen pensar que es un buen libro para leer ... si te lo dejan, pero demasiado caro para lo que tiene.

04 abril 2005

phpBB

Rebuscando por ahí he encontrado phpBB.

Parece que es un paquete en php que se instala y da un foro en un servidor web.

Tengo que probarlo en el servidor que me he montado en el trabajo, a ver qué tal va. Supongo que puede ser útil para dejar constancia de ideas, comentarios y demás sin necesidad de hacer reuniones, que siempre se pierde algo el tiempo.

01 abril 2005

Entornos de desarrollo

Un problema para mi de los entornos de desarrollo (visual c++, JBuilder, etc) es el concepto de proyecto que tienen.

Para ellos, un proyecto es lo que todos pensamos que es un proyecto, es decir, los directorios, ficheros, librerías y demás que son necesarios para un programa. El problema es que casi todos los entornos de desarrollo no te dejan libertad para elegir, sobre todo, los directorios.

Cuando creas un proyecto nuevo, no hay problema. Creas el proyecto, el entorno de desarrollo crea los directorios que considera oportunos y tú sumisamente pones los ficheros donde el entorno de desarrollo te dice.

Pero, ¿Qué pasa cuando ya tienes fuentes hechos por otros medios y quieres crear un proyecto con esos fuentes?. Ya la hemos liado. Ni en Visual C++ ni en JBuilder se puede hacer de forma fácil. No digo que no se pueda hacer, pero no es trivial y requiere pelearse con (o conocer muy bien) el IDE.

Otro problema es que la forma de incluir librerías externas en tu proyecto suele ser buscando una opción escondida de menú que abre una ventana con catorce pestañas y en una de ellas, entre un montón de parámetros incomprensibles hay que poner la librería. Si no sabes donde está, es imposible encontrarlo.

Cuando elegí un entorno de desarrollo para java, probé el Forte for java, el netbeans (version 3.x) y el Jbuilder. Al final me decidí por Netbeans, simplemente porque su concepto de proyecto es muy simple.

En Netbeans, sólo hay que dar el nombre del proyecto. Luego tú, a mano, "montas" en el proyecto los directorios y librerias que quieras, que pueden estar donde tú quieras, con el nombre que quieras y ser todos los que quieras. La forma de montarlo es bien sencilla, con e botón derecho del ratón sale el menú de "montar" y puedes montar un directorio o una librería (un fichero .jar). De esta forma, un proyecto nuevo o empezar un proyecto con fuentes ya existentes es totalmente intuitivo. Sin conocer el IDE, se encuentra com hacerlo y se hace sin problemas en unos pocos minutos.

Más adelante, probé Eclipse y Netbeans 4.0. Me sigo quedando con la versión Netbeans 3.6. Eclipse también tiene un concepto de proyecto algo complejo y Netbeans 4.0 ya lo ha complicado.

31 marzo 2005

Intalación de MySQL, Apache y PHP

En el trabajo estamos realizando un proyecto que ya está muy avanzado, en fase de pruebas y con montones de fallos (incidencias) que corregir y mejoras (también llamadas incidencias) que añadir.

Con intención de que de forma cómoda los que prueban puedan dar de alta incidencias, los que las corrigen puedan marcar que ya están hechas y que los que prueban puedan marcar que efectivamente están corregidas, me decidí a hacer una base de datos de incidencias, accesible desde los navegadores de internet.

Como en http://members.lycos.co.uk/chuidiang/enlaces.php ya había hecho algo de esto con php y mysql, decidí usar esta tecnología: Apache, php y mysql. A pesar de que en el trabajo utilizo un PC con windows 2000.

Me bajé e instalé MySQL de http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-4.1.10a-win32.zip/from/pick#mirrors.

Me bajé e instalé Apache de http://archive.apache.org/dist/httpd/binaries/win32/apache_2.0.53-win32-x86-no_ssl.msi.

Y finalmente me bajé e instalé PHP de http://es2.php.net/get/php-5.0.3-Win32.zip/from/a/mirror.

La instalación de ninguno de ellos me dio ningún problema. Luego tuve que tocar un poco los ficheros de configuración de php y de apache para conseguir que todo funcionara junto. Ahora mismo estoy en casa y voy a contar un poco por encima lo que tuve que tocar. Cuando tenga un rato en el trabajo, pondré los ficheros y lineas exactas.

Configuración de Apache:

En "Inicio", "Programas", "Apache..." se puede editar el fichero de configuración de Apache con el notepad. Una de las líneas indica cual es el directorio que queremos publicar con el servidor Apache. Yo cambié dicha línea para, en vez de publicar el directorio por defecto, publicar uno más a mi gusto (dentro de c:/users/chuidiang/WEB).

En la ayuda de php a la que se puede acceder una vez instalado, pone las líneas que se deben añadir en el fichero de configuración de Apache para hacer que Apache sepa qué hacer con los ficheros .php (es decir, para habilitar PHP dentro de Apache). Copie dichas líneas y las añadí al final del fichero de configuración de Apache.

Configuración de PHP:

En el directorio de php hay un fichero de configuracion php.ini y otro que pone algo así como php.ini.recomendado. Copie el recomendado encima del php.ini

En una linea de php.ini pone si se admiten variables globales o no. Por defecto dice que no, pero yo lo cambié por sí. Si no se hace así, no podía leer los parámetros que pasaba a la página PHP directamente. Creo que si no se habilita esta variable global, hay que leer los parámetros a través de las variables $_POST o $_GET de php, pero no he probado. Supongo que esto último es lo más seguro y lo más correcto (puesto que el php.ini.recomendado lo tiene deshabilitado). Probaré y si funciona lo dejaré así.

Hay un tema que no recuerdo bien sobre extensiones. En él se trata de decirle a php que puede utilizar las funciones propias de mysql. Si no se hace esto, no se puede acceder a mysql desde php. Básicamente, creo que consiste en el php.ini indicar dónde están las librerias de extensiones o bien, copiar esas librerias en el mismo directorio donde está php.ini. Las librerías en cuestión están dentro mismo del árbol de directorios de php y son las de mysql.

Configuración de MySQL:

Nada especial para configurar MySQL en sí. Únicamente, hay una librería .dll que debe ponerse en el path de busqueda de ejecutables (yo la copié en c:\WINNT), porque la necesita Apache (o php) cuando php utiliza funciones de acceso a MySQL.

Bueno, como ya he dicho, está pendiente de revisar todo esto que comento con detalle, para indicar exactamente qué líneas hay que tocar, etc, etc.

25 marzo 2005

Captura de video

He capturado varias cintas de la cámara de video y del video normal con la pinnacle pc tv pro. El resultado es más o menos decente, pero un par de comentarios.

Ha visto que cuando la señal de video es mala o cuando hay un hueco sin grabar entre dos tomas, la captura con la pinnacle "se para". Por ello tuve que estar más o menos pendiente de la pantalla mientras capturaba las cintas, de forma que cuando la captura se paraba, tenía que rebobinar un poco y volver a grabar.

La pinnacle captura en mpeg-1 en 352x288. Para capturar en mpeg-2 con más resolucion en teoría hay que pagar a través de internet para "habilitar" esa característica. En PC-actual de Marzo de 2005 vi una consulta de un lector y le decían que hay posibildad de usar otros software de captura (le daban tres posibles ejemplos). Yo he probado con el nero que venía con el grabador de dvd y tiene opción de captura de videos y de programas de televisión. Este programa reconoce la tarjeta y en teoría parece que permite capturar en mpeg-2 con más resolución. Lo que no he conseguido de momento es el sonido. Voy a probar algo más a ver si es mejor capturar con esto en vez de con el software de la pinnacle.

17 marzo 2005

Flashget y "new offer for you"

A pesar del spysweeper y del spyboot, seguía con el problema del popup que ponía "new offer for you".

Me mosqueaba que mi navegador sea el FireFox y que el pop up saliera con el internet explorer. Además, a veces salía y a veces no el dichoso pop up.

Con el tiempo, me he dado cuenta que suele salir mientras estoy descargando cosas. Tengo instalado el FlashGet y el plug-in correspondiente para mozilla, asi que hice una busqueda en google de "new offer for you" y flashget. Entre un montón de páginas con caracteres extraños, encontré una de un foron en inglés:

http://www.technologyliving.com/forums/index.php?showtopic=158&mode=threaded

Resulta que parece que la culpa es de FlashGet. Es un programa gratuito a cambio de mostrar propaganda. En principio la propaganda sólo la muestra en la misma ventana de FlashGet, pero según el foro, también muestra popups.

De momento voy a dejar el FlashGet, aunque posiblemente me ponga a buscar otros administradores de descargas gratuitos.

11 marzo 2005

Formateadores de código c++

Buscando he encontrado dos formateadores de código de c++, de esos que cuando programas dejas los fuentes hechos una guarreria (mal sangrados, etc, etc) y que te lo dejan bonito.

Uno que viene con los fuentes y hay que compilar es el bcpp http://dickey.his.com/bcpp/bcpp.html y vale para linux

Otro para windows que me ha pasado un compañero de trabajo es astyle http://sourceforge.net/projects/astyle .Este viene con fuentes también, pero no he probado a compilarlo.

06 marzo 2005

pc actual

En este "post" criticaba el dvd de pc-actual de marzo de 2005. El comentario anónimo a este post me hizo remirar el dvd, con lo que tengo que pedir disculpas por las críticas y reemplazar el post por este otro.

El McAfee VirusScan completo, efectivamente en el dvd, en letra pequeña, dice que es completo durante 90 días. No me queda muy claro qué es completo 90 días. Si a los 90 días la base de datos de virus no se considera actualizada o que el programa se convierte en trial.

La versión de demo de pinnacle studio 9 efectivamente viene. El problema es que en la presentación únicamente pone que se puede acceder al tutorial instalando. Yo en general no instalo cosas por instalar o para ver qué tienen, así que no lo instalé. Al instalar aparecen varias opciones y además del tutorial, aparece el programa.

En cuanto al ubuntu linux, pasa algo parecido al pinnacle studio 9. En el comentario del programa, antes de instalar, habla de un tutorial. Yo, con mi costumbre de no insalar sin saber qué instalo, tampoco miré.

En fin, pido disculpas y en el dvd de de pc-actual de marzo de 2005 viene lo que dice que viene.

04 marzo 2005

Un par de links interesantes

Para todo el tema este de privacidad al navegar, cookies maliciosas y demás, he encontrado un par de links interesantes, en el que se indican programas gratuitos, de demo y de pago para asegurar la privacidad al navegar, además de explicar un poco todo este tema.

En ingles http://www.doxdesk.com/parasite/ . Si se usa internet explorer 5.5 o superior, al visitar la página se hace un chequeo del navegador y nos cuenta si tenemos algún espía infiltrado dentro.

En cristiano http://www.vsantivirus.com/ev-parasitos.htm

01 marzo 2005

spybot y spysweeper

Hace unos días me descargué spybot, con la intención de que me elimara dialers del ordenador, cookies maliciosas, y demás programas perniciosos de los que se cogen cuando se navega por internet.

Todo bien hasta que empezó a salirme de vez en cuando un pop up con "new offer for you". Eso huele a programa malo de estos. El spybot, además de darme un falso aviso cada vez que lo pasaba, no me quitó este programa.

Buscando por internet, encontré spysweeper, y este si consiguió eliminarme el dichoso programita (creo que se llamaba adlogix), además de encontrarme otro montón que parece que se le pasaron al spybot.

El spy sweeper no soluciona el tema. Ver Anotación 17/03/2005 para más sobre el "new offer for you"

En fin, de momento me quedo con spysweeper, aunque posiblemente lo que tengo es una versión de evaluación que caducará dentro de 30 dias.

Como cortafuegos llevo bastante tiempo con zone alarm, que es gratuito y parece que va bien.

Como antivirus gratuito, tengo instalado el avg.

Puertos usb

Al final estaba mal el chip de la placa base, o algo así. Cambiar la fuente de alimentación no sirve.

Para no gastar muchas perras y aconsejado por el de la tienda, le he puesto una tarjeta pci con cuatro puertos usb (36 €). Desde ahi todo funciona bien. He tenido que comprar también un alargador usb (4.95 €) para poder poner la conexión en el frontal del ordenador, en vez de estar obligado a enchufar por detrás.

28 febrero 2005

nero express

Con el grabador de dvd que compré venía el nero express para grabar cd y dvd. No me ha convencido nada, se me queda colgado y me da fallos de violación de segmento cada poco.

La herramienta que sirve para ver videos (avi, mpg, etc) cuando abro varios ficheros a la vez, reproduce el primero y se queda colgada en la primera imagen del segundo. Además, es incapaz de reproducir los ficheros capturados con la capturadora de televisión. Imagino que los ficheros no son 100% correctos (se pierde algún frame y demás), pero el windows media player y otros programas de ver videos sí son capaces de reproducirlos.

El primer dvd de datos que grabé, se estropeó porque se quedó colgado el nero. Al menos, el grabador dejó de grabar (no se encendía el piloto rojo que lo indica) y no salió ningún tipo de aviso en el nero. La aplicación además estaba colgada, no se la podía matar, no se veía ninguna barra de progreso ni número moverse, ni nada de nada. No puede matarla, porque no respondía.

En cuanto a crear mi propio dvd de película (con los avis capturados de la camara de video de las niñas), después de estar jugando un rato y grabando el proyecto, resulta que da una violación de segmento de esas. Ahora, cuando abro el proyecto (con doble click en el), da directamente la violación esa, por lo que parece que he perdido el rato de trabajo. Además, me costó un montón encontrar la opción de abrir un proyecto guardado. Según abres la aplicación sale una ventana directamente para añadir ficheros avis, sin darte opción a cargar un proyecto guardado. Hay que darle a un botón que pone "Atrás" y ahí sí esta esa opción, junto con otras opciones que no tienen nada que ver con crear una película de dvd.

En fin, seguiré investigando a ver si todos estos cuelgues se deben a algo mal instalado o algo que hago mal, pero el programa en sí ya no me ofrece ninguna confianza.

26 febrero 2005

Cargador de arranque de windows

He descubierto que windows tiene un cargador de arranque similar al de linux (al lilo de toda la vida).

En el c:\ está el fichero oculto boot.ini. En el se indican los distintos sistemas operativos de los que disponemos y con cual se arranca por defecto. Al encender el ordenador, nos sale un menú con esos sistemas operativos, en el que está remarcado el de por defecto y que nos da opción a elegir otro.

Este fichero boot.ini es de texto, está oculto y protegido, pero podriamos tocarlo. Windows creo que no tiene ningún programa para ello, pero con el programa bootpart podemos tocarlo.

En nautopia está muy bien explicadito todo esto del arranque.

puertos usb

Dándole vueltas a la cabeza y haciendo experimentos, creo que además del lápiz de memoria de el de la tienda, también funcionó hace poco un grabador de dvd externo que llevaba alimentación propia.

Eso me hace pensar que quizá falle la alimentación que sale del conector usb, de forma que en cuanto se le enchufa algo que consuma un poquitín de nada, la alimentación se va. Si esta alimentación es compartida con el teclado y el ratón, eso explicaría que al poner un dispositivo usb el teclado y ratón se queden colgados o hagan cosas raras.

Por ejemplo, el efecto de la camara de fotos que parpadea a ritmo con el teclado. Cuando la cámara intenta encenderse, se lleva la alimentación del teclado, haciendo que se apaguen sus luces. Cuando la camara decide que no puede encenderse por falta de alimentación, se apaga y el teclado vuelve a cobrar vida. Una vez recuperada la corriente la cámara decide encenderse nuevamente, repitiendo el proceso una y otra vez.

Nada, nuevamente a la tienda (mejor el lunes que hoy, porque para que esté mi ordenador el domingo encerrado en la tienda sin que nadie lo mire, mejor está en mi casa).

24 febrero 2005

El dichoso usb

Bueno, lo del usb de mi ordenador es asombroso.

Mi memoria usb me deja colgados el teclado y el ratón. Cuando introduzco la memoria, ambos se quedan totalmente bloqueados, aunque parece que windows sí encuentra la memoria y la pone. Si lo desconecto, sale la ventana de que he quitado un dispositivo usb sin detenerlo.

LLevo el ordenador a la tienda, el tio prueba con su propia memoria usb y le funciona perfectamente. Prueba con la mia y se queda bloqueado el teclado y el ratón. Se lleva mi memoria usb a otro ordenador y funciona bien.

Me comenta que puede ser que falte instalar un driver para la memoria usb (nunca lo había puesto antes). Así que me llevo el ordenador a casa no muy convencido.

Me pongo a enchufar otros dispositivos usb y son alucinantes los resultados.
  • La web cam deja colgado todo el ordenador, excepto el ratón y el teclado.
  • La camara de fotos empieza a encenderse y apagarse sola, parpadeando a ritmo con los leds del teclado (esos de mayúsculas, num lock, etc). Deja ratón y teclado colgados.
  • El lápiz de memoria, ya sabemos, deja el ratón y teclado colgados.
¿Será que en la tienda tienen el único dispositivo usb en el mundo que funciona con mi ordenador?.

Mañana les vuelvo a bajar el ordenador, pero con la cámara, con el lápiz de memoria y con la webcam.

El puerto USB

Bueno, lo del dvd al final lo solucionaron en la tienda. El problema era que el lector antiguo estaba estropeado y el cable IDE estaba mal. Al ver que el grabador de dvd no iba (culpa del cable), lo metí en la caja para devolverlo por si acaso y me puse a hacer pruebas con el lector antiguo (pensando que estaría bien). Todas las pruebas fallaron, por supuesto, porque el lector de dvd no iba bien.

Ahora el problema que tengo es que no me funcionan los USB (ni los de delante ni los de detras). Cuando enchufo algo (la memoria usb), aparentemente lo reconoce, aunque parece que va más lento que antes. El caso es que el ratón y el teclado se quedan muertos. No puedo hacer nada con el ordenador.

Si extraigo la memoria, el ordenador protesta indicando que no lo he detenido y el ratón y el teclado ya vuelven a funcionar, pero la ventana de aviso no se puede cerrar y el windows/ratón, en general, van muy lentos.

Ya he probado de todo y no consigo sacarlo de este estado. De hecho, si enciendo el ordenador con la memoria usb puesta, el teclado no funciona incluso cuando está arrancando la bios.

Creo que tengo que mandarlo otra vez a la tienda...

En cuanto a los conectores usb de la placa base, los que van al frontal del ordenador, he visto que lleva los cuatro cables habituales de usb (vcc, -usb, +usb y gnc), pero lleva además uno etiquetado usboc. Mirando en foros, he visto que es mejor no enchufar nada a este pin, porque parece que nadie sabe para qué sirve, pero todos saben que conectandolo da problemas.

22 febrero 2005

Lector de dvd (2)

Bueno, al final el ordenador está en la tienda por el tema del lector/grabador de dvd que no va.

Parece, de momento, que había dos problemas. Por un lado el lector de dvd antiguo estaba efectivamente estropeado. Por otro, uno de los conectores del cable IDE plano estaba mal. Una vez quitado ese conector, el grabador de dvd nuevo ya sí se enteraba de la inserción del disco.

Una buena prueba que me sugirió un compañero de trabajo para descartar que fuera tema del controlador y de windows, era meter un cd de arranque en el dvd y encender el ordenador con el dentro. Si no arranca, el fallo ya no es de windows, puede ser de la bios o de algo de hardware (como fue mi caso). Eso es lo que me hizo finalmente llevar el ordenador a la tienda. Estoy en espera de la reparación (espero que sea sólo el cable IDE).

20 febrero 2005

Lector de DVD

Hace tiempo mi lector de dvd dejó de funcionar. Aunque todo estaba bien según windows (el dispositivo funciona correctamente, no hay conflictos, etc, etc), el caso es que yo metia un cd o un dvd y windows insistía en que metiera una disco. Es como si no detectara que hay un disco dentro del dvd.

Pense que se había estropeado el lector de dvd y como no lo uso mucho, no le di importancia.

Hace poco compré un lector/grabador de dvd y reemplace el viejo. Resulta que es nuevo y hace exactamente lo mismo que el otro. Esto ya me hace pensar que no es la unidad dvd, sino algo de windows, de los drivers o de lo que sea.

Buscando en internet he visto gente con el mismo problema, pero ninguna solución.

En fin, estoy en ello. Supongo que ire a la tienda y lo cambiaré por un grabado externo de usb. No me hace gracia (otro trasto más encima de la mesa), pero me da mas pereza llevar el ordenador a una tienda a ver si son capaces de arreglarlo.

08 febrero 2005

Poster de los lenguajes de programación

En http://www.oreilly.com/news/graphics/prog_lang_poster.pdf hay un poster (en pdf) con la historia de los lenguajes de programación.

Puede verse como el Fortran fue el primero, y de ahí derivan un montón de lenguajes. Aparecen montones de versiones de C (concurrent C, C con clases anterior a C++, Objective C, etc, etc).


Es curioso ver, por ejemplo, que Java parte de un montón de lenguajes, como C++, Ada, smalstalk, etc.

06 febrero 2005

Tarjetas capturadoras de video

Me han dejado una Pinnacle PCTV Pro. La he instalado, tanto software como hardware, sin problemas.

Tuve que comprar un cable de audio con jacks en ambos extremos para contectar la salida de audio de la Pinnacle con la entrada de audio de la tarjeta de sonido. No sé si ese cable viene o no con la tarjeta, puesto que me la han prestado.

En mi casa la señal de televisión no es muy buena y la Pinnacle no da la misma calidad que una televisión. Si algunos programas los veo en la tele con algo de nieve, con la Pinnacle los veía peor. De todas formas, compré un amplificador de señal (20 euros) y mejoró mucho la calidad de la imagen tanto en la tele como en la Pinnacle.

Hice la prueba de meter la señal de la cámara de video analógica. El resultado también es más o menos aceptable.

He probado a grabar y el programa de la tarjeta sólo graba en avi y en mpeg1. Creo que para grabar en mpeg2 hay que conectarse a internet y pagar con la tarjeta para habilitar esta característica.

Me he bajado virtualDub, un programa que permite algo de edición de video (cortar trozos de una película) y salvar en varios formatos (los formatos de los codecs que tengamos intalados en windows). Este programa no entiende mpeg2, así que me he bajado otro, el TMPGEnc que sabe convertir varios formatos de video a mpeg2.

Sigo de todas formas con un problema/inquietud. Cuando con el programa de la Pinnacle doy a grabar un canal de televisión, me guarda el fichero en un avi o mpeg1. Estos ficheros ocupan bastante (creo que unos 50 Megas por minuto, o sea 500 Megas 10 minutos, o sea 5 Gigas 100 minutos). Luego paso esto a divX con el virutalDub y ocupa bastante menos, sin embargo siguen sin caberme hora y pico en los 600 Megas de un CD. Hay películas divX que caben en un CD, así que algo no hago lo suficientemte bien ...

Total, que la tarjeta me ha convencido, pero ahora estoy peleandome con los programas de conversion de formatos de video, a ver si consigo meter más de una hora de video en un CD con una calidad aceptable.

Una página con muchos programas de conversión de formatos de video es http://www.videohelp.com y ahí dentro podemos meternos en "tools".


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á.