style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

blog de luxspes

Por que usar BigDecimal (y no Double) para calculos aritmeticos financieros

Escribe el siguiente código:

double unCentavo = 0.01;
double suma=unCentavo+unCentavo+unCentavo+unCentavo+unCentavo+unCentavo;
System.out.println(suma);

Que se imprime? Si contestaste: 0.06, estas equivocado.

Se imprime: 0.060000000000000005

Ahora escribe:

java.math.BigDecimal unCentavo = new java.math.BigDecimal("0.01");
java.math.BigDecimal suma=unCentavo.add(unCentavo).add(unCentavo).add(unCentavo).add(unCentavo).add(unCentavo);
System.out.println(suma);

Que imprime? 0.06.

James Gosling (Autor de Java): Renuncia a Oracle (y a Java?)

James Gosling: Renuncia a Oracle (y a Java?)!. El autor de Java a renunciado a seguir trabajando en Oracle. Significa esto que ha renunciado a trabajar en Java? O veremos en el futuro su participación a través del proyecto Harmony o de IceTea pero a traves de otra compañia? A mi me encantaría que alguien con su peso decidiera apoyar a un proyecto como Scala o Rel. ¿Que creen ustedes que haga? ¿Por que habrá renunciado a Oracle? Se habrá enterado de que el rumbo por que Oracle llevara Java en el futuro no es bueno?

Rel Project: Una base de datos relacional (en Java) como deberian ser? Parte III: Restricciones

Continuando con las restricciones

En la parte II vimos que era posible efectuar un insert así (en donde el Usuario 'Rodrigo' no existe en la relvar/tabla de usuarios):

INSERT RELACIONES_USUARIOS RELATION { TUPLE {NombreUsuarioOrigen 'Juan', NombreUsuarioDestino 'Rodrigo', TipoRelacion 'Amigo'} }

Y la base de datos no nos lo impediría... ¿como podemos evitar que este tipo de "registros huérfanos" entren en nuestra base de datos?

Es necesario establecer una “restricción” en nuestra base de datos, así: :

Frameworks Web basados en componentes del lado del servidor: El reto del cache del lado del cliente

Digamos que se tiene un pantalla mas o menos así:

Tengo un combobox (<select/>) en donde selecciono el país, y abajo se rellena otro combobox, en donde aparecen los estados para ese país, y cuando selecciono un estado, me aparecen las ciudades de ese estado, y cuando selecciono la ciudad, me aparecen otro combo para seleccionar la colonia.

Hacer algo asi con Richfaces+JSF, con Tapestry, AribaWeb o Wicket no parece demasiado difícil...
Hacer lo mismo con Capucchino+DWR, o Flex+GraniteDS, tampoco es demasiado difícil...

Pero aquí viene el reto: Reducir el numero de peticiones al servidor pero sin traerme todos los datos de todos los países/estados/ciudades/colonias desde un principio, por que eso hará que mi pantalla tarde demasiado en cargar (y desperdicie memoria), pero quiero que al seleccionar un país por segunda vez, no vuelva a ir por la lista de estados... y al seleccionar un estado por segunda vez, no vuelva a ir por la lista de ciudades al servidor, y al... bueno, ya se hacen una idea.... ;-)

Rel Project: Una base de datos relacional (en Java) como deberian de ser? Parte II: Historia, Relvars, Cerradura....

Un poco de Historia y teoría

En la primera parte de esta serie de “blog posts” sobre el proyecto Rel, hable acerca que de Rel era una base de datos verdaderamente relacional, pero no aclare mucho acerca de que distingue a una base de datos verdaderamente relacional de una que no lo es. Bueno, revisitemos la definición de una base de datos relacional.

Nos interesan, en este caso, particularmente 2 de las 12 las reglas que el inventor de las bases de datos relacionales (Edgar F. Codd) propuso para describir a una base de datos relacional:

Y tu... le presentas al usuario mensajes de error claros y contextualizados?

Reglas de Integridad

Cuando los datos se modifican con sentencias INSERT, DELETE o UPDATE, su integridad puede perderse de muchas maneras diferentes. Pueden añadirse datos no válidos a la base de datos, tales como un pedido que especifica un producto no existente.

Pueden modificarse datos existentes tomando un valor incorrecto, como por ejemplo si se reasigna un vendedor a una oficina no existente. Los cambios pueden ser aplicados parcialmente, como por ejemplo si se añade un pedido de un producto sin ajustar la cantidad disponible para vender.

Para evitar que la integridad de los datos se pierda, se pueden definir reglas que se encargaran de protegerla. Estas reglas pueden definirse en distintos niveles del código de la aplicación:

"Aplicaciones" Web: Ni el foco pueden controlar!

En Swing se puede navegar de un componente a otro usando las teclas Tab o Shift-Tab. Estas teclas son las "teclas de recorrido de foco" (focus traversal keys) y pueden ser cambiadas programaticamente. Por ejemplo, tu puedes agregar la tecla Enter a la lista de teclas de recorrido de foco con el siguiente codigo:

Set forwardKeys = getFocusTraversalKeys(
    KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
Set newForwardKeys = new HashSet(forwardKeys);
newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
    newForwardKeys);

