18 mayo 2006

Dichoso Windows

En el trabajo, debido a varios cortes de luz seguidos, se me "fué" el ordenador. El windows no volvió a arrancar.

Tras varios intentos, decidimos volver a instalar windows. Metemos el CD, nos sale el menú, vamos contestando a las cosas y en un momento dado windows nos informa que: "se borrará la carpeta c:\winnt y todo su contenido y la carpeta Mis Documentos".

¿¿??

¿Qué tiene que ver la carpeta Mis Documentos con el sistema operativo?. Entiendo que borre c:\winnt, entendería que borrara Archivos de programa, total, todos sabemos que esos programas no volverán a funcionar sin reinstalarlos, pero ¿la carpeta Mis Documentos?. ¿Es necesario borrar mis fotos de la cámara digital, mis cartas en word y los últimos chistes interesantes que me llegan por correo?.

Y lo peor de todo, es que encima te engaña. Luego no borra esa carpeta. Si yo tenía un usuario administrador y su carpeta era c:\documents and settings\administrador, resulta que al reinstalar y poner al pc en nombre mi-pc (nombre ficticio) crea un c:\documents and settings\administrador.mi-pc y respeta la antigua.

17 mayo 2006

Perl en latín

Me he tropezado con esto escribe perl en latin, una especie de forma de escribir perl en latín. Como si no fuera ya bastante complejo programar, para encima liarse con el lenguaje.

Y aquí http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html está la explicación de cómo, en la que nos tienen que enseñar declinaciones en latín para programar correctamente.

Para los nostáligos de motif

Hace tiempo ví en la API de java un layout que desconocía, el SpringLayout. Hoy me he puesto a ojearlo y ¡qué sorpresa!, es cagadito a los attachment de motif.

Se añaden los componente en un panel y luego hay que indicar cada borde de los componentes (izquierdo, derecho, superior e inferior) a cuántos pixels de distancia va del borde de otro componente. Los componentes para usar los bordes pueden ser cualquiera de los añadidos e incluso el mismo contenedor. Una llamada como esta:

layout.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST, contentPane);

hace que el borde izquierdo de la etiqueta esté a 5 pixels del borde izquierdo el panel contenedor (por supuesto, label y contenPane son variables tipo JLabel y JPanel o equivalentes).

En http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html tienes el tutorial completito de sun sobre cómo usar este layout.

16 mayo 2006

Socket udp en java

El otro día un compañero me preguntó por los sockets udp en java. Nunca había trabajado con ellos, pero sí tenía el concepto por los sockets udp de C en linux, Nos pusimos a ello.

Salió bastante rápido y no es complejo, así que me decidí ¿cómo no?, a hacer un pequeño tutorial. Aquí tienes el resultado:

Ejemplo de socket udp en java.

15 mayo 2006

Nuevos ejemplos en mis apuntes de programación

No sé si voy a seguir mucho más, pero en la parte de java acabo de abrir una nueva sección con clases listas para ser reutilizadas.

He metido ahí la librería gráfica que hace tiempo que tengo, así como un par de paneles que admiten imágenes de fondo y una clase para búsqueda de ficheros, que le hice para alguien del foro.

En estas dos páginas, la que tiene la lista de componentes reutilizables y la de applets de ejemplo, he hecho mis primeros pinitos con css, aunque no se note, poque el estilo es el de siempre. Y también he metido algo de cutre-php, sólo uso el include. A ver qué tal se porta eso.

13 mayo 2006

Solucionado lo de css

Después de pelearme unas cuantas horas tratatando de hacer con css una simple línea en la que hubiera tres palabras, una a la izquierda, otra en el centro y otra a la derecha, me decidí a escribir en un foro de css y me contestaron.

Esta claro que de momento no tengo ni puñetera idea y que debo pelearme un poco más con ello.

Con la solución que me han dado:

#cabecera1, #cabecera2, #cabecera3 {
border: 1px solid black;
width: 33%;
float:left;
}
#cabecera1 {text-align: left;}
#cabecera2 {text-align: center;}
#cabecera3 {text-align: right;}

queda todo mucho más elegante y además funciona.

Al menos he aprendido que los float: left se apilan hacia la izquierda, de forma que este código css en realidad lo que hace son tres columnas de igual ancho.

Seguiré con ello.

css

Con la página de apuntes de programación tengo un problemilla y es que cada página la hago "artesanalmente" con html. Cuando tengo que hacer algún cambio que afecte a todas las páginas, como cambiar un enlace o si quiero darless otro aspecto, es un verdadero rollo ir una por una haciendo la modificación en todas y subirlas al servidor.

Para el tema de la cabecera, el pie y los anuncios de google se me ocurre que puedo hacer un ficherito para cada uno de esos trozos. Luego, aprovechando php, hacer simplemente un "include" de esos ficheritos. De esta forma, cambiando el ficherito, se cambia en todas las páginas.

Para el aspecto, conocía la existencia de css e hice alguna pruebecilla en su día, así que decidí mirarlo un poco más en serio. Intenté hacer una página nueva con el mismo aspecto de las otras usando css. Bien, css es una nueva cosa que me ha dejado asombrado, es increible la cantidad de posibilidades que tiene que me resultaban desconocidas.

En css Zen Garden hay una página echa con html y css. En el menú de la derecha puedes cambiarle el aspecto a la página eligiendo otro css. Puedes probar y verás los cambios espectaculares sobre la misma página.

De momento el problema "gordo" que se me ha presentado, es que los navegadores no interpretan igual las cosas. Pretendo hacer una única linea de texto con tres palabras, una a la izquierda, otra en el centro y otra a la derecha. Defino tres estilos o como se llame así

#cabecera1 {
text-align: left;
border-style: solid;
width: 33%;
display: inline;
}
#cabecera2 {
width: 33%;
text-align: center;
border-style: solid;
display: inline;
}
#cabecera3 {
width: 33%;
border-style: solid;
text-align: right;
display: inline;
}

y luego, en la página con tres div, uno con cada estilo, pongo las tres palabras. Internet explorer hace lo que quiero, firefox no coge el ancho. Si quito lo de display inline, entonces firefox sí coge el ancho, pero no sale todo en la misma línea. Si consultas por ahí, todo el mundo dice que internet explorer es el malo porque interpreta css como le da la gana y que firefox es el bueno, porque sigue estrictamente el standard de css.

¿Cómo demonios se hace entonces eso?

12 mayo 2006

El que no corre vuela

Hace un tiempo recibí un correo de una persona de una empresa que me había visto en los foros de java. En el correo me comentaba que yo parecía tener conocimientos de SWING y que si quería trabajar con ellos, le enviara un correo. La empresa es bastante conocida (no es una empresilla cualquiera), pero no contesté al correo.

Pensé que este señor había pensado, al verme en los foros, que yo era un estudiante o un recién titulado. La verdad es que ya tengo mis añitos y llevo 12 trabajando en la misma empresa, bastante más grande y conocida que la del correo. Como no tenía ganas de andar indagando el tipo de trabajo que me ofrecía, sueldo, meterme otra vez en entrevistas, etc, al final, simplemente, no conteste.

Ahora, en el mensaje 11 de mi libro de visitas he recibido una oferta de hosting gratuito para mi página de apuntes de programación. También la he rechazado porque, aunque pago, estoy contento con mi actual hospedaje en hostito. Además, acabo de pasar toda la página ahí y no me apetece volver a moverla.

A ver si me siguen llegando ofertas de estas, seguro que al final alguna cuela...

10 mayo 2006

Más vueltas con rmi

Sigo dale que te pego con rmi.

Primero retoqué el tutorial de rmi para obtener un ejemplo con lo básico e imprescindible de rmi.

Acabo de añadir otro que lo complica un poco, pasando como parámetros en los métodos del objeto remoto clases Serializable y Remote. Esto, como se explica allí, es casi equivalente a pasar parémtros por valor o por referencia a un método normal.

Ahora tengo que retocar el tutorial que hice de SecurityManager, porque está mal enfocado y no cuadra con los otros dos tal cual. En él explicaré qué es y la necesidad de la carga dinámica de clases, así como todo lo del SecurityManager. Con un poco de suerte, para mañana está hecho ...

07 mayo 2006

Más sobre rmi

Bueno, esta vez hay varias cosas sobre rmi y el tutorial de rmi.

Por un lado, mande un correo a la persona que había copiado el tutorial en http://siul02.si.ehu.es/%7Ejimena/ISO/LAB_4/LAB_4.htm pidiéndole que pusiera un enlace al original. Me constestó amablemente y ya ha puesto el enlace.

En cuanto al tema de seguridad y los experimentos que he hecho, así como el tutorial de SecurityManager, veo que tuve unos problemas de concepto.

Es posible hacer, como indiqué allí, que un cliente envíe una clase maliciosa al servidor que haga algo que no debe y que el servidor puede protegerse contra estas acciones por medio del SecurityManager y el fichero java.policy. Sin embargo, veo que no es tan fácil. Si la clase enviada no está en el CLASSPATH del servidor, no se acepta con tanta facilidad como yo pretendía. Si está en el classpath del servidor, el problema no es tan grave, puesto que es una clase propia del servidor y se supone que no tiene código maloso.

Buscando por internet, veo que sí es posible enviar clases que no existen en el classpath del servidor y que este las cargue dinámicamente (carga dinámica de clases en rmi) y las use. Sólo en ese caso es donde está el problema de seguridad.

Esto sólo es posible con rmi (no con sockets) y rmi por defecto no carga este tipo de clases si no tiene un SecurityManager instalado. En mis pruebas, poniendo un RMISecurityManager y poniendo un fichero java.policy con todos los permisos para todo el mundo, no he conseguido que se carge dinámicamente una clase. Seguiré investigando y posiblemente tenga que cambiar/ampliar los tutoriales ....

05 mayo 2006

Open Source EJB Servers

Una lista de contenedores EJB gratuitos.

Open Source EJB Servers

Jose Daniel . es

Aquí la página de un amiguete. Tiene fotos de cuando se fue a esquiar a Costa Rica.

Seguridad en rmi

Gracias a una "charla" en el foro http://www.forosdelweb.com/showthread.php?t=390224, me puse a ver en qué momentos es mejor usar sockets y en qué momentos es mejor usar rmi. Aunque GreenEyed no está de acuerdo, estas son las conclusiones que encontré buscando por internet.

Luego, también por la misma charla, me puse a mirar también el por qué del SecurityManager y el fichero java.policy. Lo que encontré es algo que me llamó bastante la atención.

