Archivo de Octubre 2005

Paginacion (I)

Lunes, 10 de Octubre de 2005

Problema
Tienes un monton de registros en la base de datos y quieres mostrarlos de una manera paginada. Es decir, si tienes mil registros, quieres mostrarlos en grupos de 20, cada uno de esos grupos sera una pagina y deberas poder navegar de una pagina a otra, desde la primera a la ultima.

Metodo 1
A traves de JDBC, lanzas tu SQL. Navegas por el ResultSet dando un salto directo con .absolute() al primer elemento de tu pagina. Después recoges con .next() todos los elementos de tu pagina. Devuelves estos resultados y los pintas.

Metodo 2
La sentencia SQL te da directamente los elementos que se corresponden con la pagina que deseas. Devuelves estos resultados y los pintas.

Solucion
Antes de empezar a recoger datos como locos, necesitamos hacer algunos calculos.
Los unicos que datos que tenemos son el número de pagina que queremos (1, 2, 3…) y el tamaño de la pagina (10, 20, 50). Y necesitamos estos datos:

- La posicion del primer elemento de la pagina en funcion de su pagina. Por ejemplo, de una pagina de 20 elementos, para la pagina 2 el primer elemento que necesitamos es el 41. A partir del 41, recogemos 20 elementos y ya tenemos nuestra pagina. Para ello podemos utilizar este metodo.

    . . .
    public static int getStartItemByPage(int currentPage, int pageSize) {
        return Math.max((pageSize * (currentPage - 1)) + 1, 1);
        // El Math.max sirve para evitar los numeros negativos, siempre hay
        // algun malvado que puede pedirnos la pagina -10. En esos casos,
        // la pagina devuelta sera 1
    }
    . . .

- El numero total de elementos posibles. Esto sirve para calcular el numero de paginas. Nos lo tiene que devolver la base de datos.

- La ultima pagina. Esto se calcula a partir del numero total de elementos posibles y el tamaño de la pagina. Sirve para pintar un “navegador” de paginas y establecer cual es la ultima pagina posible.

    . . .
    public static int getLastPage(int totalElements, int pageSize) {
        int base = totalElements / pageSize;
        int mod = totalElements % pageSize;
        return base + (mod > 0?1:0);
    }
    . . .

(more…)

El Problema de Monty Hall

Lunes, 10 de Octubre de 2005

Investigando por la Wikipedia, me he encontrado algunas cosas interesantes. Una de ellas es el problema de Monty Hall. Aqui os dejo el inicio de la cuestión…:

“El Problema de Monty Hall es un problema de probabilidad que está inspirado por el concurso televisivo estadounidense Let’s Make a Deal. Su nombre proviene del nombre del presentador, Monty Hall. En este concurso, el concursante escoge una puerta entre tres, y su premio consiste en lo que se encuentra detrás. Una de ellas oculta un coche, y tras las otras dos hay una cabra. Sin embargo, antes de abrirla, el presentador abre una de las otras puertas y muestra que detrás de ella hay una cabra. ?Debe el concursante mantener su elección original o escoger la otra puerta? ?Hay alguna diferencia?

Esa pregunta ha generado un intenso debate. Como la respuesta correcta parece contradecir conceptos básicos de probabilidad, se puede considerar como una paradoja. La respuesta se basa en suposiciones que no son obvias y que no se encuentran expresadas en el plantemiento del problema, por lo que también puede considerarse una pregunta con trampa.”

Lee el articulo completo con la solucion en la Wikipedia

Practicamente se podría decir que da igual, si te toca al principio ?para que cambiar? te ha tocado, y si no te toca, como no puedes saberlo, pues no te ha tocado y ya está, ?verdad?
Tecnicamente la idea es otra:
- Cuando eliges la primera vez, la probabilidad de que acertar es una entre tres.
- Cuando ya has elegido y el presentador te muestra una puerta incorrecta, ya solo quedan dos puertas, por lo que elegir ahora tiene una probabilidad de acierto de una entre dos. Esta probabilidad de acierto (50%) es mayor que la anterior (33,3%)
Otra cosa es que decidas cambiar y elijas la misma. ?Curioso eh?

Editar el CSS “on the fly”

Sábado, 8 de Octubre de 2005

Paso 1: Usa mozilla firefox. Si no conoces el mejor navegador que hay, bajatelo de aqui.

Paso 2: Bajate la extensión Web Developer de aqui. La instalas y reinicias Firefox.

Paso 3: Utiliza un buen color picker. Tras mucho buscar, el mejor que he encontrado es el de pkworld. Descarga directa desde aqui.
Si conoces un Color Picker mejor, dimelo.

Un buen color picker es imprescindible

Paso 4: Abre tu pagina cuyo CSS quieras editar (asegurate de que la extension Web Developer esta instalada)

Paso 5: Pulsa CTRL+MAYUS+Y (CSS, View style information). Con esto conseguiras que al pasar el cursor por encima de cualquier parte del html, la barra de estado te muestra el estilo CSS que se aplica.

Paso 6: Pulsa CTRL+MAYUS+E (CSS, Edit CSS). Te abre un panel lateral donde puedes modificar al vuelo las CSS de la pagina html que se este mostrando. Ojo, si cambias de pagina en el navegador, se perderan los cambios del CSS cuando vuelvas a la pagina inicial cuyo CSS estabas editando. Asegurate de copiar y pegar a tu editor de textos favoritos los cambios que vayas haciendo en los CSS.

