jueves, octubre 15, 2009

Hormiga (Poema)

Otro poema, del 98. De los que escribí luego de dejar de escribir.

------------------------------------------------

Tome mi disfraz de hormiga, y caminé,
Sólo,
En la fila de las negras voces,
En las voces de las grandes filas,
En las cara de siluetas desteñidas
y en tus labios rotos camine.

Solo para encontrar más negro,
Más cientos de hormigas disfrazadas de colores
Formadas como estrellas en una larga fila negra,
De silencios,
De misterios negros y oscuras cicatrices.

Vi como el silencio se desvanecía,
vi la luz, vi el mar
y vi una sonrisa perdida entre los destellos del viento,
luego la vi desaparecer.

Este manto negro que me cubre...
Este manto negro, piel de hormiga, que me esconde...
Como pesa ya este manto negro…!
Como pesa ya este tiempo eterno,
Como se me impregna por entre los poros esta tinta inmaterial,
que se va secando,
que se va apropiando de mis nuevos huesos negros,
de mi sangre, de mi alma y de mis ojos negros.

A donde me llevará la noche?
En que lugar susurrare ahora tu nombre,
Como poder recordarte si me olvido,
Si me pierdo en este oscuro horizonte?

Acércate más...
Acércate más que no te encuentro,
Acaríciame el rostro para saber que lo tengo,
Grita mi nombre,
No dejes que me olvide,
No dejes que me pierda,
Quítame este manto negro...

Piel de hormiga, hormiga adentro.

Caminar...
Por esta larga fila, caminar.
Por esta oscura línea, caminar.
Tanto tiempo y caminar,
Tanta hormiga y caminar,
Tanta tinta negra que se seca y nos envuelve,
Tan espeso el aire que nos une,
Ahorcándonos en esta tinta negra,
Y nos aprieta, y nos estrecha
y nos va juntando hasta que somos uno,
una sola línea,
mil puntos y una sola línea disfrazada en tinta negra,
y caminar,
Caminar...


carcasco .30.10.1998

miércoles, septiembre 16, 2009

Balanceo de Carga para dos websphere application server 6.1 usando mod_proxy_balancer

Hace varios días que vengo trabajando en un problema que me ha quitado el sueño y la tranquilidad.

Hace como mes y medio empece a leer sobre el tema de balanceo de carga desde Apache usando el mod_proxy_balancer.

http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

Desde las guías todo parecía sencillo. Sinceramente no estaba muy claro de las modificaciones que se estaban planteando, pero para variar, empece a probar sin terminar de leer la documentación :p

Hice unas pruebas y asumi que todo estaba funcionando bien. El tema se quedó dormido durante algún tiempo, pero luego tuve que retomarlo desafortunadamente con las fechas ya bastante apretadas.

http://www.howtoforge.com/load_balancing_apache_mod_proxy_balancer

Me pareció excelente que se pudiera tener no solamente el balanceo de carga sino la tolerancia a fallos. De manera que si un server se caía, podía seguir operando con el otro server.

-- la version 1 de mi httpd.conf
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /balancer-manager !
ProxyPass / balancer://clusterWAS/ stickysession=BALANCEID nofailover=On
ProxyPassReverse / http://192.168.15.124:9080/
ProxyPassReverse / http://192.168.15.127:9080/
<Proxy balancer://clusterWAS>
BalancerMember http://192.168.15.124:9080 route=http1
BalancerMember http://192.168.15.127:9080 route=http2
ProxySet lbmethod=byrequests
</Proxy>

<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Allow from all
</Location>
Hice unas pruebas y asumi que todo estaba funcionando. Pero desafortunamente en ese momento no puse mucha importancia al tema de la sesion.

