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!