martes, 17 de noviembre de 2009

Ubuntu 9.10 - Compartir ThunderBird con windows

Bueno, acabo de formatear mi maquina y ando con la intensión de poner ubuntu.

¿porque?

porque me gusta y porque es algo que quería hacer desde hace tiempo. Al final de cuenta, soy un poco geek.

Espero poder hacerlo, mientras logro acostumbrarme y configurar todo tengo mi computadora con 2 particiones, una en Windows 7 y otra con Ubuntu 9.10

Lo primero y lo principal para mí es tener mi correo funcionando. Hace algun tiempo que uso thunderbird en windows y me va bien.

En algun momento algun compañero me comento que tenia el thunderbird en windows y linux compartiendo los archivos.

Esa fue mi primer misión: Poder usar mi correo en thunderbird desde linux y windows en un solo repositorio (pst dirían los que usan outlook).

0. Saqué un backup de la carpeta donde estaban mis archivos de thunderbid (c:/user/USUARIO/appData/../thunderbird/profiles/perfil.perfil

1: hice la particion de windows e instale. Deje el resto de disco sin particionar.

2: instale ubuntu y cree la segunda particion para el sistema operativo (la de swp tambien).

3. cree una particion adicional en ntfs con el resto de mi disco. desde windows.

4. copie mi backup del perfil en la carpeta de la unidad adicional.

5. cambié el archivo c:/user/USUARIO/appData/../thunderbird/profiles.ini con esto:
[Profile0]
Name=default
IsRelative=0
Path=d:/Perfil
Default=1

6. levante el thunderbird desde windows y funcionaba calidad.

7. cambie el fstab para que en linux siempre monte automaticamente la particion compartida. agregué esta linea:

/dev/sda4 /media/Datos ntfs users,defaults,umask=000 0 0

8. instale el thunderbird desde el Synaptic

9. modifique el archivo /home/USUARIO/.mozilla-thunderbird/profiles.ini con lo mismo que puse en windows pero con la carpeta montada /media/Datos/Perfil

10. Arranque thunderbird y todo nitido.

Ahora puedo cambiarme linux windows sin perder los correos que voy trabajando.

saludos!

jueves, 15 de octubre de 2009

Micro Howto para crear un repositorio cvs.

#crear un repositorio
mkdir /cvs/nombre
cvs –d /cvs/nombre init
chmod 655 /cvs/nombre -R
chown cvs:cvs /cvs/nombre -R

donde cvs:cvs es el usuario y role creados para manejar el cvs.

jueves, 1 de octubre de 2009

Quitar Tunnel Adapter Local Area Connection* 9 en windows 7. (deshabilitar ipv6)

Desde que instale windows 7 en mi maquina, al darle ipconfig me empezaron a salir algunas conexiones "raras".

Tunnel Adapter Local Area Connection* 9
Tunnel Adapter Local Area Connection* 10
Tunnel Adapter Local Area Connection* 11
etc...-

Realmente muy molestas porque no me dejaban ver la información de la red. Igual cuando daba un route print.

Encontre que el problema es porque el windows 7 trae por default el ipv6 configurado. Se que es el futuro del ip y que algun día portaremos a eso, pero hoy no lo necesito.

Encontre como quitarlo en el siguiente link:
http://www.lboro.ac.uk/it/vista/ipv6.html

saludos!

jueves, 24 de septiembre de 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 cloneid 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, 26 de agosto de 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!

jueves, 9 de julio de 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();

viernes, 3 de julio de 2009

Error interno al mostrar un error interno ?

Un hermoso error de aquellos que no se ven todos los días:












Disculpen la resolución pero fue tomado desde un Celular, el mensaje dice:

Se ha producido un error interno mientras se mostraba un error interno.

WTF :S !?

saludos!

jueves, 2 de julio de 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, 30 de junio de 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, 24 de junio de 2009

Obtener el Nombre de la maquina a partir de una IP

Mas de alguna vez me he topado con que tengo la ip de una pc y quiero saber quería saber de quien es la maquina (el nombre).

Para buscar el nombre de la maquina desde una ip uso este comando dos.

C:\Users\carcasco>ping -a 192.99.99.99

Haciendo ping a carlosc [192.99.99.99] con 32 bytes de datos:
Respuesta desde 192.99.99.99: bytes=32 tiempo<1m TTL=128
Respuesta desde 192.99.99.99: bytes=32 tiempo<1m TTL=128
Respuesta desde 192.99.99.99: bytes=32 tiempo<1m TTL=128
Respuesta desde 192.99.99.99: bytes=32 tiempo<1m TTL=128

Estadísticas de ping para 192.168.15.225:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 0ms, Máximo = 0ms, Media = 0ms

miércoles, 27 de mayo de 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, 19 de mayo de 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, 16 de abril de 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, 15 de abril de 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, 4 de abril de 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, 27 de marzo de 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, 23 de marzo de 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

domingo, 22 de marzo de 2009

Internet movil de Tigo: Errores en el DNS, firewall??

Ya llevo unos 3 meses con el Internet Móvil de Tigo y hasta el momento no había tenido ningún problema con el.

Hace un par de días me disponía a instalar un antivirus para mi computadora. Entre a google, y busque el Avast. Al intentar ingresar, me lanzaba un error de que no se encontraba el sitio.

Bueno, a buscar el AVG o el Avira. Pero otra vez error!

Entre a gmail, a yahoo, youtube, etc. y todo andaba bien. Entre a microsoft y error también.

Llame a tigo y me dijeron que había un problema con el servicio, que desconectara el módem porque lo iban a reiniciar.

Lo hice y nada. Volví a llamar y me dijeron que: "En este caso tendremos que esperar a la próxima semana para que lo revisen en el departamento técnico..."

Esto sucedió un sábado, espero a ver que solución me dan y que tan rápido.

Por el momento, usé el servicio de ping online para obtener la Ip de avast y bajar mi antivirus :P

miércoles, 18 de febrero de 2009

Optimización pl/sql Oracle 10g


Hace un tiempo estaba trabajando en un proyecto que requería hacer grandes candidades de procesamiento en la base de datos (pl/sql en un oracle 10g).
Entre muchos paquetes que fue necesario crear, estaba el principal que llegó a tener mas de 7000 lineas.

Este paquete tenía que generar código pl/sql dinámico en base a tablas de configuración y luego aplicar este código a un repositorio de transacciones.

El rendimiento era muy importante por lo que era necesario que el procesamiento de las transacciones fuera hecho de la manera más óptima. Googleando me encontré con esta solución.

Oracle trae una paquete de optimización: DBMS_PROFILER. El DBMS_PROFILER es como un log con cronómetro que se activa antes de empezar con la ejecución, de código en la base de datos. Luego de registrar la información, por ejemplo, cuantas veces se ejecutó un linea de código o cuanto tiempo representó la ejecución de una línea de código con respecto al tiempo total de ejecución.

Los pasos para usarlo son:

1) Verificar que existan las siguientes tablas