Al tener mi servidor balanceando carga entre los 2 nodos, la mitad de los requerimientos va a un server y la otra mitad al otro. Pero... si entro a mi aplicacion y me firmo. Esto se guarda en una variable de sesion. Y balanceando la carga se pierde.... :(

Es decir..
Pinto pantalla de login (Nodo1)
Recibo parametros de login valido y guardo variables de sesion(nodo2)
Reenvio a pantalla de inicio (Nodo1)

El problema es que en el nodo1, nunca guarde variables asi que asume que no esta firmado y vuelve a pedir la clave.

Lei un poco sobre el tema y hablaba del stickysession.

Ahora que ya entendí les cuento que la famosa stickyession es una cookie con un id de session. Que tiene 2 partes. La session y el route.
CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg.-1

Esto lo pude ver gracias al pluggin firebug de firefox. Que en la pestaña de red muestra los paquetes enviados.

No obstante no lograba que funcionara en mi esquema.

Yo tengo 2 nodos con Websphere Application Server 6.1. Los 2 tienen la aplicacion instalada y funcionando.

Luego de buscar bastante y hacer bastantes pruebas encontré que la cookie de session se envía diferente en websphere que en tomcat. Y que el apache no la entendía.
CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg:-1

La diferencia es el ":" en lugar del ".".

https://issues.apache.org/bugzilla/show_bug.cgi?id=42513

No hay un parque para esto en los releases.

Tuve que recompilar el apache para inlcuir la modificación en el modulo. (esto será un post aparte).
El truco no era la recompilada de apache, el truco era, la recompilada en Windows de apache :S

Bueno... luego de recompilado el apache con la recomendación que dan en el bug. Logre que la cookie tuviera el formato adecuado... pero... aun así no funcionaba!

CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg.-1

Fue luego de esto cuando comprendí que el problema es que el -1 que estaba mostrando debía ser el nombre del nodo.

En algunos post, encontre que este valor es llamado route. y se configuraba en los tomcat como jvmrouteid. En websphere no encontraba nada por el estilo.

Un poco de suerte me llevo a una url donde se miraba el debug de una traza en websphere con balanceo de carga y hablaba de un Clone ID ... http://www-01.ibm.com/support/docview.wss?uid=swg27014498&aid=1

Buscando en la documentación encontre como configurarlo y funcionó.

http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.zseries.doc/info/zseries/ae/rprs_custom_properties.html
Application servers > server1 > Web container > Custom Properties

Para el nodo uno le puse un HttpSessionCloneId de "nodo1" y al otro "nodo2".

Ahora sí. Mis cookies quedaban de la siguiente forma:
para el nodo1:
JSESSIONID=0000gQCnyQMY94sb5oVXZsLU0lR:nodo1

para el nodo2:
JSESSIONID=0000gQCnyQMY94sb5oVXZsLU0lR:nodo2

Con mi apache recompilado y con mis cookies en buen estado procedí a realizar las configuraciones que me hacían falta en el apache.

Primero habilité los módulos necesarios:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so


Luego algunos parámetros generales de la configuracion:
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>


Configuré el balance con mis 2 nodos:
<Proxy balancer://clusterPerfilUno>
BalancerMember http://192.168.15.121:9080 route=nodo1
BalancerMember http://192.168.15.123:9080 route=nodo2
ProxySet lbmethod=byrequests
</Proxy>


donde dice "route=nodo1" es el nombre que haya puesto al cloneid en mi WAS. Luego hago el proxypass en mi aplicacion hacia el balanceo.
La stickysession la hago sobre la cookie que logre setear. Y seteo el reverse para el regreso de las conexiones.

<Location /app>
Order allow,deny
Allow from all
ProxyPass balancer://clusterPerfilUno/app stickysession=JSESSIONID nofailover=On
ProxyPassReverse http://192.168.15.121:9080/app
ProxyPassReverse http://192.168.15.123:9080/app
</Location>


Puse el loglevel en debug para rastrear posibles errores y me sale algo asi:
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(46): proxy: BALANCER: canonicalising URL //
clusterPerfilUno/app
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(280): ICON: proxy: BALANCER: Found value 00006BXDRmMTJiopXVx9UnRFUCR:nodo1 for stickysession JSESSIONID
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(296): proxy: BALANCER: Found route nodo1
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(579): proxy: BALANCER (balancer://
clusterPerfilUno) worker (http://192.168.15.121:9080) rewritten to http://192.168.15.121:9080/app
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy.c(993): Running scheme balancer handler (attempt 0)
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_http.c(1920): proxy: HTTP: serving URL http://192.168.15.121:9080/app

Si no tengo buena la cookie recibo el found value (null) for stickysession JSESSIONID.

con esto logre hacer el balanceo de carga usando mod_proxy_balancer con un websphere 6.1 en los nodos.

En los proximos días estaré haciendo pruebas de esto y si encuentro algo mas lo publico.

Espero poder publicar la recompilada del apache sobre windows y también una segunda alternativa que estuve a punto de implementar.

Cabe mencionar que el IHS de IBM es una alternativa que no logre a terminar de evaluar para resolver este problema.

saludos!

miércoles, agosto 26, 2009

ORA-04030: out of process memory when trying to allocate 123404 bytes

Hace algunos días empece a recibir errores extraños en una de nuestras aplicaciones. Ocasionalmente nos reportaban que no podian hacer algo o que no se mostraba cierta información, pero cuando volvían a probar la aplicacion empezaba a funcionar correctamnete.

El problema con este tipo de reportes, es que son bastante difíciles de encontrar y de replicar, por consiguiente se empiezan a volver difíciles de resolver.

La aplicación es una aplicación web en java que consulta una base de datos oracle, ambos servidores estan corriendo sobre windows.

Lo primero que hicimos fue empezar a generar logs adicionales a los bloques de codigo que pensabamos pudieran estar fallando, empezamos a encontrar errores de este tipo desde mis programas:

java.sql.SQLException: ORA-04030: out of process memory when trying to allocate 123404 bytes (QERHJ hash-joi,kllcqas:kllsltba)

y desde el sistema operativo empece a ver errores en el event viewer que decían que no se podía asignar memoria a un thread de la base de datos.

Aclaro que no soy DBA, soy desarrollador. Pero a veces como desarrollador es necesario involucrase en temas de infraestructura para poder identificar los problemas que suceden.

Tenía una maquina con 4gb de ram y cuando miraba la memoria de la maquina no pasaba de los 2gb.

Encontramos 2 temas que estaban causando el problema:
1. El servidor es un windows de 32 bits, y por ser un windows de 32 bits no puedo tener ningún proceso en ejecución con mas de 2gb de uso de memoria.
Se modifico el boot.ini del servidor para que pudieran utilizarse hasta 3 gb de ram en un solo proceso.

http://technet.microsoft.com/es-es/library/bb124810.aspx

2. Revisando los parámetros de la base de datos, encontré que se tenía configurado un SGA de 2GB y un PGA de 1.6GB. Por lo que el tamaño del proceso que estaría ejecutando el oracle llegaría a tener hasta 3.6 GB en memoria. Procedímos a cambiar los parámetros de configuracion de la base de datos para corregir el tema.

Este cambio se hizó en los parámetros, sga_target y pga_aggregate_target.

saludos!

sábado, agosto 01, 2009

Silla (poema)

Antes de ser programador (durante mi adolescencia) era más artístico. Escribí algunos poemas que a veces leo y que guardo con mucho cariño. Hoy publicaré un poema o escrito que hice hace ya algún tiempo en una fugaz comunicación entre los 2 lados de mi cerebro.

-------------------------------------------

Silla

Una mañana desperté, y estaba muerto. Escupiendo gusanos por mi ojos, estaba sentado frente al monitor de siempre, con la manos sobre el teclado, con raíces brotando de mis uñas y encarnándose en el decadente espacio de la alfombra.
Muerto.
Con un pequeño resplandor en mi rostro, reflejo del ups aún prendido.
A lo lejos, todavía se escuchan los susurros sobrantes de cientos de reuniones sobre la mesa, de miles de discusiones infructuosas y banales. Hoy nada.
Solo yo,
Muerto.
Desvestido ya; más la ropa está aún planchada sobre mis piernas.
No recuerdo cuando me quedé dormido, no recuerdo cuando olvidé mi nombre, o el tuyo. Solo sé que paso… y que seguía sentado.
Una mancha de café sobre la mesa... y en el amarillo de mis dientes.
¿Cuándo comenzó a endurecerse mi rostro… y cuándo mis manos?
¿Cuándo empezó a confundirse el día y la noche… y cuándo dejo de importarme?
Todo pasa… Y el pasado se convierte en un pequeño resentimiento a la nostalgia, y en seguir allí. Absorbiendo la luz del monitor, dejando que mis ojos se carcoman. Y mi voz, cada ves mas callada y sola.
Sentado.
¿Cuántas veces tendré que morir para olvidar esto?
¿Cuántas veces volver a pensar lo mismo… y seguir tratando?
¿Cuantos silencios?… solo quedo yo, sentado, destruyéndome, viendo como mi deformado cuerpo se esconde tras mi mente… Y la luz del monitor! siempre allí, prendido, con su maldito calor quemándome, pegando mis articulaciones hasta el punto de no poder levantarme.
Sigo aquí sentado en esta silla cada vez mas grande, las ventanas cada vez mas chicas, el frió del aire, la Luz del monitor, las gigantescas paredes, el inalcanzable techo, las enormes sillas y mis delgadas y secas piernas que se enredan en sus patas llegando a la alfombra, arañándola, rasgándola, como queriendo enterrarse. Y los gusanos que se arrastran por mi cuerpo y me comen.
Y me seco, y me muero… Ya mi cuerpo no responde y no se levantarme. Solo seguir sentado. Me quedo quieto… y por momentos duermo. Abro los ojos y es igual, duermo otra vez. Seguir tratando. Solo puedo a veces respirar, las noche cada ves es mas larga, y el amanecer que no termina de llegar. Vuelvo a dormir, despierto. Miro el reloj y sigue igual. La misma luz enfrente, mis manos igual. Cada ves mas oscuro y mas silencio.
Me estoy quedando solo.
Como molestan estos malditos gusanos.. y la luz! No me deja dormir, ni respirar. Y este café que me mata, y el silencio. Y este sueño que no acaba, esta noche interminable. La incomodidad de mi silla,
y volver a dormir…


carcasco - 02 de Octubre del 2,001

jueves, julio 09, 2009

Programando GreaseMonkey

Soy un adicto a Ikariam, lo acepto. :D

En mi alianza juego con gente de España y Argentina y nos cuesta un poco mantenernos sincronizados para algunas "campañas".

Decidí hacer un pequeño script para que al lado de la fecha pueda poner la fecha de GT y de ARG.

GreaseMonkey es un complemento de Firefox que permite pogramar javascripts adicionales a las paginas que sean actualizados en el browser. Algo asi como... modificar la pagina de cualquier servidor web con funcionalidad javascript programada por nosotros.

El ejemplo que use fue:
El server de Ikariam muestra la hora del servidor en españa. Yo quería modificar la pagina de ikariam para que al lado aparezca la hora de Guatemala y la de Argentina.

Las primeras lineas dan información del script:

// ==UserScript==
// @name HoraArgGua
// @namespace http://carcasco.blogspot.com
// @description Poner varios horarios en el ikariam
// @include http://s6.ikariam.es/index.php*
// ==/UserScript==

Las funciones que puse despues son cosas que solo utilicé de la misma pagina ikariam. Luego mi funcion de cambia de horario.

busco el elemento que quiero cambiar:
servertime = document.getElementById('servertime');

Si existe entonces creo un nuevo elemento:
detalleHoras = document.createElement('span');

Y lo inserto luego de ese. Es decir, agregue un tag de html extra a la pagina:
servertime.parentNode.insertBefore(detalleHoras, servertime.nextSibling);

Adicional hice la funcion que calcula la fecha (puro javascript) y cambio el innerHtml del elemento recién creado.

saludos!

Codigo Completo:
=================


// ==UserScript==
// @name HoraArgGua
// @namespace http://carcasco.blogspot.com
// @description Poner varios horarios en el ikariam
// @include http://s6.ikariam.es/index.php*
// ==/UserScript==

function dezInt(num,size,prefix){prefix=(prefix)?prefix:"0";var minus=(num<0)?"-":"",result=(prefix=="0")?minus:"";num=Math.abs(parseInt(num,10));size-=(""+num).length;for(var i=1;i<=size;i++){result+=""+prefix;}
result+=((prefix!="0")?minus:"")+num;return result;}

function getFormattedDate(timestamp,format){var currTime=new Date();currTime.setTime(timestamp);str=format;str=str.replace('d',dezInt(currTime.getDate(),2));str=str.replace('m',dezInt(currTime.getMonth()+1,2));str=str.replace('Y',currTime.getFullYear());str=str.replace('y',currTime.getFullYear().toString().substr(2,4));str=str.replace('G',currTime.getHours());str=str.replace('H',dezInt(currTime.getHours(),2));str=str.replace('i',dezInt(currTime.getMinutes(),2));str=str.replace('s',dezInt(currTime.getSeconds(),2));return str;}


function cambiarHorario() {
var d = new Date();
d.setMinutes(d.getMinutes()+d.getTimezoneOffset()-6*60);
var strHoraGt = "GT: "+ getFormattedDate(d, 'd/G:i');
d = new Date();
d.setMinutes(d.getMinutes()+d.getTimezoneOffset()-3*60);
var strHoraArg = "AR: "+ getFormattedDate(d, 'd/G:i');
document.getElementById('servertime').nextSibling.innerHTML=" | "+strHoraGt+" | "+strHoraArg;
}

iniciaCambioHorario = function() {
var servertime,detalleHoras;
servertime = document.getElementById('servertime');
if (servertime) {
detalleHoras = document.createElement('span');
detalleHoras.innerHTML="";
servertime.parentNode.insertBefore(detalleHoras, servertime.nextSibling);
}
cambiarHorario();
}

iniciaCambioHorario();

martes, julio 07, 2009

Extraño accidente en Zona 10

Hoy en el edificio hubo un extraño accidente, un carro por error (!!!) entró por las gradas del primer nivel en lugar de entrar por la rampa al parqueo ???!??


Es cierto, yo lo ví.. Al parecer era un señor de edad avanzada y como que se le descompuso el radar :D

viernes, julio 03, 2009

WordPress.com desde Guatemala resuelto

WordPress.com desde Guatemala resuelto

El "fallo" o "bloqueo" que habia mencionado fue corregido.

Que casualidad que 3 empresas distintas tuvieron el msmo fallo al mismo tiempo. :S

saludos!

martes, junio 30, 2009

Bloqueo de Blogs en Guatemala

Desde ayer vengo leyendo varios post relacionados a que en Guatemala estaba siendo bloqueado wordpress... me parecio al principio algo extraño y la verdad no tuve tiempo de revisar el tema.

WordPress es un sitio que al igual que blogspot provee de una herramienta para publicar blogs. Muchas personas en Guatemala lo utilizan como plataforma para publicar sus opiniones, muchas de ellas políticas.

Hoy tratando de leer mis feeds habituales me encuentro con que es verdad!!!! Tuve que salir por un proxy para poder leer los blogs que hablan del tema.

En uno de los blogs que leo hablan de Turbonett, yo ahora estoy navegando desde tigo movil y tambien esta bloqueado?!

Yo no soy de los que apoyan las teorías conspiradoras, pero esto me suena bastante preocupante. Esto es algo que uno podría pensar que estuviera pasando en IRAN o COREA del Norte, o que hubiera pasado hace 25 años.... pero hoy?

No me parece un bug de dns o algo por el estilo, porque no es posible que los distintos proveedores de internet tengan el mismo bug.

Hoy voy a llamar a mi proveedor de internet para exigir que vuelvan a habilitar este portal. Les invito a publicar esta noticia en su blog, en su twitter, en el mensajito de su msn y a llamar a su proveedor de internet para que les expliquen porque tienen bloqueado WordPress.

Adjunto el post escrito en el blog de Javier Gramajo, por si no pueden leerlo. La dirección es esta http://jgramajo.wordpress.com/2009/06/30/bloqueo-de-blogs-en-guatemala/

Bloqueo de Blogs en Guatemala (Javier Gramajo)

Las razones del bloqueo o fallo no las se y en cualquier caso hay que ir dos pasos más allá, mi recomendación es que para lo usuarios de cualquier sistema operativo se instalen TOR, además es muy importante que le expliquen a sus contactos como resolver este problema mandándoles las referencias a manuales que permitan la instalación adecuada y oportunamente.

Como presidente de la Comisión Técnica Intersectorial de Información e Informática del CONCYT estoy haciendo todas las averiguaciones oportunas y de ser necesario haremos un comunicado en relación al bloqueo y el atentado que posiblemente se esté cometiendo a la libre emisión del pensamiento en Guatemala, como ciudadano me preocupa el cierre voluntario pero abrupto de dos blogs o espacios que han sido seguidos por muchas personas FueraColom y PrensaNegra, no califico aqui lo acertado de cada espacio, si no la expresión clara de la democracia que impera o debería imperar en Guatemala, en relación a la libre expresión del pensamiento, libertad que se ha puesto en entredicho al señalar a miembros de la comunidad Bloggers o Twitteros como es el caso de Jean Anelu (carta abierta) o @jeanfer (entrevista).

El uso de las Tecnologías de la Información y las Comunicaciones TICs en Guatemala es de uso intensivo y los distintos indicadores en los que aparece Guatemala no son fiel reflejo de la realidad de un país como Guatemala, el uso de las TICs y las últimas noticias de impacto mundial, las actuaciones y manifestaciones de los últimos meses, ponen de manifiesto a un gran colectivo fundamentado en las TICs y como utiliza un medio trascendental para la búsqueda de una sociedad más equilibrada, desde mi perspectiva todos los sectores deberán poner más atención a uso e impacto que tienen las TICs en la sociedad Guatemalteca de hoy en adelante, si quieren ser coherentes con ese 43% de la población menor de 30 años de este país.

Se están realizando distintas propuestas dentro de la sociedad Guatemalteca quizá una de las más estructuradas sea la de ProReforma propuesta que deberá ser analizada por los distintos colectivos ya existentes y que deberia analizarse para que sea apoyada, no solo por las 70,000 firmas que ha recaudado si no por millones de Guatemaltecos, pero como todo deberá pasar por el consenso de cada Guatemalteco, quizá la única forma de que sea consensuada y validada radique en la utilización de las TICs, dependerá de la estrategia que sigan los que la proponen para social izarla por las redes sociales oportunamente, hay que mencionar que hay cuatro estados en un proceso de validación: Independencia, codependencia, contra dependencia, Interdependencia. No pretendo explicar cada uno pero quizá el más peligroso sea el de contra dependencia que es un estado el que cualquier propuesta será rechazada porque no se origina en el que la rechaza, Guatemala no necesita de personas contra dependientes, independientes (en su sentido negativo) y menos codependientes, necesitamos trabajar de manera interdependiente.

Finalmente muchos de los movimientos que se generarón en los últimos meses en Guatemala, lo cuales han fundamentado su actuar en las TICs, es en esos espacios donde debería calificarse si el movimiento se ha apagado o no, no entiendo como se está calificando la actuación de los distintos colectivos basados en la presencia o protesta física, en primer lugar es necesario un cambio de paradigma de los que participan y aquellos que califican en y a los movimientos, la protesta no está en la calles está en los blogs, en los mensajes, correos, cadenas, redes sociales, etc, y es por ello que es tan peligroso el hecho que hasta el día de hoy no se pueda acceder a los blogs publicados en espacios como wordpress.

Con el bloqueo de los Blogs que residen en wordpress, donde seguramente se generan más del 60% de los blog en Guateamala se están dejando de discutir temas como la Comisión de Postulaciones, el recurso interspuesto por los Rectores (artículo, opinión) de la universidades del país en la Corte de Constitucionalidad (articulo, declaraciones) así que sea fallo o bloqueo existen herramientas que permiten evadir cualquier de los anteriores, no quiero dejar de terminar sin recomendar a todos aquellos estudiantes o profesionales del sector TICs en Guatemala a que jamas utilicen su conocimiento para atentar contra la derechos fundamentales de cualquier individuo y ciudadano de un país.

Relacionados con el tema:

1.Carpe Diem

2.Guatemala Drummer

3.Maestros de la Web

4. Artículo: Prensa Libre se expresan en la web

5. ALT1040: Guatemala Bloquea acceso a WordPress


miércoles, mayo 27, 2009

Oracle busquedas like (fuzzy, contains, soundex)

Necesito hacer una busqueda por nombres, pero quiero que el sistema me diga si hay un nombre "parecido" en el sistema. Es decir, quiero buscar un cliente llamado Carlos Castañeda pero en la base de datos tengo varios similares, aunque ninguno igual:
Juan Carlos Castañeda
Carlos Castañeda Perez
Carlos Castaneda

La verdad estuve divagando bastante en el tema y no lograba encontrar el camino correcto.

Lo primero que busqué fue la funcion Soundex. Soundex es un algoritmo que hace equivalencias foneticas de 2 palabras. Por ejemplo ait con eight. Cada palabra tiene un valor soundex y si los valores son iguales, entonces, tengo un acierto.
select soundex('eigt'), soundex('eight') from dual
Ambos registros me devuelven E230 por lo que deben ser equivalentes.

Pero.... este algoritmo solo funciona en ingles. No para español.

Seguí buscando y encontre un blog con una implementacion plsql del soundex: http://oraclenotepad.blogspot.com/2008/03/soundex-en-espaol.html

Pero el soundex me compara solamente una palabra y yo quería comparar 2 nombres completos. Modifiqué un poco el codigo e hize una funcion que sacaba el soundex de cada palabra del nombre_a_buscar en el campo_nombre y si cumplía mas del N porciento entonces devolvía ok. Estaba bien, pero...

el performance se fue al suelo cuando quería buscar en una tabla con mas de medio millon de registros.

De dedique entonces a buscar la funcion CONTAINS de Oracle. Esta funcion me permite buscar en textos grandes. Separa las palabras de un texto y las indexa. Hay que crear un indice para utilizarla:

create index clientes_idx on temp (nombre) indextype;

ya ahi podía hacer consultas:
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'castañeda',1) > 0;

El contains devuelve un score con el que se evalúa el resultado. Mientras mas alto sea el resultado es mas exacta la busqueda.

Cuando busco con 2 nombres, este query me devuelve los resultados que tengan los 2 nombres, por ejemplo juan Carlos Castañeda o Carlos Castañeda Perez
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos castañeda',1) > 0;

pero... no me devuelve nombres como Carlos Alberto Castañeda Perez.

agregué un OR a la consulta
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda',1) > 0;
pero... me devuelve todos los carlos y todos los castañedas. Carlos Perez, Carlos Lopez, Juan Castañeda, Carlos Castañeda, etc.

Cambié la consulta a un AND y mejoró
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda',1) > 0;

Pero me posicionaba de igual manera el Carlos Castañeda del Carlos Jose Castañeda y del Carlos Castañeda Perez.

Necesitaba diferenciar las busquedas exactas.

Busque entonces:
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda or (carlos and castaneda)',1) > 0;

El query se empezaba a complicar un poco. Además estaba buscando tambien que me diera busquedas Fuzzy, es decir, busquedas que me devolvieran palabras que contienen "casi" todos los caracteres de la palabra a buscar.

en ese caso debía buscar
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, '?carlos or ?castañeda',1) > 0;

