lunes, 29 de diciembre de 2008

Instalar Pgadmin3 en Linux

Hola, la vamos a hacer cortita por que no tengo mucho tiempo, escribo este tips solo como recordatorio.

Una de las bases de datos Open Source más utilizadas es PostgreSQL, por su flexibilidad, potencia y rapidez es una de las mejores que existe hoy en día, con respaldo de grandes empresas, ademas de tener soporte para multiples funciones, entre ellas soporte para PL (procedimientos almacenados). aunque no soy muy amigo de meter logica de negocio en las bases de datos, por la dependencia que esto provoca, ojo, no digo que sea malo... jajajja son pesimos.. kikokiko.

Bueno, cuando tenemos linux y nos queremos hacer de una buena base de datos local para nuestros desarrollos optamos por Mysql que es excelente o por PostgreSQL que tambien es muy buena. ambas free.

Si tenemos instalado webmin, podemos instalar Postgre desde la pestaña de servicios, esto no es nada mas que instalar postgre con apt-get pero desde una interfaz grafica.

Una vez instalada nuestra base de datos postgreSQL, podemos instalar un cliente grafico como PGadmin3.

Por consola lo hacemos de la siguiente manera, utilizando el gestor de paquetes de Debian y ubuntu:

1.- Buscamos en nuestros repositorios si contamos con este paquete para instalar.

slack@ubuntu:/usr/local/Xerox/DocuShare/bin$ apt-cache search pgadmin
pgadmin3 - graphical administration tool for PostgreSQL
pgadmin3-data - graphical administration tool for PostgreSQL - documentation
pgagent - job scheduler for PostgreSQL
phppgadmin - web-based administration tool for PostgreSQL
postgresql-contrib-8.3 - additional facilities for PostgreSQL

2.- Se despliega en el listado lo que andamos buscando, ahora procedemos a instalar automatyicamente el software con apt-get, como root

slack@ubuntu:/usr/local/Xerox/DocuShare/bin$ sudo apt-get install pgadmin3
[sudo] password for slack:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3-data pgagent
Se instalarán los siguientes paquetes NUEVOS:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3 pgadmin3-data pgagent
0 actualizados, 5 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 8225kB de archivos.
Se utilizarán 23,1MB de espacio de disco adicional después de desempaquetar.

decimos que S, y comienza la descarga desde los repositorios que tenemos en nuestro source.list

¿Desea continuar [S/n]? S
Des:1 http://cl.archive.ubuntu.com intrepid/universe libwxbase2.8-0 2.8.8.0-0ubuntu2 [671kB]
Des:2 http://cl.archive.ubuntu.com intrepid/universe libwxgtk2.8-0 2.8.8.0-0ubuntu2 [3373kB]
Des:3 http://cl.archive.ubuntu.com intrepid/universe pgadmin3-data 1.8.4-1 [2626kB]
Des:4 http://cl.archive.ubuntu.com intrepid/universe pgadmin3 1.8.4-1 [1515kB]
Des:5 http://cl.archive.ubuntu.com intrepid/universe pgagent 1.8.4-1 [38,2kB]
Descargados 8225kB en 19s (420kB/s)
Seleccionando el paquete libwxbase2.8-0 previamente no seleccionado.
(Leyendo la base de datos ...
140462 ficheros y directorios instalados actualmente.)
Desempaquetando libwxbase2.8-0 (de .../libwxbase2.8-0_2.8.8.0-0ubuntu2_i386.deb) ...
Seleccionando el paquete libwxgtk2.8-0 previamente no seleccionado.
Desempaquetando libwxgtk2.8-0 (de .../libwxgtk2.8-0_2.8.8.0-0ubuntu2_i386.deb) ...
Seleccionando el paquete pgadmin3-data previamente no seleccionado.
Desempaquetando pgadmin3-data (de .../pgadmin3-data_1.8.4-1_all.deb) ...
Seleccionando el paquete pgadmin3 previamente no seleccionado.
Desempaquetando pgadmin3 (de .../pgadmin3_1.8.4-1_i386.deb) ...
Seleccionando el paquete pgagent previamente no seleccionado.
Desempaquetando pgagent (de .../pgagent_1.8.4-1_i386.deb) ...
Procesando activadores para man-db ...
Procesando activadores para doc-base ...
Processing 1 added doc-base file(s)...
Registering documents with scrollkeeper...
Configurando libwxbase2.8-0 (2.8.8.0-0ubuntu2) ...

Configurando libwxgtk2.8-0 (2.8.8.0-0ubuntu2) ...

Configurando pgadmin3-data (1.8.4-1) ...
Configurando pgadmin3 (1.8.4-1) ...

Configurando pgagent (1.8.4-1) ...
Procesando activadores para libc6 ...
ldconfig deferred processing now taking place
slack@ubuntu:/usr/local/Xerox/DocuShare/bin$

3.- Y listo, ya tenemos pgadmin3 para trabajar graficamente con nuetsro PostgreSQL

Aqui va un pantallazo de PGAdmin3



Esto si que es Open Source, todo a la mano y sin comprar licencias.

El software libre es una fuente de innovación...

Saludos y Suerte !!

jueves, 18 de diciembre de 2008

BPEL y BPMN

Los sistemas de soporte operacional en las empresas están basados en procesos que conforman su cadena operativa, cadenas de valor, de negocio, etc. soportando por ejemplo, los ciclos para la gestión de clientes, productos, servicios, recursos humanos, contabilidad, finanzas, administración, presupuesto, facturacion, etc.

La agilidad operativa en la administración de estos procesos, es un diferenciador competitivo vital y una de las principales características que una organización necesita para poder adaptarse a los continuos cambios de negocio. El éxito dependerá de la rapidez con la cual las organizaciones puedan adaptarse a estos cambios y al correcto uso de las herramientas tecnologicas que facilitan su control.

Por lo general, las empresas tienen analistas de negocio, que definen y establecen los ciclos y los procesos de negocio. Su función es mejorar, iterar y optimizar los procesos, equilibrar los requerimientos con los objetivos de la organización, etc. Tradicionalmente los analistas han utilizado herramientas para modelar y representar los procesos. Luego estos procesos son desplegados en alguna tecnología que pueda ejecutarlos y crear una representación técnica basada en un lenguaje de programación.

Resumiendo, el proceso se modela en una herramienta grafica, creando una representación de los procesos de alto nivel, como el modelo no trae un ejecutable directamente, los programadores deben crear componentes que implementan los procesos sobre una tecnología específica y basada en su comprensión del proceso.

Los procesos desarrollados de esta manera son muy susceptibles a errores de comprensión, errores de codificación, debido a la desconexión existente entre el modelo de alto nivel y el proceso ejecutable. En este tipo de soluciones, un cambio implica un impacto significativo, es necesario por ejemplo, reescribir código, cambiar el modelo, etc., además es difícil obtener métricas para medir el estado actual y las condiciones de negocio vigentes. entonces aqui se dice que "Problemas de diseño extremo, soluciones de programacion extremas", asumiendo en este caso una metodologia agil para el desarrollo de software (Scrum y XP).

Problemas con este modelo de implementación.

  1. Los procesos desarrollados de esta manera son muy susceptibles a errores de comprensión y errores de codificación.
  2. Existen grandes brechas entre el modelo y su implementación técnica.
  3. Un cambio implica un impacto significativo en la infraestructura TI de la organización, porque los procesos están cableados en el código.
  4. Las reglas de negocio, están altamente acopladas a los procesos.
  5. Mantenerlos es extremadamente engorroso, difícil y costoso.
  6. Debido a los continuos cambios, los procesos pierden vigencia continuamente y pueden llegar a convertirse en piezas incomprensibles, con un nivel de detalle que aprisiona la agilidad.
  7. No podemos automatizar los cambios de políticas.

Una Solución

Para solventar estos problemas, los gerente de IT utilizan una solución basada en modelos, con una alternativa de implementación mas abierta y estándar: BPM y BPEL.

BPEL es el estándar de la industria que representa y ejecuta procesos del negocio, bpel permite una abstracción lógica del proceso, del modelo de implementación o tecnología. BPEL esta basado en una notación XML que permite representar los procesos de negocio, uno de los ides que implementa muy bien esta tecnologia es Netbeans de la version 5.5 en adelente, y su propio motor de procesos asociado a Glassfish.

