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!