Encontré también algo que no había utilizado que es el "query template" que me permitiría tener un query un poco más sencillo, con esto deje mi query así:










Lo que hace la plantilla es partir la cadena que envio en textquery como si fuesen varios tokens, y además va evaluando progresivamente cada una de las opciones que le envío. Es decir, primero busca con AND para ver si estan todas las palabras:
transform((TOKENS, "{", "}", "AND"))

Luego busco con AND pero con palabras "fuzzy" o parecidas, añadiendo el "?"
transform((TOKENS, "?{", "}", "AND"))

Si quisiera que hiciera un soundex pondria un "!" antes del token. Pero el soundex es en ingles y no me sirve.
transform((TOKENS, "!{", "}", "AND"))

Luego hago lo mismo pero con OR para que busque alguna de las 2 palabras.

pero...
también estuve leyendo que el query no estaba sincronizado por default, habría que sincronizarlo.
begin
CTX_DDL.SYNC_INDEX('clientes_idx','50K');
end;
/

pero.. yo no quería sincronizarlo cada ves que ejecuto el query... así que cambie el indice para que se sincronice al hacer commit:

create index clientes_idx on temp (nombre) indextype is ctxsys.context parameters('sync (on commit)');

ahora sí, cuando quise buscar CASTANEDA o JOSE en lugar de josé no me devolvia los mismo valores. Consideras las tildes como caracteres distintos.