Otro estándar, Business Process Modeling Notation (BPMN), es una especificación que proporciona una notación que todos los usuarios y clientes los puedan entender, los analistas bosquejan inicialmente los procesos para que los desarrolladores lo ejecuten en algun motor, como Jboss BPM.

Con BPEL y BPMN, un analista puede utilizar una herramienta para modelar el proceso y construir el proceso usando BPMN. El modelo del proceso BPMN genera automáticamente un entorno para BPEL, donde se establecen metadatos, reglas de negocio, bifurcaciones, flujos de trabajo, participantes, punto de decisión, contextos de pool y lane, etc.

Beneficios

  1. Simplifica la comunicación y colaboración entre los arquitectos, analistas y desarrolladores.
  2. Habilita y disponibiliza el concepto de SOA en la organización.
  3. BPEL proporciona un modelo rico en operaciones como el manejo de excepciones, reglas de negocio, transaccionalidad, logica, etc.
  4. La visión lógica no demuestra los detalles subyacentes de la puesta en práctica.
  5. Cambios no afectan la representación total del proceso.
Ingresaremos luego a este mundo, con ejemplos practicos para su correcta implementacion.

Saludos y Suerte !!

lunes, 27 de octubre de 2008

Scrum y XP (1)

Hola, muchas veces cuando debemos desarrollar o implementar rapidamente un software, tenemos demasiado poco tiempo, sobre todo cuendo el asunto es partir de cero y no tenemos tiempo para análisis, modelamiento perfecto de UML, etc.

Para estos casos se ha puesto de moda Scrum y XP, ambas son tecnicas de desarrollo agil de software.

Los equipos de trabajo deben conocer los principios de Scrum. ¿Cómo se crea y se estima una pila de producto? ¿Cómo se transforma en una pila de Sprint?
¿Cómo se gestiona un gráfico de burn-down y se calcula la velocidad del equipo?

Para responder esto veremos una introducción practica de Scrum.

La ejecución correcta de Scrum se está convirtiendo en un factor cada vez más importante para los equipos que buscan inversión de capital.

¿Por qué es esto tan importante? Si los equipos no conocen su velocidad, el Dueño de Producto no puede crear una hoja de ruta del producto con fechas de lanzamiento creíbles. Sin fechas de lanzamiento fiables, la ompañía podría fracasar y los inversores perder su dinero.

Tanto Scrum como Programación Extrema (XP) requieren que los equipos completen algún tipo de producto potencialmente liberable al final de cada iteración. Estas iteraciones están diseñadas para ser cortas y de duración fija.
Este enfoque de entregar código funcional cada poco tiempo significa que los equipos Scrum y XP no tienen tiempo para teorías. No persiguen dibujar el modelo UML perfecto en una herramienta CASE, escribir el documento de requisitos perfecto o escribir código que se adapte a todos los cambios futuros imaginables. En vez de eso, los equipos Scrum y XP se enfocan en que las cosas se hagan. Estos equipos aceptan que puede que se equivoquen por el camino, pero también son conscientes de que la mejor manera de encontrar dichos errores es dejar de pensar en el software a un nivel teórico de análisis y diseño y sumergirse en él, ensuciarse las manos y comenzar a construir el producto.

Este es un proceso de aprendizaje continuo, así que la historia no acaba aquí.
Estoy convencido de que esta empresa seguirá aprendiendo (si se siguen haciendo las Retrospectivas de Sprint) y adoptando nuevas perspectivas sobre las mejores formas de implementar Scrum en su contexto particular.

Si necesitas averiguar más antes de seguir puedes ver los siguientes link's

• http://agilemanifesto.org/
• http://www.mountaingoatsoftware.com/scrum
• http://www.xprogramming.com/xpmag/whatisxp.htm

Sino, no importa, veremos la forma practica de implementar scrum rapidamente, bueno eso es en realidad, imprimir energia y rapidez al desarrollo de software.

Pila de producto.
La pila de producto es el corazón de Scrum, y simplemente es la priorización de los requisitos que debe tener una aplicación solicitada por el cliente.
A esta lista de requisitos le llamamos historias, o funcionalidades, o lo que sea. Cosas que el cliente quiere, descritas usando la terminología del cliente. Llamamos a esto historias, o a veces simplemente elementos de la Pila.
Esta pila de requisitos puede ser escrita en una planilla excel de manera simple para que el cliente la entienda en su lenguaje natural, dejamos de lado aqui los administradores de tareas como Jira u otros bug-tracker.

Para hacerlo simple y productivo nuestra pila de producto (lista priorizada de requisitos) contiene los siguientes campos:

ID – un identificador único, simplemente un número auto-incremental. Esto nos permite no perder la pista a las historias cuando cambiamos su nombre.
Nombre – una descripción corta de la historia. Por ejemplo, “Ver tu historial de transacciones”. Suficientemente claro como para que el Dueño de Producto comprenda aproximadamente de qué estamos
hablando, y suficientemente clara como para distinguirla de las otras historias. Normalmente, 2 a 10 palabras.
Importancia – el ratio de importancia que el Dueño de Producto da a esta historia. Por ejemplo, 10. O 150. Más alto = más importante. Suelo evitar el término “prioridad” porque típicamente “1” se considera la
“máxima prioridad, lo que es muy incómodo si posteriormente decides que algo es más importante. ¿Qué prioridad le daríamos a ese nuevo elemento? ¿Prioridad 0? ¿Prioridad -1?
Estimación inicial – la valoración inicial del Equipo acerca de cuanto trabajo es necesario para implementar la historia, comparada con otras historias. La unidad son “puntos de historia” y usualmente corresponde a “días-persona ideales”. Lo importante no es que las estimaciones absolutas sean correctas (es decir, que una historia de 2 puntos deba durar 2 días), lo importante es que las estimaciones relativas
sean correctas (es decir, que una historia de 2 puntos debería durar la mitad que una historia de 4 puntos).
Como probarlo – una descripción a alto nivel de como se demostrará esta historia en la Demo al final del Sprint. Se trata, esencialmente, de una simple especificación de un test: “Haz esto, entonces haz lo otro, y
entonces debería ocurrir aquello”. Si practicas TDD (Test-Driven Development, desarrollo orientado a test) esta descripción puede usarse como pseudo-código para vuestro test de aceptación.
• Notas – cualquier otra información, clarificación, referencia a otras
fuentes de información, etc. Normalmente muy breve.

Ejemplo de Pila de Producto:

Sigamos, vemos en la tabla anterior la implementación de una pila de producto simple, falta completar campos, como la estimación, prueba y notas, estos deben ser completados en conjunto con el equipo Scrum (equipo de desarrollo).


En la practica se pueden agregar otros campos, pero a la larga estos son los mas recurrentes tras los Sprint.

Como mantenemos la Pila de Producto a nivel de negocio.
Si el Dueño de Producto tiene una formación técnica, puede que añada historias del tipo “añadir índices a la tabla de eventos”. ¿Por qué quiere algo así? El auténtico objetivo probablemente será algo como “aligerar el formulario de búsqueda de eventos en el backoffice” (con un índice).
Puede ocurrir que los índices no fueran el cuello de botella que hiciera al formulario ir lento. Puede que fuera algo completamente diferente. El equipo está normalmente mejor capacitado para averiguar como resolver algo, así que el Dueño de Producto debería concentrarse en los objetivos de negocio y no en modificarnos la pila luego de los requisitos ya vistos y entregados.

Pronto, va la segunda parte de este doc. de Scrum.

Saludos y Suerte !!

jueves, 9 de octubre de 2008

Firma digital de PDF

Hola, muchas veces para nuestros sistemas debemos resguardar la integridad de los documentos almacenados en nuestros repositorios, ya sean word, pdf u otros.

Esto lo podemos realizar agregando la firma digital a los documentos, y una manera de hacerlo es mediante las apis de Java, las que nos proveen los metodos apropiados para la firma avanzada de documentos PDF.

Avanzada, porque el mismo Acrobar Reader valida la integridad del documento y la firma digital, ademas de agregar la capacidad de usar nuestro propio certificado pfx.

En el siguiente ejemplo veremos como firmar digitalmente un documento PDF.

1.- Debemos contar con algún certificado pfx valido en nuestro sistema.

Si ya contamos con este certificado PKCS12 (. pfx) procedemos con el ejemplo.

primero vamos a nuestro ide eclipse para Java creamos una clase con el siguiente código.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfSignatureAppearance;

