martes, mayo 24, 2011

Tomcat Error – prunsrv.c Failed creating java (jvm.dll)

Bueno.. que puedo decir, como dice mi jefe, esta gente vino a improvisar con nosotros :D y tiene toda la razón, llevamos todo un día tratando de instalar un sistema de un proveedor y mandaron a una persona con los conocimientos que debían ser suficientes, pero no, nos toco a nosotros montar la DB Oracle, y ya cuando estaba eso, el tomcat no levanta, y en mi poca experiencia, siempre que haya un error.. pues tirar de la mano de los logs, sino estamos perdidos, pero claro, la persona no tuvo esta iniciativa sino que fue la mía, mirando salia un error que indicaba:

[2011-05-24 15:55:54] [info] Procrun (2.0.4.0) started
[2011-05-24 15:55:54] [info] Running Service...
[2011-05-24 15:55:54] [info] Starting service...
[2011-05-24 15:55:54] [174 javajni.c] [error] The specified module could not be found.
[2011-05-24 15:55:54] [994 prunsrv.c] [error] Failed creating java C:\Program Files (x86)\Java\jre6\bin\client\jvm.dll
[2011-05-24 15:55:54] [1269 prunsrv.c] [error] ServiceStart returned 1
[2011-05-24 15:55:54] [info] Run service finished.
[2011-05-24 15:55:54] [info] Procrun finished.

Buscando en google encontré la siguiente pagina donde eran claros y concretos con la solución:
  1. Copy msvcr71.dll from java’s bin directory to tomcat’s bin folder.
  2. Add java’s bin directory to windows environment variable.
  3. Copy msvcr71.dll from java’s bin directory to windows\system32 folder.
  4. Make sure your tomcat’s pointing to correct jvm.dll folder.
Ademas verificando en foros es un error ya documentado a la hora de realizar la instalación de Tomcat en un ambiente de Windows Server a 64 bits.

viernes, abril 22, 2011

dbwrench

Una herramienta interesante a la hora de realizar un diseño de base de datos y que sea multiplataforma

martes, enero 11, 2011

Email forwarding en Zentyal

Verificando como realizar un forwarding de una cuenta de correo a otro, encontré esta alternativa en el foro de zentyal, aunque por el entorno grafico lo puedes realizar por: Correo -> Dominios virtuales de correo -> click en "Alias de cuentas externas" en el dominio donde desean agregar el alias y por ultimo ingresar los datos que piden, tenga en cuenta que no debe existir el alias

http://forum.zentyal.org/index.php?topic=459.0

Ok. I got it to work now. It now stores a copy in the mailbox, what I did was

1. sudo nano /etc/postfix/virtual
2. added the mail addresses to forward. ie test@mydomain.com pepe@hotmail.com,test@mydomain.com
3. Save the file and edit the line virtual_alias_maps in /etc/postfix/main.cf. The original is:
virtual_alias_maps = ldap:valiases change it to virtual_alias_maps = hash:/etc/postfix/virtual, ldap:valiases

4. Run: sudo postmap /etc/postfix/virtual, then reload postfix: sudo postfix reload

And thats it, now all mail to test@mydomain.com goes to pepe@hotmail.com and a copy is stored for the original destination.

lunes, octubre 25, 2010

Agregar puerto SSL en ISA Server

Bueno hace algún tiempo tuve un inconveniente de que el isa me rechazaba el acceso a un procedimiento del banco, revisando vi que era porque no utilizaba el puerto estándar del ssl sino otro y como este no estaba configurado en el isa server y debía indicarse, entonces buscando en Internet encontré el siguiente código

Dim root
Dim tpRanges
Dim newRange
Set root = CreateObject("FPC.Root")
Set tpRanges = root.GetContainingArray.ArrayPolicy.WebProxy.TunnelPortRanges
set newRange = tpRanges.AddRange("SSL 4443", 4443, 4443)
tpRanges.Save

Se guarda el anterior contenido en un fichero (extencion .vbs) y se ejecuta en el server y listo

lunes, septiembre 20, 2010