Encontre que el indice hay que indicarle que utilice un LEXER_BASIC.

Para esto me conecte como sys y me di grants: grant execute on CTX_DDL to scott;

ya en mi esquema, creé una preferencia con el LEXER que necesito:
begin
CTX_DDL.CREATE_PREFERENCE ('LEXER_SINTILDES', 'BASIC_LEXER');
CTX_DDL.SET_ATTRIBUTE ('LEXER_SINTILDES', 'BASE_LETTER', 'YES');
end;
/

recreé el indice:

create index temp_nombre_idx on temp (nom_contacto) indextype is ctxsys.context parameters('sync (on commit) LEXER LEXER_SINTILDES');

Con eso ya logré los resultados que esperaba. mmm... no del todo. No encontré un soundex que me diera mejores resultados sin sacrificar el performance. Pero tengo buenos resultados.

saludos!
Algunos de los links que leí... solo algunos:

http://hugoracle.blogspot.com/2008/07/mejora-de-desempeo-con-oracle-text.html
http://www.orafaq.com/forum/t/95509/2/
http://www.oracle.com/technology/products/text/pdf/10gtext_features_overview.pdf
http://www.oracle.com/technology/products/text/htdocs/prog_relax.html?_template=/ocom/print

martes, mayo 19, 2009