public class FirmarPDF {

public static void main (String [] args) throws Exception{
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("/home/slack/mycert.pfx"), "quaker77".toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, "quaker77".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader("/home/slack/0X/ccu/documento_inicial_req.pdf");
FileOutputStream fout = new FileOutputStream("/home/slack/compartido/documento_firmado2.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new File("/tmp"));
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("Prueba de firma digital con iText");
sap.setLocation("Chile");
sap.setContact("Empresa Chile");
stp.close();
}

}

Debemos contar con las librerias necesarias que se importan en la clase.

En el código vemos que tenemos un archivo pdf de entrada y otro de salida, pero este ultimo va firmado.

La firma digital de documentos PDF la valida Adobe Acrobat, que es capaz de procesar y validar esta información.

Para verificar visualmente que el documento de salida esta firmado vemos las siguientes caracteristicas en el nuevo documento en acrobat reader.



Bueno, este en un ejemplo practico para firmar pdf con Java.

Ahora faltaría agregar esta implementación a una aplicación web para clientes.

Saludos y Suerte !!

viernes, 3 de octubre de 2008

Instalar pgadmin3 en Linux

Hola, cuando necesitamos administrar un PostgreSql o MySql de manera amigable, muchas veces ocupamos algún administrador grafico, yo he utilizado mucho webmin como administrador de base de datos PostgreSql y MySql, sin embargo para utilizar Webmin necesitas que la maquina donde residen las bases de datos lo tenga instalado y tener habilitado el puerto 10000.

Pero que ocurre cuando esa maquina no cuenta con Webmin. Tenemos 2 opciones, una es solicitar la instalación de Webmin y otra en utilizar en este caso PgAdmin3.

Por defecto las distribuciones Linux no lo traen instalado, pero si esta en los repositorio del source.list, por lo tanto abrimos una consola y lo buscamos con apt de la siguiente forma.

slack@slacktop:~$ apt-cache search pgadmin
pgadmin3 - graphical administration tool for PostgreSQL
pgadmin3-data - graphical administration tool for PostgreSQL - documentation
pgagent - job scheduler for PostgreSQL
phppgadmin - Set of PHP scripts to administrate PostgreSQL over the WWW
postgresql-contrib-8.2 - additional facilities for PostgreSQL
postgresql-contrib-8.3 - additional facilities for PostgreSQL

En el listado de resultado vemos que el primer paquete corresponde a lo que buscamos, por lo tanto procedemos con apt-get a su instalación en nuestro sistema.

slack@slacktop:~$ sudo apt-get install pgadmin3
[sudo] password for slack:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3-data
Paquetes recomendados
pgagent
Se instalarán los siguientes paquetes NUEVOS:
libwxbase2.8-0 libwxgtk2.8-0 pgadmin3 pgadmin3-data
0 actualizados, 4 se instalarán, 0 para eliminar y 12 no actualizados.
Necesito descargar 8381kB de archivos.
Se utilizarán 24,0MB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? S


Confirmamos con S la descarga del paquete PgAdmin3 y continua su instalación.

Des:1 http://cl.archive.ubuntu.com hardy/universe libwxbase2.8-0 2.8.7.1-0ubuntu3 [675kB]
Des:2 http://cl.archive.ubuntu.com hardy/universe libwxgtk2.8-0 2.8.7.1-0ubuntu3 [3500kB]
Des:3 http://cl.archive.ubuntu.com hardy/universe pgadmin3-data 1.8.2-0ubuntu1 [1070kB]
Des:4 http://cl.archive.ubuntu.com hardy/universe pgadmin3 1.8.2-0ubuntu1 [3136kB]
Descargados 8381kB en 23s (358kB/s)
Seleccionando el paquete libwxbase2.8-0 previamente no seleccionado.
(Leyendo la base de datos ...
160747 ficheros y directorios instalados actualmente.)
Desempaquetando libwxbase2.8-0 (de .../libwxbase2.8-0_2.8.7.1-0ubuntu3_i386.deb) ...
Seleccionando el paquete libwxgtk2.8-0 previamente no seleccionado.
Desempaquetando libwxgtk2.8-0 (de .../libwxgtk2.8-0_2.8.7.1-0ubuntu3_i386.deb) ...
Seleccionando el paquete pgadmin3-data previamente no seleccionado.
Desempaquetando pgadmin3-data (de .../pgadmin3-data_1.8.2-0ubuntu1_all.deb) ...
Seleccionando el paquete pgadmin3 previamente no seleccionado.
Desempaquetando pgadmin3 (de .../pgadmin3_1.8.2-0ubuntu1_i386.deb) ...
Configurando libwxbase2.8-0 (2.8.7.1-0ubuntu3) ...

Configurando libwxgtk2.8-0 (2.8.7.1-0ubuntu3) ...

Configurando pgadmin3-data (1.8.2-0ubuntu1) ...
Configurando pgadmin3 (1.8.2-0ubuntu1) ...

Processing triggers for libc6 ...
ldconfig deferred processing now taking place
slack@slacktop:~$

El log nos dice que ya esta ok la instalación, ahora lo vamos a ejecutar, lo podemos hacer directamente por consola escribiendo pgadmin3 y enter o podemos encontrar pgadmin en el menú del sistema: Aplicaciones --> Herramientas del Sistema.

para el ejemplo lo abriremos por consola.

slack@slacktop:~$ pgadmin3

Esto abre el siguiente entornos grafico de pgadmin3.




Hacemos click con el mouse en el icono de conexion lo que nos abre la siguiente ventana donde tenemos que ingresar los datos de conexión a las base de datos, para este ejemplo lo estoy apuntando a mi local, sin embargo se puede apuntar a otra ip.



Hacemos click en Aceptar y nos despliega el contenido de nuetro Postgre Local, como muestra la figura.



Podemos apuntar a una ip remota, siempre y cuando el puerto 5432 de Postgre este aceptando conexiones.

Saludos y Suerte !!

martes, 19 de agosto de 2008

Montar un FingerPrint reader USB en VirtualBox

Hola, con los avances tecnologicos y nuevos desarrollos es necesario ocupar las ultimas tecnologías para los sistemas web, las que nos permiten poder desarrollar aplicaciones que se integran con dispositivos de hardware, y que aveces en linux no contamos con los driver.

Bueno en mi caso tengo sobre linux corriendo VirtualBox de Sun, y en el tengo Ventanukos XP (lease Windows XP), tengo ademas en el ventanukos una aplicación que ocupa componentes ActiveX y un lote de archivos dll, aunque no son elegantes y no se les ve mucho futuro debemos utilizarlos para nuestras aplicaciones.

La aplicación cuenta con un formulario web, el cual contiene un componente ActiveX que se conecta con un dispositivo usb, este dispositivo es un FingerPrinter, es decir contiene una pantalla, un lapiz y un lector de huellas dactilares. Debido a esto debo correrlo en ventanukos XP.

Por defecto VirtualBox no reconoce los dispositivos USB, y menos un FingerPrinter.

Por lo tanto me he dado la paja de investigar un poco el VirtualBox para que lo reconozca.

Leyendo, he resuelto el tema de la siguiente forma:

1.- Primero debo habilitar la lectura y permisos de los USB en los archivos de configuración de VirtualBox, para comenzar, vamos a la consola y escribimos lo siguiente:

slack@slacktop:~$ sudo gedit /etc/init.d/mountdevsubfs.sh

con este comando entramos a editar el archivo mountdevsubfs.sh, y descomentamos las siguientes lineas:

#
# Magic to make /proc/bus/usb work
#
#mkdir -p /dev/bus/usb/.usbfs
#domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
#ln -s .usbfs/devices /dev/bus/usb/devices
#mount --rbind /dev/bus/usb /proc/bus/usb

Quedando de la siguiente forma:

#
# Magic to make /proc/bus/usb work
#
mkdir -p /dev/bus/usb/.usbfs
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
ln -s .usbfs/devices /dev/bus/usb/devices
mount --rbind /dev/bus/usb /proc/bus/usb

Guardamos los cambios y cerramos Gedit.

2.- Luego debemos modificar otro archivo para agregar permisos al dipositivo, lo hacemos ingresando el siguiente comando.

slack@slacktop:~$ sudo gedit /etc/udev/rules.d/40-permissions.rules

Modificamos lo siguiente:

# Block devices
SUBSYSTEM!="block", GOTO="block_end"
ATTRS{removable}!="1", GROUP="disk"
ATTRS{removable}=="1", GROUP="floppy"
SUBSYSTEMS=="usb", GROUP="plugdev"

Quedando de la siguiente forma:

# Block devices
SUBSYSTEM!="block", GOTO="block_end"
ATTRS{removable}!="1", GROUP="disk"
ATTRS{removable}=="1", GROUP="floppy"
SUBSYSTEMS=="usb", MODE="0666" GROUP="plugdev"

Notese que agregamos al dispósitivo USB el MODE="666", con esto le damos permiso al dispositivo para ser ejecutado.

Tambien modificamos el parrafo USB serial converter, como se ve:

# USB serial converters
SUBSYSTEM=="usb_device", GOTO="usb_serial_start"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="usb_serial_start"
GOTO="usb_serial_end"

Dejandolo de la siguiente forma:

# USB serial converters
SUBSYSTEM=="usb_device", MODE="0666"
#SUBSYSTEM=="usb_device", GOTO="usb_serial_start"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GOTO="usb_serial_start"
GOTO="usb_serial_end"

Solo comentamos la linea que habia anteriormente y la incluimos modificada.

Cerramos Gedit y vamos al fstab.

3.- A continuación debemos agregar el montaje de los USB al archivo FSTAB, vamos a la consola nuevamente:

slack@slacktop:~$ sudo gedit /etc/fstab

Este comando abre Gedit con la información de los dispositivos y unidades que monta Linux por defecto. agregamos al final la siguiente linea:

#usbfs
usbfs /proc/bus/usb usbfs devgid=1001,devmode=666 0 0

Con esto le decimos que monte el dispositivo USB con modo de permiso 666 de ejecucion.

Y listo.

Ahora solo debemos ejecutar el montado de lo que configuramos, si no queremos reiniciar la maquina podemos ingresar el siguiente comando por consola:

slack@slacktop:~$ sudo mount -a

Ahora fui al VirtualBox, conecte el USB FingerPrinter y lo reconocio al choque

Creo que no debemos tener ningun problema para trabajar correctamente con el VentanukosXP sobre VirtaulBox de Sun y este sobre Linux ah.. q tal

Saludos y Suerte !!

miércoles, 30 de julio de 2008

Instalar Oracle 10g Express Edition

Hola, en algunas aplicaciones cuando el motor de base de datos es oracle y en nuestro desarrollo local no contamos con Oracle, podemos instalar una version free para Linux que Oracle puso a disposición de todos los que quieran usar Oracle para los desarrollos, y ademas con interfaz web integrada.

Vamos instalar oracle 10g Express Edition en Linux Debian, de la siguiente manera:

1.- Debemos añadir a nuestro archivo /etc/apt/source.list el siguiente repositorio:

deb http://oss.oracle.com/debian unstable main non-free

2.- Actualizar los repositorios de nuestro gestor de paquetes apt con el siguinte comando:

slack@slacktop:~$ sudo apt-get update

3.- Ejecutar la instalación:

slack@slacktop:~$ sudo apt-get install oracle-xe-universal
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
libaio
Se instalarán los siguientes paquetes NUEVOS:
libaio oracle-xe-universal
0 actualizados, 2 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 262MB de archivos.
Se utilizarán 451MB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? S

Se va a demorar un poco, Un par de preguntas, como los puertos que se van a ocupar, y password del SYS, y tendriamos Oracle 10g en linux, este es el log:

slack@ubuntu:~$ sudo /etc/init.d/oracle-xe configure
[sudo] password for slack:

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:8082

Specify a port that will be used for the database listener [1521]:

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:
Confirm the password:

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:y

Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to "http://127.0.0.1:8082/apex"

Nos muestra la url de acceso al login del Oracle XE.


Saludos y suerte!

viernes, 18 de julio de 2008

Resolucion en debian

Hola, muchas veces cuando instalamos alguna distribución de linux, nos ocurre que nuestra tarjeta grafica no es compatible y nos muestra la pantalla con resoluciones muy bajas.
Para corregir este problema podemos hacerlo de la siguiente manera configurando nuestros Xorg.conf

1.- nos cambiamos a superusuario en la consola

slack@debian:~$ su

ingresamos passwd de root y hacemos una copia del archivo xorg.conf de configuracion de la X

# cp /etc/X11/xorg.conf /root

2.- Ejecutamos la siguiente linea de comando para ejecutar el script de configuracion

# dpkg-reconfigure xserver-xorg

3.- se abrira una pantalla de fondo azul que nos solicitara una serie de parametros para la configuracion de distintos dispositivo.
Revisamos las preguntas que nos ira mostrando, aunque por lo general las respuestas son las opciones que nos muestra por defecto, configuramos mouse, teclado, pantalla, etc.

Cuando pregunte por la resolución de pantalla, verificamos en el listado que este chekeada la mejor resolución que nos permite el monitor, seguimos aceptando las respuestas por defecto hasta terminar con la configuración.

Al final nos mostrara un mensaje similar al siguiente:

# dpkg-reconfigure xserver-xorg
xserver-xorg postinst warning: overwriting possibly-customised configuration
file; backup in /etc/X11/xorg.conf.20080718152423

Luego salimos de los programas que tenemos abiertos y reiniciamos Linux

Saludos y Suerte !!

miércoles, 18 de junio de 2008

Instalar fuentes de windows en OpenOffice

Hola, este articulo nos explica en pocos pasos la instalacion de fuentes de windows en Open Office, entre otras la Arial.

entonces, vamos a la consola y escribimos:

slack@slacktop:~$ apt-cache search msttcorefonts

Con este comando estamos buscando y listando de nuestro repositorio (source.list) el paquete de software msttcorefonts, el que contiene las fuentes mas tipicas del ventanukos windows, si todo va bien nos debiera desplegar un listado similar a este:

openoffice.org - OpenOffice.org Office suite
msttcorefonts - Installer for Microsoft TrueType core fonts
ttf-liberation - Free fonts with the same metrics as Times, Arial and Courier

En el cual identificamos a simple vista que se trata de paquetes de software para instalacion de fuentes microsoft.

Ahora instalamos msttcorefonts con apt-get install de la siguiente forma, y siempre por consola, en este caso como root (sudo).

slack@slacktop:~$ sudo apt-get install msttcorefonts
[sudo] password for slack:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
libxalan110 libxerces27
Utilice «apt-get autoremove» para eliminarlos.
Se instalarán los siguientes paquetes extras:
cabextract
Se instalarán los siguientes paquetes NUEVOS:
cabextract msttcorefonts
0 actualizados, 2 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 89,0kB de archivos.
Se utilizarán 389kB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? S
Des:1 http://cl.archive.ubuntu.com hardy/universe cabextract 1.2-2 [53,9kB]
Des:2 http://cl.archive.ubuntu.com hardy/multiverse msttcorefonts 2.4 [35,1kB]
Descargados 89,0kB en 1s (46,3kB/s)
Preconfigurando paquetes ...
Seleccionando el paquete cabextract previamente no seleccionado.
(Leyendo la base de datos ...
134064 ficheros y directorios instalados actualmente.)
Desempaquetando cabextract (de .../cabextract_1.2-2_i386.deb) ...
Seleccionando el paquete msttcorefonts previamente no seleccionado.
Desempaquetando msttcorefonts (de .../msttcorefonts_2.4_all.deb) ...
Configurando cabextract (1.2-2) ...
Configurando msttcorefonts (2.4) ...

These fonts were provided by Microsoft "in the interest of cross-
platform compatibility". This is no longer the case, but they are
still available from third parties.

You are free to download these fonts and use them for your own use,
but you may not redistribute them in modified form, including changes
to the file name or packaging format.

--14:43:45-- http://surfnet.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo surfnet.dl.sourceforge.net... 130.59.138.20
Conectando a surfnet.dl.sourceforge.net|130.59.138.20|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Ubicación: http://prdownloads.sourceforge.net/corefonts/andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net [siguiente]
--14:43:46-- http://prdownloads.sourceforge.net/corefonts/andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net
=> `./andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net'
Resolviendo prdownloads.sourceforge.net... 216.34.181.60
Conectando a prdownloads.sourceforge.net|216.34.181.60|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Ubicación: http://master.dl.sourceforge.net/sourceforge/corefonts/andale32.exe [siguiente]
--14:43:47-- http://master.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo master.dl.sourceforge.net... 216.34.181.56
Conectando a master.dl.sourceforge.net|216.34.181.56|:80... conectado.
Petición HTTP enviada, esperando respuesta... 404 Not Found
14:43:47 ERROR 404: Not Found.

--14:43:47-- http://internap.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 198,384 (194K) [application/octet-stream]

100%[=====================================================================================>] 198,384 58.08K/s ETA 00:00

14:43:51 (57.95 KB/s) - `./andale32.exe' guardado [198384/198384]

--14:43:51-- http://internap.dl.sourceforge.net/sourceforge/corefonts/arialb32.exe
=> `./arialb32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 168,176 (164K) [application/octet-stream]

100%[=====================================================================================>] 168,176 54.42K/s ETA 00:00

14:43:56 (54.29 KB/s) - `./arialb32.exe' guardado [168176/168176]

--14:43:56-- http://internap.dl.sourceforge.net/sourceforge/corefonts/arial32.exe
=> `./arial32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 554,208 (541K) [application/octet-stream]

100%[=====================================================================================>] 554,208 51.49K/s ETA 00:00

14:44:06 (55.71 KB/s) - `./arial32.exe' guardado [554208/554208]

--14:44:06-- http://internap.dl.sourceforge.net/sourceforge/corefonts/comic32.exe
=> `./comic32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 246,008 (240K) [application/octet-stream]

100%[=====================================================================================>] 246,008 59.69K/s ETA 00:00

14:44:10 (59.52 KB/s) - `./comic32.exe' guardado [246008/246008]

--14:44:10-- http://internap.dl.sourceforge.net/sourceforge/corefonts/courie32.exe
=> `./courie32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 646,368 (631K) [application/octet-stream]

100%[=====================================================================================>] 646,368 56.77K/s ETA 00:00

14:44:22 (55.15 KB/s) - `./courie32.exe' guardado [646368/646368]

--14:44:22-- http://internap.dl.sourceforge.net/sourceforge/corefonts/georgi32.exe
=> `./georgi32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 392,440 (383K) [application/octet-stream]

100%[=====================================================================================>] 392,440 54.83K/s ETA 00:00

14:44:30 (52.78 KB/s) - `./georgi32.exe' guardado [392440/392440]

--14:44:30-- http://internap.dl.sourceforge.net/sourceforge/corefonts/impact32.exe
=> `./impact32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 173,288 (169K) [application/octet-stream]

100%[=====================================================================================>] 173,288 50.91K/s ETA 00:00

14:44:34 (50.82 KB/s) - `./impact32.exe' guardado [173288/173288]

--14:44:34-- http://internap.dl.sourceforge.net/sourceforge/corefonts/times32.exe
=> `./times32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 661,728 (646K) [application/octet-stream]

100%[=====================================================================================>] 661,728 47.12K/s ETA 00:00

14:44:47 (53.53 KB/s) - `./times32.exe' guardado [661728/661728]

--14:44:47-- http://internap.dl.sourceforge.net/sourceforge/corefonts/trebuc32.exe
=> `./trebuc32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 357,200 (349K) [application/octet-stream]

100%[=====================================================================================>] 357,200 56.39K/s ETA 00:00

14:44:53 (59.04 KB/s) - `./trebuc32.exe' guardado [357200/357200]

--14:44:53-- http://internap.dl.sourceforge.net/sourceforge/corefonts/verdan32.exe
=> `./verdan32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 351,992 (344K) [application/octet-stream]

100%[=====================================================================================>] 351,992 60.51K/s ETA 00:00

14:45:00 (51.63 KB/s) - `./verdan32.exe' guardado [351992/351992]

--14:45:00-- http://internap.dl.sourceforge.net/sourceforge/corefonts/webdin32.exe
=> `./webdin32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 185,072 (181K) [application/octet-stream]

100%[=====================================================================================>] 185,072 53.97K/s ETA 00:00

14:45:04 (53.86 KB/s) - `./webdin32.exe' guardado [185072/185072]

Extracting cabinet: andale32.exe
extracting fontinst.inf
extracting andale.inf
extracting fontinst.exe
extracting AndaleMo.TTF
extracting ADVPACK.DLL
extracting W95INF32.DLL
extracting W95INF16.DLL

All done, no errors.
Extracting cabinet: arialb32.exe
extracting fontinst.exe
extracting fontinst.inf
extracting AriBlk.TTF

All done, no errors.
Extracting cabinet: arial32.exe
extracting FONTINST.EXE
extracting fontinst.inf
extracting Ariali.TTF
extracting Arialbd.TTF
extracting Arialbi.TTF
extracting Arial.TTF

All done, no errors.
Extracting cabinet: comic32.exe
extracting fontinst.inf
extracting Comicbd.TTF
extracting Comic.TTF
extracting fontinst.exe

All done, no errors.
Extracting cabinet: courie32.exe
extracting cour.ttf
extracting courbd.ttf
extracting courbi.ttf
extracting fontinst.inf
extracting couri.ttf
extracting fontinst.exe

All done, no errors.
Extracting cabinet: georgi32.exe
extracting fontinst.inf
extracting Georgiaz.TTF
extracting Georgiab.TTF
extracting Georgiai.TTF
extracting Georgia.TTF
extracting fontinst.exe

All done, no errors.
Extracting cabinet: impact32.exe
extracting fontinst.exe
extracting Impact.TTF
extracting fontinst.inf

All done, no errors.
Extracting cabinet: times32.exe
extracting fontinst.inf
extracting Times.TTF
extracting Timesbd.TTF
extracting Timesbi.TTF
extracting Timesi.TTF
extracting FONTINST.EXE

All done, no errors.
Extracting cabinet: trebuc32.exe
extracting FONTINST.EXE
extracting trebuc.ttf
extracting Trebucbd.ttf
extracting trebucbi.ttf
extracting trebucit.ttf
extracting fontinst.inf

All done, no errors.
Extracting cabinet: verdan32.exe
extracting fontinst.exe
extracting fontinst.inf
extracting Verdanab.TTF
extracting Verdanai.TTF
extracting Verdanaz.TTF
extracting Verdana.TTF

All done, no errors.
Extracting cabinet: webdin32.exe
extracting fontinst.exe
extracting Webdings.TTF
extracting fontinst.inf
extracting Licen.TXT

All done, no errors.
All fonts downloaded and installed.
Updating fontconfig cache for /usr/share/fonts/truetype/msttcorefonts
No CIDSupplement specified for Batang-Bold, defaulting to 0.
No CIDSupplement specified for Batang-Regular, defaulting to 0.
No CIDSupplement specified for UMingCN, defaulting to 0.
No CIDSupplement specified for KochiGothic-Regular-JaH, defaulting to 0.
No CIDSupplement specified for Dotum-Bold, defaulting to 0.
No CIDSupplement specified for KochiMincho-Regular, defaulting to 0.
No CIDSupplement specified for KochiGothic-Regular, defaulting to 0.
No CIDSupplement specified for KochiMincho-Regular-JaH, defaulting to 0.
No CIDSupplement specified for Dotum-Regular, defaulting to 0.

slack@slacktop:~$

Y listo, uta q amigable es linux ah... luego de esta configuracion tenemos las fuentes instaladas para OpenOffice.

Saludos y Suerte !!

Clases y Objetos

Hola, dentro de las clases y presentaciones que expongo donde trabajo, he planificado la preparacion de estos documentos con el objetivo de introducir a los oyentes al mundo Java, SOA, y UML.
Traspasandoles mi conocimiento para un mejor entendimiento de las tecnologìas que demanda la Industria.
Las presentaciones de UML y Java apuntan a eso. Ahora veremos un articulo sobre Clases y Objetos, tema presentado en esta planificacion.

Comencemos.

Programa Java
  • Un programa Java está formado por un conjunto de clases que interactúan entre sí
  • La clase es la unidad básica de programación
Clase
Implementación de un tipo de dato.
Una clase sirve tanto de módulo como de tipo
  • Tipo: Descripción de un conjunto de objetos (equipados con ciertas operaciones).
  • Módulo: Unidad de descomposición del software.
Objeto
Instancia de una clase:
Unidad que encapsula estado y comportamiento.
  • Un objeto puede caracterizar una entidad física (un teléfono, un interruptor, un cliente) o una entidad abstracta (un número, una fecha, una ecuación matemática).
  • Todos los objetos son instancias de una clase: Los objetos se crean por instanciación de las clases.
  • Todos los objetos de una misma clase (p.ej. coches) comparten ciertas características: sus atributos (tamaño, peso, color, potencia del motor...) y el comportamiento que exhiben (aceleran, frenan, curvan...).
Todo objeto tiene...
- Identidad (puede distinguirse de otros objetos)
- Estado (datos asociados a él)
- Comportamiento (puede hacer cosas)

Las diferentes instancias de cada clase difieren entre sí por los valores de los datos que encapsulan (sus atributos).
Dos objetos con los mismos valores en sus atributos pueden ser diferentes.
TODOS los objetos de una misma clase usan el mismo algoritmo como respuesta a mensajes similares.
El algoritmo empleado como respuesta a un mensaje (esto es, el método invocado) viene determinado por la clase del receptor.

Clase
Una clase es una descripción de un conjunto de objetos similares.
Al programar, definimos una clase para especificar cómo se comportan y mantienen su estado los objetos de esa clase.
A partir de la definición de la clase, se crean tantos objetos de esa clase como nos haga falta

Cada clase en Java:
• Se define en un fichero independiente con extensión .java.
• Se carga en memoria cuando se necesita.

La máquina virtual Java determina en cada momento las clases necesarias para la aplicación y las carga en memoria.

El programa puede ampliarse dinámicamente (sin tener que recompilar):

La aplicación no es un bloque monolítico de código.
Para definir una clase en Java se utiliza la palabra reservada class, seguida del nombre de la clase (un identificador):

public class MiClase { ... }

NOTA: Es necesario que indiquemos el modificador de acceso public para que podamos usar nuestra clase “desde el exterior”.

El nombre de una clase debe ser un identificador válido en Java.
Por convención, los identificadores que se les asignan a las clases en Java comienzan con mayúscula.
En Java, las clases públicas deben estar definidas en ficheros con extensión .java cuyo nombre coincida exactamente con el identificador asignado a la clase.

Errores comunes
Cuando el nombre de la clase no coincide con el nombre del fichero, el compilador nos da el siguiente error:

Public class MiClase must be defined in a file called MiClase.java

donde MiClase es el nombre de nuestra clase.
Las llaves siempre deben ir en parejas: Si falta la llave de cierre } el compilador da un error:

‘}’ expected Lo mismo ocurre si se nos olvida abrir la llave ({): ‘{’ expected


Encapsulación de datos (variables) y operaciones (métodos)

Objeto = Identidad + Estado + Comportamiento


Identidad
La identidad de un objeto lo identifica unívocamente:
- Es independiente de su estado.
- No cambia durante la vida del objeto.

Estado
El estado de un objeto viene dado por los valores de sus atributos.
- Cada atributo toma un valor en un dominio concreto.
- El estado de un objeto evoluciona con el tiempo
- Los atributos de un objeto no deberían ser manipulables
directamente por el resto de objetos del sistema (ocultamiento de
información):
o Se protegen los datos de accesos indebidos.
o Se distingue entre interfaz e implementación.
o Se facilita el mantenimiento del sistema.


Interfaz vs. implementación
Los objetos se comunican a través de interfaces bien definidas sin tener que conocer los detalles internos de implementación de los demás objetos.

Ejemplo: Un coche se puede conducir...
  • Sin saber exactamente de qué partes consta el motor ni cómo funciona éste (implementación).
  • Basta con saber manejar el volante, el acelerador y el freno (interfaz).

Comportamiento de Objetos

Los métodos que definen el comportamiento de un objeto:
- Agrupan las competencias del objeto (responsabilidades)
- Describen sus acciones y reacciones.

Las acciones realizadas por un objeto son consecuencia directa de un estímulo externo (un mensaje enviado desde otro objeto) y dependen del estado del objeto.
El interfaz de un objeto ha de establecer un contrato, un conjunto de condiciones precisas que gobiernan las relaciones entre una clase proveedora y sus clientes (diseño por contrato).

Estado y comportamiento están relacionados.

Ejemplo
Un avión no puede aterrizar (acción) si no está en vuelo (estado)

Representacion Grafica de Una Clase
Una clase se representa con un rectángulo dividido en tres partes:
- El nombre de la clase (identifica la clase de forma unívoca)
- Sus atributos (datos asociados a los objetos de la clase)
- Sus operaciones (comportamiento de los objetos de esa clase)

IMPORTANTE: Las clases se deben identificar con un nombre que, por lo general, pertenecerá al vocabulario utilizado habitualmente al hablar del problema que tratamos de resolver.
Declaración en Java de una clase.

public class Cuenta { ... }
Representación de una clase con sus atributos:

public class Cuenta
{
private double balance; // Saldo
private double limit; // Límite
...
}
public class Cuenta
{
private double balance = 0;
private double limit;
...
}

NOTA:
Aquí hemos decidido utilizar el tipo primitivo double para representar cantidades de dinero. En un programa en el que no se pudiesen permitir errores de redondeo en los cálculos, deberíamos utilizar otro tipo más adecuado (por ejemplo, BigDecimal).


Representación de las operaciones de una clase:

public class Cuenta
{
private double balance = 0;
private double limit;
public void ingresar (...) ...
public void retirar (...) ...
}

Los métodos implementan en Java las operaciones características de los objetos de una clase concreta.

public class Cuenta
{
private double balance = 0;
private double limit;
public void ingresar (double cantidad)
{
balance = balance + cantidad;
}
public void retirar (double cantidad)
{
balance = balance – cantidad;
}
}


Representación gráfica en UML:


Definición en Java:

Fichero Motocicleta.java

public class Motocicleta
{
// Atributos (variables de instancia)
private String matricula; // Placa de matrícula
private String color; // Color de la pintura
private int velocidad; // Velocidad actual (km/h)
private boolean en_marcha; // ¿moto arrancada?
// Operaciones (métodos)
public void arrancar ()
{ ... }
public void acelerar ()
{ ... }
public void frenar ()
{ ... }
public void girar (float angulo)
{ ... }
}



Uso de Objetos
El operador . (punto) en Java nos permite acceder a los distintos metodos de una clase:

objeto.metodo

Cuando tenemos un objeto de un tipo determinado y queremos acceder a uno de sus metodos sólo tenemos que poner el identificador asociado al objeto (esto es, el identificador de una de las variables de nuestro programa) seguido por un punto y por el identificador que hace referencia a un metodo concreto de la clase a la que pertenece el objeto.

¿Cómo se comprueba el estado de un objeto?
Accediendo a las variables de instancia del objeto

objeto.atributo

Por ejemplo, cuenta.balance nos permitiría acceder al valor numérico correspondiente al saldo de una cuenta, siempre y cuando cuenta fuese una instancia de la clase Cuenta.

¿Cómo se le envía un mensaje a un objeto?
Invocando a uno de sus métodos.

objeto.método(lista de parámetros)

La llamada al método hace que el objeto realice la tarea especificada en la implementación del método, tal como esté definida en la definición de la clase a la que pertenece el objeto.
Ejemplo

cuenta.ingresar(150.00);

Si cuenta es el identificador asociado a una variable de tipo Cuenta, se invoca al método ingresar definido en la clase Cuenta para depositar una cantidad de dinero en la cuenta.
La implementación del método ingresar se encarga de actualizar el saldo de la cuenta, sin que nosotros nos tengamos que preocupar de cómo se realiza esta operación.

Creacion de Objetos
Antes de poder usar un objeto hemos de crearlo...

El operador new nos permite crear objetos en Java.

Tipo identificador = new Tipo();

Si escribimos un programa como el siguiente:

public class Ingreso {
public static void main (String args[])
{
Cuenta cuenta; // Error
cuenta.ingresar(100.00);
}

}

El compilador nos da el siguiente error:
Ingreso.java:7:
variable cuenta might not have been initialized
cuenta.ingresar(100.00);
^
Hemos declarado una variable que, inicialmente, no tiene ningún valor.
Antes de utilizarla, deberíamos haberla inicializado (con un objeto del tipo adecuado):

Cuenta cuenta = new Cuenta();


Constructores
Cuando utilizamos el operador new acompañado del nombre de una clase, se crea un objeto del tipo especificado (una instancia de la clase cuyo nombre aparece al lado de new).
Al crear un objeto de una clase concreta, se invoca a un método especial de esa clase, denominado constructor, que es el que se encarga de inicializar el estado del objeto.

Constructor por defecto
Por defecto, Java crea automáticamente un constructor sin parámetros para cualquier clase que definamos.

public class Cuenta {
// Constante
public static final double LIMITE_NORMAL = 300.00;
// Variables de instancia

private double balance = 0;

private double limit = LIMITE_NORMAL;

// Métodos
...
}

Al crear un objeto de tipo Cuenta con new Cuenta(), se llama al constructor por defecto de la clase Cuenta, con lo cual se crea un objeto de tipo Cuenta cuyo estado inicial será el indicado en la inicialización de las variables de instancia balance y limit.


PrimerPrograma.java

/** * Este programa en Java imprime un saludo por pantalla. */
import java.*;


/* La clase principal se denomina PrimerPrograma */
public class PrimerPrograma {
public static void main(String args[ ]){
System.out.println("Hola Mundo ");
}
}

Herencia
Supongamos que tenemos una clase que nos define una persona.
Queremos las clases Alumno y Profesor.
Ambos son personas y seria perfecto no tener que volver a escribir (y pensar) todas las variables y funciones que ya hay en la clase Persona.



Ejemplo de Herencia


public class Persona {
protected int dni;
protected String nombre;
protected String direccion;
protected int telefono;
public int obtenerDni() {
return dni;
}
public void modificarDni(int dni) {
this.dni=dni;
}
public void mostrarPorPantalla() {
System.out.println("DNI: "+dni);
System.out.println("Nombre: "+nombre);
System.out.println("Direccion: "+direccion);
System.out.println("Telefono: "+telefono);
}
}


public class Alumno extends Persona {
protected int[ ] notas;
public void nuevaNota(int nota) {
// Añade una nueva nota
}
public void listadoNotas() {
System.out.println("Notas:");
for(int i=0;i
System.out.println(notas[i]);
}
}
public void mostrarPorPantalla() {
super.mostrarPorPantalla();
listadoNotas();
}
}

  • Java sólo tiene herencia simple. Esto es, una clase sólo puede heredar de una clase.
  • Además, si una clase no hacemos que herede de alguna otra clase, Java automáticamente hace que herede de la clase Object.

Bueno, eso seria por hoy.

Saludos y Suerte !!

miércoles, 11 de junio de 2008

Fundamentos de la Programación Orientada a Objetos

Hola, en este articulo explicare los fundamentos de la programación orientada a objetos. mas adelante seguire profundizando este tema.

Comenzamos,

Agenda

Introducción a la Programación Orientada por Objetos
Conceptos básicos
Abstracción
Herencia
Relaciones entre clases
Polimorfismo

Introducción a la Programación Orientada por Objetos

En la siguiente imagen vemos la evolución de los lenguajes de programación orientados a objetos, esto no es nuevo, sin embargop es hoy en día que este concepto o tecnología esta acaparando los desarrollos de software debido a la gran aceptacion, implementacion y popularidad que ha tenido Java en este ambito.


Conceptos básicos
  • OO provee objetos como el principal medio para abstraer y estructurar un sistema.
  • Un objeto puede modelar entidades del mundo real,puede capturar abstracciones de fenómenos complejos, puede representar artefactos de software (pilas, gráficos,...).

El contexto del problema se ve como
objetos que interactúan entre ellos


Ejemplo: Enviar Flores
  • Suponga que Juan desea llevarle flores a una amiga en otra ciudad, María.
  • Como Juan no puede llevarlas personalmente, le encarga a su florista preferida (Rosa) el envío.
  • María recibe sus flores

A continuación descomponemos el problema en la secuencia de los pasos para cumplir con el requerimiento.
  • Juan le solicita a Rosa un servicio
  • Rosa sabe cómo prestarle el servicio a Juan
  • Juan sabe que Rosa presta el servicio que el necesita
  • Rosa es responsable de prestarle el servicio adecuadamente a Juan
  • Juan desconoce qué le implica a Rosa prestarle el servicio

La imagen siguiente seria un diagrama conceptual, solamente para no entrar en mas detalle con los casos de uso, ya que ese tema lo hemos visto en otros articulos, y este trata de fundamentos de OO.


  • En programación orientada a objetos un programa es una comunidad de agentes (objetos) que interactuan entre ellos.
  • Cada objeto tiene un rol en la solución del problema
  • Cada objeto provee un conjunto de servicios (o métodos)
  • Los servicios de un objeto son usados por otros objetos.

La forma en que los objetos se comunican entre ellos es a través de mensajes:

  • Un mensaje encapsula la petición de un servicio
  • El receptor del mensaje presta el servicio y
  • Devuelve una respuesta al que solicitó el servicio

Donde: cambiarTamaño es un mensaje.

Modelar consiste en identificar (abstraer) qué objetos hay en el mundo del problema, cómo son, cómo se comportan y cómo se relacionan.


Objeto

Es una abstracción de un elemento del Contexto del Problema, tambien es una instancia de una clase.

Ejemplos:
  • Estudiante
  • Fecha
  • Automóvil
  • Libro
  • Vuelo
El comportamiento de los objetos puede ser descrito por una caracterización abstracta de su interfaz.

Por ejemplo:


  • La caracterización del comportamiento es suficiente para diseñar el sistema.
  • El comportamiento real del objeto puede ser implementado y refinado más tarde de acuerdo con las necesidades.
  • Un objeto empaqueta datos (una representación concreta) y procedimientos que operan sobre los datos.

La imagen anterior representa una clase, en ella podemos identificar: nombre de la clase (Libro), Datos/Atributos/Campos, y Métodos/Servicios/Interfaz

  • El envío de mensajes es la única forma para que un objeto realice una operación.
  • Las operaciones son la única forma para cambiar el estado de los datos.
  • Cuando esto se cumple, se dice que el estado interno del objeto (el valor de sus datos) está encapsulado; éste no puede ser manipulado directamente desde el exterior y su representación concreta es invisible.

Abstracción:

Mecanismo de la mente humana fundamental para la comprensión de fenómenos o situaciones que involucren una gran cantidad de detalles.
  • En biología los seres vivos se clasifican en especies, géneros, clases, etc...

Abstracción y encapsulamiento:

La abstracción se centra en el comportamiento observable de un objeto, el encapsulamiento se centra en la implementación que da lugar a ese comportamiento.


Clase

Describe un conjunto de objetos del Contexto del problema, que tienen las mismas características y el mismo comportamiento



La noción de Clase viene de clasificación: agrupar (en un conjunto) objetos (elementos) que se comportan de la misma manera (con respecto a la interfaz que describe el comportamiento).


Agregación/Composición

  • Permite abstraer relaciones de tipo ...tiene... y ... está compuesto de...



Asociaciones
  • Permite abstraer relaciones entre objetos diferentes a la composición



Herencia
  • Los objetos se organizan en jerarquías

La herencia permite modelar relaciones del tipo ...es... y clasificaciones:
  • Un mamífero es un vertebrado



Polimorfismo

Es la posibilidad de definir de forma distinta un método,dependiendo del objeto.







  • El polimorfismo es posible gracias a la herencia:



Resumen Principios
  • Todo es un objeto
  • Los objetos realizan operaciones (computan) solicitando serviciosentre ellos a través del paso de mensajes
  • Todo objeto tiene su propia memoria, la cual consiste de otros objetos
  • Todo objeto es una instancia de una clase. Una clase agrupa objetos similares.
  • En la clase se describe el comportamiento de los objetos.
  • Las clases están organizadas en una jerarquía con una única raíz, llamada la jerarquía de herencia.


Bueno, hemos aprendido un poco más de los fundamentos de la orientación a objetos, agradecere comentarios constructivos.

Saludos y Suerte !!

Ejemplo de Modelado con UML

Hola, veremos a continuación un sencillo ejemplo para implementar el modelado de requerimientos con UML, para esto tenemos los siguientes pasos:

• Descripción del problema
• Identificación de requisitos.
• Casos de uso.
• Conclusiones.


Comencemos,


Descripción del problema
  • Sokoban es un juego de varios niveles.
  • Cada nivel está compuesto por un jugador, cajas, repisas y muros.
  • El objetivo del jugador es empujar todas las cajas sobre las repisas.
  • Cuando esto sucede el jugador pasa al siguiente nivel.
  • Para mover una caja, el jugador debe colocarse al lado y empujarla. Si la casilla hacia la que está empujando la caja está libre la caja se moverá.
  • Si el jugador se queda bloqueado, es decir, no puede terminar el nivel, puede reiniciar el nivel perdiendo una vida.
  • Cuando el jugador pierde todas sus vidas la partida termina.


Identificación de requisitos

Una mini entrevista
¿Qué debe hacer el sistema (o tiene que tener) para implementar la descripción?

Requisitos:
• El sistema debe permitir comenzar una nueva partida y terminarla.
• El sistema debe permitir mover al jugador, a las cajas y reiniciar el nivel cuando
el usuario lo solicite.
• El sistema deberá almacenar varios niveles y cambiar de nivel cuando el usuario
complete el nivel actual.


Casos de uso

Los casos de uso son una respuesta,

¿Cómo puede un usuario jugar una partida de sokoban?

La primera pregunta que vamos a resolver:


¿cuántos actores tiene el sistema?

Un único actor:

  • ­ Persona humana que controla al jugador
  • ­ Su meta es jugar una partida de Sokoban

La segunda pregunta que vamos a resolver:

¿qué casos de uso necesitamos?



A continuación debemos completar la documentación de estos Casos de Uso, para esto existen las fichas de Casos de Uso, las que cumplen con el estandar de documentación de Casos de Uso:








Conclusiones

¿Cambiar de nivel es un caso de uso?
• No, porque sólo participa el sistema, no participa ningún actor externo.
• La única manera que un actor externo tiene de cambiar de nivel es mediante los movimientos (caso de uso 2)

¿Cargar un nivel es un caso de uso?
• No, porque sólo interviene el sistema.
• Además, cuando detallamos como cargar un nivel estamos detallando el sistema (queda fuera de la fase de requisitos).

¿Terminar la partida es un caso de uso?
• Como está redactado en el enunciado la respuesta es no.

¿Faltan casos de uso o están incompletos?
1. El sistema debe permitir comenzar una nueva partida y terminarla.

2. El sistema debe permitir mover al jugador y a las cajas y reiniciar el nivel cuando el usuario lo solicite.

3. El sistema deberá almacenar varios niveles y cambiar de nivel cuando el usuario complete el nivel actual

Los tres requisitos anteriores son los que definimos al principio, en la siguiente ficha vemos que los casos de uso cumplen con lo requerido.


Esta es una forma de comprobar que con los casos de uso definidos tenemos satisfechos los requerimientos.

Saludos y suerte !!

viernes, 16 de mayo de 2008

Instalador RPM firmado con clave GPG

Hola, este articulo nos servira para proteger con claves y firmas digitales nuestros softwares instalables, ya sean rpm, deb, etc.
Explico aqui de forma practica su uso.

1.- Objetivo: Generar un instalador que permita incluir una clave de tipo key con firma digital la cual contenga el periodo de tiempo que estará habilitado el software.

2.- Instalación de los paquetes necesarios
Para Linux Red-Hat o distribuciones que manejen gestor de paquetes RPM debe tener actualizados los siguientes paquetes:

Repositorios main, contrib, main-updates

# urpmi rpm rpm-build spec-helper libtool rpmlint
Para satisfacer las dependencias, se instalarán los paquetes siguientes:
..........
¿Efectuar la instalación de los 16 paquetes? (82 MB) (S/n) s
..........

3.- Generación del RPM con clave GPG, firmas y exportación

slack@debian:~$ gpg --gen-key
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? 1
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) [enter]
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 2
Key expires at dom 18 may 2008 12:26:28 CLT
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) "