Consultar las llamadas/canales activos en ASTERISK desde la consola

Ver el numero de canales activos:
watch "asterisk -vvvvvrx 'core show channels' | grep channels"

Ver el numero de llamadas activas:
watch "asterisk -vvvvvrx 'core show channels' | grep calls"

Ver los canales activos:
watch "asterisk -vvvvvrx 'core show channels verbose'"

Tomado de:

Mas comandos en:

lunes, agosto 02, 2010

Proyectos de Software


Siempre que veo esta imagen, lo afirmo una vez mas, en el 99% de los proyectos de software se da :D


miércoles, junio 16, 2010

Expresiones Regulares

esto me lo facilito un amigo, expresion que permite solo numeros y puntos (1.552.255)
(/[^0-9'.']/g, "");

si se necesita saber algo mas

miércoles, enero 06, 2010

Cosas con awk

Interesante manual de awk :
http://www.vectorsite.net/tsawk.html

y un pequeño ejemplo para listar el contenido de una carpeta y sacar el listado sin la extencion del archivo ordenado y sin elementos repetidos:
ls INFOBCO | awk '{split($1, str,".");print str[1]}' | sort | uniq

sábado, agosto 29, 2009

Formato de salida de Fecha/Hora PostgreSQL

Siempre lo dire, en la lista de postgres es mucho lo que se encuentra, tarde o temprano alguien nos indica de forma rapida como realizar cosas en este excelente motor de base de datos, hoy me encontre con una respuesta de Alvaro Herrera sobre la salida de Fecha con la funcion TO_CHAR, cosa que recuerdo hace algunos años lo hice con el lenguaje de programacion, con la base de datos hubiera sido inmediato y muy facil de realizar :

Edwin Quijada escribió:
>
> Alvaro de donde salen las TM, no me digas que eres mago ahora??
> Que signifcan algo sobre el idioma de la maquina?

No, el idioma viene de la variable de configuración lc_messages:

alvherre=# select to_char('26/08/1987'::date, 'TMDay, DD TMMonth YYYY');
to_char
---------------------------
Miércoles, 26 Agosto 1987
(1 fila)

alvherre=# set lc_messages to 'fr_CA.utf8';
SET
alvherre=# select to_char('26/08/1987'::date, 'TMDay, DD TMMonth YYYY');
to_char
------------------------
Mercredi, 26 Août 1987
(1 fila)


--
Alvaro Herrera http://www.flickr.com/photos/alvherre/
"¿Cómo puedes confiar en algo que pagas y que no ves,
y no confiar en algo que te dan y te lo muestran?" (Germán Poo)

lunes, julio 07, 2008

client_encoding en el pg_restore

Bueno hace tiempo estaba buscando como restaurar una base de datos de un encoding a otro a la hora de restaurar un backup.. en la lista de español Alvaro Herrera indico el como:

Haz el pg_dump normalmente (en Latin1), y luego

PGOPTIONS="-c client_encoding=latin1" pg_restore el-dump-de-tu-base.dump

Creo que eso debería funcionar.

(Obviamente, al hacer initdb en 8.3 se debió haber escogido una
configuración regional en utf8)

jueves, marzo 15, 2007

Netbeans 5.5 VWP con MyFaces Tomahawk

Bueno este es la primera cosa que coloco sobre Java, aunque colocare mas, esto lo hago porque era algo demasido sencillo y que no pude resolverlo rapido, si hay otro despistado como yo que no sepa como hacerlo pos espero que lo siguiente le ayude.

Para poder trabajar con Netbeans y MyFaces encontre la siguiente GUIA, solo agregare algunas pasos para trabajar con el paquete VWP .

1. En mi caso solo necesito trabajar con la extension de los componentes de JSF, solo manipulare el componente del menu JSCookMenu ,tampoco necesito todas las librerias de MyFaces, asi que solo se incluira en el proyecto las siguientes librerias:
* Tomahawk (tomahawk-1.1.3.jar)
* commons-el-1.0.jar
* commons-lang-2.1.jar
2. Luego de incluir las librerias, debemos de agregar lo siguiente en modo de edicion JSP
xmlns:t="http://myfaces.apache.org/tomahawk"

