30 noviembre 2005

FOLDOC - Diccionario de computación

En FOLDOC hay un diccionario, en perfecto inglés, sobre terminos de programación.

Esta bastante bien para buscar todas esas siglas que aparecen en todos sitios y no sabemos qué significan o qué es exactamente lo que son.

29 noviembre 2005

Cetus Links

En Cetus Links hay una hartá de enlaces sobre temas de programación, en perfecto inglés.

Diagramas UML para java

Una herramienta de dibujo UML para java gratis: fujaba.

No la he probado y no tengo ni idea de qué tal va, pero parece interesante de mirar...

26 noviembre 2005

Las buenas prácticas de programación

Todos sabemos que está prohibido hacer variables globales, que no se pueden poner atributos publicos, no se debe usar goto, etc, etc.

¿Por qué es un pecado?

Todas las buenas prácticas están pensadas para evitar problemas después, no para evitarlos ahora. Me explico. Si yo quiero hacer un programa rápido, lo más rápido posible y no pienso tocar ese código nunca más, ni pretendo reaprovecharlo, ni nadie tiene que mantenerlo ni añadirle mejoras, las buenas prácticas de programación no sólo no sirven para nada, sino que además son un estorbo que me harán programar más despacio. En ese caso sí se pueden usar goto, atributos públicos, no comentar código, etc, etc.

Sin embargo, esto no es lo habitual. Un programa, sobre todo si es para el trabajo, siempre corre prisa, pero siempre hay que introducir luego mejoras, nunca funciona a la primera y siempre hay que depurarlo. Siempre nos sale otro programa después que se parece al primero y hace que intentemos reaprovechar el primero. Y aunque no pensemos usar el programa nunca más, nunca podemos estar seguros de ello.

Por ello
  • Comentar el código es totalmente inútil si nunca nadie va a mirar ese código. Es casi obligatorio si tenemos que mirarlo dentro de unos meses o tiene que mirarlo otra persona que quiere reaprovecharlo, corregirle fallos a añadirle funcionalidades.
  • Las variables globales impiden reaprovechar el código. No podremos llevarnos un trozo de código sin esa variable global y quizás sin el resto de código que modifica esa variable. Tampoco sabremos en el efecto en el resto del código si aquí hacemos alguna moficiación que modifique el valor de la variable global. Buscar por todo el código dónde se usa la variable global puede ser un infierno, sobre todo si la variable global se llama "a".
  • Los atributos públicos son parecidos a las variable globales. No sabemos que efectos puede tener en el resto del código el cambio de esa variable.
  • Los goto sí que hacen impredecibles los cambios en el código. Nunca sabemos quién puede venir al trozo de código que estamos modificando ni desde dónde. Si hacemos funciones y llamamos a las funciones, podemos modificar el código dentro de la función siempre que aceptemos los mismos parámetros y devolvamos lo mismo.
y así hasta el infinito.

23 noviembre 2005

JFrame y JDialog

¿Qué diferencia hay entre un JFrame y un JDialog? ¿Cuando usar uno u otro?.

Teóricamente, en una aplicación debe haber un único JFrame, que es la ventana principal de la aplicación.

En windows, el JFrame aparece además de como ventana, en la barra de tareas. El JDialog no aparece. Si queremos que nuestra aplicación apareezca en dicha barra y sólo aparezca una vez, debemos usar un único JFrame, correspondiente a la ventana principal de nuestro programa.

Al JFrame además podemos llamar al método setIconImage(), para hacer que el icono de la taza de café propio de java cambie por el icono que nosotros queramos.

El resto de las ventanas de nuestra aplicación deberían ser JDialog. Estos JDialog no aparecen en la barra de tareas y además, en el constructor, se les puede pasar un padre. Al pasarles un padre, siempre se visualizarán delante del padre. Si les pasamos como padre el JFrame de nuestra aplicación, siempre saldrán encima de él y no se iran detrás. Una ventaja adicional de pasarles como padre el JFrame es que heredan de él el icono que pusimos con setIconImage(). El JDialog no tiene este método y la única forma de cambiar la taza de café es pasarle como padre otra ventana que tenga el icono cambiado.