Aunque todavía no estoy seguro de ello y quiero hacer unos experimentos, el "problema" de seguridad con rmi que obliga al uso e SecurityManager y java.policy es el siguiente:

Cuando un objeto remoto recibe como parámetro un objeto Serializable, se hace una copia del objeto que tiene el cliente en el servidor.
Si un cliente malicioso hace un objeto con código malicioso y lo pasa como parámetro en un método remoto, se está haciendo copia de ese objeto con código malicioso en el servidor. Es posible que el servidor llame a un método inocente de este objeto (por ejemplo, un getNombre()) y en ese método se ejecute el código malicioso.

Esto se evita instalando en el servidor el SecurityManager y el java.policy. En el fichero java.policy, aunque en casi todos los ejemplos se deja con todos los permisos para todo el mundo, se pueden restringir los permisos para cada clase en concreto, en función de que venga o no firmada, se le puede dar permiso o no para abrir y conectarse a sockets, en determiados puertos, para acceso de lectura sólo a determinados directorios del disco, etc, etc.

En el tutorial de java de sun también aconseja el SecurityManager y java.policy en los objetos devueltos por un método remoto y en las excepciones lanzadas por el mismo. No entiendo porqué en el servidor, imagino que se refiere a hacerlo en el cliente, por si el servidor es algo malo y pretende recopilar información "oculta" del cliente que se le conecta.

Sigo en ello y quiero hacer experimentos.
  • Probar a arrancar el rmiregistry desde java.
  • Hacer un código malicioso en el cliente y ver que efectivamente puede hacer o no lo que le de la gana en función del java.policy.
Luego modificaré y añadiré esta información al tutorial de rmi.

04 mayo 2006

Otra vez el mismo tutorial copiado

Buscando por internet cosas sobre java.policy, acabo de ver otro tutorial, el de rmi (el mismo de la vez anterior), que me han copiado. Esta vez, al menos, lo han modificado y dado forma, aunque sigue reconociéndose mi "inconfundible" estilo.

El original mio es Ejemplo simple de rmi en java.

La copia está en http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm. Según lo iba leyendo, me iba sonando, el ejemplo, lo de sumar dos números, etc. Pero la frase final...

"Para que el código del cliente compile necesita ver en su classpath a InterfaceRemota.class. Para que además se ejecute sin problemas necesita además ver a ObjetoRemoto_Stubs.class, por lo que estas clases deben estar accesibles desde el servidor o bien tener copias locales de ellas."

es exactamente igual que el mio, así que me despejó toda posible duda.

La otra copia de este tutorial sigue estando en http://lawebdelprogramador.iespana.es/index3_archivos/menu/programas/rmi.htm, aunque aquí la copia es más descarada.

Sockets vs RMI

He estado investigando un poco sobre cuándo usar sockets y cuándo rmi.

Parece que por dificultad de programación son algo peor los sockets, ya que necesitan leer el mensaje e identificar cuál es para obrar en consecuencia. En rmi, como se basa en llamadas a métodos, no hay que hacer ninguna programación especial.

Sin embargo, rmi lleva un protocolo interno que utiliza bastante ancho de banda de nuestra conexión, mientras que con sockets se usa bastante menos, ya que sólo circulan los datos y lo que nosostros queramos meter.

La conclusión es que si nuestra red es lenta, hay pocos mensajes y son principalmente para transferir ficheros, es mejor sockets.

Si hay nuestra red es rápida y hay muchos mensajes en los que se transmiten pocos datos, es mejor rmi.

En Sockets & rmi de la ChuWiki he puesto algo de esto además de un enlace bastante interesante sobre el tema.

03 mayo 2006

Estoy perdido con php

Ando un poco perdido php. Me apetece aprenderlo y además de leer un poco, pienso que la mejor forma de aprender un lenguaje de programación es ponerse a hacer algo.

Sin embargo, veo que en php está casi todo hecho y descargable gratis: hay foros, chats, diarios, wikis, incidencias (los llaman tickets), enlaces, libros de visitas, etc, etc.

¿Qué demonios programo y que tenga un mínimo de utilidad, al menos para mi mismo?. Esta todo hecho y mejor de lo que podría hacerlo yo.

Bien por Hostito

Tengo mi página web de programación alojada en Hostito. El Viernes pasado instalé una wiki a la que llamo ChuWiki. Todo funcionó correctamente durante tres o cuatro días, pero...

Ayer por la tarde, de repente, dejó de funcionar, dando un "internal server error". Envié la incidencia a Hostito. Inmediatamente recibí el correo-robot de que mi incidencia había sido recibida y que sería atendida. 10 minutos más tarde (aunque ya no vi el correo), recibí un correo de una persona indicando que no sabía cual podía ser el error y preguntando sobre la instalación de la wiki.

Esta mañana le constesté. Por la tarde encendí el ordenador y vi un correo de hacía 40 minutos de que iban a recompilar el servidor y el php. Miré la ChuWiki y ya funcionaba.

Resumiendo, me solucionaron el problema en menos de 24 horas y la tardanza fué, casi seguro, por la diferencia de horario: ellos están en San Francisco y yo en España, así que mi correo de esta mañana llegó sobre sus 12 de la noche.

Es de agradecer la atención, sobre todo en estos tiempos en que las empresas grandes te ponen teleoperadores muy amables que toman nota de todo y no solucionan nada.

02 mayo 2006

Foro de Java y JSP

Habitualmente me solía meter en el foro de lawebdelprogramador y en el foro de programación, pero sobre todo este último, cada vez me gustan menos. Se ve que son foros antiguos y no permiten poner enlaces, caretos ni demás. El de programación, además, llevaba una temporada con muchos fallos, ponen un texto de confirmación al introducir un post que muchas veces ni siquiera se ve entero y parece que la moderación es nula. En concreto, en el de C/C++ del mismo sitio hay más "socorros" que dudas serias.

He descubierto hace un par de días un foro de java y jsp que me gusta bastante. Tiene la suficiente actividad como para resultar entretenido y parece que los moderadores están en ello. No veo mensajes del tipo "socorro, que alguien me haga los deberes, urgente", así que supongo que los borran.

Estaré por allí una temporada, aunque no abandonaré los otros dos del todo.

01 mayo 2006

Estadísticas de Abril con Adsense

Cuando me planteé meter anuncios de google adsense en mi página web, la primera pregunta era obvia. ¿Cuanto puedo sacar? ¿Merece la pena?

Google no aclara nada en su ayuda. Más o menos viene a decir "Como es gratis, lo mejor que puedes hacer para saber cuánto vas a ganar es darte de alta y comprobarlo".

Por ello, pongo aquí mis estadísticas del mes de Abril, por si a alguien puede servirle como idea de cuánto se puede ganar.

En el mes de Abril se han mostrado 61294 aununcios en mis páginas, se han hecho 607 clicks en ellos y me pagan 73.27$.

Esto quiere decir que se hace click en un anuncio en un 0.99% de los casos (cada 100 muestras de anuncio, un click). Pagan de media a unos 12 centavos por click.

Resumiendo para el cálculo rápido, por cada 1000 páginas vistas (muestra de anuncios) se gana unos 1.20$.

Esto puede variar teniendo en cuenta varias cosas:
  • Si consigues poner los anuncios mejor que yo, igual consigues más click por cada 1000 visitas, ganando más. Si los pones peor, te saldrá una estadística peor.
  • El coste por click depende mucho de la empresa que se anuncia. Este que pongo aquí, 12 centavos por click es para el tipo de empresas que se anuncian en una página de programación en C y java. Si tu página habla de alcachofas posiblemente te paguen menos por click y si habla de pisos, te pagarán más.
En cuanto al cuadro de búsqueda en google, ese apenas merece la pena. En este mes de Abril con ese número de visitas, se han hecho 572 consultas, se hecho click en alguno de los anuncios resultantes de la consulta en 9 ocasiones y me pagan por ello 50 centavos en total.

Cambio de jefe

En la empresa que trabajo, hace poco nos han cambiado de jefe de departamento. Como la cosa no estaba bien organizada y los proyectos, sobre todo uno, iba bastante mal, este nuevo jefe tiene intención de reorganizar la cosa de otra manera.

El Viernes me llamó para comunicarme la subida de sueldo de este año y de paso, contarme lo que tiene pensado para mí.

Me va a poner, junto con otro, como "expertos" de java del departamento. Se supone que nos va a dejar un poco aparte de los proyectos y nos va a dar las siguientes responsabilidades:
  • Formar en java a la gente nueva que entre.
  • Hacernos lo más expertos posible en java y herramientas asociadas, metiéndonos en internet, en foros, etc y estar los más al día posible. De esta forma se supone que podremos aconsejar a la gente de proyectos qué herramientas tienen disponibles y cuales usar.
  • Realizar librerías en java que puedan reutilizar la gente de los proyectos. Por ejemplo, algo similar a la librería gráfica que me hice para la página web.
  • De "apaga-fuegos". Cuando en algún proyecto surga algún problema técnico especialmente liado (sockets que no van, etc), nos tocará echar una mano.
De alguna forma, como a mí lo de los proyectos no es algo que me guste demasiado, más que nada por el tema de documentación y de trato con el cliente, para mi este puesto en principio me gusta más. Además, estas tareas ya casi son las que oficialmente desempeño, puesto que todo eso me gusta mucho y me dedico a ello.

A ver en qué queda todo...

29 abril 2006

Meter Adsense en MediaWiki

Después de instalar el ChuWiki, me apetecía meterle el contador de estadísticas y los anuncios de google adsense.

Mirando por internet, vi que el fichero que hay que tocar está en el directorio skins, y si no hemos cambiado el skin por defecto, es el fichero MonoBook.php el que hay que tocar

Ahí hay mezclado php con código html. Es cuestión de tener cuidado y no pegar el código de adsense o del contador entre medias del código php. Hay que buscar la parte de html.

En concreto, para añadir el código donde lo he hecho, busqué donde pone


<h1 class="firstHeading"><?php $this->text('title') ?></h1>

que es el título principal del artículo que se está viendo y puse mi código adsense justo detras. Así sale entre el título y el artículo, donde más fastidia.

Para el contador, busqué el </body> del final, y lo añadí justo antes.

Si no te gustan esas posiciones, es cuestión de ir probando hasta que des con el sitio adecuado.

28 abril 2006

ChuWiki

Como estoy emocionado con esto del MediaWiki, la WikiPedia y veo que hay más sitios que tienen este tipo de cosas, acabo de abrir una ChuWiki, para poner muchos tutoriales de muchos lenguajes de programación, a ver si entre todos conseguimos rellanarla y conseguir algo aceptable.