3. Ahora agregamos el codigo que se encuentra en la guia de netbeans con myfaces y configuran el filter que indican en la guia en el web.xml.

Si todo ha salido bien, a la hora de correr el proyecto tendran la siguiente salida:
Una ultima cosa, no se podra ver en modo de diseño los componentes de myfaces en VWP, ese es el unico pero, aunque puedo vivir con eso.

lunes, enero 29, 2007

Tablas temporales en PostgreSQL

Bueno la creacion de tablas temporales a partir de un sql es muy facil, la sentencia seria la siguiente:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
[ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]
AS query
si se realiza una tabla temporal para una operacion compleja y esta falla estando en una transaccion la tabla temporal se detruye pero si no hay ningun problema entonces la vida de esta estara hasta que la sesion haya terminado.
Un pequeño ejemplo:

=#BEGIN;
=#CREATE TEMP TABLE prueba AS SELECT * FROM CIUDAD;
=#SELECT * FROM prueba;
ciud_id | ciud_codigo | ciud_nombre
----------+---------------+-------------
1 | 123 | Bogota
2 | 456 | Medellin
3 | 5 | ñoño
4 | 789 | Cali
(4 filas)
=#ROLLBACK;
ROLLBACK
=# SELECT * FROM prueba;
ERROR: relation "prueba" does not exist
si no realizaramos un rollback sino un commit entonces la tabla no se destruiria,
seguiria hasta que se termine la sesion con la base de datos.

Aqui es donde nace la pregunta: Que pasaria si se utiliza un pool de conexiones como pgpool?? ademas creo que en la documentacion del proyecto nombraban el inconveniente, pero bueno buscando un poco en el manual, en la referencia del comando create table indican algo sobre tablas temporales:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]

y leyendo un poco la parte de ON COMMIT:

ON COMMIT
The behavior of temporary tables at the end of a transaction block can be controlled using ON COMMIT.
The three options are:

PRESERVE ROWS
No special action is taken at the ends of transactions. This is the default behavior.
DELETE ROWS
All rows in the temporary table will be deleted at the end of each transaction block.
Essentially, an automatic TRUNCATE is done at each commit.
DROP
The temporary table will be dropped at the end of the current transaction block.
Entonces comence a probar a crear una tabla temporal indicando ON COMMIT DROP el cual me interesa probar:

=# CREATE TEMP TABLE prueba AS select * from ciudad ON COMMIT DROP;
ERROR: syntax error at or near "on" en el carácter 50
LINEA 1: create temp table prueba as select * from ciudad on commit d...

Hum... no funciona.. busque en la lista de ayuda en ingles y ya alguien habia tenido la misma inquietud donde la respuesta fue la siguiente:

> But how can I create a table using a query and putting ON COMMIT DROP.

You can''t. Use INSERT ... SELECT to fill the table, instead.

Entonces hay que crear la tabla primero y luego llenar la tabla con una consulta, la prueba:

=# BEGIN;
BEGIN
=# CREATE TEMP TABLE prueba(ciud_id integer, ciud_codigo numeric, ciud_nombre varchar) ON COMMIT DROP;
CREATE TABLE
En el sql de la creacion de la tabla temporal solo me funciono indicando el nombre y tipo del campo.

=# \d prueba
Tabla «pg_temp_1.prueba»
Columna | Tipo | Modificadores
-----------------+---------------------+-----------------
ciud_id | integer |
ciud_codigo | numeric |
ciud_nombre | character varying |

=# INSERT INTO prueba SELECT * FROM ciudad;
INSERT 0 4
=# SELECT * FROM prueba;
ciud_id | ciud_codigo | ciud_nombre
----------+---------------+-------------
1 | 123 | Bogota
2 | 456 | Medellin
3 | 5 | ñoño
4 | 789 | Cali
(4 filas)

