17 octubre 2005

Me han fastidiado los de oracle

En el trabajo tenemos y tratamos de mejorar un conjunto de clases java para facilitar los programas que manejan base de datos. Básicamente la idea que tenemos es la siguiente:

Para cada posible tipo de campo de la base de datos tenemos un editor, es decir tenemos varios editores capaces de manejar los datos que nos devuelve un resultSet.getObject(): String, BigDecimal, Double, etc, etc. Todos esos editores implementan una interface común de tomaDatos() y dameDatos(). Estos editores se pueden configurar con las restricciones de los campos en la base de datos (número de cifras, de decimales, es obligatorio, es editable, etc) que se pueden leer automáticamente con los metadatos desde java.

Tenemos una clase que lee un fichero de configuración. Ese fichero contiene los nombres de las tablas de base de datos y el tipo de editor que debemos usar para ese campo, con sus restricciones. Ese fichero se genera automáticamente con un programita java que nos hemos hecho y que consulta los metadatos de la base de datos. Hemos optado por este fichero de configuración por no tener que ir leyendo en tiempo de ejecución los metadatos de la base de datos.

Tenemos también un panel al que se le pasan nombres de campos de la base de datos. El panel consulta el fichero de configuracion (que también se le pasa), instancia el editor adecuado para ese campo, lo configura con sus restricciones y lo coloca en el panel. Con esta clase creamos todos los formularios de forma casi automática.

El panel tienen dos metodos tomaDatos() y dameDatos() que reciben y dan un Hashtable. La clave del Hashtable es el nombre del campo de la base de datos y el valor es el valor que nos devuelve el ResultSet. De esta forma, rellenando el formulario y llamando al dameDatos(), obtenemos un Hashtable con todos los campos del formulario rellenos. El tomaDatos() lo que hace es repartir los valores del Hashtable a los editores individuales que hay dentro del panel.

Por supuesto, tenemos un TableModel que en cada fila admite uno de estos Hashtables y un JTable al que dándole los nombres de los campos que queremos que se vean, añade las columnas correspondientes.

Finalmente, tenemos una clase a la que dándole un String con un select de oracle, es capaz de realizar la consulta y construirnos los Hashtables correspondientes. Esta clase, si le damos cualquier sentencia SQL con nombres de campos entre # y un Hashtable, reemplaza los nombres de campos entre # por los valores del Hashtable. De esta forma se construyen los insert, delete, update e incluso los where de los select de forma más o menos automática. Por ejemplo, si hacemos "select * from tabla where campo=#campo#" y le pasamos un Hashtable con una clave "campo" y con valor Integer=3, esta clase reemplaza el #campo# por un 3. El select quedaría asi "select * from tabla where campo=3".

Con todo esto, para hacer un programa que trabaje con base de datos, creamos un fichero de configuración con nuestro programa independiente. Escribimos los select, insert,update en un fichero de configuracion. Los leemos y lo pasamos a nuestra clase de consultas, que nos devuelve directamente Hashtables. Estos los podemos meter tal cual en una tabla o en un formulario que se construyen solos con un par de líneas de código. De la misma forma, leyendo datos nuevos de un formulario y reemplazando campos entre # en el insert correspondiente, podemos insertar.

¿Cual es el problema?. Para construir el Hashtable con el resultset que obtenemos del select de SQL, necesitamos leer los metadatos del ResultSet. Estos metadatos sólo nos devuelven el nombre del campo, pero no de la tabla ni del esquema al que pertenece dicho campo ( ver última línea en http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/OracleResultSetMetaData.html). Esto nos plantea el problema que si el select pide dos campos con el mismo nombre en distintas tablas, a través de los metadatos del ResultSet no podemos distinguir qué columna es qué campo. No queda más remedio que hacer los select con cosas como "select tabla1.nombre as nombre_1, tabla2.nombre as nombre_2 ...", que no deja de ser un incordio, puesto que hay que acordarse de hacerlo y no es algo que nos haga el código automáticamente.

_gxx_personality_v0

En varias ocasiones me han llegado correos de gente que quieren correr algunos de los ejemplos de mi página web y tienen problemas. El problema suele un error del estilo

undefined reference to '_gxx_personality_v0'

El problema no es del ejemplo. No sé muy bien a qué se debe, pero da la impresión de que en algunas versiones de linux han hecho depender el compilador de C (el gcc) de alguna librería propia del de C++ (el g++).

Buscando por internet (_gxx_personality_v0 en google) he visto que hay montones de entradas en los foros referenciando este error.

Las soluciones que se proponen parecen ser:
  • Usar g++ en vez de gcc al compilar, aunque sea un programa de C en vez de C++
  • Añadir a mano el linkado con la libreria /usr/lib/libstdc++.so. Bastaría con añadir una opción -lstdc++ en la línea de compilado con gcc.