Paso 7: Disfruta

Total Commander (I)

Sábado, 8 de Octubre de 2005

Hay pequeñas aplicaciones que marcan un antes y un despues en la vida de un programador.
Cuando te pasas el dia usando el ordenador es necesario optimizar al máximo el tiempo de trabajo. Hay multitud de tareas repetitivas o pesadas que, con una pequeña pero sutil ayuda, podrian ser pasadas por alto si tuvieramos la herramienta apropiada.
Me refiero al Total Commander, que ahora va por la version 6.53.

Su ultima feature desde la version 6.01 mas llamativa es la incorporacion de pestañas (tabs) en cada uno de los dos exploradores laterales. Aprendiendo y dominando el CTRL+T para abrir, CTRL+W para cerrar el tab y CTRL+TAB para desplazarese entre tabs (y algunas mas) podemos ahorrarnos el tener varios Total Commander abiertos a la vez (como ocurria en versiones anteriores).

Total Commander se ha convertido (por lo menos para mi) en el sustituto perfecto para el Explorador de Windows y en una excelente herramienta de trabajo.
Programar en grandes proyectos requiere manejar una gran cantidad de archivos y, dominar un proyecto significa dominar cada archivo.

Intentare en sucesivos posts ir enumerando funcionalidades de esta herramienta desde el punto de vista de un programador.

Tratamiento de ficheros comprimidos
Pulsando CTRL+AVZ.PAG podemos introducirnos y navegar, como si de un directorio mas se tratara, en el interior de archivos comprimidos de casi cualquier formato (ZIP, ARJ, RAR, ACE, LHA, TAR…).
Por ejemplo, la actualizacion de una clase java en concreto dentro un modulo JAR o WAR (internamente son ZIPs pero con otro nombre) ya no es un lio, como sucede si usas Winzip o cualquier programa similar. Te introduces dentro del .EAR, despues dentro de tu .WAR, buscas la carpeta de tu clase y copias el fichero.

Visualizar rapidamente un archivo
Pulsando F3 abre un visor sobre el archivo actual (sea del tipo que sea) o pulsando CTRL+Q hacemos que el panel contrario sea un visualizador. CTRL+Q otra vez cierra este visualizador

Sincronizacion de directorios
Dadas dos carpetas, comparandolas y sincronizandolas puedes saber que ficheros le faltan a tu proyecto o que ficheros han cambiado. Y si dos ficheros son distintos, puedes compararlos para ver sus diferencias.
En esta nueva version, se pueden sincronizar carpetas dentro de archivos comprimidos (ZIPS, etc) y carpetas de red.
Por ejemplo, tienes tu proyecto por un lado con la carpetas de la aplicaicon web (un WAR) llenas de JSP y clases, etc. Y por otro lado, tienes la carpeta de la misma aplicacion WEB pero dentro del servidor de aplicaciones (JBOSS o Weblogic, el que sea) desde donde estas editando directamente los JSPs porque desde esa ruta es mas rapido (no tienes que desplegar la aplicacion, pues ya esta desplegada: editas el JSP y pulsas F5 en tu navegador).
Despues de trabajar un buen rato, se puede dar el caso de que tengas ficheros cambiados en tu proyecto y ficheros modificados en el directorio desplegado del servidor J2EE. Sincronizas las dos carpetas (Commands -> Synchronize dirs) y puedes saber que ficheros de cada lado han sido editados.
El proceso de sincronizacion se compone de tres pasos: comparar, filtrar/cambiar orden de copiado y sincronizar.
Al comparar, le decimos a Total Commander que mire que diferencias hay entre las dos carpetas elegidas. Podemos decirle que mire en subdirectorios (muy util), que lo haga por contenido o no (a veces puede tardar mucho comparar por contenido, desmarcando esta opcion, solo compara los tamaños y las fechas de ultima modificacion) o ignore las fechas (solo compara contenido y/o tamaño, pero no tiene en cuenta las fechas de modificacion). Una vez elegidas las opciones de comparación, le damos a comparar. Total Commander nos mostrará todos los archivos de las dos carpetas con una flecha que indica en que dirección deberían copiarse (según el).
Segundo paso, filtar y elegir dirección de copia. Pulsa los distintos botones de filtro de “Show” para visualizar los ficheros. Duplicates o singles te indica si quieres que te muestre los ficheros nuevos que han aparecido en un lado u otro (singles) o los ficheros duplicados que pueden haber sido modificados o no (duplicates). Una vez tengamos mostrados los ficheros que hemos localizado como modificados y que queremos actualizar, podemos dejar la dirección de copia tal cual esta o cambiarla. Es posible, por ejemplo, que queramos que un fichero más nuevo modificado sea sobreescrito con su versión antigua, en vez de escribir la antigua por la nueva. En ese caso, haciendo click en la flecha que une los dos ficheros podemos alterar el orden de copia (o ignorar ese fichero, para que no lo copie a ningun lado).
Tercer paso: le damos a sincronizar y Total Commander copiara cada fichero mostrado en la dirección elegida y volverá a compara las carpetas.
Realmente es muy util.