Real name: jorge_salomon
Email address: linSlackware@gmail.com
Comment: ejemplo de clave con expiracion para instalador RPM
You selected this USER-ID:
"jorge_salomon (ejemplo de clave con expiracion para instalador RPM) "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++.++++++++++++++++++++.+++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..+++++++++++++++++++++++++.++++++++++>.+++++.+++++....+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++.++++++++++++++++++++..++++++++++...+++++.+++++.+++++.+++++++++++++++++++++++++++++++++++.+++++..++++++++++++++++++++..+++++.+++++...++++++++++.+++++.++++++++++>++++++++++>+++++........................................................................................................>.+++++................+++++^^^
gpg: key FB0A8720 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2008-05-18
pub 1024D/FB0A8720 2008-05-16 [expires: 2008-05-18]
Key fingerprint = CA96 8146 B051 C0CF 8687 665C 9671 45F8 FB0A 8720
uid jorge_salomon (ejemplo de clave con expiracion para instalador RPM)
sub 2048g/1D35BFAD 2008-05-16 [expires: 2008-05-18]


Ya generada la clave a ocupar en el instalador podemos verificar con el siguiente comando:

slack@debian:~$ gpg --list-keys
/home/slack/.gnupg/pubring.gpg
------------------------------
pub 1024D/4F4DACF2 2008-05-15
uid Jorge Salomon
sub 2048g/B823BCC8 2008-05-15