Ya sabes, estás invitado a vistarla y parcipar en ella, aportando tus conocimientos. Yo, de momento, he puesto una "declaración de intenciones" y un "Hola mundo" en C para linux y en Java.

Por cierto, el "cpanel" que es el panel que ofrece hostito para manejar tu página web, una maravilla. Para instalar el MediaWiki, símplemente subí el zip, que era un mediawiki.tar.gz. Desde el mismo cpanel pude descomprimirlo, así me evité tener que desempaquetarlo en mi pc y luego subir un porrón de ficheros.

El Hola Mundo en varios lenguajes

En http://www.holamundo.es/ está el "Hola Mundo" en varios lenguajes de programación.

Son particularmente crípticos BrainFuck, Unlambda y sobre todo WhiteSpace, en el que el código se escribe a base de espacios y tabuladores. ¡¡Debe ser horrible tener que depurar un programa!!

27 abril 2006

La WikiPedia

Después de andar jugando con mi instalación de mediaWiki, volví a instalar la tikiWiki en mi página de programación. Definitivamente, me gusta más la primera.

Había oido hablar de la WikiPedia, una enciclopedia "libre" en el que todo el mundo puede escribir artículos, corregir los ya existentes, añadir cosas, etc. He visto que el formato que usa es claramente el de mediaWiki.

Animado porque con mis pruebas ya sabía editar, busqué en la wikiPedia un artículo que contuviera alguna palabra mal escrita y creo que fue en el del Doctor Muerte (un personaje de comic), encontré "caln" en vez de "clan". Lo edité, lo corregí y ¡milagro!, funcionó. No hace falta registrarse, no queda archivado el cambio hasta que alguien lo supervise. Directamente tocas y se cambia.

Todo esto me ha dejado realmente asombrado. La wikiPedia es una enciclopedia muy conocida, con montones de visitas diarias. Según he visto en la misma página, tienen cientos de modificaciones y añadidos a la hora. Aunque sí hay supervisión, hay una serie de tios revisando constantemente los cambios que se hacen para evitar lo que llaman "vandalismo" y deshacerlos, los cambios que tú hagas con inmediatos.

No deja de asombrarme que eso funcione, entre tantos miles de visitantes, quizá el 99% es gente responsable y bienintencionada que colabora con ánimo de ayudar. Sin embargo, en este mundo en que hay tantos que hacen virus realmente destructivos, en el que la publicidad mueve millones, etc, es realmente curioso que haya poca gente que en la wikiPedia no se dedique simplemente a estropear las cosas con mala intención, a poner publicidad de sus productos, etc.

De hecho, sí hay gente que lo hace. Si miramos los comentario de lo que ellos llaman café, donde la gente y los responsables de la wikiPedia comentan cosas, y si miramos los historiales de modificaciones de los artículos, vemos que sí se añade publicidad y que de vez en cuando alguien estropea completamente un artículo. En el historial, en concreto, puede verse el artículo justo antes de que lo estropeen, el estropeado y justo después, cuando alguien lo arregla.

Sin embargo, funciona. Impresionante.

Ya metidos más en programación, existe también wikiLibros, en el que la gente libremente y sin registrarse puede ir escribiendo algunos apartados, capítulos o párrafos o lo que sea de libros en línea gratuitos. Por ejemplo, hay un libro-tutorial de java a medio hacer. En él me animé a escribir uno de los capítulos que me pareció simple, y nuevamente sin necesidad de registrarse se hizo el cambio inmediatamente.

Esta página de wikiLibros es interesante para encontrar tutoriales, que podemos mejorar en un momento dado si nos interesa.

26 abril 2006

Poner una wiki en tu página web

He estado probando a instalar una wiki en la página web.

Tanto en mi página de internet como en el servidor del trabajo intenté instalar la phpWiki de sourceforge, pero no la conseguí hacer funcionar, así que desistí. Posiblemente soy un poco torpe.

Luego, desde hostito, instalé la tikiwiki, jugué un poco con ella y la desinstalé, no por nada especial, simplemente porque de momento no me interesabe tenerla. En el trabajo intenté instalarla también, pero no pude acceder a su página, buscando tikiwiki en google.

En el trabajo me bajé mediawiki, y esta sí que funcionó a la perfección. Desempaquete el zip en el sitio adecuado y entré desde el navegador. Me llevó a una página de configuración sencilla y todo correcto.

Lo que más me ha llamado la atención es la forma de crear nuevos artículos en un chisme de estos. No hay botón de "crear" por ningún lado. Lo que hay que hacer es editar cualquiera de los artículos existentes y poner un enlace al nuevo artículo que queremos crear. Le damos a previsualizar el artículo que hemos editado (no hace falta salvarlo) y pinchamos en el link que acabamos de crear. Nos sale algo parecido a "este artículo no existe" y la cajita del editor para emperzar e escribirlo. Curioso.

Tutorial de java

Últimamente ando metiendo una especie tutorial de java en mi página de java, pero no sé en qué quedará la cosa.

Soy consciente de que un tutorial serio de java, en el que se empiece desde cero hasta lo más avanzado, explicándolo todo, es mucho trabajo. Demasiado para que esté seguro de poder empezarlo y acabarlo en un tiempo razonable.

Así que estoy intentando orientarlo como siempre, un conjunto de tutoriales pequeños que tienen sentido sueltos. Además, tampoco me pongo a explicar cosas como qué tipos de datos primitivos admite java, los bucles, etc, etc. Estas cosas vienen en miles de tutoriales y libros mucho mejores que lo que yo pueda hacer. En cada tutorial pretendo hacer hincapié en algún aspecto de java que veo en los foros que la gente en general no tiene claro. También en aquellos aspectos en los que yo metí la pata en su momento, me costó más entender o simplemente me llamaron la atención.

Ya tengo tres nuevos de esos tutoriales, que empiezan y terminan con uno ya hecho, es decir, cinco en total. Puedes verlos en mi página de java.

También, no sé como, mi intención era que fuese un tutorial "interactivo", por llamarlo de alguna forma, de forma que la gente que vaya leyendo, pueda decirme cosas que no estén claras, posibles amplicaciones de cada tutorial e incluso orientarme sobre qué tema tratar después. Una vez dados los primeros pasos con java, hay muchos posibles caminos por los que seguir. Podemos pasarnos al tema de ventanas e interfaces gráficos de usuario, a bases de datos, a comunicaciones en red, hilos, etc, etc, etc. Cuando tenga algunos tutoriales más, los separaré en una página aparte de la principal y pondré mi dirección y demás invitando a la gente a hacer sugerencias.

21 abril 2006

Eclipse y refactoring

Hace poco leí el libro de "refactoring" de Martin Fowler. Aunque ya conocía el tema, me pareció buen libro y bastante interesante. Los primeros capítulos hablan de qué es el refactoring, por qué es bueno hacerlo, cuando hay que hacerlo, etc, etc. Son los capítulos interesantes.

El resto del libro es como un libro de recetas. Cada arreglo que queremos poder hacer en el código, por ejemplo, partir un método largo en varios pequeños, está contemplado y te cuenta en un par de páginas cual es la mejor forma de realizarlo.

Esto me animó a escribir un mini-tutorial contando qué es el refactoring y qué ventajas tiene y, sobre todo, me animó a probarlo con eclipse.

Eclipse tiene muchas opciones de refactoring. En el código del trabajo encontre dos clases similares con un método común muy grande, así que decidí hacer una clase padre, llevarme ese método a la clase padre y luego partirlo en cachos.

Una vez creada la clase padre y puesto los extends en los hijos, seleccione en uno de ellos el nombre del método largo. Di al botón derecho del ratón para sacar el menú, "refactoring", "pull-up". Eclipse detectó que había otro hijo con un método del mismo nombre y me preguntó si quería borrar ese método de ahí. Conteste que sí y ¡voila!, eclipse hizo todo el trabajo. Desapareció el método de las clases hijas y apareció en la clase padre.

Luego empecé a partir el método en partes más pequeñas. Seleccioné un trozo de código de ese método que tenía sentido como método separado, botón derecho del ratón, "refactor", "extract method" y listo, eclipse lo hace sólo. Pregunta el nombre del método, pone automáticamente los parámetros necesarios, reemplaza el código por la llamada y todo funciona correctamente.

En cuatro click de ratón tenía el método grande partido en cuatro métodos pequeños.

Pude comprobar que uno de los parámetros del método grande no se usaba, así que a rehacer código de nuevo. Seleccioné el nombre del método, botón derecho de ratón, "refactor", "change method signature" y me sale una ventana con todas las cosas del método (tipo devuelto, nombre y parámetros). Selecciono el parámetro inútil, le doy borrar y ya está. Eclipse se encarga de corregir el código y de corregir en todas las llamadas a ese método para quitar el parámetro sobrante.

En fin, una pequeña maravilla de la herramienta que permite arreglar el código en dos patadas y con seguridad.

20 abril 2006

El libro del posicionamiento de los buscadores

Me han pasado un pequeño pdf

el_libro_del_posicionamiento_en_buscadores.pdf (application/pdf Objeto)

en el que se habla sobre cómo los buscadore, especialmente google y altavista, revisan las páginas para decidir en qué posición colocarlas.

Es bastante interesante y sencillo de leer (podemos saltarnos un pequeño apartado que tiene fórmulas para decir cómo se calcula el pagerank de google). Ahora comprendo, por ejemplo, como al buscar "maskformatter" en google, páginas en español, mi página aparece la primera, a pesar de tener un pagerank de cero.

El truco parece ser básicamente en construir páginas sencillas html, con contenido, a ser posible sin tablas (o las mínimias imprescindibles), repetir mucho la palabra, sobre todo al principio del texto y a ser posible ponerla en negrita o con fuente más grande que las demás (por ejemplo, en los subtítulos de la página).

Yo, que no soy amigo de flash ni de java script y soy demasiado vago para hacer tablas o meterme en php, ya entiendo por qué mis páginas salen bastante arriba en determinadas búsquedas.

google adsense y hacienda

Al meter los anuncios de google en mi página de programación, decidí mirar por internet cómo se declaran estos ingresos en hacienda.

Tras urgar por internet, se me ha caido el alma al suelo. Por algo tan tonto como poner anuncios en una página, hay que hacer de todo.

Antes de que sigas leyendo, ten en cuenta que no soy ningún especialista en el tema. Simplemente he investigado por internet y pongo aquí mis conclusiones. Si este tema te afecta, comprueba con alguien que realmente sepa todo esto.

