domingo, 24 de febrero de 2013

Recepción

Esto pasa diario en el trabajo, por el lado amable es el único perro que conozco que no me ladra cuando me ve.

Recepción en el trabajo.

jueves, 21 de febrero de 2013

Detalles en el formateo de decimales con toString en C#

O por que sale una , en vez de . cuando uso toString("0000.00")

Si esta programando una interfaz grafica en C# muy probablemente habra necesitado hacer un textBox que formatee los datos en el, ya sabe agregando ceros a la izquierda y poniendo los decimales.

En C# basta con aprovechar el evento "Leave" para que, al momento que el cuadro de texto (referido de aquí en adelante como TextBox) lea el contenido, se convierta en numero y luego usar .toString("00000.00") para dar el formato necesario, fácil, ¿no?

Pues NO

Al menos en C# existe un detalle capaz de causar errores impredecibles, calculos errados  y un dolor de cabeza buscando que salio mal, y cuya única pista parece ser que el textBox esta ignorando el punto decimal.

Todo esto resultado de una buena idea que tal  vez podría estar o mejor explicada o mejor implementada.

Ejemplo en acción.

Para explicar esto usaremos un programa muy sencillo, simplemente recibe un numero  en un textbox y al pulsar un boton calcula y muestra el cuadrado de este en otro textBox  como muestra la figura 1

Figura 1 - Aplicación de Ejemplo.
Y que al poner un numero lo formatee de modo que ponga los ceros a la izquierda y la derecha necesarios, como  muestran la Figuras 2 y 3

Figura 2 - Entrada de Datos.
Figura 3 - Formato de Datos.
(Ya en la figura 3 puede empezar a notar que algo anda mal, llegare a eso en un momento)

Ese formateo se logra con el evento Leave del textBox, asumire que ya sabe como declararlo, el codigo que use  para dar formato es el siguiente:

        private void textBox1_Leave(object sender, EventArgs e)
        {
            double d = Convert.ToDouble(textBox1.Text);

            textBox1.Text = d.ToString("0000.00");
        }

        
y para el botón se usa este código, de nuevo nada del otro mundo

        private void button1_Click(object sender, EventArgs e)
        {
            double d = Convert.ToDouble(textBox1.Text);
            d = d * d;
            textBox2.Text = d.ToString("0000.00");
        }


Suena simple pasamos el texto a double y luego ese double lo pasamos a texto aplicandole el formato deseado, incluso puede  ver que pusimos un punto para indicar donde iran los decimales.

Como puede ver en la figura 2 se puso un 45.5 en el textBox1, pero al pulsar fuera del textoBox1 vemos el 45.5 convertise  en un 0455.00 como en la figura 3 y al pulsar el boton btenermos el cuadrado de ese numero, pero *no* del que pusimos Figura 2

Figura 4 - Resultado erroneo.
La unica pista que tenemos sale de la documentacion de .NET donde se refieren a un parametro del metodo toString de tipo CultureInfo
el cual es la clave de lo que esta pasando aqui.

Al parecer, con el propósito de facilitar la localización de los programas, C# permite indicar como se deben separar los números, y otros valores  dependiente de localidad esto es recordando que en algunos idiomas la , se usa (quien sabe por que) para indicar decimales y esto se puede demostrar en el  programa ejemplo pues si escribe 45,5 en el programa (Figura 5), consigue el resultado correcto (Figura 6). 

Figura 5 - 45,5
 
Figura 6 - Resultado usando comas.

Pero como aquí *no* se usa la coma para los decimales que el programa se comporte de ese modo es molesto, por decir de menos , sin mencionar que puede ser  desconcertante que el programa *no* este haciendo lo que se le indica en el codigo.

Por fortuna la solucion es sencilla basta agregar al inicio del programa la instrucción

using System.Globalize;

y el parametro "CultureInfo.InvariantCulture" al toString y al  Convert.toDouble y listo, el punto decimal hará honor a su nombre y funcionara se espera.

Figura 7 - Programa corregido

Figura 8 - Comportamiento correcto.

Para hacer esto mas claro aquí esta el código con las correcciones, el parámetro "CultureInfo.InvariantCulture" se encarga de indicar a la función de hacer exactamente lo que se le dice, sin tomar en cuenta detalles sobre el idioma del sistema.

private void button1_Click(object sender, EventArgs e)
{
    double d = Convert.ToDouble(textBox1.Text,   CultureInfo.InvariantCulture);
    d = d * d;
    textBox2.Text = d.ToString("0000.00", CultureInfo.InvariantCulture);

}


private void textBox1_Leave(object sender, EventArgs e)
{
    double d = Convert.ToDouble(textBox1.Text, CultureInfo.InvariantCulture);
    textBox1.Text = d.ToString("0000.00", CultureInfo.InvariantCulture);
}


Espero que esto sea de ayuda para los que se encuentren con este tipo de problemas.

lunes, 4 de febrero de 2013

Java-Gnome en Fedora 18

Las librerías Java-Gnome son un una interfaz para poder usar las librerías básicas del entorno GNOME desde el lenguaje de programación Java.

Si bien el java ya posee nativamente unas librerías para la creación de interfaces gráficas, las aplicaciones realizadas con Java-gnome tienen de inmediato el look nativo de las aplicaciones de GNOME y mejor integración al escritorio.

Como buenas librerías, los tutoriales sobre su uso son muy abundantes.

Cosa que *no* se puede decir sobre su instalación y configuración, en especial sobre la version mas reciente disponible, que a la fecha de esta entrada es la 4.1.2.

Con el fin de ayudar a quienes quieran hacer uso de estas librerías, aquí presento un pequeño tutorial en como instalarlas en Fedora 18, como darlas de alta en proyectos con el entorno Eclipse y como corregir un error me ocurrió al instalarlas.

