Synergy : compartiendo KM

•marzo 24, 2009 • Dejar un comentario

Hace algún tiempo ya conseguí este software en un programa de televisión que se dedicaba meramente a temas de tecnología… techtv, (en el cual trabajaba Kevin Rose (digg.com)), el canal cambio su nombre a g4 desde hace bastante tiempo. Empezaré diciendo que es (que hace) y que no es (que no hace :P) el programita.

¿Que es synergy?

Synergy es un software cliente-servidor multiplataforma que nos permite compartir el teclado, ratón y portapapeles (casi) en múltiples computadoras, por ejemplo, tengo un equipo con Windows, otro con Linux y ademas mi laptop, yo puedo instalar el servidor de Synergy (es el mismo paquete que el cliente) en el equipo con Linux y los clientes en el Windows y mi laptop, entonces… una vez configurado uso el teclado y ratón de mi equipo con Linux y al pasar el ratón al limite izquierdo de la pantalla automáticamente se pasa al extremo derecho del equipo con Windows, con la laptop similar, al llegar al limite derecho de mi equipo con Linux se pasa a la izquierda de la laptop. lo del casi-portapapeles es porque solo soporta textos cortos (es mi experiencia) y a veces me ha pasado que devuelve letras chinas (o japonesas, u otra parecida ( no he visto suficiente anime)).

Quizá para algunos esta herramienta sea inútil, pero en mi caso y algunos compañeros de trabajo (del actual y el anterior) nos ha sido de gran ayuda ya que usamos muchas maquinas (algunas con Windows, otras laptops, la del día a día (en caso de duda… Debian :P), etc.).

He preparado unas imágenes que permitirán entender mas rápidamente que es y como se comporta.

Equipo linux y windows compartiendo teclado y mouse

Equipo Linux y Windows compartiendo teclado y mouse

¿Que *NO* es synergy ?