- plsql_profiler_runs
- plsql_profiler_units
- plsql_profiler_data

Si no existen, buscar en: /opt/oracle/product/10.2/client_1/rdbms/admin # cat proftab.sql , este archivo contiene la definición de las secuencias y tablas necesarias.


2) Con bloque de código como este se activa el DBMS_PROFILER.

BEGIN
--Activar el DBMS_PROFILER
DBMS_OUTPUT.PUT_LINE (
DBMS_PROFILER.START_PROFILER ('mi_procedimiento ' TO_CHAR (SYSDATE, 'YYYYMMDD HH24:MI:SS') ) --Para identificar mi log
);

MI_PROCEDIMIENTO('param1',10); --Ejecutar normalmente el procedimiento
COMMIT;

--Desactivar el DBMS_PROFILER
DBMS_OUTPUT.PUT_LINE (
DBMS_PROFILER.STOP_PROFILER);
END;

Al ejecutar el procedimiento se han registrado las estadísticas.

3) Con este query se podrá observar el porcentaje de tiempo usado por cada unidad de procesamiento (un trigger, un procedimiento, una funcion, un paquete, etc.)

select unit_name,unit_number,unit_times.tiempo/t.total*100 as "%"
from
(
select p2.unit_name, p2.unit_number, sum(p3.total_time) tiempo
from plsql_profiler_data p3, plsql_profiler_units p2
where p3.RUNID = p2.RUNID
and p3.UNIT_NUMBER = p2.UNIT_NUMBER
and p2.runid = :runid
group by p2.unit_name, p2.unit_number
order by unit_number asc
) unit_times,
(
select sum(total_time) total
from plsql_profiler_data
where runid = :runid
) t
order by 3 desc