21 noviembre 2005

Artículos de técnicas de diseño en java

En http://www.artima.com/designtechniques/index.html he encontrado una lista de artículos sobre diseño en java. Tiene bastante buena pinta. Miraré alguno que me interese y ya comentaré que tal.

20 noviembre 2005

Para crear un foro gratis

Me he encontrado una página http://www.foroswebgratis.com/ en la que te registras y te dan un foro. Puedes meterlo en tu página web o simplemente ellos te lo crean y tú tienes el link. Por supuesto, tú eres el administrador del foro.

De momento, para probarlo, lo he añadido a mi página de java. Y este es el foro.

Tutorial de Swing y JFC (Java Foundation Classes)

En http://www.programacion.com/java/tutorial/swing/ hay un tutorial con buena pinta sobre java swing.

19 noviembre 2005

www.links-rotos.com: Comprueba tus enlaces

En http://www.links-rotos.com/ hay una página a la que le das la url de la tuya y se dedica a revisarla, buscando links rotos. Al final te da un informe de los links que hay en tu página y que no funcionan.

Está limitado a un número concreto de páginas dentro de tu host y un número de páginas en el exterior, además de un tiempo de exploración de 15 minutos.

Está bastante bien para poder revisar los enlaces de tu página web.

18 noviembre 2005

La leche de geocities

Tengo una paginilla en http://www.geocities.com/chuidiang

El problema es que va aumentando de visitas y los de geocities me limitan el tráfico. Cada vez con más frecuencia, al entrar en la página, me sale un aviso indicando algo así como "esta página ha excedido el límite de tráfico permitido y no está disponible durante una hora".

Como no me apetece pagar para aumentar el limite ese, pues creo que voy a tener que ir llevándome páginas a otro sitio, al menos para repartir.

14 noviembre 2005

Documentación de java

En http://java.sun.com/j2se/1.5.0/docs/index.html hay un bonito gráfico con todos los paquetes de la edición standard de java 1.5

Lo interesante del asunto, es que pinchando en el bloque que queramos, accedemos a la documentación de ese paquete. No a la api de java, sino a una documentación en la que se explican cosas interesantes, como qué se puede poner en un fichero de manifiesto de un jar, la filosofía de swing y awt, etc, etc.

13 noviembre 2005

Servidores web gratis con mysql y php

En http://www.free-webhosts.com/power-search.php hay un buscador de servidores web gratuitos.

Únicamente tenemos que marcar qué características queremos que tenga el servidor (php, mysql, etc) y darle a buscar.

12 noviembre 2005

SpywareInfo > Online Spyware Detection

Con todo el tema del emule este y el kazaa sobre todo se me ha llenado el ordenador de "parásitos" indeseados, adware variados y popups a mogollón.

Todos esos parásitos, básicamente son cokies y programitas que se instalan con la intención de transmitir a alguien las páginas por las que navegas, información de tu ordenador, mostrar popups de propaganda, etc, etc.

SpyBot, el programa habitual que uso para eliminar estos bichos, eliminó muchos de ellos, pero no fue capaz de eliminar dos en concreto. Los detectaba, me decía que no podía eliminarlos salvo que reiniciara el ordenador. Reiniciaba el ordenador y el SpyBot me mandaba reiniciar otra vez.

Me bajé AdWare (Otro programa gratuito para quitar adware) y lo pasé. Me encontró más cosas que el SpyBoot y quitó todas sin problemas.

Para más seguridad todavía, me fuí a la página http://www.spywareinfo.com/xscan.php, que si se entra con internet explorer y se le da permiso, te hace un scaneo completo. Este encontró unas cuantas cosas más que borró. Espero que ya esté todo limpio.

11 noviembre 2005

Tutorial de Java - Tabla de Contenido

En http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/parte11/cap11-11.html parece que hay un tutorial de java, que debe ser de Froufre. En él hay algunos temas interesantes que no se tratan en otros tutoriales, como el modelo de delegación de eventos.

09 noviembre 2005

Foro phpBB