Nota:
El sistema en que estoy haciendo el tutorial es de 64 bits, razon por la cual las rutas indicadas estan en /usr/lib64/ no se si el error que aqui menciono ocurra en 32 bits, pero si es el caso es posible que la solución sea muy similar.



Instalación en Fedora 18

Figura 1 - Instalación

Como muestra la figura uno solo basta el seleccionar los paquetes java-gnome y java-gnome-javadoc, el segundo es opcional pero muy recomendable pues es la documentación oficial, solo necesita pulsar aplicar cambios y listo tendra las librerías listas para usar.

Usando Java-GNOME con Eclipse.

Ahora es momento de mostrar algo que, si bien es sencillo, es critico en el uso de las librerias, como declararlas en un proyecto de Eclipse.
Comenzaremos iniciando el entorno Eclipse y creando un nuevo proyecto, esto abrira un dialogo como el de la figura 2.

Figura 2: Proyecto de Eclipse.
En este ejemplo en particular el nombre del proyecto sera "ExamplePressMe", ya que ponga el nombre vaya a la pestaña "Bibliotecas" como muestra la Figura 3.

Figura 3: Bibliotecas.
Presione el boton "Añadir JAR externos..." y agrege el archivo "/usr/lib64/java-gnome/gtk-4.1.jar", ahora presione "Finalizar" y tendra el proyecto iniciado, notara un ! rojo en el nombre del proyecto como muestra la figura 4.

Figura 4: Proyecto con Java-GNOME

Ese ! rojo es la primera indicación de un problema que tiene, al momento de hacer esta entrada, la instalación del java-GNOME en Fedora 18, para hacerlo mas obvio agreguemos una clase al proyecto, de nuevo se asumira que ya se conoce el procedimiento y solo se indicaran los valores para el paquete y nombre de clase,que para este ejemplo seran ExamplePressMe y el paquete sera button.

El código que usaremos como ejemplo es parte de la documentación oficial de java-GNOME y se encuentra aqui: http://java-gnome.sourceforge.net/doc/examples/button/ExamplePressMe.html

Solo copielo directamente a la nueva clase, notara casi de inmediato una gran cantidad de errores, como muestra la Figura 5

Figura 5: Código

Esto es bastante desconcertarte y se debe muy posiblemente a un error al instalar las librerías, he de notar de usar gtk.jar causa también el mismo error.

Corrigiendo el problema de instalación

Con ayuda de Nautilus vaya a "/usr/lib64/java-gnome" vera algo como la figura 6
Figura 6: El Error.

Seguro las X cerca de los iconos de los .jar le haran sospechar que algo anda mal y tiene toda la razon.

El problema es, en forma simple, que el archivo gtk-4.1.jar no puede ser accedido de ninguna forma por usuarios que no sean el root, lo que es un problema para una librería que debe ser accedida tanto por el IDE Eclipse como por las aplicaciones escritas en este.

Poniendose mas técnicos el problema es la falta de permiso de lectura para el resto de los usuarios, como se ve en la Figura 7.
Figura 7: Error visto desde el terminal.
Por fortuna la solución es muy sencilla, siempre y cuando tenga acceso a la cuenta del root o pueda solicitar la ayuda del administrador del sistema, como root use los comandos:

chmod a+r gtk-4.1.jar
chmod a+r gtk.jar

Estos daran a todos los usuarios del sistema permisos de lectura sobre la libreria.
Ahora regrese al Eclipse y vaya a las propiedades del proyecto, en especifico a la pestaña Bibliotecas como muestra la Figura 8.

Figura 8: Bibliotecas del proyecto.
Simplemente remueva la librería gtk.jar (o gtk4.1.jar) con el botón borrar y vuela a agregarla con el botón "Añadir JAR externos..", la ruta de la librería es "/usr/lib64/java-gnome/gtk-4.1.jar" hecho esto de en "Aceptar" y listo, deveria ver algo como la figura 9

 
Figura 9: Java-GNOME funcionando adecuadamente
Los errores ya no aparecen, puesto que Eclipse ya pudo acceder correctamente al archivo .jar, ahora solo presione ejecutar (ya sea en el menú ejecutar o con el boton verde) y correra su primera aplicacion en java-GNOME.

Figura 10: Primera aplicación.
Espero que esto les halla sido de utilidad y nos vemos en la próxima entrada :).

domingo, 3 de febrero de 2013

Sobre la falta de entradas y actividad.

Pues que se puede decir, simplemente no he tenido el tiempo y mas importante un tema del que hablar aquí....

Pero con suerte eso puede cambiar en poco tiempo :)

Como parte del proyecto en turno del trabajo tendré que comenzar a familiarizarme con una serie de herramientas para el desarollo de aplicaciones web siendo las principales que se usaran las siguientes

  • Hibernate
  • Struts
  • JQuerry
  • Eclipse IDE
  • Tomcat
  • MySQL
  • Desarollo de WebApps con Java

Salvo por la parte de la programación en Java y el uso básico de MySQL todos estos temas son cosas con las que no estoy familiarizo al 100% pero que ya he usado a la brava para un proyecto anterior.

Asi que, ¿por que no aprovechar eso y hacer unas cuantas entradas detallando lo que vaya encontrando sobre esas herramientas?, quien sabe y capaz le sirvan a alguien para comenzar o salir de alguna duda con la que me encuentre.

Eso y seguir poniendo comics, aunque esta vez sin encajonarme en algun tema es especifico, total son comics.

Nos vemos y espero comenzar la primera entrada de esa serie pronto, instalación, interfaz y uso básico de Eclipse IDE en Fedora Linux.