En primer lugar, si cobramos por poner anuncios en nuestra página web, nuestra página web se convierte en una página personal con actividad económica y está sujeta a la LSSI (Ley de Servicios Sociedad de la Información) y debe cumplir lo que se estipula allí.

Básicamente consiste en identificarse en algún sitio de la página (con nombre, apellidos, dirección, nif y dirección de correo) además de cumplir alguna otra cosa, como poner los anuncios perfectamente distiguibles del contenido de la página.

Es curioso, pero la página ya se convierte en un negocio, así que no se pueden copiar contenidos de otras páginas que estén bajo licencia del estilo "sólo usos personales, NO usos comerciales".

Por otra parte, en el tema de hacienda, el resumen es el siguiente:
  • Hay que darse de alta obligatoriamente en el IAE (Impuesto de Actividades Económicas). Es simplemente un papeleo que hay que hacer en hacienda. Si nuestros ingresos no superan una cantidad determinada, deberemos hacer nuestra declaración de actividades económicas cada tres mese, pero no pagaremos nada.
  • Si nuestros ingresos anuales superan una cantidad de alrededor de 6000 euros, hay que darse de alta ademá en el RETA (Régimen espacial de trabajadores autónomos). Si superamos esa cantidad y nos damos de alta, ya sí tenemos que pagar una cantidad todos los meses de cotización a la seguridad social. Ojo, si estás de alta en el RETA y además eres trabajador por cuenta ajena, creo que no tienes derecho al paro, ya que sigues realizando un trabajo, como autónomo, aunque no te dé un duro.
  • Si se factura IVA, también hay que darse de alta en lo del IVA. Por ahí se comenta que al ser google una empresa americana, no se le factura IVA y no hace falta, pero no he visto ningún sitio que lo ponga en serio.
Tienes todo esto un poco más explicado por un asesor fiscal en este foro.

Luego hay otro tema curioso. Si nuestra página web tiene un registro de usuarios con su base de datos correspondiente .... nos liamos con la ley de protección de datos y demás y todo es más liado aún.

Parece demasiado para una vulgar página personal (o incluso un blog) en los que simplemente pones anuncios y ganas 5000 pelas al mes.

Un caso claro más en los que la realidad y la técnica van diez pasos por delante de la ley...

19 abril 2006

Desuscribirse sobre la marcha

Hace poco me he encontrado con un pequeño problema, que es el siguiente.

Tengo una clase que hereda de JTable. Esta clase en cierta ocasión debe mostrar un JDialog. Para que toda vaya bien, necesito que el padre de ese JDialog sea la ventana en la que está mi JTable. Como estoy dentro de la clase JTable, no tengo garantía ninguna de que mi clase JTable esté todavía dentro de ninguna ventana, así que no hay un sitio claro donde crear este JDialog hijo.

La solución que se me había ocurrido consiste en hacer un HierarchyListener y suscribirlo a mi clase JTable. De esta forma, cuando metan el JTable dentro de algún componente, compruebo si ya tengo ventana (con SwingUtilities.getWindowAncestor(miJTable)). Si ya tengo ventana, creo el JDialog pasándole el padre.

Como el JDialog sólo quiero crearlo una vez, lo que hago inmediatamente después de crearlo es desuscribir el HierarchyListener. Ahí me saltó el problema.

En las primeras pruebas que hice, todo correcto. Sin embargo, al meter mi clase JTable en una aplicación con interfaces de usuario más complejas, me saltaba una excepción en el momento de meter el JTable dentro de un JPanel. Además, la excepción no era en mi código, sino en las clases internas de java. La primera línea de código mia implicada en la excepción era simplemente meter el JTable en un JPanel, con todo correcto.

El problema es que java está avisando a los HierarchyListener de mi JTable. Primero mira cuantos hay, se lo guarda en una variable y luego se mete en un bucle para ir avisándolos. Como en ese mismo aviso yo me desuscribía, su lista de HierarchyListener decrecía en un elemento. El bucle, al llegar al último índice, daba una excepción al tratar de recuperar el último elemento de la lista que ahora es de un elemento menos (el número de elementos de la lista estaba previamente guardado en una variable).

La solución que he puesto es desuscribirme con un SwingUtilities.invokeLater(). De esta forma la desuscripción se realiza más adelante, cuando se pueda, y el bucle de aviso a los suscriptores termina de forma normal.

Resumiendo, un listener de cualquier cosa no puede desuscribirse alegremente de un sitio en el mismo método de aviso. En mi caso, no puedo desuscribir mi HierarchyListener en el método hierarchyChanged(). Según como esté implmentado el recorrer la lista de suscriptores/listeners para avisarles, esto puede provocar una excepción.

Acentos y Firefox

Desde que me bajé la última versión de FireFox (la 1.5.0.2) empecé a tener problemas en ciertas páginas con los acentos. En vez de la letra acentuada, me salía un rombo con un interrogante. Además era en unas páginas sí y en otras no, e incluso dentro de la misma página, en unos sitios sí y en otros no.

Investigando, descubrí que los que salían mal eran los que en código html estaban puestos directamente como letra con acento. Los que salían bien eran los que seguían las convenciones de html, es decir "& <vocal> acute ;"

Al final, con windows 2000, conseguí tocar en un sitio y ya sale todo bien. El sitio es

"inicio", "configuración", "panel de control", "configuración regional", "avanzada" y marcando el check de "20284 ibm ebcdic - latin america/spain" que no lo tenía marcado. Por supuesto, para que los cambios tuvieran efecto en windows, tuve que reiniciar el ordenador. Ahora, aparentemente, todo va bien, en FireFox salen bien todos los acentos, independientemente de cómo estén en el código html.

Actualización de librería gráfica

Después de un montón de tiempo, acabo de actualizar mi pequeña librería gráfica en java.

Como cambios importantes, he modificado el Canvas de dibujo con un JLayeredPane. Esto me permite tener dos (o más) capas de dibujo. Una para un dibujo de fondo y otra para dibujar encima cosas como cursores que se mueven con el ratón. Con este cambio he conseguido un repintado mucho más efectivo al mover el cursor con el ratón.

También he añadido la posibilidad de hacer gráficos polares. Aunque ya se puede usar, está un poco a medias y tengo todavía que darle un repaso a este tema. Es posible que cambie bastantes cosas para una próxima versión.

Al Lienzo ahora se el puede cambiar fácilmente el color de fondo y se le puede poner un pequeño marco para dejar un márgen alrededor sin dibujo.

Hay unos cuantos objetos gráficos más, pero destaca el GraficoSimbolos, que permite dibujar imágenes en el gráfico, dando su posición y una etiqueta.

A ver para cuándo la próxima actualización...

18 abril 2006

El arte de programar

Cuando empecé con el sinclair zx81 a programar en mi casa, mi principal objetivo era aprender el lenguaje de programación, el basic, que me ofrecía dicho ordenador.

Mientras seguía programando por afición, simplemente hacía código. Quería un programa que hiciera algo, normalmente un juego, lo programaba lo más rápido que podía y lo depuraba hasta que funcionaba. La elegancia del código, su reusabilidad o cualquier otra consideración de este tipo era algo que ni siquiera sabía que existía. Usaba los "goto" y las variables globales sin ningún tipo de remoridimiento<, sin saber que eso era "pecado".

Al empezar a trabajar como programador, el objetivo inicial era el mismo. El jefe me mandaba algún programa para hacer, esta vez no era un juego, y lo hacía lo más rápido posible hasta que funcionaba. Por aquello de cumplir con cierto formalismo, usaba menos las variables globales, no usaba el goto y procuraba comentar algo el código. Era cosas que había oido que eran buenas, aunque no sabía muy bien por qué.

Con el paso de los años, trabajando de programador, empezaba a hervirme la sangre al ver que tenía que repetir el mismo código o muy parecido una y otra vez. Al ver que mis compañeros repetían código que yo ya había hecho y que no les servía porque no estaba suficientemente aislado. Al ver que los compañeros tenían código que yo necesitaba pero no podía utilizar por los mismos motivos.

Todo esto me llevó a plantearme hacer el código de forma distinta. Cada vez que veía que algún trozo de código se repetía una y otra vez, trataba de buscar la forma de que ese código fuera único, de hacerlo una única vez para que sirviera en cualqueir sitio. En este tiempo fue cuando llegué a darme cuenta de lo que realmente era y da las infinitas posibilidades que ofrecía la programación orientada a objetos. Una cosa era hacer clases y heredar de vez en cuando como hacía antes y otra la nueva forma de hacer código que estaba descubriendo.

Al descubrir todo esto, emepecé a investigar por internet las formas de hacer ese código reutilizable, de cómo usar la orientación a objetos. Tropecé entonces con todo el tema de patrones de diseño.

Me llamó muchísimo la atención que después de varios años programando en el trabajo, estaba llegando muy despacio, sin saberlo, a una versión primitiva de los patrones de diseño. Muchas de las soluciones que iba encontrando con mucho esfuerzo, a base de ensayo y error, eran los patrones de diseño. Me estaba costando varios años llegar a una versión primitiva de los patrones de diseño, a reinventar la rueda.

Actualmente, creo que programo con un poco más de conocimiento de causa. Cuando quiero hacer algo, no tengo que inventar cómo, conozco bastantes patrones y los aplico cuando lo creo necesario. Sin embargo, sigue sin gustarme totalmente el código que hago.

Asi que de alguna manera, cuando necesito tocar código ya hecho y que no me gusta, trato de arreglarlo. Es curioso, pero veo en internet que eso también está inventado. Lo llaman refactorización y es algo a lo que también llegas, si no lo lees antes, después de varios años de hacer código.

Después de quince años programando en el trabajo ocho horas diarias (es un decir, algún que otro día estoy vaguete y hago otras cosas), todavía descubro cosas, veo que no sé programar lo suficientemente bien. No quiero decir que mis programas no funcionen, eso ya está superado hace tiempo, simplemente quiero decir que cuando más adelante necesito ese código para otra cosa, nunca está cien por cien disponible, siempre hay que tocarlo algo. También veo, en internet, que los grandes gurús de la programación comentan que tienen el mismo problema, aunque programan cien veces mejor que yo. No hacen bien el código a la primera y por eso cada vez desisten más de hacer el diseño óptimo a la primera y necesitan cosas como la refactorización. El código, por mucho que se piense y bien que se haga, siempre necesita ser retocado para reutilzarlo. Con esto quiero decir que un programador, por muy experimentado que sea, siempre encuentra formas de mejorar y nunca hace el código óptimo a la primera.