Hace tiempo intenté instalar en el servidor apache/php que tengo en el trabajo el foro phpBB. Este foro no es más que un montón de páginas php que se copian en el directorio web en el que se quiera que esté el foro y ya casi está. Sólo hay que configurarlo.

El administrador del foro debe entrar con su navegador en la página del foro y meter unos datos de configuración más o menos simples (tipo de base de datos usada, usuario y password para la base de datos, correo del supervisor del foro, etc, etc). Una vez que le da a "Aceptar", se crean automáticamente en base de datos todas las tablas necesarias y todo está funcionando.

Esto en teoría es fácil. De hecho, la página phpBB2 en su ayuda para la configuración da cuatro ideas tontas y dice algo así como "si no eres capaz de configurarlo, no eres digno/capaz de mantener un foro".

Pues yo no soy digno. Con la versión phpBB 2.0.13 fuí incapaz de meter los cuatro datos tontos que pide. Daba error al pulsar "Aceptar", pero no te decía el error ni ninguna pista de lo que estaba mal. Por más que lo intenté y cambié parámetros, no fui capaz de hacerlo.

Sin embargo, mucho después decidí volver a intentarlo. Me bajé la versión phpBB 2.0.18 y ¡misterios de la ciencia!, metí los cuatro datos tontos y se instaló sin ningún problema. Ya tengo el foro funcionando en el trabajo. Ahora sólo queda saber para qué sirve. Parece que la gente no le ha hecho mucho caso, así que de momento el único que escribe soy yo.

08 noviembre 2005

Undo - Redo en java

Java tiene un paquete javax.swing.undo que da soporte para hacer undo-redo en algunos componentes java.

Los Document (que van metidos en JTextField y similares) también tienen soporte, por lo que hacer undo - redo de los JTextComponent es casi inmediato.

El funcionamiento es básicamente el siguiente:

  • Los Document admiten un suscriptor a cambios undoables. Para suscribirse hay que llamar al método addUndoableEditListener().
  • javax.swing.undo tiene una clase UndoManager que implementa la interface UndoableEditListener, que se puede suscribir a esos cambios en los Document.
  • La clase UndoManager va guardando todos los cambios de todos los sitios en los que está suscrita. Tiene métodos de undo() y redo() para hacer y desacer los cambios de los que se ha enterado de forma secuencial, además de otro montón de métodos útiles.
En resumen, para hacer undo - redo en los JTextField, hay que hacer un código similar a este

UndoManager um = new UndoManager();
textField1.getDocument().addUndoableEditListener (um);
textField2.getDocument().addUndoableEditListener (um);
...
// cuando venga bien (pulsar algún botón que ponga "undo") se puede hacer
um.undo();


Una pequeña tontería. Todo esto lo he mirado, pero no lo he probado. Es posible que no funcione o haya alguna pega que no está aquí.

07 noviembre 2005

Google PageRank

En http://pr.efactory.de/ he encontrado una página que explica con bastante detalle cómo funciona el page rank de google.

El page rank es una puntuación que da google a cada página web. Cuanto más alta sea esa puntuación, antes saldrá la página en el buscador. De esta forma las páginas con mayor page rank son las que salen primero en el buscador.

Esta puntuación se obtiene a base de los enlaces que hay entre páginas. Cuando una página A tiene un link a una página B, ese link equivale a un "voto" de la página A por la página B.

Todos los votos no valen lo mismo. El voto de una página A por una página B es más valioso teniendo en cuenta los siguientes factores:

- Cuanto mayor sea el page rank de A, más vale el voto.
- Cuantos menos links hacia otras páginas tenga la página A, más vale el voto.

El page rank de una página es la suma del valor de todos los votos a esa página.

Es curioso, pero para tener un page rank alto, basta con que una única página importante con pocos links ponga un link a ella.


El navegante errático.

Una cosa que me ha llamado la atención es que la fórmula de cálculo del page rank está basada en el cálculo de probabilidad de que un navegante, pinchando enlaces al azar, acabe en esa página.

Cuanto mayor sea el page rank (entendido como probabilidad) de una página que enlaza con la tuya, más probabilidades hay de que el navegante se encuentre en esa página, por lo que aumentan las probabilidades de que pinche en la tuya.