WSWS3549E: Error: WSDL2Java could not discover a suitable StubWriter for null.

Estabamos creando un cliente de webservice en Rational Web Developer 6.0.
El servicio estaba hecho en visual basic o .net
Cuando tratabamos de consumirlo recibimos un error de WSWS3549E: Error: WSDL2Java could not discover a suitable StubWriter for null.

Buscando un poco en la red, encontre que el problema es que RWD6.0 no utiliza soap 1.2 y por eso no me dejaba crear el cliente.

Encontré 3 posibles soluciones:
llamar a los desarrolladores del servicio y pedir que lo publiquen sin soporte soap 1.2, esto cambiando el web.config agregando estas lineas. Con esto logre crear el cliente correctamente.






Crear el cliente usando Axis, ahi logré utilizar el servicio.











Modificar "a mano" los wsdl quitando las llamadas a soap 1.2













Hasta ahí todo bien... pero... mas cosas pasaron en esa implementación....

Ref. http://www.ibm.com/developerworks/forums/thread.jspa?threadID=113283&tstart=30

continuará.-

jueves, abril 16, 2009

Error WSWS3047E al consumir un webservice en Rational Web Developer

Relacionado al Post Anterior, estabamos tratando de consumir un webservice desde el Rational Web Developer de IBM.
Cuando consumiamos el webservice desde visual basic o desde el SoapUi, lograbamos consumirlo perfectamente, pero al tratar de consumirlo desde el RWD6 nos daba error.