=# COMMIT;
COMMIT
=# SELECT * FROM prueba;
ERROR: relation "prueba" does not exist
De esa forma conseguia el comportamiento que queria, que cuando la transaccion se confirme la tabla se destruya sin necesidad de terminar la sesion con la base de datos, una ultima cosa esto lo probe en la version 8.1.4.

miércoles, enero 10, 2007

EL CTID

Los CTID son usados para identificar registros físicos específicos con valores de bloque y de desplazamiento (offset). Los CTID cambian después de que los registros son modificados y recargados. Son usados por entradas indexadas para apuntar a registros físicos.

Bueno en mi ultima entrada indique como eliminar registros repetidos, en ese ejemplo se indico un como con DISTINCT, el dia de hoy me encuentro con un mensaje de correo en la lista de ayuda de PostgreSQL en español de Alvaro Herrera donde indica como realizar la misma operacion utilizando el ctid y tambien dejando una reflexion, a continuación indico el contenido del correo:


> create or replace function eliminar_ubiprograma_repetidos()
> as
> $body$
> declare
> var_dir numeric;
> var_prg numeric;
> cur_ubiprg refcursor;
> begin
> OPEN cur_ubiprg for select dir_codigo,prg_codigo,count(*) from
> ubicacion_programa group by dir_codigo,prg_codigo having count(*)>1
> LOOP
> fetch cur_ubiprg into var_dir,var_prg;
> select ctid from ubicacion_programa where prg_codigo=var_dir and
> dir_codigo=var_prg

No no no no no. Debes dejar de pensar en modo procedural. Debes dejar
de programar diciendole a la maquina paso por paso que es lo que debe
hacer. Debes encontrar la manera de decirle a la maquina _QUE_ es lo
que debe hacer, no _COMO_ hacerlo. Si no consigues pensar de esa manera
jamas lograras entender como hacer funcionar una base de datos.

Aca en tu funcion lo que estas haciendo es decir "por favor traigame
todos los CTIDs que cumplan tal condicion", y a continuacion pedir para
cada CTID conseguir que se haga tal o cual cosa. Eso es perdida de
tiempo y recursos y escribir mil lineas que estan de sobra.

Mira, aca un ejemplo de como se hace realmente:

alvherre=# create table duplos (a int );
CREATE TABLE
alvherre=# insert into duplos values (1);
INSERT 0 1
alvherre=# insert into duplos values (1);
INSERT 0 1
alvherre=# insert into duplos values (2);
INSERT 0 1
alvherre=# insert into duplos values (2);
INSERT 0 1
alvherre=# insert into duplos values (2);
INSERT 0 1
alvherre=# insert into duplos values (3);
INSERT 0 1
alvherre=# select * from duplos;
a
---
1
1
2
2
2
3
(6 rows)

Ok, hay duplicados. Como se eliminan? Observa esto:

alvherre=# select ctid, a from duplos;
ctid | a
-------+---
(0,1) | 1
(0,2) | 1
(0,3) | 2
(0,4) | 2
(0,5) | 2
(0,6) | 3
(6 rows)

Queremos dejar (0,1) pero eliminar (0,2); dejar (0,3) pero eliminar (0,4) y
(0,5); y dejar (0,6). Como se expresa esto? Observa:

alvherre=# select min(ctid), a from duplos group by a;
min | a
-------+---
(0,6) | 3
(0,3) | 2
(0,1) | 1
(3 rows)

Wow, aca tenemos justo los que queremos dejar! Ahora como se borra el resto?

alvherre=# delete from duplos where ctid not in (select min(ctid) from duplos group by a);
DELETE 3
alvherre=# select * from duplos;
a
---
1
2
3
(3 rows)


Listo. Nada de jugarretas con cursores ni loops.

Puedes perder todo el tiempo que quieras tonteando con shared_buffers y
discos en RAID y servidores gigantescos, pero si cuando te vas para tu
casa has dejado un loop en PL/pgSQL que podia haberse escrito como una
simple consulta, el rendimiento de tu servidor sera malo y la culpa sera
tuya.

Si _realmente_ quieres aprender a programar y dejar de tontear con Java
o Visual Basic, que son juguetes para niños, aprende LISP o Scheme y
veras como el mundo cambia de color de una forma que te sorprendera.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.