Sin embargo, existe una diferencia abismal en la rapidez y calidad del código generado por un programador exerto con varios años de experiencia y que se preocupa por todas estas cosas con respecto al programador novato. Un programador experto con su propia librería de componentes reutilizables puede hacer un proyecto en un tiempo muy inferior al de un programador novato que reutilice el proyecto anterior. Además, el código reutilizado por el experto da muchos menos problemas y está muy depurado.

Todo esto me lleva a sentir pena por las empresas actuales de software. Puede que haya excepciones, pero actualmente la programación es una cosa que las empresas no aprecian. Suponene que bastan unos meses de práctica para saber programar perfectamente. Se han quedado en que un buen programador es el que hace un programa que funciona en un tiempo razonable, es decir, lo acaba un par de meses después de que se acabe el plazo de entrega. ¡Sólo dos meses de retraso! ¡Qué maravilla!.

Es normal que las empresas de software contraten a un universitario o fp recién salido, que puede ser más o menos hábil en programar y le pongan a hacer un programa. Por supuesto, nadie le cuenta que existen los patrones de diseño ni la refactorización ni le dicen, por supuesto, que dentro de un año tiene que hacer otro programa muy similar, pero distinto y tenddrá que retocar su código si no lo hace bien ahora. Esta persona, cuando lleva un tiempo, la echan o se va porque está subcontratada o le dan algún cargo de responsabilidad y le hacen jefe de algo. El caso es que deja de programar en esa empresa. Es normal que ninguna persona se tire varios años programando (yo soy una excepción, porque soy especialmente asocial y no me "ascenderán" ni a tiros).

El resultado es que el software de muchas empresas puede más o menos funcionar correctamente, pero no es todo lo reutilizable, ampliable y modificable que debiera. Un nuevo desarrollo de software por parte de esa empresa, requiere casi recodificar todo desde cero o copiar, pegar y modificar el proyecto anterior, gastando mucho tiempo en depuración. Además, es normal que esta tarea de copia, pega y modifica la haga un nuevo contratado que sustituye al que hizo el código original. En fin, que el código de muchas empresas siempre está hecho por gente "novata" y retocado por gente "novata".

Si hubiera programadores experimentados, que realmente les gusta hacer el código reutilizable y bien hecho y se les diera tiempo para ello y otro montón de cosas "imposibles", los proyectos de las empresas, una vez saltado el bache de empezar, saldrían mucho más rápido y con mucha más calidad. Se utilizaría tal cual mucho código hecho y depurado en proyectos anteriores, sin necesidad si quiera de recompilarlo. La empresa, en unos años, tendría sus propias librerías específicas para el tipo de proyectos que hace.

En fin, una pena.

11 abril 2006

Comentarios en el código

Ya había odio algo, pero me ha llamado la atención leerlo.

En http://www.stickyminds.com/testandevaluation.asp?Function=edetail&ObjectType=ART&ObjectId=9041&tth=DYN&tt=siteemail&iDyn=3 dice que muchas veces sobra el comentario de nuestro código o, como mínimo, que si el código está bien hecho, debería sobrar.

La idea es que un código bien hecho debe ser autoexplicativo. Si el código es lo suficientemente autoexplicativo, el comentario es redundante y, por tanto, es algo que sobra. Además, necesita mantenimiento y que en algún momento puede decir lo contrario que el código. Por ejemplo, si modificamos el código y nos olvidamos de cambiar el comentario.

La idea, por ejemplo, es que si tenemos lo siguiente

// muestra una tabla con todos los usuarios
visualizaTabla()

deberíamos cambiar el nombre del método por este otro

// Comentario inútil: muestra una tabla con todos los usuarios
muestraTablaDeTodosLosUsuarios();

Así el comentario puesto es totalmente inútil y no es necesario.

Según se comenta en el artículo, es buena idea rehacer el código, haciendo que los nombres de los métodos se parezcan lo más posible a los comentarios que hemos puesto previamente, para de esta forma evitar poner comentarios y que el código se pueda leer fácilmente y entenderse mejor.

En el artículo sólo excusa poner comentarios cuando todo esto falla. Pone cuatro ejemplos concretos en los que sí se pueden poner comentarios:
  • Un comentario al principio de cada clase para explicar para qué sirve esa clase en el sistema
  • Explicar limitaciones del código o cosas que se presuponen al hacerlo. En general, cosas que en el código no están reflejadas.
  • Advertencias sobre el código, del estilo de que el código necesita mejorarse en tal punto o que no es lo suficientemente robusto, etc, etc.
  • Cuando se usen algoritmos conocidos, indicar dónde puede encontrarse dicho algoritmo, vaya, lo que se conoce como bibliografía. En qué libro o página de internet está explicado dicho algoritmo.
La verdad es que es curioso y va en contra de lo que todos conocemos como buenas costumbres de programación, pero no deja de tener su punto de razón. En algunas ocasiones me he visto poniendo por costumbre comentarios que básicamente son el nombre del método pero separando las palabras.

10 abril 2006

MAGIX Video DeLuxe 2006

He estado probando el programa MAGIX Video DeLuxe 2006.

Es un programita que sirve para grabar en DVD una sesión de diapositivas para ver en la tele, hacer tus propias películas de video, etc, etc.

Después de mis problemas con el nero, este programa me ha parecido una maravilla. En poco tiempo y sin leer manuales he conseguido hacer la sesión de diapositivas que quería. Le he ido añadiendo las fotos que he querido, sin que se me quedara colgado como el otro. Y los más importante, al final incluso ha grabado el DVD, yo creo que incluso más rápido que el Nero (si es que este último hubiera sido capaz de grabar algo).

Permite además hacer películas (que no he probado) y se puede grabar en varios formatos además de DVD: Video CD, Super Video CD, etc.

La interface me resulta un poco compliada, quizás por que no he leido el manual y tiene muchísimas opciones. De todas formas en un momento no sé qué toque, que se me cambio la forma de la presentación de ver sólo la pista de fotos a ver quince pistas distintas, vacías todas salvo la de fotos y la de sonido. Fui incapaz de quitarlas y dejarlo como lo tenía antes.

Eso sí, el programita vale 49 € comprándolo por internet.

08 abril 2006

WordPress

Por aquello de jugar un poco, he instaldo WordPress para ver qué pinta tiene. WordPress es un conjunto de páginas php que una vez instaladas en nuestro servidor, junto con mysql, permiten tener un blog. En ese blog, además de escribir, se pueden dar de alta usuarios y demás.

El programita no me acaba de convencer. Tiene una pega gorda. Cuando te das de alta de usuario, se inventa la clave automáticamente. En el caso del administrador al principio, te la da para que la guardes. En el caso de otros usuarios que se dan de alta ellos solos, se la envía por correo. Ahí está la pega gorda. En la instalación que yo he hecho, no me ha preguntado nada sobre el servidor de correo. Quizás haya que configurarlo en algún sitio que no he visto. El caso es que me ha creado el usuario de prueba y ha dado un fallo al enviarme la clave por correo. Resultado: Tengo un usuario con una clave que inventada que no sé.

Una cosa buena que tiene comparando con phpMyAdmin, es que al configurarlo no hay que andar como en el último, que hay que crear un directorio a mano, luego hay que copiar un fichero en un sitio, etc. En WordPress la parte de configuración ha sido inmediata.

Seguiré investigando un poco con él ya es es bastante conocido, pero de momento no sé si me convece.

06 abril 2006

Albums de fotos

Tenía desde hace mucho tiempo una pequeña página web con las fotos de mis hijas. Esta página está destinada a mis padres, mis suegros, familia y demás.

Al comprar el dominio y el hosting con hostito, vi la posibilidad de hacer un subdominio protegido de www.chuidiang.com. En este dominio podría poner esa página de fotos, de forma que sólo tiene acceso la familia.

Una vez hecho, decidí mirar los programas preinstalados que me da hostito para poner fotos. En concreto, ofrece tres: "4Images gallery", "Coppermine Photo Gallery" y "Gallery", ordenados del que menos espacio en disco ocupa al que más.

Instalé los dos primeros, pero no me convencieron. No es que los programas estuvieran mal, es simplemente que me parecieron demasiado complejos de usar para gente que no está acostumbrada a la informática: permite registrarse como usuario, poner comentarios, los links para ver las siguientes fotos están un poco escondidos (bastante abajo en la página y no visibles hasta que se da al scroll), etc.

Puesto que webshots permite poner álbums y verlos como pase de diapositivas, hice ahí mis experimentos. Permite hacer albums privados que sólo pueden ver las pesonas a las que invvitas. Sólo tiene una pega, la cuenta gratuita tiene limitado el número de fotos que se puede subir a algo así como 240 fotos.

Luego probé flickr, pero también tiene otra pega. Si invitas a alguien a ver las fotos (lo normal que haría con mi familia), no tiene más remedio que entrar con un usuario y password. Esto obliga a mi familia a darse de alta. Ya empezamos con procesos que dan pereza). Además, el proceso he visto que no es sencillo, porque se empeñan en asociar la cuenta con una de yahoo y al final no hay manera de evitar registrarse en dos sitios.

Finalmente tengo las fotos en yahoo photos. Es ilimitado y no hay necesidad de darse de alta para ver las fotos. Las fotos públicas están en http://es.pg.photos.yahoo.com/ph/javier_abellan/my_photos

05 abril 2006

Estadísticas Urchin de Google

No recuerdo cuánto tiempo hace, pero descubrí que google tenía unas estadísticas para páginas web, estilo las que comentaba en otro post.

Puesto que las cosass que hacen google de momento me inspira confianza y en general son buenas, decidí intentar darme de alta. Sorpresa, no se puede uno dar de alta si no tiene invitación. Me apunte a la lista de espera para que me enviaran la invitación cuando tuvieran a bien.

Esta mañana la recibí, así que me abrí la cuenta, me lie a pegar códigos de javascript en mis páginas y a ver las estadísticas.

Por un lado, tiene tres perfiles de estadísticas y podemos alternar entre ellos. Podemos ver las estadísticas como webmasters, en el que se nos da principalmente información sobre los navegadores, resoluciones, flash y demás de los visitantes. Es decir, la información necesaria para optimizar nuestra página para que se vea bien en los navegadores de la mayoría de los visitantes.

Podemos también ver las estadísticas como responsables de "marketing". Ahí vemos principalmente de dónde provienen las visitas, si tenemos anuncios de enlace a nuestra página lo efectivos que son, posición en los buscadores, de qué paises vienen las visitas, etc, etc.