Sin embargo, cuanto más enlaces haya en esa página, menos probabilidades hay de que pinche en el enlace a la tuya. Por eso el tema de dividir por en número de enlaces.

05 noviembre 2005

Otra más sobre e-mule

Seguí haciendo pruebas con el tema de que e-mule me dejaba colgado el ordenador. Probé e-mule Plus, eDonkey 2000 (que es compatible con e-mule) y algún otro cliente (no recuerdo si era iMesh o lphant). El caso es que todos ellos se me dejaban colgado el ordenador en algún momento.

Con kazaa no, todo funciona bien (y dicho sea de paso, me descarga las cosas más rápido, aunque hay menos cosas que descargar).

Otra prueba que hice es cambiar la tarjeta de red. Tengo una D-Link DWL 520+ y la cambié por una Belkin Wireless 54Mbps y con ella todo funciona correctamente. Al final la conclusión es que e-mule no es muy compatible con esta tarjeta.

Ya de paso, comparando ambas tarjetas, recibo mejor la señal con la D-Link. Supongo que el hardware de captura de señal es mejor es esta tarjeta (también hay una diferencia de precio importante).

04 noviembre 2005

Sincronización de hilos en java

No soy ningún experto en hilos, pero voy a contar aquí un poco de lo que sé. Quizás no sea lo más correcto, pero es la forma en la que yo los uso y me funcionan.

Para sincronizar hilos tenemos dos formas.

Sincronizar los métodos:

Por un lado podemos poner synchronize en los métodos de una clase. Sería algo como esto:

class Clase
{
public synchronized void metodo()
{
....
}
}

Si varios hilos llaman al método a la vez, sólo el primero consigue entrar. Los siguientes se quedan a la espera de que el primero termine.

Supongamos ahora que hay varios métodos synchronzied. Si un hilo entra en uno de ellos, todos los demás métodos synchronized quedan bloqueados para los demás hilos. No pueden llamar a ninguno de los demás métodos hasta que el primer hilo termine con el suyo.


Sincronizarse con un objeto:

Por otro lado podemos hacer un código sincronizado con un objeto. El código sería así

synchronized (cualquierObjeto)
{
// código que usa cualquierObjeto
}

Esto requiere la colaboración de todos los hilos. Cualquier hilo que quiera acceder a ese cualquierObjeto, debería hacerlo así. Mientras un hilo está en su trozo de código synchronized, ningún otro hilo puede acceder al cualquierObjeto.

¿Cuándo se usa uno y otro?

El primer sistema está bien para proteger atributos de la clase, de forma que ningún hilo los cambie mientras se está ejecutando uno de sus métodos. Sin embargo presenta una pequeña pega. Supongamos que tenemos una clase Lista con dos métodos sincronizados, un dameNumeroElementos() y un dameElemento(int i). Si un hilo quiere obtener los elementos, hará algo como esto

