10 abr 2014

Problemas con el separador de los números decimales (punto o coma) en Java

En ocasiones podemos tener problemas con el formato de los números decimales, ya que el carácter que separa la parte entera, de la parte decimal, puede ser un punto o una coma. Depende del idioma que tenga configurado por defecto el sistema operativo. Si tenemos configurado español y escribimos un número con decimales, escribirá la coma, pero si leemos un número escrito de esta forma e intentamos asignárselo a un float nos dará error porque está esperando un punto, que es el formato interno con el que trabaja el compilador.
Por ejemplo el siguiente código:
public void leerVectorDiscos() throws FileNotFoundException     {
        Scanner sc = new Scanner(new File("archivo.txt"));
        String fila;
        String[] vectSt;
        for (int j=0;j<hd.length;j++)
        {
            fila=sc.nextLine();
            vectSt=fila.split("\t");
            hd[j].setTecnologia(vectSt[0]); 
            hd[j].setCapacidad(Integer.parseInt(vectSt[1]));
            hd[j].setVelocidad(Float.parseFloat(vectSt[2]));
        }
        sc.close();
}
producirá esta excepción:
Exception in thread "main" java.lang.NumberFormatException: For input string: "9600,00"
            at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
            at java.lang.Float.parseFloat(Float.java:452)
            at java500_1.VectorDiscos.leerVectorDiscos(VectorDiscos.java:118)
            at java500_1.Java500_1.main(Java500_1.java:36)
Java Result: 1

Una solución es utilizar la clase Numberformat, para especificar el formato que va a tener un número decimal:
float numf;
Locale spanish = new Locale(“es”, “ES”);
NumberFormat nf= NumberFormat.getInstance(spanish);
numf= nf.parse(st[2]).floatValue();

Hay que incluir los correspondientes import:
import java.text.NumberFormat;
import java.util.Locale;

De esta forma como estamos indicando que el idioma local es español, tomará la coma como separador decimal al hacer el parseo. El código resultante sería:
public void leerVectorDiscos() throws FileNotFoundException , ParseException     {
        Scanner sc = new Scanner(new File("archivo.txt"));
        String fila;
        String[] vectSt;
        for (int j=0;j<hd.length;j++)
        {
            fila=sc.nextLine();
            vectSt=fila.split("\t");
            hd[j].setTecnologia(vectSt[0]); 
            hd[j].setCapacidad(Integer.parseInt(vectSt[1]));
            Locale spanish = new Locale(“es”, “ES”);
            NumberFormat nf= NumberFormat.getInstance(spanish);
            hd[j].setVelocidad(nf.parse(vectSt[2]).floatValue());
        }
        sc.close();
}

Hay que tener cuidado porque crear una instancia de Locale, no sólo cambia el separador sino también el resto de características asociadas al idioma, como puede ser la moneda o los formatos de fecha y hora.
Una solución alternativa puede ser utilizar un objeto de la clase DecimalFormat, derivada de NumberFormat, que toma la configuración de los números del idioma del sistema operativo que tengamos instalado:
public void leerVectorDiscos() throws FileNotFoundException , ParseException     {
        Scanner sc = new Scanner(new File("archivo.txt"));
        String fila;
        String[] vectSt;
        for (int j=0;j<hd.length;j++)
        {
            fila=sc.nextLine();
            vectSt=fila.split("\t");
            hd[j].setTecnologia(vectSt[0]); 
            hd[j].setCapacidad(Integer.parseInt(vectSt[1]));
            DecimalFormat df= new DecimalFormat();
            hd[j].setVelocidad(df.parse(vectSt[2]).floatValue());
        }
        sc.close();
}