Y eso es todo, asi de facil se puede usar Enter en ves de tab para mover el foco al siguiente elemento. Simple no? Ahora trata de hacerlo con JavaScript en una forma de HTML:

No se puede. O tal ves si, pero nadie sabe como.
Hay algunas soluciones parciales, por ejemplo, esto solo funciona en IExplorer:

<INPUT TYPE="TEXT" onKeyDown="if(event.keyCode==13) event.keyCode=9;">

Rel Project: Una base de datos relacional (en Java) como deberian de ser? Parte I - Proyeccion

El proyecto Rel es una implementación del lenguaje Tutorial D de Date y Darwen en Java.

Rel es una verdadera RDBMS (no como Oracle, SQLServer o DB2 que son solo pseudo relacionales) con un lenguaje de consultas avanzado.
Rel es gratuito y opensource

Rel implementa un conjunto extendido del lenguaje propuesto por C. J. Date y Hugh Darwen, llamado Tutorial D. Es posible que ya lo hayas visto si alguna ves leíste el libro "Introducción a los Sistemas de Base de Datos" de Date.

El objetivo principal de Rel es como una herramienta de enseñanza, para que podamos explorar los conceptos de las bases de datos relacionales, pero lo que me impresiono sobre el, es que tras conocerlo se volvió imposible para mi el considerar a SQL como una lenguaje bien diseñado. Tutorial D te hace ver que SQL es una reliquia de de los 70 de la que ya deberíamos habernos deshecho hace mucho tiempo... y sin embargo, seguimos creando lenguajes para consultas lo mas parecidos a SQL que podemos, con el objetivo de facilitarle el aprendizaje a las personas que ya saben SQL, sin darnos cuenta que el aprender SQL en si mismo es una fuerte limitación a la productividad.

Empecemos con la operación relacional proyeccion: Veamos una comparación:

En SQL, puedo escribir:

SELECT DISTINCT a, b, c FROM r

Con lo que obtendré una consulta con las columnas a, b, c de la tabla r.

En Tutorial D dicha consulta se escribiría (en SQL es necesario escribir DISTINCT para garantizar que la salida no tenga redundancia, en Tutorial D, la redundancia esta prohibida por default por los principios Relacionales):

r { a, b, c }

Que es mucho mas corto, hasta el momento, parece que esta es la única ventaja, pero ahora supongamos que la tabla "r" tiene los campos: a,b,c,d,e,f,g,h,i, y que solo queremos ver los campos d,e,f,g,h,i.

En SQL escribiria:

select DISTINCT  d,e,f,g,h,i. FROM r

Mientras que en Tutorial D escribiria:

r { ALL BUT a, b, c }

Agregando Epiciclos?: Java todavia tiene futuro?

Vas a construir una nueva aplicación.. si eres como yo alguien que disfruta de las ventajas de la reutilizacion que te dan los proyectos opensource, y te estan pidiendo la tipica aplicacion web que tanto se acostumbra en estos tiempos... que haces?

Pues desde el principio ya estas pensando: Spring (o Weld si queres probar algo mas nuevo) para integrarlo todo, JPA para guardar en la base de datos... JSF, Wicket o Tapestry para la interfaz... y si tengo que poner mucha interactividad con Javascript? pues DWR!

Y construyes tu aplicación... Inclusive escribes un script de Ant para poder generar el .war que subiras (de forma tambie automatizada) al servidor de produccion...

Ignoremos por un momento los problemas que hayan podido surgir durante el desarrollo, y pensemos que llego el dia de finamente entrar "en produccion":

RTFS: Read The F.... Stacktrace

Tal vez hayas leido del acronimo RTFM, se utiliza en tipicamente (sobre todo en los foros de internet) cuando se le quiere indicar a alguien que para responder a su pregunta todo lo que tendria que haber hecho es leer el manual.

Bueno, quisiera proponerles un nuevo acronimo que me comento una amigo cuando estabamos platicando sobre los problemas a los que nos enfretamos todos los dias cuando estamos desarrollando: RTFS, la S es the StackTrace.

Cuando una aplicacion de Java se traba, en el 99% de los casos (a menos que le hayas logrado pegar a un bug de bajo nivel de la maquina virtual, cosa que ocurre muy pero muy rara vez)  la aplicacion te presentara a una StackTrace que te permitira saber no solamente en que linea ocurrio el problema, si no tambien que metodo(s) estaban llamando al metodo dentro del cual ocurrio el problema.

Digamos por ejemplo que  tenemos el metodo:

public static boolean areEqual(Object object1, Object object2) {
return object1.equals(object2);
}

Que ocurre cuando el parametro object1 es null? Pues una NullPointerException, que se nos presentara de la siguiente forma:

Exception in thread "main" java.lang.NullPointerException
    at JavaSnippet$1.equals(JavaSnippet.java:5)
    at JavaSnippet$1.run(JavaSnippet.java:11)
    at JavaSnippet.main(JavaSnippet.java:14)

Ahi podemos ver que el error ocurrio en la linea 5 del archivo “JavaSnippet.java”, cuando la linea 11  del mismo archivo fue invocada por la la linea 14, inclusive nos dice a que metodo pertenece cada linea de ejecucion!

Distribuir contenido

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">