miércoles, abril 11, 2012

configuracion impresora en linux (edit)

Una nota, cuando se trata con cups de configurar una impresora compartida en windows y no aparece la opción de Windows printer via Samba se debe buscar el programa smbspool y crear un enlace a este desde el directorio /usr/lib/cups/backend

En el siguiente enlace se encuentra informacion sobre esto:

martes, marzo 27, 2012

Restriccion en listas de correo Zentyal - Postfix

El caso es el siguiente, se tiene una lista de correo para todos los empleados, la idea es que solo algunas personas pueden enviar correo a estas listas, por la interfaz de Zentyal no es posible esta configuración, pero dado que es postfix podemos modificar los archivos de configuración, mirando la documentación de postfix, este trae un ejemplo claro:
en español encontré la siguiente información:

lo primero es definir el listado de las listas que se necesitan restringir (archivo de configuracion main.cf)
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/listas_protegidas
el contenido del archivo es
lista@dominio.com insiders_only

y luego se define la lista de correos/dominio que están autorizados a enviar correo a las listas indicadas en el punto anterior
smtpd_restriction_classes = insiders_only
insiders_only = check_sender_access hash:/etc/postfix/autorizados_enviar, reject
el contenido del archivo es:
jhon@dominio.com OK
doe@dominio.co OK

Luego de definir estas opciones generamos la base de datos de los listados
postmap hash:listas_protegidas
postmap hash:autorizados_enviar

y recargamos la configuración del postfix
postfix reload

Para que estos cambios sean persistentes en el zentyal debemos colocar los anteriores datos en el archivo
/usr/share/ebox/stubs/mail/main.cf.mas
En la variable $smtpRecipientRestrictions colocamos la parte de las listas y luego donde se imprime el valor de la variable se coloca el listado de las cuentas de correo autorizadas, por ultimo ingresamos a la pagina de administración del zentyal y reiniciamos el servicio de correo y verificamos como se genera el archivo main.cf con los cambio indicados.

jueves, marzo 22, 2012

Cambiar permisos solo a las carpetas

Bueno la tarea era simple, en una unidad NAS de cisco, la cual tiene linux :D habia cierta informacion que no se dejaba copiar o eliminar, de entrada dije permisos, sencillo un simple chmod -R me ayudara, pues no pense el comando y lo lance en la terminal y oh Dios ! el resultado, solo se podia ver las carpetas la informacion no estaba en el exporador de windows, luego de que la usuaria entrara en panico y por hay derecho a mi, me puse a mirar y es que el comando que indique dio permisos a todos de ejecucion y estos solo se debe indicar en las carpetas, para solucionarlo me di de la mano de google y encontre de la siguiente pagina http://movabletripe.com/archive/recursively-chmod-directories-only/ el siguiente dato:
find . -type d -exec chmod 755 {} \;
excelente, ejecuto esto en la consola y sale error, veo que la version del find no es la que me permite estos parametros, analizando, pues tiremos mano del mismo comando find combinado con un poquito de awk y obtenemos el siguiente resultado
find . -type d | awk '{print "chmod a+x \""$0"\""}' | sh
De esta forma solucione el inconveniente

miércoles, enero 11, 2012

Cambiar lenguaje de Cisco SPA525G2 a Español

Para realizar el cambio del lenguaje de este teléfono IP debe hacer lo siguiente:

Descargar el diccionario de la siguiente dirección https://supportforums.cisco.com/docs/DOC-11462
Nota: debemos descargar la versión del firmware, para mi caso es el paquete spa525_v745

Luego montamos los archivos que necesitamos en un servidor para que el teléfono pueda descargarlos, en mi caso fue en el servidor web donde tengo el servidor asterisk

Ingresamos al administrador web del teléfono con la opción de admin, nos vamos a la etiqueta Regional, en la seccion Language, en el campo Dictionary Server Script colocamos lo siguiente (las X.X.X.X son la dirección del servidor web):
serv=http://X.X.X.X/spa525g2/;d0=English;x0=spa525_en_v745.xml;d1=Spanish;x1=spa525_es_v745.xml
y en el campo Language Selection colocamos Spanish

Algo muy importante a tener en cuenta es que se debe respetar d0=English;x0=spa525_en_v745.xml si solo se pone el lenguaje Español o se cambia el orden no funcionara el cambio del lenguaje.

Bueno eso es todo para cambiar el lenguaje de este equipo que tiene bastantes características.

domingo, agosto 21, 2011

Log de Asterisk

Tuve cierto inconveniente con un intento de ingreso para realizar llamadas a travez del asterisk, revisando el log me encontre con que este pesaba mas 3 Gb, buscar información en un archivo así se vuelve pesado, mirando la configuración (/etc/asterisk/logger.conf), pude observar que estaba enviando toda la información al archivo /var/log/asterisk/full, ahora la idea es que se genere varios archivos despues de un tiempo o peso del archivo, para esto nos valemos del programa logrotate , para mi caso cree un archivo en la siguiente ruta /etc/logrotate.d/asterisk con el siguiente contenido:

/var/log/asterisk/full {
weekly
missingok
rotate 52
compress
delaycompress
postrotate
/usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null
endscript
}
Luego de esto ejecutamos el siguiente comando logrotate -fv asterisk

viernes, julio 22, 2011

Error Zentyal: maximo de usuario excedido

Bueno el dia de hoy me salio ese error, buscando en el foro me encontre con la solucion:

/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb/olcOverlay={0}syncprov.ldif
en ese archivo adicione la linea olcSizeLimit: 50000 y listo SE ARREGLO EL PROBLEMA
claro despues de reiniciar el servcio slapd

Link del foro
http://forum.zentyal.org/index.php?topic=3098.0

martes, julio 12, 2011

PHP y SQL SERVER 2005

Coloco como referencia el siguiente link para realizar la configuración entre PHP y SQL Server 2005 http://msdn.microsoft.com/en-us/library/cc296170(SQL.90).aspx

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.