29 septiembre 2005

Picasa

Otro programita más de google basado en lo mismo, en buscar.

Nos descargamos este programa, lo instalamos, lo ejecutamos y se dedica a buscar todas las fotos y videos que tengamos en nuestro PC.

Por defecto nos muestra todos los directorios que tienen fotos ordenados por fecha, de más reciente a más antiguo.

En la parte del buscador ponemos palabras y según vamos escribieno, van desapareciendo todos los directorios y fotos que en su nombre no tienen eso que vamos escribiendo.

A cada directorio podemos ponerle un texto asociado, indicando, por ejemplo, qué cosas hay en las fotos, dónde están hechas, etc. El buscador luego tendrá también en cuenta estas palabras. Si tenemos la paciencia de poner estos textos a cada directorio con fotos, luego es muy sencillo encontrar las fotos de las vacaciones, de las bodas, etc.

26 septiembre 2005

Aver Media AverTV 203

Esta fin de semana he estado instalando la tarjeta Aver Media AverTV 203 para ver la tele en el ordenador. No cogí la AverTV Studio 203, porque la única diferencia es que esta última tiene para escuchar la radio y es algo más cara. No voy a escuchar la radio con el ordenador en la vida.

Mis problemas con la instalación.

La instalación resultó "sencilla". En primer lugar hay que instalar el driver desde windows. Esto es lo primero que desconcierta, porque normalmente esperamos que en el CD de la tarjeta venga un programa que lo instale todo solito. Pues no, el driver hay que instalarlo desde windows, diciéndole a windows que busque en el CD.

Luego se instala el programa. Todo funcionó correctamente.

Sin embargo, tuve un "pero". Cuando dejé de jugar con la tarjeta y me decidí a apagar el ordenador, se quedó colgado. Tuve que apagarlo de mala manera. Luego no volvió a encender. Cuando intentaba arrancar windows, salían rápidamente unos mensajes de error que no se podían ver, se quedaba la pantalla negra y el ordenador bloqueado.

Intenté arrancar en modo a prueba de fallos. Nada de nada. Al final reinstalé windows desde cero. Luego volví a intalar la tarjeta y esta vez, casi sin problemas.

Primero instalé la tarjeta gráfica. Luego la AverTV, que me da un aviso de que la tarjeta de sonido no está accesible (todavía no la había instalado). A pesar de todo se hacía la instalación, pero al arrancar el programa de televisión, daba un error y se cerraba.

Instalé la tarjeta de sonido y el programa averTV ya funcionó .. con la pantalla en negro. Tras darle vueltas descubrí que si no pones a windows en modo de muchísimos colores, simplente sale la tele negra y no se ve nada, aunque se oye.

Ya está, seguí instalando todo lo demás y todo bien.


Mi opinión sobre la tarjeta AverTV

Por lo demás, la tarjeta muy bien.

El driver WDM que comenté en el post anterior debe venir con windows, porque no me hizo falta instalarlo a posta y el programa de ver la tele es capaz de grabar directamente en mpeg-ii y formato dvd.

En la caja ponía que grababa también el divx si se disponía del codec ... y es cierto. Es más, por lo que he visto es capaz de grabar con cualquier codec que tengamos instalado. Dispone de los formatos mpeg-i, mpeg-ii, vcd, svcd y dvd. Luego además dispone de un formato avi manual, en el que elegimos el codec tanto para video como para sonido que queramos. Aquí es donde se puede elegir el divx.

En cuanto al programita tiene una cosa que me pareció curiosa (no sé si es útil), que consiste en que se puede poner la televisión como fondo de escritorio. Podemos trabajar mientras vemos nuestro canal favorito como fondo de escritorio. Digo que no sé si es útil porque yo normalmente hago grandes las ventanas con las que trabajo y casi nunca veo nada del fondo de escritorio.

Resumiendo

Salvo mis problemas de instalación que achaco más a windows que a la tarjeta de televisión, me gusta más esta tarjeta que la pinnacle pc tv pro.

22 septiembre 2005

WDM Video Capture Driver

En su día me dejaron una tarjeta Pinnacle PC TV Pro (o algo así) para ver la tele en el ordenador y poder grabar los programas.

Al intentar grabar en mpeg II, la opción siempre estaba deshabilitada. Mirando en la caja ponía que se podía grabar en mpeg II directamente, pero en esa indicación ponía un par de asteriscos. En la misma caja, buscando el significado de los asteriscos, ponía que la característica de poder grabar en mpeg II debía activarse por internet y pagando.