El problema específico que estabamos teniendo con este webservice es que luego de invocar al mismo, al traer los resultados de la ejecución nos estaba dando este mensaje:


WebServicesFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultString: org.xml.sax.SAXException: WSWS3047E: Error: No se puede deserializar el elemento cod_Cuenta del bean dataTransferObject.customerABE.customerDomain.framework.scl.tmmas.com.RegistroComercialDTO.
faultActor: null
faultDetail:

El servicio se ejecutaba, es decir, la llamada fue correcta y se hacian las acciones del servicio. Pero no lograbamos obtener el objeto que trae los resultados obtenidos de la ejecución. El servicio no fue desarrollado por nosotros y no teniamos acceso tampoco a los logs del servidor (del servicio) como para poder identificar el problema. Esto nos hizo perder mucho tiempo en pruebas infructuosas.

Instalamos y probamos el TCPMon para rastrear el problema y encontramos que la respuesta del webservice si se estaba enviando por la red, pero que (como dice el error) no se podía parsear. Cambiamos los wsdl con tipos de datos String asumiendo alguna posible incompatibilidad de tipos entre el servicio y el cliente. No funcionó.

Los servicios fueron desarrollados sobre WebLogic.

Luego de algunas investigaciones, encontramos que al parecer habia cierta información que se enviaba en la respuesta que no era acorde a las especificaciones RFC de XML. Y que esto es lo que estaba dando el problema.

http://www-01.ibm.com/support/docview.wss?uid=swg21220377


Procedimos a cambiar nuevamente el wsdl indicandole la propiedad
elementFormDefault="unqualified" al wsdl y recrear el cliente y apartir de ahi empezamos a consumir correctamente los servicios.

El unqualified es porque el weblogic no genera los namespaces usando las especificaciones RFC al 100% mientras que el websphere sí.


saludos!



miércoles, abril 15, 2009

TCPMon

Ayer tuve que trabajar en un problema complicado relacionado con un webservice. No lograba encontrar el error. Probaba el servicio desde unas aplicaciones en .net y funcionaba correctamente, pero al probarlo desde mi aplicación java, enviando los mismos parametros no lograba hacerlo funcionar.

Leyendo en internet encontré un producto buenísimo que se llama TCPMon. Este me sirvió para poder ver los paquetes enviados por la red, como un sniffer. Con esto pude rastrear lo que estaba enviando al WebService y lo que me contestaba exactamente y así logré encontrar el error.

Yo estaba consumiendo un servicio en el SERVERXXX con el puerto 7103.

Lo que hice fué configurar para que TCPMon actuara como listener y en un puerto 7199 y apuntara a SERVERXXX:7103.
Cambie mi aplicacion para usar localhost:7199 y pude rastrear todos los mensajes que pasaban por la red.

Me parece una aplicacion muy util para temas de webservices, aplicaciones que leen datos de sockets, analisis de paquetes http.

saludos!

sábado, abril 04, 2009

Configurar Memoria en un Websphere application server 6.1 (WAS6.1)

Como Configurar el tamaño de la Memoria en un Websphere application server 6.1 (WAS6.1)

Hace algún tiempo tuve que reconfigurar la configuración de la memoria de un WAS. Un tema "relativamente" facil. Hoy lo haré de nuevo, les cuento los detalles:

Creo que por default el servidor asigna un rango de 256MB a 512MB.


Entro al administrador y busco el servidor de aplicaciones que tengo configurado.


Busco las opciones del JVM, donde dice "definición de procesos". (mi was esta en español :s )

y luego seteo el tamaño de memoria (heap) maximo e inicial.

aplico los cambios y luego bajo el servidor. C:\IBM\WebSphere\AppServer\bin>stopserver server1 ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\stopServer. log ADMU7702I: Dado que server1 se ha registrado para ejecutarse como un servicio de Windows, la petición de detener este servidor se realizar deteniendo el servicio de Windows asociado. ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\stopServer. log ADMU0128I: Iniciando herramienta con el perfil AppSrv01 ADMU3100I: Leyendo la configuración para el servidor: server1 ADMU3201I: Se ha emitido una petición de detención del servidor. Esperando el estado de detención. ADMU4000I: La detención del servidor server1 ha finalizado.


Reinicio el servidor:
C:\IBM\WebSphere\AppServer\bin>startserver server1 ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\startServer .log ADMU7701I: Dado que server1 se ha registrado para ejecutarse como un servicio de Windows, la petición de iniciar este servidor se realizará iniciando el servicio de Windows asociado. ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\startServer .log ADMU0128I: Iniciando herramienta con el perfil AppSrv01 ADMU3100I: Leyendo la configuración para el servidor: server1 ADMU3200I: El servidor se ha iniciado. Esperando el estado de inicialización. ADMU3000I: Servidor server1 abierto para e-business; el ID de proceso es 2920

Luego de esto... listo! el server tiene nueva memoria.


Troubleshooting
Cuando hice esto hace algún tiempo, tuve el problema de que por alguna extraña razon el servidor no levanto por falta de memoria. Es decir, le estaba asignando mas memoria de la que el servidor tenía. (esto probablemente lo detalle en un post luego del cambio que haga hoy ;)
Esto me provocó que no pudiera entrar al administrador de was a configurar nuevamente la memoria.

Lo que hice fue buscar el archivo server.xml C:\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\carloscNode01Cell\nodes\carloscNode01\servers\server1\server.xml
Y modificar la configuración de la memoria desde el archivo de texto:
initialHeapSize="512" maximumHeapSize="1024"

luego reinicie el server y funcionó de nuevo ;)

saludos!

viernes, marzo 27, 2009

Pool de conexiones en websphere - Connection reset