La clase DecimalFormat permite además especificar máscaras, con el formato de presentación que queramos, mediante el constructor, y unos caracteres especificados, con el carácter ‘#’, si el número no tiene una cifra no aparecería, y con el ‘0’, aparecería un ‘0’, por ejemplo:
DecimalFormat df = DecimalFormat(“###.##”);
System.out.println (df.format (2.3));                    //Sacaría 2,3
System.out.println (df.format (2.357));               //Sacaría 2,35
System.out.println (df.format (4322.3));             //Sacaría 4322,3

DecimalFormat df = DecimalFormat(“000.00”);
System.out.println (df.format (2.3));                    //Sacaría 002,30
System.out.println (df.format (2.357));                //Sacaría 002,35
System.out.println (df.format (4322.3));             //Sacaría 4322,3


Existen más caracteres que pueden utilizarse en la máscara, descritos en la API de DecimalFormat.

Instalación de Cygwin

Se accede a: http://www.cygwin.com


Se selecciona la versión de descarga dependiendo de si el sistema operativo de la máquina donde se va a instalar, es de 32, o de 64 bits.
Nos descarga un pequeño instalador, que cuando ejecutemos será el que ponga en marcha el proceso de descarga real de cygwin. Lo primero que tenemos que elegir es el tipo de instalación que vamos a realizar:


Mediante esta pantalla podremos hacer la instalación directamente desde Internet, o bien podremos descargarnos la aplicación para instalarla más tarde o en otros equipos (por ejemplo sin conexión). La última opción nos permite iniciar la instalación desde un fichero previamente descargado.
A continuación nos pide el directorio de instalación de Cygwin, nos propone dos nombres distintos de dependiendo si es de 32 o de 64 pero en la misma ruta. Esta ruta será importante posteriormente si queremos enlazar con Netbeans. Además elegiremos si se instala para todos los usuarios de Windows o sólo para el usuario actual.


Lo siguiente será el lugar donde se va a realizar la descarga, previa a la instalación. Este directorio podrá después ser borrado, una vez instalado, si no se van a efectuar más instalaciones.


Podemos elegir el servidor de descarga.  Se ha observado que la versión puede variar dependiendo de los servidores, por lo que es recomendable acudir a los españoles. Se recomienda desactivar los antivirus para una descarga más rápida.


Si sólo se va a utilizar para desarrollo en C++ no es preciso instalar todo Cygwin, basta acceder al epígrafe Devel y marcar el compilador de C++, el depurador gdb, y la utilidad make. Hay un cuadro para buscar en la parte superior de la pantalla. Esto da lugar a la instalación de la cadena mínima de herramientas para C++. También es posible instalar el paquete completo de Devel,  lo cual da lugar a una descarga más lenta, y a la instalación de una colección de compiladores.


Una vez finalizada la instalación, aparece un grupo de programas con una única entrada y un  icono en el escritorio, que permite ejecutar una terminal y compilar programas desde la línea de órdenes. Se puede comprobar la correcta instalación del compilador y de make activando estas dos opciones (esto es, escribiendo g++-4 y make en la terminal de Cygwin). Deben aparece los mensajes de error propios de esas aplicaciones.


La instalación de la cadena de herramientas, por defecto, se efectúa en C:\cygwin\bin; esa es la ruta que debe utilizarse una vez instalado NetBeans.
La ruta (PATH) está fijada correctamente para la terminal de Cygwin, pero no para las ventanas de comandos de Windows (cmd). Para que funcione la cadena de herramientas desde la terminal de Windows, es preciso añadir C:\cygwin\bin a la variable de entorno PATH.
Para modificar esa variable de entorno, en Windows XP, se hace clic con el botón derecho en Mi PC, se selecciona Propiedades, se hace clic en Opciones avanzadas, se hace clic en Variables de entorno, se hace clic en Path y se hace clic en Modificar. Finalmente, se añade C:\cygwin\bin al PATH.


En Windows 7 y en Windows 8, clic con el botón derecho sobre el icono de Equipo, opción propiedades y en la ventana que aparece, en la parte izquierda elegimos Configuración avanzada del sistema:


En la nueva ventana que aparece, pulsamos en el botón Variables de entorno…, situado en la parte inferior derecha:


Dentro del apartado variables del sistema, editamos la variable path, añadimos la ruta y guardamos.




9 abr 2014

Bug de Netbeans en Windows 8 con Cygwin 64 bits ( Unable to start pty process)



Para evitarlo podemos modificar las propiedades del proyecto para que se ejecute en una terminal externa. Se accede al menú File, opción Project propertis, y en la ventana que aparece seleccionamos en la parte izquierda la entrada Run, y en la tabla de la derecha, elegimos dentro de Console Type, el valor External Terminal.


Esto hará que la aplicación se ejecute en una nueva ventana de terminal:



7 abr 2014

Alarma social por el fin de soporte de Windows XP

En los últimos días y más en las últimas horas se está produciendo una alarma social porque Microsoft deja de dar soporte a Windows XP. Muchas personas se están angustiando porque temen que su ordenador vaya a dejar de funcionar o vaya a dejar de hacer alguna de las cosas que venía haciendo, situación similar a la que se produjo con el llamado “efecto del año 2000”. Pero, en realidad, ¿qué va a pasar?. NADA. A partir de mañana podrán seguir utilizando su ordenador como si tal cosa.

Que Microsoft no dé soporte supone que no va a actualizar más el sistema, por tanto no va a solucionar problemas y no va a facilitar más parches, pero es que muchas veces estos parches a multitud de usuarios nunca les han afectado, porque correspondían a partes del sistema que nunca utilizaban o estaban relacionados con otras aplicaciones que no tenían. Por otra parte está el tema de la seguridad, se amenaza con que va a ser más vulnerable al ataque de intrusos o de virus. También se exagera, ya que siempre ha sido vulnerable y de ahí la gran cantidad de antivirus que existen en el mercado y que son absolutamente recomendables y que sí se seguirán actualizando. Pero además tampoco hay que preocuparse demasiado por este tema porque hay que partir del hecho de que por mucho que se proteja un sistema, antes o después, va a ser vulnerable, luego está bien poner medidas pero sin obsesionarse.

Una pregunta que nos podemos hacer es ¿cuántas veces he acudido al soporte de Microsoft para que me resuelva un problema, y cuando lo he hecho, cuál ha sido el resultado? La respuesta a esta pregunta, en cada caso, puede ser un indicativo de lo que te va a suponer no tener soporte.
Indudablemente esta política de difusión, mediante una campaña que se viene desarrollando desde hace meses, supone el que mucho equipos se actualicen y esto se traducirá en un aumento considerable de las ventas y más hoy día con la influencia que tienen los medios y las redes, cosa que no pasó por ejemplo con versiones anteriores como w95, w98 o incluso Vista.

La tan deseada renovación del sistema operativo en muchos casos traerá consigo la renovación del equipo, en unos casos porque el equipo no soportará las nuevas versiones, en otros casos porque el equipo no podrá sacar partido de todas las características del sistema como por ejemplo el uso de las pantallas táctiles. Aunque aquí en muchos casos también se está jugando con los usuarios, porque tampoco una versión como Windows 7 o Windows 8 requiere mucho más hardware de lo que ya se tiene con Windows XP, ya que funcionan con procesadores a partir de 1 GHz y con una memoria RAM de 1 GB, requisitos que cumplen muchos de los equipos actuales que están funcionando con XP.


Como conclusión, no es una catástrofe seguir con XP, salvo que te llamen obsoleto, pero por supuesto cualquiera de las nuevas versiones es mucho más atractiva, incluso en muchos equipos con un hardware aceptable funcionará mucho mejor, pero a cambio de tener que pagar un precio y en muchos casos la reinstalación de otras aplicaciones. Puestos a cambiar siempre es buen momento para estudiar las alternativas, existen más sistemas operativos, algunos a coste cero como los basados en Linux, aunque pueden suponer un aprendizaje o tener que renunciar o sustituir alguna de las aplicaciones instaladas.

Compilar y ejecutar programas Java desde la Consola de Windows

Lo primero es verificar que vamos a compilar y ejecutar con la versión de JAVA que deseamos, ya que podemos haber ido instalando diferentes kits de desarrollo y/o entornos de ejecución y  estar utilizando una versión antigua.
Para la compilación necesitamos un  kit de desarrollo (SDK Software Development Kit), mientras que para la ejecución nos bastará con un entorno de ejecución (JRE Java Runtime Environment). Los kits de desarrollo incluyen entornos de ejecución. En nuestro sistema podemos tener instalados diferentes SDK y diferentes JRE, normalmente en la carpeta C:\Archivos de Programa\java, cada uno de ellos en su propia carpeta.



Incluso podemos tener otros JRE en otros directorios, dependiendo de las aplicaciones instaladas que los utilicen, por ejemplo en c:\archivos de programa\oracle.
Si desde una consola de comandos ejecutamos  javac  –version  obtendremos información del kit que estamos utilizando, si ejecutamos   java   -version  nos indicará el entorno de ejecución con el que ejecutamos, que no tiene por qué ser el mismo con el que compilamos.


Cuando tenemos instalados varios kits, a no ser que nos posicionemos en el directorio de los ejecutables de un kit concreto, se ejecutarán según el orden en el que aparezcan en la variable de entorno del sistema PATH. Po ejemplo, si tenemos una variable de entorno con el siguiente contenido
C:\Archivos de programa\Oracle\jre\1.3.1\bin;C:\Archivos de programa\Java\jdk1.6.0_13\bin;%SystemRoot%\system32;C:\Archivos de programa\Java\jdk1.7.0_40\bin
y ejecutamos javac desde la consola,  se ejecutará el comando que se encuentra en C:\Archivos de programa\Java\jdk1.6.0_13\bin, ya que es el primer SDK de la variable. Si lo que ejecutamos es java, se ejecutará la versión que están en , C:\Archivos de programa\Oracle\jre\1.3.1\bin, ya que es el primer comando que encuentra tanto en SDK como en JRE.
Si lo que queremos es que se ejecuten las versiones de javac y java del SDK 1.7.0_40, lo que tendremos que hacer es colocarlas en la variable PATH, al principio, de esta forma:
C:\Archivos de programa\Java\jdk1.7.0_40\bin; C:\Archivos de programa\Oracle\jre\1.3.1\bin;C:\Archivos de programa\Java\jdk1.6.0_13\bin;%SystemRoot%\system32

COMPILACIÓN
Para compilar un fichero fuente en el directorio actual:
javac    miprograma.java
y obtendremos  miprograma.class
si el fichero pertenece a un paquete (estará situada en el directorio correspondiente al paquete), se ejecutará:
javac   mipaquete\miprograma.java
y nos colocará miprograma.class en el paquete (directorio), mipaquete
Si el fichero fuente proviene de un IDE, por ejemplo Netbeans, puede que nos haya incluido una línea de código del tipo:
package mipaquete;
con lo que tendríamos que situarlo dentro de un directorio de nombre mipaquete y compilarlo desde fuera, o bien quitar esta línea de código.
Podemos compilar a la vez clases situadas en diferentes paquetes, por ejemplo:
javac miclas1.java paq1\miclas2.java paq1\miclas3.java paq1\paq2\miclas12.java

EJECUCIÓN
Si el fichero compilado está en el directorio actual:
java  miprograma
sin poner la extensión .class
Si estuviera en un paquete, pondríamos:
java   mipaquete.miprograma
utilizando como separador el “.” en lugar de  “\”
Si se tratara de un fichero .jar, lo ejecutaríamos así:
java   -jar  miprograma.jar


4 abr 2014

Abrir una base de datos Access que tiene oculto el menú principal y la barra de herramientas estándar

Se debe mantener pulsada la tecla SHIFT, a la vez que se abre la base de datos. De esta forma no toma los datos de inicio (configurados mediante herramientas/inicio), como puede ser la apertura de un formulario inicial, o la ocultación de determinadas barras.


Si sólo se necesita ver los distintos elementos de la base de datos (tablas, formularios, informes, etc.) basta con pulsar F11.

Problemas por alcanzar el tamaño máximo de los archivos de carpetas personales (.pst) en Outlook

Cuando el fichero .pst está próximo a su límite de capacidad, que es diferente dependiendo de las versiones de Outlook, y que además puede ser configurado mediante las correspondientes entradas del registro, puede bloquearse y no permitir enviar mensajes de correo electrónico  ni  copiar o mover elementos dentro del fichero.
En estos casos, es necesario reducir el tamaño del fichero eliminando correos, para ello se pueden intentar algunas de las siguientes opciones:
1.       Trabajar sin conexión e intentar eliminar mensajes, con May+Eliminar.
2.       Ejecutar Outlook en Modo de prueba de fallos. Ctrl + doble clic.

3.       Buscar el archivo scanpst.exe y ejecutarlo.