jueves, agosto 31, 2006

La funcion DISTINCT (PostgreSQL/SQL Server)

Bueno la historia comenzo cuando en una base de datos de SQL Server se necesitaban eliminar de una tabla unos datos duplicados, aunque soy nuevo en la oficina donde laboro dije que podia asumir el reto, pero naaa no pude hacerlo, tratando de mirar las posibles soluciones para almenos sacar la informacion que se necesitaba, recorde que en PostgreSQL existe una funcion llamada DISTINCT ON la cual tambien existe en SQL Server pero el comportamiento de esta al agregar varios campos no daba el resultado que necesitaba, es decir era lo mismo utilizar un DISTINCT que un GROUP BY, entonces con mas calma decide hacer pruebas en mi equipo con Postgres para saber la forma de hacerlo. Realizando las pruebas lo primero que note es que no es lo mismo DISTINCT a DISTINCT ON, el DISTINCT ON si retorna solo una fila unica descartando las demas y con esta funcion si tenia los resultados esperados pero esta no existia en SQL Server y tomando en cuenta que en el manual de PostgreSQL indicaban que la funcion DISTINCT ON podia retornar resultados inesperados entonces segui en busca de encontrar una solucion para ambos motores de base de datos. Ya habia intentado de varias formas obtener el resultado con subquery y el group by pero sin buenos resultados, Googleando un poco encontre la siguiente pagina donde ya alguien habia tenido el mismo inconveniente pero indico un sql donde habia obtenido los mismo resultados, observando el sql me di cuenta que se utilizaba la funcion MIN() entonces decidi realizar las pruebas:
--con distinct
SELECT DISTINCT ON (campo1) * FROM prueba2;
--sin el distinct to
SELECT b.* FROM ( SELECT campo1, min(campo6) as campo6 FROM prueba2 GROUP BY campo1 ) a, prueba2 b WHERE a.campo1=b.campo1 AND a.campo6=b.campo6
eso era lo que faltaba utilizar era una funcion MIN()/MAX() para obtener el resultado esperado, ya habia conseguido la solucion a la primera parte del problema.

La segunda parte es mas sencilla, eliminar los registros duplicados, esto lo consegui de la siguiente forma: creando una tabla temporal donde se registraran los datos unicos, luego se elimina los datos de la tabla principal y luego se vuelcan los datos de la tabla temporal a la principal como tabla temporal (en PostgreSQL):
CREATE TEMP TABLE temporal AS SELECT b.* FROM ( SELECT campo1, min(campo6) as campo6 FROM prueba2 GROUP BY campo1 ) a, prueba2 b WHERE a.campo1=b.campo1 AND a.campo6=b.campo6
o sencillamente asi: (de esta forma funciona en PostgreSQL y SQL Server)
SELECT b.* INTO temporal FROM ( SELECT campo1, min(campo6) as campo6 FROM prueba2 GROUP BY campo1 ) a, prueba2 b WHERE a.campo1=b.campo1 AND a.campo6=b.campo6;
luego eliminamos los datos (la funcion truncate tambien es soportada por sql server o almenos eso dicen los manuales)
TRUNCATE prueba2;
y por ultimo
INSERT INTO prueba2 SELECT * FROM temporal;
En postgreSQL creandose la tabla temporal no hubiera sido necesario eliminar la entidad, dado que esta desaparece cuando se termina la sesion, pero no siendo el caso para la sentencia INSERT [..] INTO [], entonces:
DROP TABLE temporal;
Bueno aunque lo anterior no es el santo grial, es un truco para salir de apuros o para alguien que no conociera una forma de hacerlo, espero que a alguien le sirva, almenos a mi me sirvio.

sábado, agosto 26, 2006

Lexmark T430 en slackware 10.2

Bueno aqui dejo la experiencia de como instalar los drivers de esta impresora en slackware 10.2.