Me tope con el problema, de que en una aplicación habia un proceso que funcionaba y al rato dejaba de funcionar...

Leyendo logs encontré este error:
com.ibm.websphere.ce.cm.StaleConnectionException: Io exception: Connection reset
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

Pero si entraba a probar la conexion funcionaba...

No estoy seguro si la conexión fue cerrada por el servidor de base de datos o por caídas de conexión, pero la conexión fue cerrada.

Cambie las propiedades del pool de conexiones para forzarlo a verificar si la conexion esta activa antes de utilizarla. Esto es ponerle un sobrecosto al ejecutar conexiones, pero nos asegura que el pool tenga conexiones disponibles y funcionales.

En propiedades avanzadas del origen de datos:Cambio la propiedad para que se prueben las conexiones:

Esto suena util si la base de datos te cierra las conexiones inactivas por cierto tiempo o si la conexion entre el servidor de aplicaciones y el servidor de base de datos es inestable.

saludos!

lunes, marzo 23, 2009

Error ORA-27102 al modificar el sga_max_size en oracle

El sabado me topé con un error en una base de datos. Un error que me complicó un poco más de la cuenta.

Necesitabamos modificar los parámetros de memoria asignada al SGA de una base de datos. Lo que hicieron fue modificar el sga_max_size de Oracle para que consumiera más memoria de la que se tenía.

El problema fue que luego de hecho el cambio y reiniciada la base de datos, la misma no levantaba.

Revisando logs encontré que me daba un mensaje:
ORA-27102: Out of memory
OSD-00022: aditional error information
O/S-Error: (OS 8) Not enough storage avaible

Resulta que la maquina donde estaba instalado el oracle era un nodo de un VMWARE y al tratar de asignar la memoria no se encontró espacio de memoria suficiente.

Hasta aca todo normal, sería solo de modificar de nuevo los parámetros y reiniciar.

Ingrese al sqlplus:
sqlplus /nolog
connect / as sysdba

trate de subir el pfile al spfile y levantar la base de datos:
CREATE spfile FROM pfile='c:/initORCL.ora';
startup

Y me dio un error:
ORA-27100 shared memory realm already exists

mmm.... la base esta levantada? probe bajarla
shutdown immediate
ORA-27101 shared memory realm does not exists

Y entonces.. ni esta arriba ni esta abajo ???! Buscando en internet encontre un par de paginas que habia una especie de bug de oracle que te dejaba la base de datos asi...

Que hice?

* baje el servicio de oracle
* baje la base con linea de comando oradim -shutdown -sid ORCL -shuttype srvc,inst
* me conecte al sqlplus
* sqlplus /nolog
* connect / as sysdba
* Cambie el pfile
* CREATE spfile FROM pfile='c:/initORCL.ora';
* Levante la base usando el nuevo pfile
*

oradim -startup -sid ORCL -starttype srvc -pfile c:/initORCL.ora

Ahi ya me pude conectar.. pero la base no levantaba automaticamente. Lo siguiente es lo que creo que hay que hacer.. pero no quise hacerlo porque ya eran las 4:00am... y debiamos estar con la base levantada en produccion.. (ohh... fue en una base de datos en produccion).-

* Borrar el servicio de oracle oradim -delete -sid ORCL
* Recrear el servicio de oracle oradim -new -sid ORCL -pfile c:/initORCL.ora

y ya....

Saludos!

Ref.
http://www.dba-oracle.com/t_ora_27100_shared_memory_realm_already_exists.htm


http://newsgroups.derkeiler.com/Archive/Comp/comp.databases.oracle.server/2005-10/msg01447.html

jueves, febrero 26, 2009

Tráfico y Descentralización

Yo vivo en Antigua Guatemala (a 45km de la capital) y trabajo en la zona 9 de la capital de Guatemala. Trabajo en la capital porque en Antigua no se consiguen la mismas oportunidades que en la Capital. La mayoría de "buenos" trabajos se encuentra en la capital y centralizados principalmente en las zonas 9 y 10.

He viajado a la capital durante 12 o 13 años asi que el tema del viaje no me afecta. Pero en mi recorrido paso por una de las arterias principales de la ciudad y esto me afecta enormemente en mi viaje.

Ultimamente el tema de tráfico se ha vuelto cada vez mas complicado, tanto que ahora incluso se encuentra congestionamiento de vehículos entrando a la capital desde antes de las 5:50am.

Como la mayoría de conductores paso mucho tiempo esperando que fluya el tránsito. Este tiempo me ha servido para reflexionar sobre este tema. Durante este tiempo te pones a pensar y proponer posibles rutas alternas, posibles ampliaciones de rutas y algunas otras alternativas para resolver el problema.

El problema que veo es que a mediano-largo plazo, no importa que tanto se amplien las carreteras y que tantas rutas alternas se vayan creando el congestionamiento continuará. Esto porque la mayoría de empresas "corporativas" se encuentran en la misma zona. Para evitar problemas de congestionamiento a largo plazo será necesario empezar a establecer políticas de "descentralizacion" en las que se promueva la creación de nuevas areas industriales, corporativas o comerciales.

La mayoría de las personas vive en "ciudades dormitorio" en las afueras de la capital y salen a sus trabajos en el centro (centro y zonas 9-10) de la ciudad.

El gobierno debería de fomentar la creación de zonas en las que las empresas y corporaciones puedan construir edificios, comercios y que no esten precisamente dentro de el centro de la ciudad.

Mi propuesta es crear varias de estas zonas, una en San Lucas Sacatepequez (para quienes ingresan de Occidente) otra cerca de Amatitlán, otra por Carretera al Atlantico (en Palencia?), otra en Pinula... de manera que flujo de personas a su trabajo sea hace "afuera" de la ciudad.

No estoy inventando el agua azucarada... En Santa Fé Mexico se ve algo parecido... en Costa del Este en Panamá también.

Como promover esto? Pues el gobierno debería de buscar zonas con características que permitan contruir varios edificios, debería de proveer infraestructura como carreteras (planificadas y amplias), transporte público y servicios básicos. El gobierno podría tambien de negociar con las TELCO's grandes para que ellas se encarguen de crear enlances a Teléfono, Internet y estos servicios talvez con anillos de fibra optica.