Finalmente, podemos verlas como "jefes". Ahí simplemente vemos un vistazo general y cuanto dinero ha generado nuestra página en sus ventas.

Me ha llamado especialmente la atención que las estadísticas están muy pensadas para páginas de negocios, en las que se realizan ventas. Es posible decir la secuencia de páginas que debe seguir un cliente para comprar algo. Por ejemplo, empieza en la página del catálogo del productos para ir añadiéndolos al carrito de la compra, pasa a la página del carrito para ver lo que ha comprado y el total a pagar, luego a la página en que se le pide el número de tarjeta, etc, etc, hasta que le da al botón de "comprar y pagar". Bien, las estadísticas son capaces de alguna forma de decir cuánto obtenemos en la compra y de seguir toda la secuencia de páginas, de forma que si un posible comprador se echa atrás a mitad de camino, sabremos en qué página exactamente decidió dejarlo.

Como curiosidad, hay también un gráfico del mundo en el que se señala exactamente y de forma automática (con ciudad y todo) los visitantes.

En fin, he puesto el dichoso script en todas las páginas y a ver en un par de días que estadísticas salen y si me sirven para algo.

04 abril 2006

phpMyAdmin

Sólo por jugar me he instalado phpMyAdmin, un montón de páginas php que sirven para administrar una base de datos MySQL.

El tema ha ido bien y es bastante sencillo. Basta descargarse el zip correspondiente y desempaquetarlo en algún sitio de tu web. Con eso ya está casi todo.

Sólo queda configurarlo. Desde el navegador, al arrancar el index.php, se obtiene un error porque no está configurado y un link al script de configuración. Pinchando en ese script sale una pantalla con muchos botones. Sólo hay que pinchar en el de añadir un nuevo servidor de base de datos.

Se introducen los datos correspondientes y ahí es donde empecé a tener las pegas (si es que se pueden llamar pegas). Entre todos los botones hay escondido un botón de "salvar" lo que se acaba de hacer. Como está escondido entre otro montón de botones, pasa desapercibido. Tuve que meter la configuración varias veces, porque no veía el botón de "salvar", por lo que no era consciente de que hubiera que salvar nada. Al lado del "salvar" hay un "cargar" que también pasa desapercibido, para cargar otros ficheros de configuración.

Luego viene la siguiente pega. El fichero de configuración se guarda en un subdirectorio config que creo que hay que crear previamente a mano. Una vez salvado, te sale un texto diciendo más o menos:

"copia el fichero de configuracion del directorio config al directorio principal y borra luego el subdirectorio config con su contenido".

Bien, parece sencillo, pero no es nada claro. ¿Cual es el directorio principal?. Si mi sitio web empieza en un subdirectorio llamado web. Dentro de él cree un subdirectorio phpMyAdmin. Ahi desempaquete phpMyAdmin, que me creo a su vez un nuevo subdirectorio... Vaya, que tengo la siguiente estructura de directorios

web/phpMyAdmin/phpMyAdmin-2.8.0.2

¿Cual es el directorio principal?. Bueno, se me ocurren dos. Por un lado web (directorio principal de mi página) por otro phpMyAdmin-2.8.0.2 (directorio principal de phpMyAdmin). Pues ni el uno ni el otro, el fichero de configuración hay que ponerlo justo debajo de web, en paralelo con phpMyAdmin-2.8.0.2.

Así que venga a copiar y mover el dichoso fichero de sitio sin ningún resultado hasta que se me ocurrió ponerlo ahí.

Por lo demás todo estupendo y maravilloso.

30 marzo 2006

Extensiones de los JTable

El JTable de java es el que es y ofrece lo que ofrece, sin embargo, a veces se queda un poco pequeño o queremos alguna funcionalidad que no implementa.

Por ejemplo, suele ser habitual querer ordenar por columnas haciendo click con el ratón en la cabecera de la columna, o bien filtrar de forma que sólo se vean las filas que cumplen ciertas condiciones, pero sin necesidad de borrarlas. A veces también nos gustaría que la primera columna fuera un árbol, de forma que al contraer y expandir nodos, desaparecieran y aparecieran las filas completas de la tabla, junto con el nodo. Es lo que se conoce como TreeTable

En los tutoriales de sun tenemos clases de ejemplo que hacen todas estas cosas. También hay gente que ha hecho y publicado clases para hacer estas cosas. Una solución muy socorrida es bajarse estas clases de ejemplo de sun o de otra gente y usarlas:
  • Para ordenar, tenemos el ejemplo de TableSorter de sun
  • Para filtrar, tenemos un TableFilter que no es de sun. Esta gente también tiene un TableSorter, además de otro montón de cosas.
  • Para el TreeTable, tenemos el JTreeTable de sun.
Como esta necesidad es bastante habitual, hay gente que ha hecho liberías que nos ofrecen todas estas funcionalidades.

Por un lado tenemos las glazedlists, que son gratuitas. Por otro, tenemos otra que es de pago. Y estas son simplemente con las que me he tropezado sin buscarlas. Seguro que una busqueda más en serio ofrece muchos más resultados.

29 marzo 2006

Hacer código java desde ficheros de configuración

Hace tiempo que en el trabajo y poco a poco vamos desarrollando una "cosa" que sirve para realizar las aplicaciones con interface de usuario y base de datos de forma más rápida.

La idea básica consiste en unos ficheros de texto que sirven de configuración meter las sentencias SQL necesarias y la información necesaria para que desde código java se construyan automáticamente formularios y tablas para crear, editar y ver los datos de una base de datos.

Tenemos algo bastante conseguido y útil, aunque con sus cosas, puesto que es código que se desarrolla sobre la marcha y en paralelo con otros proyectos reales, de los que tienen cliente que paga.

Urgando por internet, hemos encontrado cosas curiosas.

Por un lado, ibatis, una cosa de la gente de apache en la que meten las sentencias SQL en un fichero xml y con él y de forma sencilla son capaces de realizar los select, insert, update y delete desde código java. Es muy similar a lo que nos hemos hecho nosotros, pero mucho más serio, configurable y demás. Lo nuestro no deja de ser una librería de andar por casa.

Lo que aporta la nuestra es que además construye los formularios swing y las tablas JTable de forma automática. Animado, me puse a buscar por internet cosas sobre la construcción automática de interfaces de usuario a partir de ficheros de configuración.

Hemos encontrado XMLFace, que construye interfaces de usuario a partir de ficheros XML.

También hemos encontrado SwiXAT, que construye interfaces de usuario a partir de ficheros XML, pero va más allá, porque lo hace siguiendo el patrón modelo-vista-controlador. Lo del controlador lo hace con algo llamando BeanShell.

Esta última, la BeanShell ya es algo que me ha parecido la leche. Es una especie de shell de comandos... que admite sentencias java, que va ejecutando sobre la marcha, según las vamos escribiendo.

Si es que ya no saben qué inventar ... y qué poco tiempo tenemos para mirar todo esto.

28 marzo 2006

Trabajo basura

En http://www.trabajobasura.com/inicio hay una página interesante en la que la gente deja opiniones sobre la empresa en la que trabajan.

Está bien para consultar cuando se está buscando trabajo saber dónde te estás metiendo.

27 marzo 2006

John Conway's Game of Life

John Conway's Game of Life

Una curiosidad. El famoso juego de la vida, en un applet de java.

Ayuda en un JDialog

Cuando queremos que un JDialog procese un evento de teclado, por ejemplo, la F1 para ayuda, tenemos un pequeño problema.

Cuando el JDialog tiene el foco, en realidad lo tiene uno de sus componentes hijos (un JTextField, JButton o el que sea). Si añadimos al JDialog un addKeyListener(), no nos sirve de nada. La tecla F1 la captura el componente interno y no se transmite hasta el JDialog.

Para poder hacerlo, hay que hacer algo tan complejo como esto


Codigo:

((JComponent)dialogo.getContentPane()).registerKeyboardAction(
unKeyListener,
"AYUDA",
KeyStroke.getKeyStroke(KeyEvent.VK_F1 , 0, false),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );


donde "AYUDA" es cualquier texto y el WHEN_ANCESTOR_OF_FOCUSED_COMPONENT sirve para que se transmita desde el JTextField hasta el JDialog.

25 marzo 2006

Más cosas sobre www.chuidiang.com

Bueno, llevo ya cuatro o cinco días liado con el nuevo dominio.

Hostito, los del alojamiento web, de momento muy bien. Me pusieron el sitio en marcha en menos de 12 horas y han tardado tres días en cobrar. Teóricamente son 7.95 dolares al mes, pero como el dolar está algo más bajo que el euro, me han cobrado sólo 6.65 euros. Supongo que este pago será además variable cada mes, dependiendo del cambio entre ambas monedas.

Los servicios de Hostito bien. Todavía no sé los del servicio técnico, porque no he tenido ningún problema hasta ahora. Me ofrecen más cosas que las que creo que vaya a instalar nunca. (scripts php y de otros tipos para crear automáticamente foros, chats, gestores de fotos y noticias, etc, etc, etc, etc, etc).

En cuanto al traslado de páginas, un poco rollo. Con el cuento del "sitio web distribuido", es un poco pesadito juntarlo todo nuevamente, cambiando los hipervínculos absolutos por otros nuevos. También es cierto que de paso, me he puesto a uniformizar un poco el sitio de todas las páginas.

Después de dos días, acabo de meter en el nuevo dominio todo lo de C/C++ en linux. Falta java, los diseños orientados a objetos y las zarandajas varias, como el problema de lo paracaidistas.

24 marzo 2006

Curiosidades de google adsense

Los anuncios de google adsense en una página en teoría miran el contenido de la página y muestran anuncios de productos relacionados con la página.

Curiosamente este diario está dedicado a programación, sobre todo en java. En cierta entrada un día puse algo así como "se puede abortar la compilación". Bueno, pues los espabilados de google pusieron anuncios sobre ginecología ;-)

23 marzo 2006

http://www.chuidiang.com

Después de darle muchas vueltas, de pensar si sí o si no, de andar mirando hostings y de mirar opiniones de hostings por foros, me acabo de coger un dominio chuidiang.com y un hosting.

El hosting al final lo he cogido con www.hostito.com. De momento muy bien. Me di de alta ayer sobre las 7 de la tarde y esta mañana, a las 5 de la madrugada, ya tenía mi dominio y mi hosting funcionando.