Primero que todo esta impresora la habia configurado en CentOS release 4.2 y dado que Lexmark tiene unos driver muy bien elaborados para Red-Hat y Suse (son los que viene en el cd de la impresora), pero ademas tiene soporte para mas distribuciones (drivers impresora)
pero no para slackware, entonces decidi hacer lo siguiente en base a la instalacion que ya tenia en un CentOS.

1. Convertir el rpm a un tgz (rpm2tgz /mnt/cdrom/unix/packages/print-drivers-linux-glibc2-x86.rpm)
2. Instalar el paquete que se creo (intallpkg print-drivers-linux-glibc2-x86.tgz)
3. Tener en cuenta que debe estar corriendo algun sistema de impresion, en mi caso es CUPS, por lo tanto levanten el servicio (/etc/rc.d/rc.cups)
4. Ejecutar el siguiente script /usr/local/lexmark/setup.lexprint, este script pedira algunos datos de configuracion, ademas que tambien solicitara manejar el script de arranque del cups (si lo desean) entonces para evitar de que salga un error por esto se puede hacer lo siguiente:
* modificar el archivo setup.lexprint he indicar donde esta el servicio de cups, recuerde que el script viene para red-hat y su familia por lo tanto lo buscara en /etc/init.d/cups
* realizar un enlace a /etc/rc.d/rc.cups (#ln -s /etc/rc.d/ /etc/init.d #ln -s rc.cups cups)
5. Luego de ejecutar el script hay que ayudarle un poco :
* crear el siguiente enlace (ln -s /usr/local/lexmark/unix_prt_drivers /usr/lexprint)
* luego en el directorio bin, realizar los siguientes enlaces:
#ln -s /usr/local/lexmark/unix_prt_drivers/bin/.scripts/chqueue.sh chqueue
#ln -s /usr/local/lexmark/unix_prt_drivers/bin/.scripts/ckdevice.sh ckdevice
#ln -s /usr/local/lexmark/unix_prt_drivers/bin/.scripts/lsdevice.sh lsdevice
#ln -s /usr/local/lexmark/unix_prt_drivers/bin/.scripts/lsqueue.sh lsqueue
6. Si decidieron crear un menu para gnome (este lo creo cuando se ejecuta el script setup.lexprint) entonces solo deben de dar click en la opcion Aplicaciones->Herramientas del sistema->Lexmark Print Drivers y listo debe inciar la aplicacion y indicar donde se encuentra la impresora (en red o conectada localmente)
NOTA: si indican al script que cree el menu para kde dara un error dado que no encontraran los archivos para hacerlo, pueden modificar el script setup.lexprint o sencillamente pueden hacerlo manualmente he indicar que el comando que deben llamar es /usr/lexprint/bin/lexprint

-Otra solucion mas elegante es editar los archivo setup.lexprint y LEXPrtDrv.link indicando las opciones anteriores y crear un paquete para el slackware.. pero bueno eso lo pruebo despues... por ahora ya me funciona la impresora :)

jueves, junio 08, 2006

Arreglos en PL/pgSQL

Bueno aqui tengo un pequeñisimo codigo para el manejo de array's en pl/pgsql:

create or replace function prueba_array(ANYARRAY) RETURNS bool as $$

declare

arreglo alias for $1;
tamano numeric;
i numeric;

begin

select array_upper(arreglo,1) into tamano;
raise notice 'El tamaño del arreglo es %', tamano;

for i in 1..tamano loop
raise notice 'valor del arreglo en la posicion % es %', i,arreglo[i];
end loop;

return true;

end;

$$ language 'plpgsql';


y la llamada a la funcion seria de la siguiente manera:
select prueba_array(ARRAY[5,22,30,35]);

viernes, marzo 10, 2006

Inicio del blog

Bueno el dia de hoy comienzo con esto del blog.. dado que esta de fiebre por este tiempo.. he pensado utilizarlo para colocar lo poco que he realizado (y en serio que es poco) en mi preciado linux-slackware, las cosas que he aprendido sobre PHP y uno que otra cosa que me parezca interesante que vea en internet eso si respetando a los autores de las fuentes, ya que no llevo ni un solo registro de eso.