Con esto, en teoría estaría resuelto el problema. Parece, de todas formas, que en versiones más modernas de linux se ha corregido el error.

En http://mapserver.gis.umn.edu/data2/wilma/mapserver-users/0303/msg00377.html hay un mensaje de un foro en el que básicamente explica estas dos soluciones.



16 octubre 2005

DVD2DivX V4

En DVD2DivX V4 hay una página interesante en la que cuenta, además de poder descargar todo lo necesario, cómo pasar una película DVD a formato DivX.

Grabando con la AverTV 203

Por fin me he puesto a grabar algo un poco más en serio con la AverTV 203.

Me gusta más que la Pinnacle PC TV Pro. Esta me daba algún problema cuando la señal no era buena. Dejaba de grabar sin más. Además, no permitía grabar en cualquier formato, simplemente grababa en mpeg-1 y ya está (la opción de mpeg-II es de pago aparte).

La Aver TV me da también algún problema, pero es secundario. Mientras está grabando, se me ha quedado colgada la imagen. Sin embargo, sigue grabando y la grabación luego está bien. También alguna vez en el arranque da un error. Hay que matar la aplicación y volverla a arrancar. Lo mejor de todo es que es capaz de grabar con cualquier codec que tengamos instalado, por lo que es posible grabar directamente en divX o cualquier otro. También soporta además los formatos de Video CD, Super Video CD y DVD.

13 octubre 2005

Un chat en java

En http://www.geocities.com/xtr3m3_sc0rpi0/java/chat/ hay el código de ejemplo de un chat en java. No lo he probado, pero tiene pinta de ser un código sencillo y que sirve perfectamente de ejemplo.

09 octubre 2005

Entornos y herramientas para desarrollo de software

En Entornos y herramientas para desarrollo de software hay un montón de enlaces a herramientas de programación:

- Herramientas case, para dibujo uml
- Editores configurables
- Herramientas para "navegar" por el código
- Compiladores varios
- Análisis de código (métricas y demás)
- Cosas de ambiente unix sobre windows

En fin, un poco de todas aquellas cosas que en algún momento hemos necesitado y que hemos tenido que buscar como hemos podido.

05 octubre 2005

El fin de fichero en C

Una pequeña tontería que suele despistar al principio.

Cuando leemos un fichero en C, normalmente leemos hasta que encontramos el fin de fichero, con la función feof(). Lo normal es hacer un bucle de este estilo

while (!feof(fichero))
{
...
}

El problema que no todo el mundo sabe es que feof() es cierto sólo cuando intentamos leer después de acabar el fichero.

Si el fichero está vacío y hacemos esto

fichero = fopen (...);
while (!feof(fichero))
{
fread (...);
tratarLeido(...);
}

abrimos el fichero. Como no hemos intentado leer, feof() es false y leemos datos. No hay datos que leer, fread() devolverá un error (que solemos ignorar) y tratamos los datos que no hemos leidos. En el siguiente bucle, como ya hemos intentado leer después de fichero, feof() es true y se acaba el bucle.

Si hubiera datos, trataríamos todo bien, pero después de leer los últimos datos y tratarlos, feof() sigue siendo false. Intentamos una nueva lectura fallida y tratamos los datos que no hemos leido.

La forma correcta de hacer este bucle, es hacer una lectura ANTES de mirar la condición feof(). Es decir

fichero = fopen(...);
fread (...)
while (!feof(fichero))
{
tratarLeido(...);
fread(...);
}

De esta forma, inmediatamente después de leer se hace la comprobación de si hemos obtenido el feof() y si no es así, tratamos el dato.

04 octubre 2005

Las cosas de Windows

Con el cuento de la tarjeta aver media, tuve que reinstalar windows desde cero. Como tenía prisa por ver si se me repetía el problema, no di de alta ningún usuario.

Más adelante, resuelto el tema de la tarjeta, me decidí a dar de alta algunos usuarios (el de jugar con internet, el de hacer programas, etc). Todo decidido, le doy a "inicio", "configuracion", "panel de control", "usuarios y contraseñas" y me creo los usuarios.

¡Sorpresa!. Cuando intento entrar como uno de los usuarios recien creados, no puedo. Da error de que no se puede copiar la configuración local en c:\Documents and Settings\usuario. Veo que dicho directorio no se ha creado. Creándolo a mano, se obtienen nuevos errores.

Me voy a consultar internet y resulta que los usuarios se dan de alta en el icono de "Mi PC", con el botón derecho del ratón, sacamos el menú y le damos a "Administrar" y "usuarios locales y grupos", "usuarios", nuevamente botón derecho y "nuevo usuario". Haciéndolo así, funciona todo correctamente.

¿Para que sirve el "usuarios y contraseñas" del panel de control? Misterio.

03 octubre 2005

Meter todo nuestro programa java en un solo jar