pub 1024D/FB0A8720 2008-05-16 [expires: 2008-05-18]
uid jorge_salomon (ejemplo de clave con expiracion para instalador RPM)
sub 2048g/1D35BFAD 2008-05-16 [expires: 2008-05-18]

Confirmada la correcta generación de la clave, la exportamos a un archivo de texto:

slack@debian:~$ gpg --export -a 'slack' > RPM-GPG-KEY-slack

slack@debian:~$ ls -l
total 224
drwx------ 2 slack slack 4096 2008-05-08 16:21 amsn_received
-rw-r--r-- 1 slack slack 579 2008-04-16 15:05 beryl~
drwx--x--x 25 slack slack 4096 2008-05-09 20:12 desarrollo
drwxr-xr-x 2 slack slack 4096 2008-05-15 17:05 Desktop
drwxr-xr-x 13 slack slack 4096 2008-05-15 17:40 documentos
drwxr-xr-x 3 slack slack 4096 2007-12-17 16:41 drivers_db
drwxr-xr-x 3 slack slack 4096 2008-01-23 12:41 flexdock
drwxr-xr-x 5 slack slack 12288 2008-05-09 10:27 imagenes
drwxr-xr-x 4 slack slack 4096 2008-03-23 14:08 NetBeansProjects
drwxr-xr-x 18 slack slack 4096 2008-05-15 17:05 programas
drwxr-xr-x 3 root root 4096 2008-05-07 21:27 redmine_open_source
-rw-r--r-- 1 slack slack 1690 2008-05-15 17:33 RPM-GPG-KEY-jsalomon
-rw-r--r-- 1 slack slack 3351 2008-05-16 12:36 RPM-GPG-KEY-slack
drwxr-xr-x 10 slack slack 4096 2008-05-16 10:07 software
drwxr-xr-x 4 slack slack 4096 2008-04-28 15:26 uml_workflow
drwxr-xr-x 6 slack slack 4096 2008-01-29 20:02 workspace


