lunes, 2 de marzo de 2009

Ni ellos se quieren!

Esto es algo extraño que vi en mi cuenta de correo de hotmail (la vieja cuenta de msn :P ).


Ellos mismos bloquean los mails provenientes de Microsoft jajajajaja.
son geniales!

martes, 25 de noviembre de 2008

Usando Trpr (TRace Plot Real-time)

Dias pasados me encontre con la necesidad de hacer un analisis del trafico de la red en mi trabajo. Navegando por google me encontre con una herramienta que es realmente excelente.
La misma es Trpr (TRace Plot Real-time) que es un programa que analiza la salida de el tcpdump y crea una salida que puede ser graficada utilizando gnuplot. Tiene varias funcionalidades, una de las cuales le permite generar graficos en tiempo real, tomando la salida del tcpdump.
el proceso es bastante sencillo:

1) Descargar trpr: se lo puede descargar desde src-trpr-2.0b2.tgz . A continuacion procedemos a descomprimirlo y compilarlo:

sysadmin@sysadmin-desktop:~$ gunzip src-trpr-2.0b2.tgz.gz
sysadmin@sysadmin-desktop:~$ ls *.tgz
src-trpr-2.0b2.tgz
sysadmin@sysadmin-desktop:~$ file src-trpr-2.0b2.tgz
src-trpr-2.0b2.tgz: POSIX tar archive (GNU)
sysadmin@sysadmin-desktop:~$ tar -xvf src-trpr-2.0b2.tgz
TRPR/
TRPR/Hcat.dsp
TRPR/README.TXT
TRPR/Trpr.dsp
TRPR/Trpr.dsw
TRPR/Trpr.opt
TRPR/hcat.cpp
TRPR/trpr.cpp
TRPR/trpr.html
sysadmin@sysadmin-desktop:~$ cd TRPR/

Como nota antes del proceso de compilacion se puede modificar una opcion para que se puedan levantar capturas grandes del tcpdump ( yo lo hice con archivos de > 100 mb)

const int MAX_LINE = 256 a const int MAX_LINE = 2048 del archivo trpr.cpp

(Esta opcion fue resultado de la colaboracion de mi amigo Alexis)

y se continua con el proceso normal

sysadmin@sysadmin-desktop:~/TRPR$ g++ -o trpr trpr.cpp -lm
sysadmin@sysadmin-desktop:~/TRPR$ chmod +x trpr
sysadmin@sysadmin-desktop:~/TRPR$ sudo cp trpr /usr/bin/

2) Iniciamos la captura con el tcpdump

sysadmin@sysadmin-desktop:~$ sudo tcpdump -x -vvv -i eth0 > salida.txt
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

en cuanto a los parametros del tcpdump uno le puede agregar lo que considere necesario; un tema a tener en cuenta es el archivo de salida generado. En este caso he utilizado la redireccion, no es la mejor opcion ya que utilizando -w archivo-salida se obtiene un archivo mas portable pero hay veces que el trpr no los puede levantar. Aun no encontre el motivo del fallo.

3) Le pasamos el trpr para generar la salida que utilizara el gnuplot como entrada. Dependiendo del tamaño del archivo de captura tomara mas o menos tiempo este paso

sysadmin@sysadmin-desktop:~$ trpr input salida.txt auto X output Grafico_analisis
TRPR Version 2.0b2
trpr: Adding autoMatcher: *,*/*->*/*
trpr: At time 0.000000 - Adding flow: tcp,10.10.8.101/22->10.10.8.81/1574~3085455732
................................................................
................................................................
................................................................
trpr: At time 2676.028576 - Adding flow: 0,22:156a:ffe6:a0a:865:1e:bb2:d82d/0->a0a:851:35:0:0:0:0:128/0~3085848948
trpr: Done.

Termino correctamente y pasamos al siguiente punto

Hay una serie de opciones que se pueden utilizar en el trpr, como filtrar por protocolos por ejemplo; se pueden generar graficos png pero requiere modificar el archivo generado, en este caso Grafico_analisis.

para que se genere un archivo png se le pasan los siguentes parametros:
sysadmin@sysadmin-desktop:~$ trpr input salida.txt png salida.png auto X output Grafico_analisis

Una vez generado el archivo se lo debe editar; en el encabezado tiene la siguiente linea
set term png color
set output 'salida.png'

se la debe cambiar por
set terminal png small size 1024,768
set output 'salida.png'

Donde:
small: es el tamaño de la fuente
size: es el tamaño que queremos que tenga la imagen
en set output se puede cambiar el nombre del archivo si se desea.
4) Generamos el grafico
sysadmin@sysadmin-desktop:~$ gnuplot -persist Grafico_analisis

y obtengo el siguiente grafico



como veran es una herramienta muy util, sencilla y potente. Recomiendo probarla e investigarla.

martes, 11 de noviembre de 2008

Acelerando el Booteo

Leyendo el blog de mi amigo Agustin encontre una herramienta excelente como para depurar el proceso de arranque. Decidi probar cuanto podia mejorar el arranque de mi laptop (Acer Aspire 3003 LCi), aunque nunca lo habia cronometrado.
La herramienta en cuestion es bootchart
El proceso de instalacion en ubuntu no fue mas que:

pelin@valkyria:~$ sudo apt-get install bootchart


Una vez instalado reinicio la pc. Genera los graficos y los guarda en /var/log/bootchart con la fecha y hora.
Yo obtuve:




En el siguiente intento, depues de dar de baja algunas cosas que no utilizaba mejoro un poco y obtuve el grafico siguiente:



Mejora sustancial, decido una vez bajar algunas otras cosas y obtengo:


Listado de servicios que di de baja:
  • apache2 (cuando necesite el web server lo levanto)
  • nvidia-kernel (no se que hace instalado si no tengo esa placa de video...pero es parte del kernel :( )
  • vboxdrv (virtualbox)
  • apparmor
  • cupsys (cuando quiera imprimir lo arranco y listo)
  • avahi-daemon (solo tengo dos pc's en mi casa, no lo necesito)
  • clamav-freshclam (actualizacion de la base de datos de clamav)
  • vmware (cuando necesite levantar las maquinas virtuales lo arranco)
  • motion
  • winbind
  • y le saque la opcion splash del grub
Aca estaba bastante conforme con la mejora, pero la codicia pudo mas y busque alguna manera de bajar algunos segundos mas y encontre las siguientes tips, en particular copio los que utilice:

2. Run boot processes in parallel
This will make upstart to run the boot processes in parallel and speed up the boot process.
sudo kate /etc/init.d/rc
Find and change the line:
CONCURRENCY=none
to:
CONCURRENCY=shell

6. Swappiness
The default value for vm.swappiness is 60 in Ubuntu Feisty whic is a good default value but if you want to tweak the performance a little bit more you can change this value to a lower value to reduce the load of the swap. If you run the follwing command:
sysctl -q vm.swappiness
You will se that the value is set to 60. And by running:
sudo sysctl vm.swappiness=10
You will change the value from 60 to 10 which will make your system write to swap a lot less and I would recommend this to everyone that has 512 mb of memory or more. If you find that you have very little use of swap set the value to 0. This will not disable the swap but it will make your system write to the swap as little as possible and keep as much as possible in memory. This makes a huge improvment when switching between applications since they are now likley to be in physical ram instead of on the swap partition.

To set your value permanent you need to change the sysctl.conf file:
sudo kate /etc/sysctl.conf
Add the line
vm.swappiness=10
To the end of the file. This way it will be set upon boot.

I’ve found that the value of 5 works very good for my use and I have 1 GB of memory.

En mi caso esa entrada no existia, asi que la agregue y setee el valor a 5.

Por ahi encontre que la herramienta sysv-rc-conf ayudaria, pero solo es una interfaz ncurses para dar de baja demonios que arrancan con el sistema.

Para probarlo basta con

sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf

Reinicio la pc y obtuve una leve mejora con la cual me quedo tranquilo.



Pero ojo!, hasta que obtengo mi escritorio totalmente cargado pasan casi 85 segundos.
Cuando ya se ha encontrado la configuracion optima se puede deshabilitar el bootchart con el comando:
sudo update-rc -f  stop-bootchart remove

lunes, 10 de noviembre de 2008

Auditoria en PostgreSQL

Cuando uno tiene que auditar las transacciones realizadas en la base de datos tiene varias aproximaciones a tomar, buscando en internet encontre muchas opciones y la mas adecuada estaba en la documentacion de postgresql.
Estrictamente hablando son una serie de triggers, que al ejecutarse un cambio sobre un registro almacena el valor anterior del registro, el nuevo valor, la hora a la que se realizo el cambio y el usuario de la base de datos. en mi caso tenemos un sistema web y la captura del usuario de la aplicacion es bastante engorroso.
La solucion encontrada fue generar una tabla de transacciones en la cual se almacena un numero de transaccion, el nombre de usuario y la tabla sobre la cual se realizo la transaccion. En cada tabla a ser auditada se la agrega un campo al final llamado nro_transaccion. Cuando se va a realizar un cambio en algun registro primero se escribe en la tabla transaccion, luego en la tabla propiamente dicha y finalmente el trigger escribe en la tabla de auditoria.
Los siguentes scripts son una mezcla partiendo del script que figura en la documentacion de PostgreSQL, agregados mios y finalmente mi amigo Luis Escobar creo las funciones para automatizar el proceso de agregar tablas a auditar.

1) Crear la base de datos de prueba:

postgres=# CREATE DATABASE "pruebaAudit" postgres-# WITH ENCODING='SQL_ASCII'; CREATE DATABASE postgres=# COMMENT ON DATABASE "pruebaAudit" IS 'Base de datos de prueba para auditoria'; COMMENT

2) Crear el esquema:

postgres=# \c pruebaAudit
You are now connected to database "pruebaAudit".
pruebaAudit=# create schema auditoria;
CREATE SCHEMA


3) Crear las tablas

Tabla personal:

pruebaAudit=# CREATE TABLE personal
pruebaAudit-# (
pruebaAudit(# idper bigserial NOT NULL,
pruebaAudit(# perdom character varying(100) NOT NULL,
pruebaAudit(# percuil character varying(11) NOT NULL,
pruebaAudit(# persex character varying(1) NOT NULL,
perdocnro character varying(10) NOT NULL,

pertelcel character varying(50) NOT NULL,
pruebaAudit(# perfchnac date,
pruebaAudit(# perdoctip character varying(4) NOT NULL,
pruebaAudit(# perdocnro character varying(10) NOT NULL,
pruebaAudit(# pertelcel character varying(50) NOT NULL,
pruebaAudit(# peremail character varying(50) NOT NULL,
pruebaAudit(# perape character varying(40) NOT NULL,
pruebaAudit(# pernom character varying(40) NOT NULL,

pruebaAudit(# eliminado smallint,
pruebaAudit(# CONSTRAINT personal_pkey PRIMARY KEY (idper)
pruebaAudit(# )
pruebaAudit-# WITH (OIDS=FALSE);
NOTICE: CREATE TABLE creará una secuencia implícita «personal_idper_seq» para la columna serial «personal.idper»
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «personal_pkey» para la tabla «personal»
CREATE TABLE

Tabla usuario

pruebaAudit=# CREATE TABLE usuario
pruebaAudit-# (
pruebaAudit(# idusu smallint NOT NULL,
pruebaAudit(# nomusu character varying(20) NOT NULL,
pruebaAudit(# passusu character varying(50) NOT NULL,

pruebaAudit(# idper bigint NOT NULL,
pruebaAudit(# eliminado smallint,
pruebaAudit(# codusu character varying(20) NOT NULL,
pruebaAudit(# CONSTRAINT codusu_pkey PRIMARY KEY (codusu),
pruebaAudit(# CONSTRAINT usuario_idper_fkey FOREIGN KEY (idper)

pruebaAudit(# REFERENCES personal (idper) MATCH SIMPLE
pruebaAudit(# ON UPDATE NO ACTION ON DELETE NO ACTION

pruebaAudit(# )
pruebaAudit-# WITH (OIDS=FALSE);
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «codusu_pkey» para la tabla «usuario»

CREATE TABLE


4) Creacion de las tablas necesarias para la auditoria

pruebaAudit=# CREATE TABLE "auditoria".infseg (
pruebaAudit(# nombtabla varchar(150) NOT NULL,
pruebaAudit(# esquema varchar(60) NOT NULL,

pruebaAudit(# activar boolean DEFAULT false,
pruebaAudit(# version smallint DEFAULT 1,
pruebaAudit(# fechageneracion timestamp WITHOUT TIME ZONE DEFAULT now(),
pruebaAudit(# fechaactivacion timestamp WITHOUT TIME ZONE,
pruebaAudit(# hastrigg boolean,
pruebaAudit(# /* Keys */
pruebaAudit(# -- CONSTRAINT infseg_pkey

pruebaAudit(# PRIMARY KEY (nombtabla)
pruebaAudit(# ) WITH (
pruebaAudit(# OIDS = FALSE
pruebaAudit(# );
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «infseg
_pkey» para la tabla «infseg»
CREATE TABLE

Insertamos datos:
busca las tablas que estan en el esquema public y las inserta en la tabla infoseg.

pruebaAudit=# INSERT INTO "auditoria".infseg
pruebaAudit-# (nombtabla
pruebaAudit(# , esquema
pruebaAudit(# , version
pruebaAudit(# , hastrigg)
pruebaAudit-# select pgtb.tablename

pruebaAudit-# , pgtb.schemaname
pruebaAudit-# , 1
pruebaAudit-# , pgtb.hastriggers
pruebaAudit-# from pg_tables pgtb
pruebaAudit-# where pgtb.schemaname like 'public'
pruebaAudit-# ;
INSERT 0 2



5) Crear las funciones:
esta funcion la creo desde la herramienta de SQL del PgAdmin

CREATE OR REPLACE FUNCTION public.CrearTrigger
(
nombretabla text,
esquema text,
db text

)
RETURNS text AS
$$
DECLARE QQ text;
BEGIN
QQ := 'CREATE OR REPLACE FUNCTION ' || nombretabla || '_trigAUTO()

RETURNS trigger AS
$BODY$
DECLARE rows_affected INTEGER;
BEGIN IF TG_OP =''INSERT'' THEN
INSERT INTO "auditoria".' || nombretabla || ' (accion, newmovimiento,consulta)

SELECT TG_OP , NEW , current_query
FROM pg_stat_activity
WHERE datname=''' || db ||''' AND current_query <> '''';
ELSIF TG_OP =''UPDATE'' THEN
INSERT INTO "auditoria".' || nombretabla || ' (accion, oldmovimiento,
newmovimiento,consulta)
SELECT TG_OP ,OLD ,NEW , current_query
FROM pg_stat_activity
WHERE datname='''|| db ||''' AND current_query <> '''';
ELSIF TG_OP =''DELETE'' THEN
INSERT INTO "auditoria".' || nombretabla || ' (accion,oldmovimiento ,consulta)
SELECT TG_OP ,OLD , current_query
FROM pg_stat_activity
WHERE datname=''' || db ||''' AND current_query <> '''';

ELSE
RAISE EXCEPTION ''TG_OP % es uno de INSERT, UPDATE or DELETE.'', TG_OP;

END IF;
GET DIAGNOSTICS rows_affected = ROW_COUNT;
IF rows_affected = 1 THEN
IF TG_OP IN (''INSERT'',''UPDATE'') THEN
RETURN NEW;
ELSE
RETURN OLD;
END IF;
ELSE RAISE EXCEPTION ''Fallo el insert en auditoria.|| nombretabla ||'';

END IF;
END;
$BODY$
LANGUAGE ''plpgsql'' VOLATILE STRICT;


CREATE TRIGGER tg_' || esquema || '_' || nombretabla || '
AFTER INSERT OR UPDATE OR DELETE ON '|| nombretabla || '
FOR EACH ROW EXECUTE PROCEDURE public.' || nombretabla || '_trigauto();'
;
RETURN QQ;

End;
$$
LANGUAGE 'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT

;


CREATE OR REPLACE FUNCTION createTablesSeguimiento
( nombtabla text,
esquema text,
db text
)
RETURNS VOID AS

$body$
DECLARE QQ text;

BEGIN
QQ:= 'DROP TABLE IF EXISTS "auditoria". ' || nombtabla || ';
CREATE TABLE "auditoria".' || nombtabla || ' (
idmovimiento serial NOT NULL,
usuariodb text NOT NULL DEFAULT "current_user"(),
accion text NOT NULL,
acciontimestamp timestamp WITH TIME ZONE NOT NULL DEFAULT now(),
oldmovimiento ' || esquema ||'.' || nombtabla || ',
newmovimiento ' || esquema ||'.' || nombtabla || ',
consulta varchar
/* Keys */

CONSTRAINT ' || nombtabla || '_pkey
PRIMARY KEY (idmovimiento),
/* Checks */
CONSTRAINT ' || nombtabla || '_check CHECK (accion = ANY (ARRAY[''INSERT''::text, ''UPDATE''::text, ''DELETE''::text]))
) ;
ALTER TABLE "auditoria".' || nombtabla || '
OWNER TO postgres;';
EXECUTE QQ;
execute public.CrearTrigger(nombtabla,esquema,db);

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
;


6) Ahora vemos como quedo todo:


Esto funciona de la siguiente manera:
a) Desde el PgAdmin se hace click con el boton derecho sobre la tabla infoseg -> Ver datos -> Ver todas las filas lo cual me muestra todas las tablas del esquema public.
b) El campo Activar esta seteado a FALSE, se hace doble click sobre el de manera que se abre un checkbox; se lo tilda de manera que quede en TRUE y se guardan los cambios.



c) Posteriomente se ejecuta el siguiente script
SELECT sinf.nombtabla ,sinf.esquema ,createTablesSeguimiento(sinf.nombtabla,sinf.esquema,'pruebaAudit')
FROM "auditoria".infseg sinf WHERE sinf.activar


El mismo crea las tablas en el esquema auditoria y los triggers en el esquema public.


Vemos como ha quedado:

Ahora solo quedan insertar algunos valores en las tablas usuario y personal y ver como se almacenan en las tablas correspondientes en el esquema auditoria.

Bueno, a cargar datos!
Cargo dos registros en la tabla personal

pruebaAudit=# INSERT INTO personal (idper, perdom, percuil, persex, perfchnac, perdoctip, perdocnro, pertelcel, peremail, perape, pernom, eliminado) VALUES (18, 'mi panza', '5634', 'M', '1976-07-20', 'DNI', '34563', '453', 'sdfgq@adfv.vom', 'Espinosa ', 'Agustin', 0); INSERT 0 1

pruebaAudit=# INSERT INTO personal (idper, perdom, percuil, persex, perfchnac, perdoctip, perdocnro, pertelcel, peremail, perape, pernom, eliminado) VALUES (31, 'adgasdgf', '252525253', 'M', '1972-02-07', 'DNI', '1315351321', '3456456', '3456356356@cksdf.com', 'yo ', 'dfgsdgf', 0);
INSERT 0 1

pruebaAudit=# select * from personal; idper | perdom | percuil | persex | perfchnac | perdoctip | perdocnro | pertelcel | peremail | perape | pernom | eliminado
-------+----------+-----------+--------+------------+-----------+------------+-----------+----------------------+-------------------------------+---------+-----------
18 | mi panza | 5634 | M | 20/07/1976 | DNI | 34563 | 453 | sdfgq@adfv.vom | Espinosa | Agustin | 0
31 | adgasdgf | 252525253 | M | 07/02/1972 | DNI | 1315351321 | 3456456 | 3456356356@cksdf.com | yo | dfgsdgf | 0
(2 rows)

Ahora verifico en la tabla personal del esquema auditoria.

pruebaAudit=# select * from auditoria.personal;
idmovimiento | usuariodb | accion | acciontimestamp | oldmovimiento | newmovimiento | consulta --------------+-----------+--------+-----------------------------+---------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1 | postgres | INSERT | 10/11/2008 17:09:47 GMT | | (18,"mi panza",5634,M,20/07/1976,DNI,34563,453,sdfgq@adfv.vom,"Espinosa ",Agustin,0) | INSERT INTO personal (idper, perdom, percuil, persex, perfchnac, perdoctip, perdocnro, pertelcel, peremail, perape, pernom, eliminado) VALUES (18, 'mi panza', '5634', 'M', '1976-07-20', 'DNI', '34563', '453', 'sdfgq@adfv.vom', 'Espinosa ', 'Agustin', 0); 2 | postgres | INSERT | 10/11/2008 17:10:38.171 GMT | | (31,adgasdgf,252525253,M,07/02/1972,DNI,1315351321,3456456,3456356356@cksdf.com,"yo ",dfgsdgf,0) | INSERT INTO personal (idper, perdom, percuil, persex, perfchnac, perdoctip, perdocnro, pertelcel, peremail, perape, pernom, eliminado) VALUES (31, 'adgasdgf', '252525253', 'M', '1972-02-07', 'DNI', '1315351321', '3456456', '3456356356@cksdf.com', 'yo ', 'dfgsdgf', 0); (2 rows)

o mejor visto desde el PgAdmin:



con esto esta demostrado que funciona.

Esto tiene algunos inconvenientes...nada es perfecto!!:

1) Si se quieren agregar mas tablas a auditar se debe ejecutar por cada tabla:

select createtablesseguimiento('nombre-tabla','public','pruebaAudit');

2) Si no se controlan bien las tablas a auditar se agrega mucha carga al servidor

3) Para poder sacar informacion util se debe trabajar con expresiones regulares y demas cosas bellas :)

domingo, 2 de noviembre de 2008

Stallman en Asuncion 08

El jueves 30/10 viajamos con los chicos a la ciudad de Asuncion Del Paraguay ya que el Sr Richard Stallman daria una conferencia en el Salon de Conferencias del Banco del Paraguay. fuimos: marcos, agustin, pedro, guillermo, pablo, juan manuel, javier, "el enano" y yo :).
Ellos fueron a un hotel mientras yo me quede en la Embajada Argentina, donde tenia alojamiento..pero al final dormi en el hotel :p. En la Embajada Argentina me encontre con Matias y el jueves llego Josi.
La conferencia se llevo a cabo en el Salon de Conferencias del Banco del Paraguay en un auditorio enorme, aun asi se ocuparon todos los asientos, los pasillos y habilitaron un salon adjunto en el que instalaron pantallas gigantes para seguir la conferencia....pero la verdad no se si alguien haya ido alli ya que no tiene gracia ir a "verlo" a Stallaman a traves de una pantalla, cuando podes escucharlo a el a 15 metros.
Como dije hubo muchisima gente, muchos de los cuales solo fueron porque les habran pedido...pero bueno.
Me sorprendio que varias personas tenian en su poder OLPC's, cuando les pregunte me dijeron que eran del Ministerio de Educacion, que se estaban capacitando en su uso para poder capacitar despues a los docentes...buenisimo!.
Al terminar su conferencia se dio la posibilidad al publico que le haga preguntas; las primeras fueron or escrito, algunas habladas pero de esas muchas le dieron problemas a Stallman ya que se debe hablarle fuerte y claro, pero los hermanos paraguayos no pronuncian muy claramente las palabras al hablar. Alla nos encontramos con mi amigo Topo que fue con Lucho Beltran, el cual le hizo saber a Stallaman de la exitosa implementacion de SL en el Poder Judicial de Formosa.
Juanma, guillermo y agustin pudieron hacerle preguntas.
Despues del evento, fuimos a cenar en un bar que esta frente al Panteon de los Heroes. El viernes paseamos un rato por el centro de la ciudad y nos volvimos para Resistencia.
Aca esta en enlace con algunas fotos
http://picasaweb.google.com/pelin.01/RMSAsuncion08#




viernes, 17 de octubre de 2008

Esto es Musica!

Ademas de mi fanatismo por la tecnologia, FLOSS y sistemas operativos Unix-like tengo cierta inclinacion por la opera y la musica clasica.
A continuacion voy a dejar algunos enlaces con videos de youtube que son realemente espectaculares:

Este es agnus dei que es parte de Coronation Mass de Mozart, el cual a su vez es parte de un rito de coronacion.
Consta de las siguientes partes:
1. Kyrie
2. Gloria
3. Credo
4. Sanctus
5. Benedictus
6. Agnus Dei

No soy un entendido en esas artes como para explicar que es cada una de las partes y lo que representa el todo..pero les puedo decir que escuchar a Kathleen Battle te pone la piel de gallina!



En el mismo site estan las restantes partes para el que las quiera escuchar.

Otra obra que es realmente espectacular es Overtura 1812 de Tchaikovsky la cual generalmente (como estamos invadidos por la television norteamericana) la relacionamos con la independencia de EEUU o con la guerra que tuvieron con Inglaterra, pero es la celebracion de la "victoria" Rusa sobre el ejercito de Napoleon en la Batalla de Borodino; batalla caracterizada por la gran cantidad de proyectiles de cañon lanzados. Estos se encuentran representados por por sonidos de cañon, como en este video, o por tambores en la mayoria de las representaciones; en algun momento tambien se escuchan sonidos como de campanas, estos son para representar el ruido de los cascos de los caballos y el ensordecedor sonido de la batalla. Tiene diversas etapas,en algun momento hay fragmentos de la Marsellesa ademas.
En este video hay dos obras, la Overtura comienza en el minuto 5. Lo que es gracioso es que al final de la representacion tiran fuegos artificiales que la verdad no tienen nada que hacer despues de escuchar como 20 descargas de los cañones de 105 mm pero bueh! .



Espero que los disfruten tanto como yo.

miércoles, 8 de octubre de 2008

SSL en Apache

Configuracion de SSL en Apache, tanto en Windows como en Linux y OpenSolaris
Windows:
1) Instalar el apache.
Se deben descargar los binarios desde http://apache.adcserver.com.ar/httpd/binaries/win32/ e instalarlos, apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi . Es importante que se descargue el openssl
2) Instalar el OpenSSL.
Se deben descargar los binarios de http://www.slproweb.com/products/Win32OpenSSL.html ,el paquete tiene como requisito los Visual C++ 2008 Redistributable que se descargan desde el mismo sitio.
3) Crear los certificados:
openssl req -new -out NOM_HOST.csr -keyout NOM_HOST.pem

Como nota, en la serie de preguntas que realiza, cuando solicita ingresar el Common Name se debe ingresar un valor igual al de NOM_HOST

openssl rsa -in NOM_HOST.pem -out NOM_HOST.key
openssl x509 -in NOM_HOST.csr -out NOM_HOST.cert -req -signkey NOM_HOST.key -days 365

Donde NOM_HOST es el nombre del host

4) Habilitar el modulo SSL en el apache.
Se debe descomentar la siguiente linea en el archivo httpd.conf
LoadModule ssl_module modules/mod_ssl.so

y agregar

listen 443


ServerName NOM_HOST
SSLEngine on
SSLCertificateFile C:\certificados\NOM_HOST.cert
SSLCertificateKeyFile C:\certificados\NOM_HOST.key


Se reinicia el servidor web, en el browser se apunta a https://localhost, pide que se acepte el certificado y ya esta funcionando con SSL.
He intentado configurar el SSL en el apache-nossl que esta en el site, agregarle el modulo y demas yerbas pero no me funciono.

Linux:
La creacion del certificado y su firma es la misma que en el caso de Windows en el item 3.
4) Configuracion del apache.
en mi caso estoy utilizando apache2 asi que cambia un poco el modo de hacerlo con respecto al apache 1.3.
4.1) Habilitar SSL
deki:/etc/apache2/sites-available#a2enmod ssl
        Module ssl installed; run /etc/init.d/apache2 force-reload to enable. 
 4.2) Modificar el archivo /etc/apache2/ports.conf agregando la linea
              Listen 443
   4.3) Configurar el host para usar SSL
            Ya tenia en uso un vhost, asi que lo copie con otro nombre (lo llame dekiseguro) y las modificaciones que le hice fueron las siguientes:     
            SSLEngine on
SSLcertificateFile /opt/certs/nom_host.cert
SSLCertificateKeyFile /opt/certs/nom_host.key


Posteriormente se debe habilitar el vhost
deki:/etc/apache2/sites-available# a2ensite
Which site would you like to enable?
Your choices are: default deki dekiseguro Site name? dekiseguro
Site dekiseguro installed; run /etc/init.d/apache2 reload to enable.


Una vez reiniciado o recargado el apache ya esta; y como solucion medio trucha
al vhost que apuntaba al puerto 80 le agregue las ultimas 3 lineas.

Que consegui con eso?
poniendo en la barra de direcciones: http://10.10.8.27/ me responde:

Bad Request

Your browser sent a request that this server could not understand.
Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.

Hint: https://deki/


Siiii, ya esta con SSL.

lunes, 15 de septiembre de 2008

lunes, 1 de septiembre de 2008

Usando SSL en Tomcat

En estos dias me encontre con la necesidad de asegurar las conexiones que se realizan a nuestro tomcat que en breve lo pondriamos en produccion.
Estamos usando el Tomcat 5.5 sobre un Ubuntu Server 8.04 para servir algunas aplicaciones y el Pentaho.
Siguiendo la "SSL Configuration HOW-TO" en http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html fue bastante sencillo.
Lo primero que se necesita es tener el sdk de java (el jre no recuerdo si alcanza)
  • Creamos el keystore con un certificado firmado por nosotro mismos. Por defecto nos crea el keystore en el home del usuario llamado .keystore, para crearlo en un directorio externo (para mi lo mas recomendable) se usa el modificador -keystore en el comando
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore /ruta/a/mi/keystore

A continuacion solicita que se ingrese la password del keystore, la password por default del tomcat es changeit pero uno es libre de cambiarla. Finalmente solicita la password del certificado, la cual debe ser la misma que la del keystore.
  • Editar el archivo server.xml del tomcat
Se debe editar el archivo $CATALINA_HOME/conf/server.xml y agregar las lineas

  • Ahora vamos a redireccionar todas las peticiones para que utilicen https:
Modifico el archivo $CATALINA_HOME/conf/web.xml agregando las siguientes lineas para redireccionar las peticiones hacia https.


  • Una vez hecho esto cuando accedamos al index del tomcat estara en http, pero cada pagina servida por debajo me redireccionara hacia el https:

Esto es todo. espero que les sirva.

Nota: tuve que poner las imagenes debido a que me da error al levantar el texto de los archivos de configuracion.

miércoles, 6 de agosto de 2008

Replicacion en PostgreSQL con Slony-I

Me toco configurar la replicacion de la postgresql, el escenario principal era entre Windows (XP y 2003) y la remota posibilidad de contar con algun Solaris como servidor final; pero ahora aparecio en escena Linux :).
Motores disponibles:
  • PostgreSQL 8.2.6 con Slony 1.2.13R-pg82 (Windows)
  • PostgreSQL 8.3 con Slony 1.2.14 (Windows)
  • PostgreSQL 8.3 (Linux) con Slony-I 1.2.13
  • PostgreSQL Plus AS 8.3 con Slony 1.2.11 (Windows)
Como primera regla a tener en cuenta:
Las versiones de slony deben ser iguales en los nodos
Pruebas realizadas:
Prueba 1
Escenario:

sargon ------------------------------> saladino


Sargon: 10.10.8.137 Windows 2003 Server PostgreSQL 8.2.6 con Slony-I 1.2.13
Saladino: 10.10.8.214 Ubuntu Server 8.04.1 kernel 2.6.24-19-server PostgreSQL 8.3 con slony-I 1.2.13

Configuracion de Sargon

1)Instalacion del PostgreSQL:

aca no hay nada raro, el mayor problema que se puede tener es que la cuenta ya exista cosa que se soluciona facilemente haciendo boton derecho sobre Mi PC -> administrar -> usuarios locales y grupos -> usuarios y ahi boton derecho sobre la cuenta, eliminar y listo!
Otra cosa: la instalacion via terminal server siempre da error. hay que hacerlo sentado fisicamente en la pc :). Por VNC no lo probe.

2)Instalacion del slony
En este caso es el tipico caso de aplis windows :P es un siguiente -> siguiente











3) Configuracion de la replicacion:
  • En el nodo maestro (sargon)
################################
cluster name = mgm_replic;
node 1 admin conninfo = 'dbname=replica host=10.10.8.137 user=replipostgres password=replipostgres';
node 2 admin conninfo = 'dbname=replica host=10.10.8.214 user=replipostgres password=replipostgres';
init cluster ( id=1, comment = 'Nodo Maestro en Windows');
table add key (node id=1,fully qualified name = 'auditoria.movimiento_audit');
table add key (node id=1,fully qualified name = 'auditoria.seguimiento_audit');
table add key (node id=1,fully qualified name = 'auditoria.stock_audit');
table add key (node id=1,fully qualified name = 'auditoria.vale_audit');
create set (id=1, origin=1, comment='aqui van todas mis tablas a replicar');
set add table (set id=1, origin=1, id=1, fully qualified name = 'public.personal',comment='mi tabla de personal');
set add table (set id=1, origin=1, id=2, fully qualified name = 'auditoria.movimiento_audit',key= serial,comment='mi tabla de auditoria de movimientos');
set add table (set id=1, origin=1, id=3, fully qualified name = 'auditoria.seguimiento_audit',key= serial,comment='mi tabla de auditoria de seguimiento');
set add table (set id=1, origin=1, id=4, fully qualified name = 'auditoria.stock_audit',key= serial,comment='mi tabla de auditoria de stock');
set add table (set id=1, origin=1, id=5, fully qualified name = 'auditoria.vale_audit',key= serial,comment='mi tabla de auditoria de stock');
store node (id=2, comment = 'Nodo Esclavo en la linux');
store path (server = 1, client = 2, conninfo='dbname=replica host=10.10.8.137 user=replipostgres password=replipostgres');
store path (server = 2, client = 1, conninfo='dbname=replica host=10.10.8.214 user=replipostgres password=replipostgres');
store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);

##########################################
lo guardo en un archivo llamado "maestro.txt"
y ejecuto en el cmd:
#######################
C:\Archivos de programa\PostgreSQL\8.2\bin>slonik.exe "c:\Archivos de programa\PostgreSQL\replicacion\maestro.txt"

C:\Archivos de programa\PostgreSQL\8.2\bin>

########################

Si no dio error, todo esta bien. En caso de haber alguno se debe ver a que hace referencia: entrada en el pg_hba.conf, no existe la cuenta, etc.

Ejemplo de error
##############################
C:\Archivos de programa\PostgreSQL\8.2\bin>slonik.exe "c:\Archivos de programa\PostgreSQL\replicacion\maestro.txt"
c:\Archivos de programa\PostgreSQL\replicacion\maestro.txt:8: FATAL: no hay una
línea en pg_hba.conf para «10.10.8.137», usuario «replipostgres», base de
datos «replica», SSL inactivo

###############################
  • En el nodo esclavo (saladino)
###############################
#!/bin/sh
slonik << name =" mgm_replic;" conninfo =" 'dbname="replica" host="10.10.8.137" port="5432" user="replipostgres" password="replipostgres';" conninfo =" 'dbname="replica" host="10.10.8.214" port="5432" user="replipostgres" password="replipostgres';" id="1," provider="1," receiver="2," forward="yes);" size="2">pelin@saladino:/etc/postgresql/8.3/main/replicacion$ sudo sh init_suscription-5to.sh
pelin@saladino:/etc/postgresql/8.3/main/replicacion$

###############################

Si no dio error todo esta bien.

  • Registro el servicio slon en sargon (Windows)
El windows 2003 da error al ejecutar el comando slon -regservice

#####################
C:\Archivos de programa\PostgreSQL\8.2\bin>slon -regservice
Failed to create service: 1057

######################
La solucion es: (Adjunto la respuesta de Roberto Crucianelli)
######################
slon -regservice

crea un servicio que en definitiva no es más que una serie de llaves de Registry.

Falla en Windows 2003 Server porque Microsoft cambió algunas llaves.

Lo podés levantar creando el servicio a mano.

Si no tenés el Windows Resource Kit para 2003 Server lo bajás de Microsoft. Son utilidades de línea de comandos. Uno de los programas es instsrv.exe. Hacé:

instsrv Slony-I "C:\Archivos de programa\Postgresql\8.3\bin\slon.exe"


(Usá el path que tengas a slon.) Te va a decir que lo creó.

Desde Panel de Control - Herramientas Administrativas - Servicios verificá que esté creado y deshabilitalo.

Ahora vas a regedit

Buscás:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Slony-I

(Tiene que estar.)

Abrí la llave ImagePath.

Vale:

\slon.exe"

Agregá esto " -service" a continuación de slon.exe.

Creá una nueva entrada Multilínea (REG_MULTI_SZ) al mismo nivel que está ImagePath.

Nombre: DependOnService"

Valor: RPCSS

Salí de Regedit y vas a de nuevo a Panel de Control - Herramientas Administrativas - Servicios. Buscá Slony-I.

Asegurate que el comando que muestra (slon.exe) tenga la opción -service y que figure la dependencia de Servicio de Llamada Remota.

Ahí pasalo a Automático y le dás Iniciar. Si todo fue bien tiene que arrancar sin problemas.

*****Te va a faltar hacer:

slon -addengine Slony-I

Y reiniciar el servicio (o Windows).
######################

****Continuamos:

En sargon creo un archivo que contiene:
#######################
cluster_name = 'mgm_replic'
conn_info='dbname=replica user=replipostgres password=replipostgres'
########################
y lo llamo slon.conf

ejecuto:
######################
C:\ARCHIV~1\POSTGR~1\REPLIC~1>slon -addengine Slony-I slon.conf
Engine added.
NOTE! You need to restart the Slony service before this takes effect.

C:\ARCHIV~1\POSTGR~1\REPLIC~1>
######################
Reinicio el servicio Slony-I

En saladino creo un archivo similar a slon.conf y lo llamo init_slony.sh
##########################
cluster_name=mgm_replic;
conn_info='dbname=replica host=10.10.8.214 user=replipostgres password=replipostgres';

##########################

y
lo ejecuto en el shell

#######################
pelin@saladino:/etc/postgresql/8.3/main/replicacion$ sudo sh init_slony.sh
pelin@saladino:/etc/postgresql/8.3/main/replicacion$

########################

Ahora queda la cuestion del slony en el lado de la linux
Creo un archivo llamado "init_slony-1.sh" que contiene
#########################
#!/bin/bash
slon mgm_replic "dbname=replica host=10.10.8.214 user=replipostgres password=replipostgres" > slon_mgm_replica.out 2>&1 &
#########################


lo ejecuto en la consola:
########################
pelin@saladino:/etc/postgresql/8.3/main/replicacion$ sudo sh init_slony-1.sh
#########################

Una vez hecho esto, ya deberia estar replicando la Base de datos replica.
En el archivo
slon_mgm_replica.out se puede ver el log del proceso que esta en ejecucion.

Esperemos que les sirva!.

En breve estare escribiendo mas articulos de replicacion.

sábado, 28 de junio de 2008

Windows 2008

Recientemente asisti a la presentacion del Windows Server 2008 que se realizo en el Aula Magna de la UTN Regional Resistencia. La presentacion fue organizada por el MUG, y consto de varias exposiciones; entre las cuales estuvo la del "Bicho" Perez que es profesor de varias catedras en la facu y MVP de Microsoft.
La verdad me parecieron interesantes las novedades del Windows pero hubieron algunas inconsistencias en la presentacion, como ser:
"Microsoft se esta ajustando a los estandares aceptados por la comunidad" pero lo siguiente que muestra es el novedoso protocolo creado por Microsoft que se utiliza para administracion remota de los equipos, el cual se maneja a traves de http.
Si no fuera usuario de sistemas Unix-like me habria quedado boquiabierto, pero por suerte eso no paso :). En uno de los puntos que mas hincapie hizo fue en la capacidad de virtualizacion que trae una de las versiones, que en si es una competencia directa a lo ofrecido por VMWARE.
Otra de las cosas que mas se menciona es la posibilidad de instalarlo sin interfaz grafica pero el inconveniente es que no instala el novedoso PowerShell ni el .NET razon por la cual se complica bastante la administracion. Me paso que instale un SSH Server en un 2003 y la verdad es durisimo el shell. Habia comandos con modificadores de hasta 30 letras!!!!!!.La verdad el shell de windows apesta!.
Lo que me queda es probarlo y ver si es tan bueno como dicen!

martes, 20 de mayo de 2008

Whyfloss Conference Corrientes 2008




El pasado 15 y 16 de Mayo se realizo la Whyfloss Conference en la ciudad de Corrientes (Argentina). Fue un evento sobre tecnologias floss organizado por Neurowork que tuvo una buena aceptacion y asistencia, aun teniendo en cuenta que el puente Chaco-Corrientes estaba cortado lo cual evito que muchos chaqueños puedan asistir ya que habia que cruzar el puente caminando :o .
Vinieron los amigos de Misol y miembros de Nesla los cuales tuvieron cuatro ponencias de muy buen nivel. Ademas participaron Yaco, Agustin y Marcos con otras ponencias.
El evento estuvo espectacular, pero el viernes no
pude asistir ya que me dormi :p

lunes, 28 de abril de 2008

Flisol 2008 - Ctes


El pasado sabado 26 de abril de llevo a cabo en la ciudad de Corrientes la Flisol 2008, en la Facena de la UNNE. La verdad fue un evento que supero nuestras expectativas y experiencias anteriores. Gracias a la colaboracion de mucha gente se hizo posible tal evento. Paso a nombrar a las personas:
* guillermo
* veronica
* fabricio
* yaco
* andy
* pupy
* pedro
* marcos
* javier
* el amigo de guillermo que no recuerdo el nombre :p


Espero que este sea el puntazo inicial de un año prodigo en actividades relacionadas al SL.
Mas fotos en http://eventoflisol.com.ar/gallery


----------------
Now playing: Tchaikovsky - 1812 Overture
via FoxyTunes

martes, 18 de marzo de 2008

Siempre lo mismo

La mayoria de las veces (99%) que leo un articulo relacionado a aplicaciones, ya sean de servidor o de estaciones de trabajo, tips o lo que sea que escriban; en los diarios, hacen referencia a sistemas operativos de Microsoft. Eso es algo que no entiendo, podran decir que es el SO mas utilizado, mas facil,no se, pueden decir lo que quieran; la cuestion es que ignoran al resto de los usuarios de SO's, ya sean tipo Unix o Linux. Que consiguen con eso?, que la gente con escasos o sin conocimientos de informatica crea que solo existe una opcion a la hora de elegir un SO, entonces al comprar una computadora nueva, que para no pagar la licencia del SO viene con alguna version de Linux preinstalada, pero con una minima o ninguna configuracion (que lo hace imposible de utilizar para un usuario comun) lo primero que quiera hacer es: "sacarle eso y ponerle XP" ,todo eso con complicidad de la persona que la instala que le cobra $40/50 para hacer la tarea.
Con esto no quiero echarle la culpa a la gente que escribe un articulo, pero podrian ser un poco mas abiertos; es decir: al escribir un articulo sobre Microsoft Office 2007 por ejemplo, que ademas de comentar sus "maravillosas ventajas" muestren cuanto cuesta el software, cuantos recursos de pc utiliza (memoria RAM, cuanto procesador) y que ademas deberian mencionar que existen otras opciones, como ser OpenOffice que es una suite de oficina que tiene costo 0 (bueno....el costo de bajarlo de Internet y bajarlo a un CD o a un pen) y para tareas de oficina basicas anda de maravillas.
Espero que entre todos podamos cambiar la mentalidad, tanto del usuario final como de la gente que escribe articulos

----------------
Now playing: Coro de monjes gregorianos de - exsultet ian angelica
via FoxyTunes