Entradas

Tomcat Native Library

La documentación del Tomcat Native dice que se puede encontrar esa biblioteca en el directorio $TOMCAT_HOME/bin.. pero cada vez que inicio el tomcat me aparece la advertencia "se encontró la versión 1.1.3, considere actualizarlo a una versión superior al 1.1.4"... pero debería venir eso con el tomcat!.. je, encontré un servidor mirror con esos archivos: http://tomcat.heanet.ie/ Aunque ahora que lo pienso... creo que debí examinar su sección " browse download area " de la sección " Tomcat connectors downloads ". ¡AH! no olvidar bajar el APR ( Apache Portable Runtime ) y compilarlo antes de compilar el Tomcat Native Library . Asegurarse que sea la última versión. Si viene el APR de un RPM (como en CentOS o Fedora), desinstalarlo antes.

String to XML

Necesitaba una función que me permitiera convertir una cadena en un objeto para manipular XML. Lo que hacía era crear un archivo .xml, le colocaba la cadena, lo cerraba y lo abría después con el objeto Document. Pero aquí tengo otra función mejor String xmlString = request.getParameter("PARAM1"); //obtengo la cadena DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //un factory DocumentBuilder builder = factory.newDocumentBuilder(); //el documento Document document = builder.parse(new InputSource(new StringReader(xmlString))); //aqui le paso al Document

SCJP 5 - Genericos

Estudiando para dar mi examen de SCJP 5 encontré algo que llaman "genéricos". Recordarás que ahora las colecciones ahora pueden ser con tipo: ArrayList perros=new ArrayList (); perros.add(new Perro("Fido")); se ve bonito, y luego bueno de esto es que el compilador no permitirá algo como esto: perros.add(new Integer(1)); Así, también se cumple la herencia: List perros=new ArrayList (); Pero esto no se puede hacer: import java.util.*; class Animal{} class Perro extends Animal{} public class Test { public static void main(String[] args){ List< Animal > animales=new ArrayList< Perro >(); } } ¿Por qué? ¡si Perro ES-UN animal! Pues bien, esto corrige un problema que tienen los arreglos comunes: import java.util.*; class Animal{} class Perro extends Animal{} class Gato extends Animal{} public class Test { public static void main(String[] args){ Perro[] perros=new Perro[]{new Perro()}; //arreglo de perros agre

Vergüenza de programador

Para el escale utilicé al principio Hibernate, pero me fue pesado aprender HQL, y los reportes que emitia se cortaban. Así que pasé a iBatis Mapper y me fue más fácil, flexible y rápido.. incluso usé iBatis DAO por su idependencia de implementación DAO. Pero desde que lo puse, no recuerdo qué mes, el procesador se satura con el java... llegaba a ocupar casi el 100% del procesador... y mandaba error de Java Heap Memory (no indicaba la línea) Continuamente reiniciaba el tomcat, modifiqué el pool de conexiones, aligeré código de consultas... y nada. Incluso puse en un cron para que se reinicié el tomcat cada 2 horas..... y nada. Encontré en la web que el kernel de linux que usaba (2.4) provocaba ese error con java.. así que cambié a CentOS 4.4 Y nada. Prácticament al día tenía que reiniciarlo manualmente 6 veces. Supuse que el diseño de la página estaba mal, xq hacia llamadas recursivas para mostrar el menú de opciones.. así que con mi compañero nos pusimos a pasar todas las páginas a

Leyes del programador

Imagen
Hace tiempo encontré esto, me parece muy bueno. Todo programa que empieza bien, acaba mal. Todo programa que empieza mal, acaba peor. Siempre trabaja en equipo al hacer algún programa, esto da oportunidad de echarle la culpa a otro. Si el Debuggear es el proceso de remover Bugs, entonces el programar debe ser el proceso de ponerlos Por cada Bug que elimines en un programa, aparecen tres más. Programar es como el sexo, un error y hay que soportarlo para el resto de la vida. Las dos frases más repetidas y más falsas en la programación: "Esta ocasión si correrá bien" y "Acabo de encontrar el último Bug". Todos los programadores en esencia son optimistas, hasta que terminan su programa. Cada programa interesante tiene cuando menos una variable, un procedimiento, un loop.....y de hecho un bug. Las computadoras siempre tienen una excusa, los programadores no. No importando cuanto tiempo hayas probado la versión final de un programa, los bugs aparecerán en la

iBatis Datamapper (sql maps) parte 1

El framework iBatis DataMapper (también conocido como SQL Maps) permite reducir significativamente la codificación en java para una aplicación que maneja base de datos relacional. Quizás la primera impresión que uno tenga es que sea igual a Hibernate (que es un mapeador de objetos con tablas relacionales – ORM). Ibatis es diferente. Como veremos en este tutor, iBatis mapea las consultas SQL y permite interactuarlas con JavaBeans tanto como parámetros de entrada y como salidas. Manos a la obra Para comenzar, obtendremos el framework de la página de ASF: http://ibatis.apache.org/ El archivo que habremos bajado (iBATIS_DBL-2.1.7.XX.zip) contendrá tres archivos .jar. En este tutor solo usaremos ibatis-common-2.jar y ibatis-sqlmap-2.jar. No necesita de algún otro .jar, al menos para este capítulo. Definiendo la estructura de los datos Crearemos nuestro JavaBean Categoria con la siguiente estructura. package com.jugperu.tutores.ibatis.beans; public class Categoria { private int id; // p

AJAX

Imagen
¿Qué es AJAX? Imaginemos que estamos haciendo un formulario web de registro de clientes que tiene cuarenta campos. Tres de esos campos son combos para “departamento”, “provincia” y “distrito”. Al seleccionar un “departamento”, el combo “provincia” se debe actualizar con el contenido correspondiente. De igual manera, al seleccionar una “provincia”: sus distritos correspondientes deberán aparecer en su respectivo combo. Para implementarlo tenemos dos maneras: Colocar en el evento “onchange” de los combos un submit() para que se envíe el formulario actual al servidor, y éste devuelva el mismo formulario (sin perder los valores de los demás campos) sólo para que actualice las opciones de los combos afectados. Como se puede predecir, se estaría desperdiciando el ancho de banda enviando todo un formulario sólo para cambiar uno o dos campos. Eso, sin contar que la programación de los submit() en el lado del servidor debe estar contemplada para saber que lo que hizo fue cambiar un combo o se