Ahora sólo me queda todo el "curro" de llevar mi "sitio distribuido" a su nueva ubicación.

22 marzo 2006

Estadísticas web

Hace tiempo, investigando por internet, encontré todo el tema de estadísticas web. Son sitios en los que te das de alta, gratuitamente, y te dan un código html con javascript para que pongas en tú página.

A partir de ese momento tienes una serie de estadísticas sobre las visitas a tú página. Visitas diarias, que navegador usan los visitantes, sistema operativo, que página tenían previamente en el navegador (google o qué otra) con lo que sabes de dónde vienene a tú página, etc, etc.

Primero me dí de alta en webstats. Estaba contento con ella. Aunque las estadísticas son muy limitadas, es sencilla de usar y presenta la información de una forma muy clara.

Más adelante y por probar, me dí de alta en onestat. Este da bastante más información que el anterior, pero me gusta menos su presentación, así que seguía consultando básicamente el de webstat.

Sin embargo, en el momento de meter los anuncios de google adsense, empezé a interesarme por cuales de mis páginas eran más visitadas, para poner ahí los anuncios. En este sentido la información de onestat era mucho más completa, da una lista diaria de las 10 páginas más visitadas ese día. Así que me pasé una temporada consultando más onestat y dejé abandonado webstat.

Ayer encontré otro nuevo sitio de estadísticas, addfreestats. Este da unas estadísticas todavía mejores que las de onestat. Lo principal que me hace cambiarme a él es que dice qué link en qué página pinchan los visitantes cuando dejan tu sitio. Esto te permite saber exactamente en qué link pincha, incluidos los anuncions de google. Con estas estadísticas se puede saber qué anuncios son más efectivos. Si colocamos los anuncios de distintos colores y en distintas posiciones en las páginas, sabiendo qué formato es más efectivo, podemos replicarlo en las demás.

Otra cosa que me llamó la atención de estas estadísticas es que para visitante te indica claramente cómo ha sido su visita: te dice que página estaba viendo antes de entrar en la tuya, con lo que sabes si entró por google, por otro buscador o por una página que enlace con la tuya. Luego te da todas las páginas tuyas que el visitante ha ido viendo, en orden y con hora, con lo que sabes si simplemente ha entrado o salido, si ha visto varias páginas, qué páginas ha visto e incluso si se ha entretenido en leerlas. Finalmente, te dice qué link de tus páginas ha pinchado para salirse fuera de tu sitio, incluidos los anuncios de google (google adsense).

En fin, que poco a poco iré cambiando los contadores en todas las páginas por este.

21 marzo 2006

Mis problemas con ObjectOutputStream

Me he puesto a jugar a escribir y leer ficheros con ObjectOutputStream y me he tropezado con un par de cosas curiosas.

Normalmente, para escribir objetos en un fichero podemos abrir un ObjectOutputStream asi

ObjectOutputStream oos = new ObjectOuputStream (new FileOutputStream("fichero.dat"));

Luego, símplemente vamos escribiendo nuestros objetos

oos.writeObject(unObjecto);

La primera pega que me he encontrado, es que no podemos reutilizar unObjeto (una única instancia de nuestra clase/dato) para escribirlo varias veces. Si hacemos

oss.writeObject(unObjeto);
unObjeto.setAtributo(nuevoValor);
oos.writeObject(unObjeto);

cuando vayamos a leer, leemos el primer objeto dos veces y ni rastro del segundo. Da la impresión de que ObjectOutputStream se guarda los bytes que va serializando, de forma que si mandamos escribir el mismo objeto por segunda vez, se ahorra la serializacion. Sin embargo, no revisa si los datos internos han cambiado.

Para evitar esto, podemos hacer un new por cada objeto que queramos meter

oss.writeObject (unObjeto);
unObjeto=new MiObjeto();
unObjeto.setAtributo(nuevoValor);
oos.writeObject(unObjeto);

o bien podemos usar el métod writeUnshared() en vez de writeObject(). De todas formas, he visto algunos problemas con writeUnshared() si no actualizamos todos los atributos de unObjeto antes de escribirlo por segunda vez. Los atributos que no actualizamos y mantenemos su antiguo valor, luego se escriben con el valor de la primera vez que hayamos metido unDato en el stream.

La otra pega que me he encontrado es que al hacer new ObjectOutputStream(...), esta clase escribe unos bytes de cabecera en el stream. Como new ObjectInputStream(...) lee esa cabecera correctamente, para nosotros es como si no existiera y no hay ningún problema.

El problema se presenta si abrimos el fichero por segunda vez para añadir más datos

ObjectOutputStream oos = new ObjectOuputStream (new FileOutputStream("fichero.dat",true));

Esto volverá a escribir una cabecera justo al final de lo que ya tenemos en el fichero, entre los datos de antes y los que vayamos a insetar ahora.

Cuando leamos con ObjectInputStream, la primera cabecera se lee bien, luego vamos leyendo datos y al llegar a la segunda cabecera obtenemos un error StreamCorruptedException y no podemos leer más datos.

La solución que he encontrado a esto consiste en hacernos nuestro propio ObjectOutputStream, heredando del de java y redefiniendo el método writeStreamHeader() para que no haga nada.

Todo esto está un poco más detallado en http://www.geocities.com/chuidiang2/ficheros/ObjetosFichero.html

18 marzo 2006

Sitio web distribuido

Por culpa de geocities, creo que acabo de inventar un nuevo concepto, el de "sitio web distribuido".

Como resulta que alcanzo con cierta frecuencia el límite de transferencia que me dan, para no pagar, he cogido y he abierto varias cuentas con gente que da sitio gratuito para páginas web. Ahora me estoy dedicando a llevarme las páginas que más éxito tienen (excepto la principal) a esas otras cuentas.

Hace un tiempo moví todo lo de java a http://www.geocities.com/chuidiang2. Hace unos días moví lo de diseño orientado a objetos y metodologías a http://chuidiang.iespana.es. Como sigo excediendo el límite (unas 60 veces en lo que va de mes), acabo de mover también el tutorial de sockets, uno de las páginas que más visitas tiene.

Al final creo que en el sitio original sólo quedará la página de portada....

Empezando con ant

Con el cuento del google adsense que he puesto en mis páginas, me ha empezado a preocupar más el tema de exceso de tráfico en geocities. Eso me ha hecho mirar lo de los dominios y hostings para ver si pago o no por ello.

Pero claro, como efecto secundario para conseguir más de google adsense y rentabilizar el posible pago de dominio/hosting, me ha vuelto a picar el gusanillo de actualizar la página web.

El resultado es que, además de meter los anuncios y mover cosas de sitio, acabo de meter un pequeño tutorial para empezar con ant. , una herramienta que ayuda a las tareas habituales de compilación en java, generar docuemtación, etc. A ver si me dura un poco la inquietud y hago algunos tutoriales o ejemplos más.

16 marzo 2006

http://web.iespana.es

He puesto una paginilla en iespana sobre diseño orientado a objetos y metodologías de desarrollo. De momento contiene poca cosa y es básicamente lo que ya tenía repartido por ahí.

De iespana me gusta mucho su mecanismo para subir y bajar ficheros. Es un applet de java en el que veo en un lado mi disco duro y en el otro, mi sitio web en iespana. Me basta con ir navegando en ambos hasta seleccionar los ficheros que quiero subir o bajar y pulsar en una de las flechitas. El mecanismo es bastante rápido y cómodo. Sin embargo, la pega es que el applet se comunica con el servidor por medio de ftp y por ejemplo, en el trabajo, el proxy no me permite conexiones ftp.

Lo que no me acaba de convencer es que al visitar la página, se pone arriba un frame de propaganda. Eso es normal y de hecho el frame es relativamente discreto y no estorba demasiado. Lo que no es normal es que al salir de la página e irse a otro sitio, el frame permanece. La gente de geocities tiene este tema mejor resuelto (al menos, de forma más agradable para el que navega). Cuando te sales del sitio de geocities, el frame de propaganda desaparece.


Total, que en todos mis links me toca poner los atributos para que el frame desaparezca. Es algo como esto

<a target="_top" href="http://www.geocities.com/chuidiang">C en linux</a>

He activado la base de datos mysql que proporcionan y lo de php y parece que más o menos va. Sin embargo sólo te dan posibilidad de una base de datos. Bueno, tendré que ir pensando en pasar los enlaces de lycos a esta base de datos.

13 marzo 2006

JTreeTable

Un componente curioso que he encontrado en sun es el JTreeTable.

Básicamente es una tabla en la que la primera columna es un árbol. Pinchando en los elementos de la primera columna, se puede expandir y contraer el árbol, haciendo que aparezca y desaparezcan filas enteras de la tabla.

He hecho algunas pruebas con él y va bastante bien, aunque si ya un JTable y un JTree por separado tienen sus trucos y complejidades, todo junto hace que necesitemos armarnos de paciencia.

12 marzo 2006

Cuatro líneas de código para hacer un navegador

Tuve la necesidad de ver ficheros html desde java. La opción típica consiste en arrancar el navegador por medio de la clase Runtime de java, pero se me ocurrió la posibilidad de ver cómo se podía hacer con componentes java. Estaba seguro de que java venía preparado para ello y que podría conseguirlo directamente o con muy poco código.

Efectivamente, aunque no entiendo del todo cómo, aquí están las cuatro líneas de código necesarias para hacerse un navegador.

En primer lugar tenemos la clase HTMLEditorKit, que aunque no sé qué hace, por el nombre imagino que es la clase que tiene todo lo necesario para interpretar los ficheros HTML. La instanciamos.

HTMLEditorKit kit = new HTMLEditorKit( );

Luego, en un JEditorPane, que es el que admite estas cosas, le decimos que su tipo de texto va a a ser HTML y le pasamos el editor kit este

JEditorPane editor = new JEditorPane();
editor.setEditorKitForContentType("text/html", kit );

Con esto ya lo tenemos todo preparado, salvo un pequeño detalle. Si al editor no le decimos nada, es editable, se puede modificar la página web. No es eso lo que quiero, así que lo hago no editable.

editor.setEditable( false );

Finalmente, basta con decirle qué página queremos que muestre

editor.setPage ("file:/unapagina.html");

Ya está, con esto se ve la página html, con sus fotos, frames y demás en nuestro editor.

Lo único que los hiperenlaces todavía no funcionan al hacer click en ellos. Debemos hacer un poco de código más.

Lo primero es decirle al HTMLEditorKit que se suscriba a los eventos de ratón sobre la página html, que los traduzca y nos los pase. Eso se hace con una simple línea de código