Luego se debe importar la clave al RPMDB, este comando debemos ingresarlo como root

slack@debian:~$ su
Password:
debian:/home/slack# rpm --import RPM-GPG-KEY-slack


Verificamos la lista de claves públicas del RPMDB

debian:/home/slack# rpm -q gpg-pubkey --qf '%{name}-%{version} --> %{summary}\n'
gpg-pubkey-4f4dacf2 --> gpg(Jorge Salomon )
gpg-pubkey-fb0a8720 --> gpg(jorge_salomon (ejemplo de clave con expiracion para instalador RPM) )

Ahora debemos configurar el fichero .rpmmacros incluyendo lo siguiente, lo podemos editar con nano:

debian:/home/slack# nano .rpmmacros


%_signature gpg

%_gpg_name fb0a8720

El archivo esta vacio, y debemos incluir las dos lineas anteriores, teniendo la precaución de que el _gpg_name debe tener el valor de la clave que hemos creado anteriormente

Posteriormente firmamos el instalador de la siguiente manera:

debian:/home/slack# rpm --addsign xs4dte-2.1.2-1.i386.rpm
xs4dte-2.1.2-1.i386.rpm

Ahora comprobamos la firma del paquete:

debian:/home/slack# rpm --checksig xs4dte-2.1.2-1.i386.rpm
xs4dte-2.1.2-1.i386.rpm: sha1 md5 OK

y ya tenemos el paquete firmado y con clave gpg con una licencia que durara el tiempo que pasamos para este instalador, en este caso es de 2 días

para más info vayan a: http://www.gnupg.org

Saludos y suerte !!