Ayer compré una AverMedia AverTV 203. Pone también lo de que graba en mpeg II con un par de asteriscos. Sin embargo, esta vez los dos asteriscos significan algo así como que sólo graba en mpeg II con el WDM Driver disponible para windows 2000, xp, ...

Miré en internet qué era el WDM driver ese y es simplemente un programa de la gente de sourceforge. Este programa únicamente es un driver que entiende determinadas tarjetas, basadas en los chip bt848, bt849, ... y que debe ser capaz de hacer la codificiación en mpeg II en tiempo real (con un micro lo suficientemente potente).

Esto me hace pensar que casi cualquier tarjeta basada en estos chips, incluida la Pinnacle que me dejaron, puede grabar en mpeg-II. Basta con instalar este driver y que el programa de captura que usemos dé la opción de grabar mpeg-II. Sé también que hay programas de captura gratuitos para este tipo de tarjetas, así que si el de la tarjeta no nos vale, podemos bajar uno de estos.

Este fin de semana instalaré la tarjeta AverMedia, el WMD driver y a ver qué pasa.

20 septiembre 2005

Look and Feel en java

Con java es muy fácil cambiar el aspecto (skin) de nuestras ventanas para que tengan aspecto java, aspecto windows, etc. Basta con tener la librería adecuada y una sola línea de código.

En javootoo.com hay un montón de look and feel (skins) para las ventanas distintos. En concreto me ha llamado la atención el Napkin Look & Feel, que hace que nuestras ventanas parezcan hechas a mano sobre una servilleta.

Basta con añadir el napkinlaf.jar correspondiente a nuestro proyecto y en el main añadir las líneas

try
{
UIManager.setLookAndFeel("napkin.NapkinLookAndFeel");
}
catch (Exception e)

{

e.printStackTrace();
}


El resultado, al arrancar nuestro programa java, puede ser como el de la imagen.






De todas formas, está en versión beta y aunque con un programa sencillo me ha funcionado bastante bien, he tenido problemas con los JDesktopPane y los JInternalFrame. Parece que no se refrescan bien o lo suficientemente rápido.

Los punteros de java

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

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

Por ejemplo, en C++ hacemos esto

MiClase a;

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

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

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

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

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

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

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

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

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

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

o bien, incluso usar referencias de verdad

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

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

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

19 septiembre 2005

Memorias de un aprendiz de PHP

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

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

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

17 septiembre 2005

Uso rápido del JTable

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

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

La forma sencilla de juntar todo esto es

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

y ya está.

Ahora podemos añadir columnas a nuestros datos llamando a

datos.addColumn ("Nombre columna");

y podemos añadir, borrar y modificar

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

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

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

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

16 septiembre 2005

Un pequeño problema con Swing

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

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

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

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

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

¿Cual es la solución?.

Solución 1.

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

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

Solución 2.

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

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

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

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

Métricas para eclipse

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

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

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

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

15 septiembre 2005

Ejemplos de java

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

14 septiembre 2005

Propiedades de System.getProperty()

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

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

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

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

Tortoise CVS

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

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

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

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

Programación de C en unix

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

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

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

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

13 septiembre 2005

Entrada standard en java

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

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

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

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

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

Bien, con este trozo de código

InputStreamReader isr = new InputStreamReader(System.in);

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

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

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

Estupendo, ya podemos leer líneas de teclado.

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

int valor = Integer.parseInt (lineaTeclado);

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

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

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

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

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

} catch (Exception e)
{}

Entendiendo make y los archivos Makefiles

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

Comandos de bash linux

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

Notepad++ y gvim

He encontrado el Notepad++

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

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

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

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

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

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

Technorati: Home

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

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

12 septiembre 2005

firmar un jar

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

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

Does XML Suck?

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

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

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

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

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

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

08 septiembre 2005

Primer mes sin wanadoo

Parece que he conseguido darme de baja de Wanadoo.

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

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

07 septiembre 2005

Google Earth - Products

Acabo de descubrir GoogleEarth.

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

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

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

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

06 septiembre 2005

Me estoy quedando obsoleto

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

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

#include <iostream.h>

esta obsoleto, que en su lugar use

#include <iostream>

sin el .h del final.

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

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

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

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

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

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

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

03 septiembre 2005

cygwin

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

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

javac `find . -name *.java`

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

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

y así sucesivamente.

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

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

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

Como conectar Java y Access

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

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

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

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