for (int i=0; i<lista.damenumeroelementos();>
{
dato = lista.dameElemento(i);
// tratamos el dato
}

Mientras se está haciendo el bucle, cualquier otro hilo puede incordiar. Mientras pedimos el número de elementos o pedimos un elemento, ningún otro hilo tiene acceso, pero mientras se está incrementando la i, se trata el dato o se compara si hemos llegado al final del bucle, cualquier hilo puede modificar la lista. En concreto puede pasar que el dameNumeroElementos() nos diga que hay un elemento, que otro hilo lo borre antes de que accedamos a él y que luego intentemos pedirlo, con el consiguiente error.

Cuando necesitamos hacer algo con un objeto llamando a varios métodos (como en el caso de obtener los elementos de la lista), es mejor usar esto

synchronized (lista)
{
for (i=0;i<lista.damenumeroelementos();i++
{
dato = lista.dameElemento(i);
// tratatmos el dato
}
}

Por supuesto, los el código de los demás hilos debe respetar este mecanismo, poniendo código sincronizado con lista cuando se quiera hacer algo con ella.

Este mecanismo también es bueno cuando el objeto en cuestión representa un recurso externo (por ejemplo, un InputStream o OutputStream de un fichero o un socket, o una Connection de una base de datos). Si nos sincronizamos con ese objeto, evitamos que varios hilos escriban o lean a la vez de ahí, impidiendo que los mensajes salgan o entren entremezclados.

03 noviembre 2005

La nueva metodología (Martin Fowler)

La página de Martin Fowler parece bastante interesante. Rebuscando en ella he encontrado un artículo (en cristiano) sobre las metodologías de diseño, haciendo especial mención de las metodologías ágiles.

Todavía no lo he leido, pero voy a ello...

Bueno, ya casi me lo he leido. No sé si es por la traducción o qué, pero se me hace un poco pesado de leer. Para cuatro ideas sencillas que cuenta, usa frases demasiado enrevesadas y que hay que leer despacio para comprender.

La idea es la de siempre, no hay que perderse haciendo documentación. El programador cobra impotancia dejándole decidir cómo hacer las cosas y en qué tiempo. Hay que hacer iteraciones en espacios cortos de tiempo (de un par de semanas a un mes) e ir dándoselas al cliente para que las prueba y decida sobre la marcha que quiere después. La programación extrema es una de las metodologías ágiles.

02 noviembre 2005

Poner imagen de fondo en una ventana

He estado haciendo unos experimentos para ver si consigo poner una imagen de fondo en una ventana. No sé si he llegado a la mejor solución, pero aquí hay una.

Lo primero es hacer una clase que herede de Container y redefina el método paint(Graphics g) de esta manera

class Contenedor extends Container
{
// La imagen que queremos de fondo, un fichero .gif
public ImageIcon icono = new ImageIcon ("./imagen.gif");

// Redefinición del método paint()
public void paint (Graphics g)
{
// Borramos todo y lo pintamos del color de fondo por defecto.
Rectangle r = g.getClipBounds();
g.setColor(this.getBackground());
g.fillRect (r.x, r.y, r.width, r.height);

// Pintamos la imagen
g.drawImage (icono.getImage(), 0,0,this);

// Hacemos que se pinten los botones dentro de este contenedor
super.paint(g);
}
}

Luego basta con instanciar un JFrame o JDialog y meterle este contenedor

JFrame ventana = new JFrame();
ventana.setContentPane(new Contenedor());

Con esto vale. Como pega es que la imagen no se repite si la ventana es más grande que la imagen. Esta sólo sale una vez.

Los componentes que se pinten en la ventana, (JButton y demás, salvo el JLabel), tienen su propio color de fondo y machacan la imagen. Si no se quiere así, habría que ir llamando a los método setOpaque(true) de los compoentes.

Unas variantes para esto pueden ser las siguientes:
  • En drawImage() podemos hacer que la imagen coja el tamaño del contenedor. Para ello hay que poner unos parámetros más e incluso el color de fondo: g.drawImage (icono.getImage(), 0, 0, this.getWidth(), this.getHeight(), this.getBackground(), this);
  • Si no damos tamaño a la imagen, pero sí ponemos el color de fondo, nos ahorramos borrar antes el contenedor. La pega es que si el contenedor es más grande que la imagen, todo ese sobrante no se borra.

Más sobre emule

Al final nada de nada. Por más pruebas que hago, el emule me deja colgado el ordenador.

Con las versiones antiguas (0.44d) no consigo nada, se sigue quedando colgado. También he probado con el emule plus sin resultado.

Mirando foros, he visto que determinados router y tarjetas de red dan problemas, generalmente de desconexión con internet, al usar emule. Hay gente que ha conseguido arreglar el problema actualizando drivers o con scripts que configuran las tarjetas de red de alguna forma especial. En mi caso, no he tenido suerte (aunque tampoco me lo he tomado muy en serio).

Mi conclusión final es que algunas tarjetas de red / routers no funcionan bien con emule. Como de momento no tengo intención de cambiar de tarjeta de red, paso de emule.

Al final he probado con kazaa. Me gusta menos la red de kazaa (hay menos cosas), pero al menos me funciona. kazaa mete mucha propaganda, pero he leido por ahi que hay una versión (kazaa lite) que es lo mismo, pero sin la propaganda ni spywares ni demás. Ya me la he bajado y algún día la probaré.