A veces hacemos un programa java que tira de otros jar externos. Por ejemplo, si hacemos un programa de base de datos contra oracle, necesitamos el jar con el driver de oracle, es decir, el ojdbc14.jar. También podemos usar para sacar nuestros mensajes de error el log4j, y necesitamos el jar correspondiente log4j.jar

Cuando metemos nuestro programa en un jar, en nuestro fichero de manifiesto podemos poner que necesitamos esos jar externos. Sería algo como esto

Manifest-Version: 1.0
Class-Path: ./ojdbc14.jar ./log4j.jar
Main-Class: MiPaquete.MiClasePrincipal


Esto va más o menos bien. El problema es que junto con nuestro jar debemos entregar los otros jar. Es decir, nuestra aplicación está compuesta de tres jar, el nuestro, el de la base de datos y el del logger.

Hay una librería de sourceforge que permite empaquetar esos jar externos dentro de nuestro jar. De esta forma, dentro de nuestro jar meteríamos también el ojdbc14.jar y el log4j.jar, junto con nuestras clases.

De esta forma, nuestra aplicación se entregaría en un único MiPrograma.jar. Todos los demás jar necesarios estaría dentro.

Aunque no lo he probado todavía, parece que simplemente hay que bajarse el one-jar-boot.jar. Al desempaquetarlo salen varias clases y un fichero de manifiesto boot-manifest.mf. Ahora sólo tenemos que añadir a nuestro jar esas clases y ese nuevo fichero de manifiesto. Con ello, nuestro jar buscará los jar que indiquemos en el atributo "Class-Path" de nuestro fichero de manifiesto original, dentro del jar y no en el disco duro.

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");

31 agosto 2005

Using HTML in Swing Components

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

El siguiente ejemplo:

import javax.swing.*;

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

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

Hay un pequeño tutorial de esto aquí:

Using HTML in Swing Components

GMail API For Java (g4j)

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

http://g4j.sourceforge.net/

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

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

Administración de Sistemas Operativos

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

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

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

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

29 agosto 2005

Ficheros de inicio de unix

En un foro encontré un link bastante interesante:

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

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

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

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

En el link mencionado tienes una lista completa.

23 agosto 2005

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

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

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

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

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

20 agosto 2005

Internacionalización de java

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

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

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

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

saludo=hola
despedida=adios

o a esto en inglés

saludo=hello
despedida=bye

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

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

12 agosto 2005

Ocultar IP

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

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

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

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

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

10 agosto 2005

Cargar imagen de un jar

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

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

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

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

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

28 julio 2005

jace

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

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

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

27 julio 2005

Wanadoo

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

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

QT

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

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

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

14 julio 2005

Una tontería de C en linux

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

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

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

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

LANG=es;
export LANG;

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

Simplemente cambiándola por

LANG=c
export LANG;

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

log4j

He empezado a utilizar log4j.

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

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

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

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

PropertyConfigurator.configure ("fichero_configuracion");

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

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

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

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

08 julio 2005

consulta de sql

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

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

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

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

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


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

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

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

21 junio 2005

Wanadoo

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

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

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

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

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

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

ant

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

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

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

10 junio 2005

eclipse

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

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

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

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

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

03 junio 2005

UML y desarrollo orientado a objetos

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

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

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

wanadoo

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

01 mayo 2005

eclipse

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

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

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

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

26 abril 2005

Turbo C en linux

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

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

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

23 abril 2005

validar entradas en un JTextField

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

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

20 abril 2005

InputVerifier de java

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

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

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

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

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

17 abril 2005

¡¡Por fin!!

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

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

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

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

16 abril 2005

Dominios vg

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

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

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

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

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

14 abril 2005

Patrón estrategia

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

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

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

12 abril 2005

Jalopy

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

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

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

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

11 abril 2005

Conexión a MySQL desde java

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

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

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

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

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

package chuidiang.ejemplos.base_datos;

import java.sql.*;

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

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

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

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

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

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

El resultado es el esperado.

Libro de patrones

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

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

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

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

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

04 abril 2005

phpBB

Rebuscando por ahí he encontrado phpBB.

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

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

01 abril 2005

Entornos de desarrollo

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

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

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

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

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

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

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

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

31 marzo 2005

Intalación de MySQL, Apache y PHP

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

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

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

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

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

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

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

Configuración de Apache:

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

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

Configuración de PHP:

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

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

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

Configuración de MySQL:

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

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

25 marzo 2005

Captura de video

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

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

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

17 marzo 2005

Flashget y "new offer for you"

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

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

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

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

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

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

11 marzo 2005

Formateadores de código c++

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

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

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

06 marzo 2005

pc actual

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

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

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

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

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

04 marzo 2005

Un par de links interesantes

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

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

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

01 marzo 2005

spybot y spysweeper

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

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

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

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

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

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

Como antivirus gratuito, tengo instalado el avg.

Puertos usb

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

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