Para saber cual es el runid (el parámetro usado en el query) vea la tabla plsql_profiler_runs, identifíquelo con el nombre que le asignó al iniciar el DBMS_PROFILER.

Un ejemplo del resultado del query:



El UNIT_NUMBER servirá en el siguiente query.

4) Con este query obtenemos el porcentaje de tiempo usado por cada línea de la unidad.

select line#,lines.total_occur, lines.total_time/t.total*100 as "%"
from (
select line#,total_occur,total_time
from plsql_profiler_data p3
where runid = :runid
and unit_number = :unit_num
) lines,
(
select sum(total_time) total
from plsql_profiler_data p3
where runid = :runid
and unit_number = :unit_num
) t
order by 3 desc

Un ejemplo con código ya optimizado:



Al revisar el código se ve que la línea 1939 está dentro de 3 bucles anidados por lo que es lógico que tome el 18% del tiempo. Cuando revise su código sabrá inmediatamente si está sub-optimizado o no.

martes, 17 de febrero de 2009

Hackearon 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/

lunes, 16 de febrero de 2009

JScreenFix Corregir pixeles en un LCD

El año pasado me decidi por actualizar mi vieja computadora de escritorio dentro del nuevo equipo que compre venía un monitor LCD de 16 pulgadas (muy bueno por cierto), al poco tiempo de uso el monitor empezó a mostrar un punto blanco cerca del centro de la pantalla en ese momento pues empece a buscar mi factura para reclamar la garantía, cuando finalmente la encontre, leí en los terminos de garantía me indicaban que la garantía no aplicaba para problemas con píxeles de monitores, que desgracia!!


Afortunadamente, a mi correo electrónico me llego un artículo con el asunto: JScreenFix, elimina los pixeles atascados en tu LCD, inmediatamente me llamo la atención y procedí a leerlo. Dentro del mismo explican la diferencia entre un pixel muerto y uno atascado.

Un pixel muerto es aquel que sencillamente no prende, es decir, al tener un fondo blanco se ve un puntito negro que nunca cambia de color pues obviamente está apagado. Por otro lado, un pixel atascado (o zombie, como yo los nombro) está encendido pero fijo en un solo color, generalmente rojo pero puede variar.

JScreenFix es un applet que funciona en cualquier navegador -consecuentemente en cualquier S.O.- que permite revivir esos pixeles atascados por medio de un “bombardeo” de cambios de color (recuerden que un pixel se compone de 3 colores: rojo, azul y verde) que con un poco de suerte te dejará con un pixel completamente funcional.

Según el autor puede funcionar incluso con las sombras que se quedan en un LCD si se ha dejado con una imagen fija por mucho tiempo, reduciendo las manchas gradualmente hasta que sean prácticamente imperceptibles.

Para utilizarlo simplemente presina este vínculo JScreenFix, coloca la ventana sobre el pixel atascado y espera una media hora para ver los resultados. Para las manchas se recomienda poner a pantalla completa por un par de horas para mantener uniformidad.

A mi me funcionó hace mucho tiempo con un par de pixeles atascados pero si contigo no hace el truco o tienes un pixel muerto, prueba frotándolo suave pero firmemente de manera circular con una franela que no dañe tu monitor (similar a la que viene con los anteojos).

viernes, 13 de febrero de 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!

sábado, 7 de febrero de 2009

Hoy me di cuenta que no se ni mierda.

Hoy cuando entre a la universidad nuevamente despues de muchos intentos fallidos de solo llegar un par de dias para luego desaparecerme, llegue al salon entre a recibir la misma clase que he llevado desde hace varios años y me senti realmente frustrado.

Mi primera impresion fue "yo ya se esta mierda", pero la verdad era que yo creia que ya sabia. Porque la verdad es que creo que se muchas cosas pero a la larga no se ni mierda de nada.

De lo que si se es de pornografia, de putas y de star wars.