kit.install( editor );

Y ahora, tenemos que suscrbirnos nosotros a los eventos de ratón sobre los hiperenlaces para cambiar nosotros la página. Es importante el install() anterior, porque si no el editor no avisará a sus HyperlinkListener. El código es este

editor.addHyperlinkListener( listener );

donde listener es una instancia de una clase como la siguiente

HyperlinkListener listener = new HyperlinkListener( )
{
public void hyperlinkUpdate( HyperlinkEvent e )
{
try
{
// Se comprueba si se ha hecho click
if( e.getEventType( ) == HyperlinkEvent.EventType.ACTIVATED )
{
// se obtiene la url a la que apunta el hiperlink
if( e.getURL( ) != null )
{
// Se pasa la página al editor
editor.setPage( e.getURL( ) );
}
}
}
catch( Exception e2 )
{
e2.printStackTrace( );
}
}
};

Aquí hay que tener un poco de cuidado. Al suscribirnos, se nos avisará cada vez que el ratón haga cualquier cosas sobre el hiperenlace, incluso aunque simplemente pase sobre él, sin hacer click. Por ello la necesidad del primer if, para ver si el hiperenlace se ha ACTIVED, es decir, si se ha hecho click sobre él. Luego, la URL sobre la que se ha hecho click se obtiene fácilmente del evento.

Ya están las cuatro líneas mágicas que necesitamos para tener un mini-navegador en java.

10 marzo 2006

Métricas de java con ant

Me he bajado javancss, un programa que permite sacar métricas de nuestro código java (complejidad ciclomática y demás).

Lo bueno de este programa es que se integra con ant, de forma que cuando compilemos o bien como tarea adicional de ant, podemos pasar las métricas a nuestro programa.

javancss permite abortar la compilación si alguna métrica se sale del rango permitido, que por supuesto, fijamos nosotros. Por ejemplo, es posible hacer que la compilación falle si la complejidad ciclomática de un método pasa de 10.

Instalarlo es fácil. Sólo hay que bajarse el zip correspondiente y desempaquetarlo encima de donde tengamos instalado ant. Sobreescribe uno de los ficheros de ayuda, de forma que en esa ayuda aparezca un link a la ayuda de javaccns.

Una vez hecho esto, simplemente con poner algo como esto en nuestro fichero build.xml

<target name="metricas">
<taskdef name="javancss" classname="net.jernigan.javancss2ant.JavaNCSS">
<javancss srcdir="." abortOnFail="false" ccnperfuncmax="10" includes="**/*.java">
</target>


tenemos esto preparado para que nos dé un informe por pantalla de aquellos métodos que sobrepasan la complejidad ciclomática de 10. Es una pena, porque versiones antiguas de javancss tenían posibilidad de sacar el informe a un fichero.

09 marzo 2006

Más problemas con geocities

Nuevamente empiezo a tener problemas de tráfico excedido con mi página web.

Como sigue sin darme la gana de pagar para mantener la página, me he llevado las páginas de metodologías de programación (metodologia y programacion extrema) a una nueva página en http://chuidiang.iespana.es

De paso he metido ahí enlaces a lo poco que tengo sobre patrones de diseño.

Actualmente estoy leyendo un libro sobre "Refactoring" de "Martin Fowler", así que he preparado un "en obras" para poner ahí un articulillo-resumen de lo que lea y me parezca interesante en ese libro.

Intercambio de enlaces

Por aquello de incrementar las visitas en mi página, me he apuntado a http://www.intercambioenlaces.com

Dándote de alta te dan, como no, unos códigos html para que pongas en tus páginas. Con ellos en tu página aparecerán enlaces a otras páginas. Cada vez que tu página visualize un enlace a otra página, en otra página que esté dada de alta en el mismo mecanismo, se mostrará un enlace a la tuya.

Otro tema es que la gente haga clicks. Hasta ahora, desde mi página se han hecho unos 57 clicks a otras páginas, mientras que yo sólo he recibido 3. Supongo que es normal, la gente está más interesada en las "chicas argentinas", "descargarse mp3" o "caratulas de películas" que en "C/C++ sobre linux".

Google AdSense

Después de darle vueltas a si sí o a si no, más por indecisión que por otra cosa, acabo de poner en algunas de mis páginas los anuncios de google adsense.

Me dí de alta y tardaron un día en confirmarme el alta y habilitarme la cuenta. Una vez dentro de la cuenta y de facilitar ciertos datos, obtuve un código html para poner en mis páginas. Lo he puesto en algunas de ellas y salen anuncios de publicidad relacionados con el contenido de la página.

Teóricamente google paga por cada 1000 visualizaciones de anuncios o cada vez que alguien hace click en ellos. Llevo dos días de alta viendo los anuncios en mi página, así que todavía es pronto. Veremos en qué queda todo esto.

No sé cuánto pagan, pero si consigo al mes alrededor de 10 euros, quizás compre el dominio y un hosting, así, al menos, la página se automantiene.

05 marzo 2006

Más problemas con el nero

Estuve intentando hacer un pase de diapositivas en DVD con el nero. Al meter unas 70 fotos se me quedó colagado y tuve que matarlo. Un montón de tiempo, el de seleccionar las fotos, a la basura.

Vuelvo a intentarlo, esta vez salvando el proyecto de nero cada poco. Nuevamente, sobre las 70 fotos se me queda colgado. Después de matar nero y volver a abrirlo con el proyecto salvado, puedo seguir metiendo más fotos y terminar el proyecto.

Pero cuando llega el momento de grabar en el DVD, el nero echa su tiempo en generar los menús y pase de diapositivas ... y se cae, desaparece sin más, sin grabar nada (menos mal, al menos no me ha fastidiado el disco). Tras dos o tres intentos con el mismo resultado, lo doy por imposible.

Se me ocurre cambiar mi windows 2000 por un xp, llevaba tiempo pensando hacerlo y tras la decepción de las diapositivas con nero, me decido, no vaya a ser que al cambiar de sistema operativo vaya mejor la cosa.

Sin embargo, microsoft es microsoft, windows es windows y funciona todo como ya sabemos. XP me ofrece actualizar el sistema conservando todo mis programas y datos de w2000. Le digo que sí, se pone a ello y al final falla.

Vaya por Dios, ya no arranca el ordenador ni en "instalando xp", ni en "windows 2000". No queda más remedio que echar mano del disco de w2000 y reparar el sistema. Luego, nuevamente a reinstalar varias cosas que al restaurar el sistema se han fastidiado.

En fin, que me he pasado un "provechoso" fin de semana entrenido con el nero y el windows.

03 marzo 2006

Los doclet de javadoc

Investigando con javadoc, nuevamente java me deja asombrado con su versatilidad y posibilidades.

Resulta que javadoc recoge la información de los ficheros java que le pasamos y le pasa dicha información a una clase java llamada Doclet. El J2SE lleva un Doclet por defecto y esta clase es la que genera la documentación html que conocemos de javadoc.

Sin embargo, es posible cambiar esta clase Doclet por defecto por otra nuestra hecha a medida. Es tan sencillo como hacerse dicha clase y llamar a javadoc de esta manera

$ javadoc -doclet <miclasedoclet> -docletpaht <pathdemiclasedoclet> <fichero.java>

En http://www.doclet.com hay un montón de clases Doclet (unas gratuitas y otras no) que modifican javadoc para generar la documentación de otra forma. Unos se comportan como el Doclet standard de java, pero generan los diagramas de clases y los insertan en la documentación, otros generan la documentación en pdf, en rtf, etc, etc.

Y, ¿por qué debe generar un Doclet documentación?. El Doclet recibe la información de los ficheros java, pero no tiene por qué generar documentación. Hay Doclets que generan los esqueletos para test de JUnit de las clases que le pasemos, otros nos formatean el código dejándolo bonito, otros lo revisan para ver si cumplimos las convenciones de código y otros, pasándoles un bean de java, son capaces de generar los EJBs necesarios para J2EE.

Finalmente, podemos hacernos nuestros propios Doclet. Un Doclet que simplemente saca un listado de clases por pantalla es tan tonto como esto (copiado de http://java.sun.com/j2se/1.3/docs/tooldocs/javadoc/overview.html):

import com.sun.javadoc.*;

public class ListClass {
public static boolean start(RootDoc root) {
ClassDoc[] classes = root.classes();
for (int i = 0; i < classes.length; ++i) {
System.out.println(classes[i]);
}
return true;
}
}

En fin, una nueva pequeña maravilla de java que nos abre un montón de posibilidades....

02 marzo 2006

Me han copiado un tutorial

En http://lawebdelprogramador.iespana.es/index3_archivos/menu/programas/rmi.htm he visto una copia de mi tutorial de rmi.

Me habría gustado que al principio pusieran un textos similar a "Este tutorial se ha extraido de ..." y un link a mi página, pero al menos el "copiador" no se ha molestado en quitar los links a otras de mis páginas ni el nombre "chuidiang", que aparece en varios sitios del tutorial.

Al menos me ha servido para ver cómo es la propaganda que mete iespana en las páginas web de sus usuarios. Dan php y mysql gratuito y llevo tiempo dándole vueltas a si abro o no ahí una página, llevándome la que tengo de enlaces de lycos, que funciona bastante mal (es desesperante subir ficheros a esa página).

23 febrero 2006

updateUI

Creía tener controlado el tema de repintados en java. Cuando hacía algo con una ventana (modificar los datos, pintar gráficos, etc, etc) simplemente había que llamar al método repaint(). Este método nofifica a la máquina virtual que el componente necesita repintado. Más adelante, cuando la máquina virtual lo dispone y en un hilo separado, se llama al método paint(Graphics) del componente para que este se pinte.

Sin embargo, encontré un pequeño problema que me ha traido loco durante un buen rato. Resulta que si al hacer una ventana hago esto

ventana = new Ventana();
ventana.add (los botones);
ventana.setVisible(true);

todo va estupendo. Pero si altero el orden

ventana = new Ventana();
ventana.setVisible(true);
ventana.add (los botones);

no hay manera de que se pinten los botones. Por más cosas que he intentado (añadir repaint() al final), no hay manera de que pinten nuevos componentes sobre una ventana ya visible. Al redimensionar la ventana con el ratón, los componentes aparecen de golpe.

Finalmente, gracias a un compañero de trabajo, descubrí el método updateUI(). Este método sí dibuja realmente todos los componentes.

ventana = new Ventana();
ventana.setVisible(true);
ventana.add (los botones);
ventana.updateUI();