Synergy NO funciona como un KVM (hardware para compartir entre diferentes equipos un mismo teclado/monitor/ratón, el cual trabaja con un solo monitor y uno cambia el equipo a trabajar por medio de unos switches , algo parecido a esto es el software VNC. La arquitectura es como se muestra a continuación.

kvm - keyboard, video y mouse

kvm - keyboard, video y mouse

Otro caso que puede tender a confundir es el hecho de usar dos monitores en el mismo equipo para expandir el área visual, útil para monitorear equipos en el caso de administradores de red, o para diseñadores gráfico para ir trabajando en un lado y ver el resultado en el otro monitor, en el mundo del software libre tenemos la herramienta xinerama que por medio de xorg hace esto, un solo equipo con la tarjeta de vídeo integrada mas una externa se pueden conectar dos monitores, o usando una laptop y conectando un monitor en la salida de vídeo.

xinerama

xinerama

Otros ejemplos de uso.

En una LAN muy pequeña como puede llegar ser dos equipos uno al lado de otro en una oficina o la casa se puede usar quicksynergy (nombre del paquete de debian que usa synergy de fondo) que es una interfaz gráfica para estos casos simples, pero hay ocasiones que necesitamos algo mas que un equipo junto a otro, pudiéramos encontrarnos con una mesa con 4 monitores por ejemplo, en este caso se tienen que definir todas las conexiones (ida y vuelta) de cada monitor, es decir, si digo que me permita la conexión de A -> B pero no B -> no dejaría devolverme. Como el gráfico a continuación.

cuatro monitores en linea

cuatro monitores en linea

Otro caso mas complejo pudiera ser el siguiente.

Esquema mas complejo de ordenacion de monitores

Esquema mas complejo de ordenación de monitores

El cual llegué a ver alguna vez en un mueble en una pared, muchos monitores (para aquel entonces usaban synergy y tenían el poco de monitores por todos lados marcados) en esa situación el uso de synergy hubiera sido ideal.

Notas:

Para los gráficos usé: dia (con iconos de RIB-network)+inkscape+gimp. En otros casos use graphviz

Enlaces de interes.

http://synergy2.sourceforge.net/

http://quicksynergy.sourceforge.net/

http://thiagoribeiro.wordpress.com/2008/08/18/new-network-icons-schema-to-gnome-dia/

http://g4tv.com/screensavers/features/468/Sarahs-Download-of-the-Day-Synergy.html

http://www.graphviz.org

Semana de trabajo interesante

•enero 31, 2009 • Dejar un comentario

Realmente no fue esta semana sino la semana pasada, básicamente hubo muchas cosas con las que tuve que trabajar que me parecieron interesantes y entretenidas, por un lado me senté con un compañero de trabajo a configurar TORA [1] para que reconociera oracle, no compilandolo a ‘pata’ sino descargando el binario directamente de debian, descomprimirlo, modificarlo, reconstruirlo e instalarlo siendo un .deb y así dpkgearlo😀. Todo bien.

Otro de los puntos que traté en esa semana fue el uso de politicas de grupo (GPO) de LDAP para poder bloquear el uso del disco USB (pendrive) de forma centralizada (servidor LDAP) a todos los usuario del dominio, ademas de esto, poder correr un script actualizardor en todos los clientes windows sin tener que pasar maquina a maquina, esto es algo que desconocía se podía hacer, y ahora que lo sé me gusta mas aún el LDAP, y sigo leyendo mas al respecto🙂.

Ademas con otro compeñero nos pusimos a levantar una VPN, usando un equipo como servidor web el cual publicaría contenido usando CA para cifrado de información, este servidor con algunas politicas de cortafuego para que solo haya trafico por la vpn, una buena práctica que nos tomó hasta casi la 1am, todo bien, por un momento me recordó cuando estaba con mi tesis, trabajando hasta tarde haciendo lo que me gusta.

Y para finalizar, el otro tema que me llamó la atención fue que de repente algunas llaves que habiamos generado usando ssh para conexiónes remotas seguras sin usar clave, empezaron a fallar, esto debido al problema con ssl que hubo en debian, a estas alturas el problema ya está solventado, me dio que pensar por un rato.

Acá dejo unos enlaces relacionados con los temas que comenté anteriormente, los que faltan los ire colocando poco a poco.

[1] http://ubuntulife.wordpress.com/2007/03/23/compilar-tora-con-soporte-de-oracle/

A pesar que esto es solo “un monton de caracteres”, quiero agradecer por estar ahí y compartirlos.

Día de descarga de Mozilla Firefox

•junio 16, 2008 • Dejar un comentario

Mañana será el día de descarga de Mozilla Firefox 3, para los que usan firefox como navegador web predeterminado, es hora de actualizarse, esta nueva versión trae varias mejoras, entre ellas está el hecho que no deja tanto memory leak como lo hace la versión estable hasta hoy (FF2) y otras cosas mas. Y para los que usan Opera, Safari e incluso Internet Explorer, es el momento que se den la oportunidad de conocer este navegador que lo uso para desarrollar, otros amigos lo usan para organizar sus redes sociales, otras personas para administrar el control parental y otros para otras cosas😛.

http://www.spreadfirefox.com/es-ES/worldrecord

Formen parte mañana de la descarga de Firefox 3 y así hacer un récord mundial, en Venezuela van ~6.800 personas comprometidas.

Primeros screencast de tutoriales de Catalyst

•mayo 7, 2008 • 3 comentarios

Por esta vez subo los archivos en un servidor para su descarga, ya que al subirlos a youtube perdió mucha calidad (aqui) y apenas se entiende.

He subido dos videos, ambos introductorios, el segundo abarca mas temas que el primero.

catalyst-inicio.ogg 39M

  • primero verificamos que catalyst se encuentre instalado, sino lo instalamos (por: aptitude y CPAN).
  • Creación de proyecto.
  • uso de servidor integrado para desarrollo
  • creacion de controlador.
  • creacion de accion (Local)
  • creacion de vista (TTSite)
  • Paso de variables del controlador a la vista

catalyst-intro.ogg 39M

  • Creacion de proyecto
  • uso de servidor integrado para desarrollo
  • muestra de uso de debug (terminal)
  • creacion de controlador
  • creación de accion de controlador (local,path).
  • creacion de vista (TT, TTSite)
  • paso de variables del controlador a la plantilla.
  • paso de variables por el get
  • trabajo con argumentos para ser procesados en el controlador
  • asignación de vista por defecto (es necesario al tener mas de una)

Catalyst, el framework web elegante.

•abril 23, 2008 • 1 comentario

Justo antes de empezar a escribir este post, tenía pensado realizar una serie de screencast‘s demostrativos de las tareas cotidianas que se le presenta a cualquier programador web al realizar un proyecto, algunos temas que tengo en mente ahora son:

  • Manejo de formularios
  • Abstracción de base de datos
  • Ajax
  • Autenticación / Autorización.
  • Reportes por PDF.
  • Manejo de sesiones
  • Depuración de la aplicación.
  • Documentación del código (pod)

Si se le presentan ideas, por favor hacerlas llegar, y en lo posible será incluido en esta serie de videos para que sea lo mas completa posible.

Empecemos por lo básico para entender este post.
¿Que es un framework? un framework es un conjunto de herramientras integradas para facilitar la realización de tareas realizadas practicamente a diario.

¿Que es Catalyst? Catalyst es un framework web escrito usando perl, quizá una forma de asociarlo más rápido puede ser pensando en el framework web Ruby on Rails, así en este caso, Ruby es para Ruby on Rails lo que Perl es para Catalyst, es decir, Catalyst no es un lenguaje.

Catalyst trabaja usando la metodología de desarrollo MVC (Modelo Vistra Controlador) que lo que hace es separar el origen de información (Base de datos, RSS, LDAP, Etc.), la presentación (xml, json, html, PDF, RSS, Etc. ) y la propia lógica de programación, la cual es la encargada de procesar la información obtenida, es decir, sirve de intermediario entre la capa de Vista y Modelo, ofreciendo un código mas mantenible e incluso, tener grupos de desarrolladores/diseñadores/DBA dedicados a su tarea.

En este punto se podría decir que Catalyst no es mas que otro Framework web, a continuación algunas caracteristicas que hacen de Catalyst un buen framework.

  • Facilidad de instalación:
    El medio mas fácil/comodo de realizar una instalación de Catalyst es a travez de aptitude, en el caso de Debian o Ubuntu se encuentra disponible con el paquete de nombre ‘libcatalyst-perl‘. Siendo tan fácil como aptitude install libcatalyst-perl .
    Otra forma es por medio de CPAN, que… usando el mismo ejemplo de hace un rato: CPAN es para Perl lo que Aptitude es para dpkg (algo así, es para que agarren una idea) CPAN es un repositorio muy extenso de modulos de Perl, y al realizar una instalación por este medio, se satisfaceran las dependencias necesarias de modulos para no dejar la instalación a medias. El nombre del módulo a instalar para tener todo lo que se necesita para empezar a trabajar es Task::Catalyst, instalandose de la siguiente forma: cpan Task::Catalyst . Recomiendo en lo posible realizar la instalación usando los paquetes de debian, este método solo cuando sea necesario.
  • uri_for (sin reglas de mod-rewrite)
    Otra de las ventajas es que nos olvidamos de las reglas de mod-rewrite para tener una direcciones de despacho limpias, de esto se encarga Catalyst internamente, y para mantener el control de las rutas a la hora de mover el proyecto de directorio es la función uri_for, la cual se encarga de mostrar la ruta adecuada según el metodo de despacho usado, es decir, trabajar con: http://mi.dominio.com/mantenimiento/empleado/11222333/editar (Basadas en segmentos) en vez de http://mi.dominio.com/mantenimiento/empleado.cgi?cedula=11222333&operacion=editar (query string). Esto a parte de ser visualmente mas limpio, intuitivo de usar, mas amigable… es mas manejable para los motores de busqueda (google,yahoo.etc) a la hora de indexar el contenido del sitio haciendolo mas accesible (en términos de visitas) en la red.
  • scripts helpers
    Al igual que otros framework’s (no todos) catalyst trabaja con unos scripts de ayuda para crear modelos, vistas, controlladores (podemos pensar en un controlador como un conjunto de páginas), es ventajoso porque hay frameworks en los cuales uno tiene que copiar archivos y trabajar sobre estos últimos, en Catalyst no es el caso.
  • Unicode
    Catalyst tiene buen soporte para unicode (UTF8), si la intención es en algún futuro ofrecer la aplicación/página web a la mayor variedad de publico, se tiene que trabajar con unicode desde un principio, de hecho, aplicaciones desarrolladas hoy día deberían trabajar bajo esta cadena de caracteres (a nivel de servidor web, base de datos, tipo de archivo, el propio charset el archivo) para evitar los rombitos con el signo de interrogación que se puedan llegar asomar en la aplicación.
  • Acciones y métodos de despacho
    Una acción es un bloque dentro de los controladores, y no es mas que una función esperando ser disparada al reconocer una llamada por meadio del URL por cualquiera de los tipos de acciones, de los cuales tenemos los siguientes:

    • Path: Se asigna una ruta absoluta a ser reconocida en toda la aplicación, independiente del controlador donde se encuentre
    • Regex, LocalRegex: Realiza correspondencias de los URL visitados según expresiones regulares (el fuerte de Perl) a nivel global y local.
    • Global: Hace pasar el nombre de la acción al primer nivel (como si se tratase de un controlador)
    • Local: Despacha el nombre de la acción como segundo nivel, justo despues del nombre del controlador que la mantiene.
    • Chained: Esta una de las acciones mas interesantes ya que permite jugar con los segmentos del URL a ser reconocidos puesto que es una combinación de varias acciones concatenadas pero aún así cada una recibe una cantidad definida de argumentos.
    • Private: no despacha por medio de URL sino funciones llamadas internamente de forma explicita y otras veces por secuencia (index,begin,auto,end,default).
  • CPAN
    “CPAN es el lenguaje, perl es sólo la sintaxis” esto es algo que escuché (o leí) alguna vez y se me quedó grabado porque en cierta forma es así, dada la gran cantidad de módulos que se encuentran disponible en CPAN para cualquier tarea pensada, uno no tiene porque reinventar la rueda sino usar los módulos aqui disponibles para facilitar las operaciones a realizar, y gracias a la flexibilidad de uso de Catalyst, no hay inconvenientes para incorporarlos como si se tratase de un script stand-alone de perl o CGI, pero recuerden que se trata de un framework MVC, no traten mezclar arroz con mango, denle sentido al asunto de separar las capasa.

Este articulo (y el resto que estan por venir) no pretende dar a explicar cada punto sobre el uso de Catalyst ya que siempre se escapará algo, para eso use la lista de Catalyst-es.

Recomendación de lectura de Catalyst , Catalyst::Manual::Intro , Catalyst::Manual::Tutorial , esta docmentación se encuentra en ingles, parte de ella ha sido traducida por mi, cuando lo tenga listo lo publicaré en castellano para llegar esta información a mas gente.

script generador de trigger para auditoría en Postgres

•abril 15, 2008 • 9 comentarios

Al terminar de seguir estos pasos, tendremos una tabla dedicada exclusivamente para el registro de las operaciones en nuestra base de datos. Los datos a ser guardados son:

  • Nombre de la tabla afectada.
  • id registro afectado
  • Nombre del campo afectado.
  • Valor anterior del cambio.
  • Nuevo valor del campo.
  • Dirección ip del cliente que realizó el cambio.
  • Fecha y hora de cambio (con huso horario, timestamptz)
  • Tipo de operación

Requisito para el uso del script es tener instalado TemplateToolkit, en Debian el paquete es libtemplate-perl

Entonces procedemos a crear la tabla de auditoría.


CREATE TABLE auditoria(
id serial NOT NULL,
nombre_tabla varchar,
id_campo int8,
nombre_campo varchar,
valor_anterior varchar,
valor_nuevo varchar,
fecha_operacion timestamptz,
tipo_operacion char(1) DEFAULT 1, -- i = insert ; u = update
ip inet,
CONSTRAINT auditoria_pkey PRIMARY KEY (id),
CONSTRAINT auditoria_tipo_operacion_check CHECK (tipo_operacion = 'i'::bpchar OR tipo_operacion = 'u'::bpchar)
)
WITHOUT OIDS;
ALTER TABLE auditoria OWNER TO postgres;
COMMENT ON COLUMN auditoria.tipo_operacion IS 'i = insert ; u = update ';

El lenguaje usado para este trigger es pl/pgsql , así que para trabajar con él debemos primero agregarlo a la base de datos. Con el front-end pgadmin3 es mas que suficiente colocando ‘plpgsql’ en el campo de nombre de nuevo lenguaje en la base de datos a aplicar el trigger.

Ahora usamos el siguiente script para generar el trigger correspondiente para cada tabla a ser auditada.

#ARCHIVO: genera_trigger_auditoria.pl #!/usr/bin/perl
use Template ;
$trigger = "genera_trigger_auditoria/trigger.tt" ;
$archivo_salida = $ARGV[0] . "-audit.trigger";
for ( $i = 1 ; $i <= $#ARGV ; $i++ ){
push(@campos , $ARGV[$i]);
}
$variables = {
tabla => $ARGV[0],
campos => \@campos
};
$template = Template->new();
$template->process($trigger, $variables , "triggers/".$archivo_salida)
|| die "Hubo un error al generar la plantilla " . $template->error() . "\n";

#genera_trigger_auditoria/trigger.tt

BEGIN
IF (TG_OP = 'DELETE') THEN
RAISE EXCEPTION 'NO SE PERMITEN BORRADOS FISICOS';
END IF ;
IF (TG_OP = 'UPDATE') THEN
[% FOREACH cp = campos %]
IF (OLD.[% cp %] <> NEW.[% cp %]) THEN
IF ('[% cp %]' = 'eliminado') THEN
insert into auditoria(nombre_tabla,
id_campo,nombre_campo,valor_anterior,valor_nuevo,ip,fecha_operacion,tipo_operacion)
values( '[% tabla %]', OLD.id, '[% cp %]', OLD.[% cp %]::int, NEW.[% cp %]::int, inet_client_addr(), current_timestamp, 'u');
ELSE
insert into auditoria(nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,ip,fecha_operacion,tipo_operacion)
values( '[% tabla %]', OLD.id, '[% cp %]', OLD.[% cp %], NEW.[% cp %], inet_client_addr(), current_timestamp, 'u');
END IF;
END IF;
[% END %]
return new ;
END IF ;
IF (TG_OP = 'INSERT') THEN
[% FOREACH cp = campos %]
IF (NEW.[% cp %] IS NOT null) THEN
IF ('[% cp %]' = 'eliminado') THEN
insert into auditoria(nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,ip,fecha_operacion,tipo_operacion)
values( '[% tabla %]', NEW.id, '[% cp %]', null, NEW.[% cp %]::int, inet_client_addr(), current_timestamp, 'i');
ELSE
insert into auditoria(nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,ip,fecha_operacion,tipo_operacion)
values( '[% tabla %]', NEW.id, '[% cp %]', null, NEW.[% cp %], inet_client_addr(), current_timestamp, 'i');
END IF;
END IF;
[% END %]
return new ;
end IF ;
END;

La sintaxis de uso es la siguiente:

$ perl genera_trigger_auditoria.pl NOMBRE_TABLA campo1 campo2 campoN

Con esto se crea un archivo con el formato <triggers/NOMBRE_TABLA-audit.trigger>

El contenido de este archivo debemos agregarlo a la lista de triggers disponibles en la base de datos, para posteriormente ser asociados a tabla/eventos. Esto lo hacemos usando pgadmin3 de la siguiente manera:

NOMBRE_BASE_DATOS > schemas > public > Trigger functions

menú: Edit > create

En language colocamos plpgsql y en la pestaña de parametros colocamos el texto generado por el script usado anteriormente.
Ahora asociamos la tabla/evento al trigger, hay que hacer esto por cada tabla.
NOMBRE_BASE_DATOS > schemas > public > tables > NOMBRE_TABLA > triggers

menú: Edit > create

  • Verificamos el la opción “row” esté marcada.
  • En el campo “trigger” asociamos el trigger recien creado.
  • Marcamos la opción para que se dispare antes (BEFORE) de realizar la sentencia.
  • Marcamos todos los eventos: INSERT, UPDATE, DELETE.

Ya con esto debería estar funcionado.

Si tienen alguna sugerencia de como se puede guardar un usuario enviado a nivel de aplicación, los comentarios son bien recibidos.

PD: El trigger evita la operación de “DELETE” pues se recomienda trabajar con borrado lógico, es decir, un campo extra boleano para cada tabla para identificar si está eliminado o no.

Crear imagen disabled-like para ser usada con CSS (estado de botones)

•agosto 12, 2007 • Dejar un comentario

En un proyecto que estoy trabajando utilizo iconos para los botones en las pantallas, el proyecto tiene un comportamiento como las aplicaciones de escritorio, en el sentido de que dependiendo del “modo” que se esté trabajando, se activan/desactivan algunos botones/campos. En el caso del texto de los botones, con simplemente agregarle al botón el atributo “disabled”, este cambia de apariencia, pero la imagen se mantiene del color. Así que trabajé en un script que se encargue de automatizar este proceso ya que pude haberlo hecho usando gimp, pero como son muchas imágenes las que quería convertir, usé imagemagick.

Para ilustrar un poco mas el asunto, la imagen original es: boton de agregar y necesito que el resutado sea:
boton de agregar con gris, resultado Para que, dependiendo del estado, cambiar la regla background-position del elemento y cambie de color a gris, mostrando un efecto de disabled.


#!/bin/bash# css-img-disabledv0.1

# Script para crear una imagen destinada a ser usada como imagen de doble

# estado, practico al usar en sitios web junto con hoja de estilo en cascada (css)

# Autor: Javier E. Pérez P. | https://dvst.wordpress.com | 20070812

# Crear carpeta (si no existe) para imagenes grices

if [ ! -e grices ]; then

mkdir grices

fi

# Crear carpeta (si no existe) para imagenes resultantes

if [ ! -e resultados ] ; then

mkdir resultados

fi

# Crear imagen de fondo (transparente 16×36)

convert -size 16×36 xc:none fondo-transparente.png


for file in *.png; do

# tomamos solo el nombre de archivo (sin extensión)

NOMBRE_ARCHIVO=${file%%.png}

# convertir imagen original a gris y 10% mas de brillo para situarla en carpeta de grices

convert –type grayscale -modulate 110 $file grices/$NOMBRE_ARCHIVO-gris.png

# componer original con imagen de fondo para situarla en imagenes resultantes

composite -dissolve 100% $file fondo-transparente.png resultados/$NOMBRE_ARCHIVO-result.png

# componer imagen gris con imagen de fondo resultante para obtener el resultado final

composite -dissolve 100% -geometry +0+20 grices/$NOMBRE_ARCHIVO-gris.png resultados/$NOMBRE_ARCHIVO-result.png resultados/$NOMBRE_ARCHIVO-result.png


# avisamos por pantall

echo Imagen: $file terminada

done

# ya los grices no nos sirven sino que ocupan mas espacio en disco, así que los borramos

rm -fr grices

Luego la regla en css podría ser:

input[type="button"][value="Agregar"]{
background-image : url("/img/icons/add.png") ;
background-repeat : no-repeat ;
background-position : 6px 3px ;
padding-left : 25px ;
}

input[type=”button”][value=”Agregar”][disabled] {
background-image : url(“/img/icons/add.png”) ;
background-repeat : no-repeat ;
background-position : 6px -16px ;
padding-left : 25px ;
}

estado botones formulario, enabled/disabled

El icono que usé en el ejemplo lo saqué de famfamfam .

Sugerencia: Podría ser bueno que en vez de leer una lista de archivos en el directorio actual, recibiera una lista de archivos a aplicar la operación, algo como: css-img-disabled.sh add.png cancel.png y que el script sólo reconozca esos archivos.

PD : que cagada es el editor de wordpress cuando uno quiere meter código, formatea la salida