Habría que promover la creación de centros comerciales y de edificios. ¿como hacer esto con dinero de la empresa privada? Podrían eliminarse impuestos de construccion, podría incluso pensarse en que los gastos de construccion en estas areas puedan ser deducibles de impuestos. El area debe ser grande, para que no quede como un par de edificios sino que sea una "ciudad completa" donde los inquilinos se seintan cómodos, seguros y que tenga accesibilidad para los empleados, los ejecutivos y este interconectada (aunque sea digitalmente) con la ciudad principal (la capital).

Es bastante inversión y es algo a largo plazo... pero.. imaginen a toda la gente de Villa Nueva, Villa Canales y Petapa viajando hacia amatitlan en lugar de hacia el centro... y la gente de Mixco hacia San Lucas... Eso segmentaría el flujo de automoviles hacia el centro disminuyendo bastante el trafico en zonas como el trebol, liberación y reforma.

Se motivaría la inversion de capital nacional y extranjero en infraestructura, se proveería de nuevos medios de trabajo a la gente de departamentos aledaños a la capital (Antigua, Chimaltenango, Escuintla, Santa Rosa, El Progreso).

Creo que es hora de que empecemos a planificar soluciones integrales a los problemas y que empecemos a "fundar" nuevas cidudades diseñadas para la realidad actual.

Esta es una de las varias ideas que van surgiendo al respecto... tambien se puede pensar en ampliar carreteras, en promover el transporte colectivo (añadiendo seguridad... ), en hacer trenes de alta velocidad... en un metro (o transmetro)... incluso en planificacion familiar... (para que no seamos tantos. ) ... seguro hay otras alternativas...

¿más ideas?

martes, febrero 17, 2009

Hackearon www.maestrosdelweb.com !

Hoy empece el día con mi lectura habitual de blogs y me tope con la sorpresa de que hackearon el sitio de Christian Van Deer www.maestrosdelweb.com. Al parecer robaron la administracion del dominio en el dns. Este sitio tiene muchas visitas y un excelente ranking en los buscadores. Segun he leido será un poco complicado hacer que le devuelvan el sitio e inclusive tendra que utilizar abogados para gestionar esto.

No acostumbro escribir sobre lo que leo en otros blogs porque igual alguien ya lo publico, pero esta noticia creo que vale la pena que se divulgue lo mas posible para "presionar" hasta donde sea posible para que GoDaddy devuelva el dominio al dueño original.


Cuando inicié a trabajar en ambientes Web fui durante bastante tiempo un asiduo lector de las listas de correo de esta página, de sus articulos y ahora de los blogs.

Sea cual sea la razón por la cual perdió su sitio esperemos que recupere rapido su dns y que le afecte lo menor posible.


http://dumitraqui.guateblogger.com/2009/02/maestros-del-web-foros-del-web.html

http://www.aeromental.com/2009/02/16/maestros-del-web-y-foros-del-web-quedaron-offline/

viernes, febrero 13, 2009

Google Sync sincroniza Contactos

Hace algunos días leí en blogs que google sync ahora ya sincroniza contactos. La funcionalidad esta buenísima, con eso me aseguro de tener un backup de mi libreta de direcciones en mi cuenta de gmail.

El tema de los contactos siempre ha sido complicado porque tengo unos en el "outlook (o thunderbird)" otros en el telefono y otros en mi mail.. Ahora ya sincronizo entre mi telefono BlackBerry y mi gmail. Hace tiempo estuve usando el zindus para thunderbird... tendre que retormarlo ya que este sincroniza thunderbird con gmail.

Esto no es tan util para quienes tiene exchange y sincronizan ahi todo, pero en mi caso esta perfecto.

Para descargarlo simplemente entre a http://m.google.com/sync desde mi blackberry


saludos!

jueves, febrero 05, 2009

Instalar un certificado SSL en un IBM Websphere 6.1

Mas de alguna vez me he topado con el problema de instalar un certificado SSL en Java. Hoy nos toco instalarlo en un Was 6.1 (Websphere Application Server de IBM).

¿porque necesitaría instalarlo?

Porque tengo una aplicacion java instalada en el WAS que necesita consumir un servicio proveído por otra maquina mediante SSL, por ejemplo: consumir un webservice en una direccion https, crear usuarios en un LDAP, leer el contenido de un https.

¿porque es complicado?

Realmente no es muy complicado pero es un poco dificil conseguir documentacion ya que la mayoría de documentación relacionada esta orientada a Tomcat, o a configurarlo en un JVM usando herramientas como el keytool. Ademas que las busquedas en google regularmente te refieren a como instalar un SSL en tu WAS o a como conectar tu WAS a un LDAP con SSL.

¿que error me da?

Si trabajo con conexiones SSL sin tener los certificados registrados, me aparecen errores como:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Could not find trusted certificate

Handshake terminated SSL engine: CLOSED at com.ibm.ws.webservices.engine.transport.http.HttpOutboundChannelConnection.connect(HttpOutboundChannelConnection.java:752) at com.ibm.ws.webservices.engine.transport.http.HttpsOutboundChannelConnection.connect(HttpsOutboundChannelConnection.java)

¿que debo hacer?
La idea es encontrar el lugar de almacenamiento de los certificados en JVM (keystore) y registrar los certificados de las urls en las que confiamos. Es decir si me voy a conectar a https://banco.com.gt debo de instalar el certificado de banco dentro de mi JVM.

En un tomcat buscaría el JRE que se esta ejecutando e instalaría el certificado: "keytool -keystore cacerts -trustcacerts -import -file xxx.cer".

pero para el WAS 6.1 no puedo hacerlo de esa manera.

WAS 6.0 funciono usando el keytool de la JRE que viene en WAS.

¿que debo hacer?

1. ir al sitio del banco y desde el explorador descargar el certificado.


2. En el sitio administrativo de WAS, buscar la opcion de "almacenes de claves" y desde ahi configurar los certificados:

Seleccionar las opciones de certificados firmados

y ahi busco el certificado default para el Nodo/celda en la que estoy trabajando dentro de WAS.Aqui agrego el archivo CER generado y con esta información ya dejo registrado el certificado de banco como confiable (trusted).



Luego de esto se reinicia el WAS y las aplicaciones ya encuentran los certificados como confiables y establecen la conexion.

saludos!