Espero algun dia saber algo productivo para la sociedad, la verdad me gustaria que la mayoria de gente viviera mi mundo pornografico y de fantasia donde todo cogen con todos hasta llegar al placer absoluto.

martes, 3 de febrero de 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!

jueves, 29 de enero de 2009

Expandir Escritorio y TaskBar

Tengo un monitor conectado a mi Laptop.

Lo tengo como un monitor "expandido" y eso me permite tener varias ventanas abiertas al mismo tiempo en ambos monitores. Cada monitor tiene sus propias ventanas.

Uno de los temas que no me gustaba es que en la ventana "ampliada" no tenia una taskbar con los programas que se estan ejecutando sino que tenia solamente la pantalla.

Yo quería tener barra de tareas en cada monitor para que cuando tenga varias ventanas abiertas en el monitor que no estoy viendo.

googleando encontre un programita que hace lo que necesito: Multimonitor TaskBar . Este me permite tener en cada pantalla una taskbar con los programas ejecutandose en ese monitor.

http://www.mediachance.com/free/multimon.htm

Second Life y Windows Vista compiten por premio al "mayor fiasco" tecnológico

Hace algún tiempo y bajo la influencia de PUBLICIDAD guiada, entre a second life y cree mi cuenta, lo cual resulto en una severenda CAGADA. Realmente me pareció MUY MALO el concepto, y la interfaz con el usuario, daba bastantes errores, cada rato se me caía la maquina.

Tal vez sea comparar peras con manzanas, pero el nivel de interacción, calidad gráfica, calidad de experiencia de usuario que logro WOW (World of Warcraft) es años luz mejor que SECOND LIFE. Es increíble que existan hasta personas que viven de hacer desarrollos sobre SECOND LIFE. En fin, les dejo la siguiente NOTA que encontré sobre los FIASCO AWARDS.

Existen nueve finalistas de la primera edición que compiten por los premios al mayor fiasco tecnológico del año, cuyo ganador elegirán los propios internautas.

Los Fiasco Awards han sido promovidos en España por un grupo de personas vinculadas al sector de las Tecnologías de la Información y la Comunicación.
El objetivo de los galardones es "potenciar el espíritu crítico y fomentar una actitud positiva ante los fracasos para poder aprender de ellos como un paso previo para asumir el éxito", explicaron los organizadores.
Hasta el 26 de febrero, todos aquellos que visiten la página web www.fiascoawards.com podrán votar por uno de los nueve finalistas, entre las que figuran también el competidor de Second Life, Google Lively.

XSLT y caracteres especiales

En una pagina jsp que utiliza xslt encontramos este problema.

Caused by: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
org.jdom.input.JDOMParseException: Error on line 9: The entity name must immediately follow the '&' in the entity reference.

XSLT es una tecnología que permite tener un xml de datos y un xml de presentacion y al combinar ambos resulta una pagina formateada. Ya sea en html, xhtml, texto o algun otro xml.

El problema que se encontro fue que uno de los xml dentro de el contenido de una TAG tenía caracteres especiales de html., ej.

prueba&prueba

El mensaje aparece relacionado a jdom porque jdom es la librería que sirve para parsear el xml y al parecer es usada por la implementacion de xslt que estamos usando.

la solucion fue simple, parseamos la data de el xml para que en lugar de usar un & pongamos el &amp;

saludos!

p.d. DavidA proporciono el problema y la solucion de este post.

miércoles, 28 de enero de 2009

Etapas de un proyecto de Desarrollo

Cualquier parecido con la realidad es pura coincidencia.

martes, 27 de enero de 2009

Arrancamos!

Este blog pretende ser un medio para publicar contenido de temas en los que nos vemos involucrados regularmente.

Es una pagina que mantendremos actualizada entre un grupo de personas que trabajamos en el mundo del desarrollo y la informática.

Queremos publicar contenido relaciondo a:
* Notas sobre tecnología
* Apuntes sobre desarrollo de software
* Ciencia Ficcion
* Linux, servidores, etc.
* Chistes geeks y noticias
* Otros temas: anime, series, películas y games

Todo esto pretendemos hacerlo mediante un ambiente agradable, informal, tecnico y sobre todo.. GEEK!

saludos!