programacion de interfaces

125
1 UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE CONTADURÍA Y ADMINISTRACIÓN Programa de la asignatura: PROGRAMACIÓN DE INTERFACES Ver. 1.0 LICENCIATURA: INFORMÁTICA CLAVE: SEMESTRE: 7º. PLAN: 2005 AREA: Informática (Desarrollo de sistemas) CARÁCTER: Obligatoria Hora / Semana / Semestre Créditos: Teóricas Prácticas 8 4 0 MODALIDAD: Laboratorio SERIACIÓN ANTECEDENTE OBLIGATORIA: Ninguna SERIACIÓN SUBSECUENTE OBLIGATORIA: Ninguna OBJETIVO: Al finalizar el curso, el alumno será capaz de incorporar diversas formas de expresión e interacción entre el hombre, la computadora y otros sistemas. TEMAS Número de horas: I.-Introducción a las interfaces 2 II.-Lenguaje de programación para el desarrollo de interfaces 30 III.-Interfaces gráficas 6 IV.-Interfaces a bases de datos 26 TOTAL: 64 HORAS

Upload: roman-torres

Post on 06-Aug-2015

98 views

Category:

Documents


3 download

DESCRIPTION

Programacion de interfaces plan 2006

TRANSCRIPT

Page 1: programacion de interfaces

1

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

FACULTAD DE CONTADURÍA Y ADMINISTRACIÓN

Programa de la asignatura: PROGRAMACIÓN DE INTERFACES

Ver. 1.0

LICENCIATURA: INFORMÁTICA CLAVE:

SEMESTRE: 7º. PLAN: 2005 AREA: Informática (Desarrollo de sistemas)

CARÁCTER: Obligatoria Hora / Semana / Semestre Créditos:

Teóricas Prácticas

8 4 0

MODALIDAD: Laboratorio

SERIACIÓN ANTECEDENTE OBLIGATORIA: Ninguna

SERIACIÓN SUBSECUENTE OBLIGATORIA: Ninguna

OBJETIVO:

Al finalizar el curso, el alumno será capaz de incorporar diversas formas de expresión e interacción entre el hombre, la computadora y otros sistemas.

TEMAS

Número de horas:

I.-Introducción a las interfaces 2

II.-Lenguaje de programación para el desarrollo de interfaces 30

III.-Interfaces gráficas 6

IV.-Interfaces a bases de datos 26

TOTAL: 64 HORAS

Page 2: programacion de interfaces

2

TEMAS:

I. INTRODUCCIÓN A LAS INTERFACES.

1.-Historia de las interfaces.

2.-Interfaces para el usuario, bases de datos e Internet.

3.-Lenguajes de programación para el desarrollo de interfaces.

II. LENGUAJES DE PROGRAMACIÓN PARA EL DESARROLLO DE INTERFACES.

1.-Java.

2.-PHP.

3.-Python.

4.-Tcl/Tk.

5.-Visual Basic.

III. INTERFACES GRAFICAS.

1.-Interfaces gráficas orientadas al usuario.

2.-Criterios de uso.

3.-Principios de composición en el diseño de las ventanas.

4.-Color.

5.-Disposición de la ventana.

6.-Alineación.

7.-Espaciado.

8.-Menús.

9.-Cuadros de texto, botones, tablas, etiquetas etcétera.

IV. INTERFACES A BASES DE DATOS

1.-Utilizando Java.

2.-Utilizando PHP.

3.- Utilizando Python.

4.- Utilizando Tcl/Tk.

5.- Utilizando Visual Basic.

Page 3: programacion de interfaces

3

I. INTRODUCCIÓN A LAS INTERFACES.

1.-Historia de las interfaces. 2.-Interfaces para el usuario, bases de datos e Internet. 3.-Lenguajes de programación para el desarrollo de interfaces.

I. INTRODUCCIÓN A LAS INTERFACES. Actualmente en la mayoría de los sistemas electrónicos es común el uso de una computadora dentro del proceso de control. Esto es así, porque el Software, más que el Hardware, permite hacer cualesquier ajustes a los parámetros del sistema con el fin de obtener una respuesta deseada. Además, las computadoras también pueden efectuar funciones de supervisión, como la programación de numerosas aplicaciones requeridas. Por otro lado, el uso de computadoras dentro del sistema tiene grandes ventajas entre ellas están:

Reducción en el costo.

Flexibilidad en respuesta a los cambios en el diseño.

Incremento en la funcionalidad.

Capacidad de capturar una gran cantidad de datos y procesarlos con rapidez.

Capacidad de comunicación del software al hardware. Una FPGA (del inglés Field Programmable Gate Array) es un dispositivo semiconductor que contiene bloques de lógica cuya interconexión y funcionalidad puede ser configurada 'in situ' mediante un lenguaje de descripción especializado. La lógica programable puede reproducir desde funciones tan sencillas como las llevadas a cabo por una puerta lógica o un sistema combinacional hasta complejos sistemas en un chip.

Las FPGAs se utilizan en aplicaciones similares a los ASICs sin embargo son más lentas, tienen un mayor consumo de potencia y no pueden abarcar sistemas tan complejos como ellos. A pesar de esto, las FPGAs tienen las ventajas de ser reprogramables (lo que añade una enorme flexibilidad al flujo de diseño), sus costes de desarrollo y adquisición son mucho menores para

pequeñas cantidades de dispositivos y el tiempo de desarrollo es también menor. Ciertos fabricantes cuentan con FPGAs que sólo se pueden programar una vez, por lo que sus ventajas e inconvenientes se encuentran a medio camino entre los ASICs y las FPGAs reprogramables

Page 4: programacion de interfaces

4

Hoy en día los gráficos por computadora son el principal medio de comunicación entre usuarios y computadoras, debido a su facilidad de uso. Pues los diferentes recursos disponibles de representan con imágenes que pueden controlarse con dispositivos de entrada tales como teclado, mouse, pantallas sensitivas al contacto etc. El punto de entrada en la interacción del usuario con la computadora es el escritorio (desktop), donde se puede usar la información almacenada en carpetas (folders) y documentos, que se administran mediante programas de aplicación y herramientas. El escritorio también nos da acceso a programas de aplicación y herramientas para manipular la información de la computadora. Cuando los ejecutamos se despliegan en áreas de la pantalla (ventanas) que hacen un fuerte uso de gráficos. Cuando están bien diseñadas son fáciles de aprender y requieren poca escritura. Objetos y Propiedades. Las ventanas pueden desplegar objetos de la interfaz de usuarios. Un objeto es una entidad lógica que la aplicación despliega y el usuario manipula. Por ejemplo, en una aplicación de procesamiento de texto tenemos párrafos y palabras. Representan datos y partes de las labores que realiza el usuario. Los objetos tienen características que definen su comportamiento, llamadas propiedades. Por ejemplo, un párrafo puede tener una propiedad llamada font, que determina el tipo de letra utilizado. Los usuarios normalmente pueden ver el valor asignado a las propiedades y modificarlo. Las vistas son diferentes formas de desplegar objetos y sus características, como son listas de elementos, tablas de propiedades o íconos.

Page 5: programacion de interfaces

5

1.- Historia de las interfaces

Evolución histórica

La tecnología de interfaz de usuario, al igual que el hardware, ha pasado por una

serie de generaciones. Estas generaciones contienen o parecen contener a las

anteriores, y se pueden clasificar cronológicamente como sigue. Hasta 1945: no

existía ningún paradigma de interfaz de usuario, y se hacía acceso directo de

forma manual al hardware.

La primera generación

1945–1955: programación en modo batch o por lotes de interfaces no era

interactiva, ya que la interacción entre el sistema y el usuario se restringía a un

único punto en el tiempo. Todos los mandatos del usuario tenían que ser

especificados antes de que el usuario conociera el resultado de cualquiera de

ellos. Se recomienda que tales modos batch proporcionen alguna opción al

usuario para controlar continuamente el progreso del trabajo batch, de forma que

pueda interrumpir o modificar el trabajo. Es muy frustante tener un trabajo grande

ejecutándose y que, cuando vaya a finalizar, tenga que descartarse porque se

debería haber modificado el último mandato. Actualmente estas interfaces han

tenido un renacimiento en los sistemas de acceso por medio del intercambio de

mensajes de correo electrónico.

Page 6: programacion de interfaces

6

La segunda generación

1955–1965: Lenguajes de mandatos. También denominadas interfaces en línea.

Los sistemas de tiempo compartido se inventaron alrededor de 1960 como un

medio para permitir a varios usuarios tener acceso simultáneo interactivo a un

único servidor [LEE et al., 19921. Uno de los problemas principales de estos

sistemas es la pequeña cantidad de recursos de ordenador disponibles para

soportar la interfaz de cualquier usuario, por lo que, a menudo, se utilizan

interfaces en línea. Éstas eran básicamente interfaces de una dimensión, en las

que el usuario sólo podía interactuar con el ordenador en una línea que servía

como línea de mandato. Cuando el usuario pulsaba la tecla de intro (Return o

Enter), no se podía modificar la entrada. De forma similar, cuando el ordenador

presentaba una salida al usuario, no se podía modificar para reflejar cambios en

los datos. Estas interfaces se implementaron originalmente en las máquinas

teletipos, aunque las últimas versiones utilizan pantallas tipo tern-únal. Debido a

que las interfaces en línea no permitían a los usuarios navegar por la pantalla, la

interacción se limitaba a diálogos pregunta-respuesta y a la introducción de

mandatos con parámetros. La mayoría de las interfaces de usuario en línea se

implementaban en lenguajes de mandatos y, aunque algunos de ellos son muy

poderosos y permiten la construcción de secuencias de mandatos muy com-

plicadas, desafortunadamente es normal que se olviden de los errores del usuario,

ya que requieren que éste especifique el mandato deseado exactamente en el

formato requerido.

Page 7: programacion de interfaces

7

La tercera generación

1965–1980: pantallas completas con menús estrictamente jerárquicos. El espacio de

diseño de la interfaz es de dos dimensiones. Un uso clásico de la pantalla completa es

el de los diálogos para rellenar informes, en los que el usuario tiene un número de

campos etiquetados que puede editar en la secuencia que desee. Estos diálogos

todavía existen en las interfaces modernas en forma de cajas de diálogo, las cuales

son más dinámicas que los informes tradicionales, ya que contienen menús

desplegables y ayuda para que el usuario rellene el informe. Además de los menús,

muchas de las interfaces de pantalla completa utilizan también las teclas de función

como una forma de interacción. Estas teclas aceleran la interacción y existen tan pocas

que los usuarios, generalmente, se las aprenden de memoria.

Page 8: programacion de interfaces

8

La cuarta generación

1980–1995: ventanas, iconos, menús y ratón. También denominadas interfaces

gráficas de usuario. La mayoría de las interfaces actuales de usuario pertenecen a

esta categoría, a veces denominada sistemas WIMP (Windows, Icons, Menus and

Pointing device). Las interfaces windows añaden casi una tercera dimensión a las

dos dimensiones inherentes a cada ventana debido a la posibilidad de superponer

ventanas (está claro que superponer ventanas no es verdaderamente una tercera

dimensión, ya que no es posible ver el contenido de la ventana que está debajo,

por tanto, podríamos decir que tienen “dos dimensiones y media”). El estilo de

interacción utilizado en muchas interfaces gráficas de usuario es la manipulación

directa [SHNEIDERMAN, 1983], la cual se basa en la representación visual de los

objetos del diálogo que tengan interés para el usuario. Esto permite al usuario

controlar el diálogo con sólo mover los objetos por la pantalla y manipularlos con el

ratón. Sin embargo, las interfaces de manipulación directa pueden resultar más

difíciles de utilizar que las tradicionales, debido a que son más dependientes de un

control fino sobre el ratón.

Page 9: programacion de interfaces

9

La quinta generación

1995-Futuro: interfaces no basadas en mandatos. La próxima generación de

interfaces ya se está desarrollando [NIELSEN, 1993b]. Es probable que la tendencia

de las generaciones previas continúe, y que la dimensión de las interfaces de usuario

aumente de 2.5 a 3 o más dimensiones. Las formas comunes de añadir una

dimensión a las interfaces de usuario consisten en añadir tiempo (en forma de

animación), sonido o voz, así como una verdadera tercera dimensión espacial en

forma de sistemas de realidad virtual. Las dos predicciones más fáciles con respecto

a la siguiente generación de interfaces de usuario son que incluirán una

dimensionalidad más alta con más tipos de medios y que serán altamente portables y

personales, a la vez que se utiliza tecnología de comunicaciones para conseguir una

gran conectividad. Otro estilo de diálogo para las interfaces de usuario de la próxima

generación puede ser el de las interfaces de usuario no basadas en mandatos. Todos

los estilos de interfaz hasta ahora han tenido en común, al menos, el concepto de

mandato, y se basaban en el principio de un diálogo explícito entre el usuario y el

ordenador en el que el usuario ordenaba al ordenador que hiciese ciertas acciones

específicas. Por el contrario, muchos esfuerzos actuales de investigación apuntan a

sistemas que permitan al usuario centrarse en el dominio en lugar de tener que

controlar al ordenador explícitamente. En estos sistemas futuros, el ordenador se

encargará de tomar la responsabilidad de la interacción, basando sus acciones en sus

observaciones del usuario, utilizando tecnologías como el seguimiento del ojo,

reconocimiento de gestos y análisis semi-inteligente de las acciones del usuario.

Page 10: programacion de interfaces

10

Page 11: programacion de interfaces

11

2.- Interfaces para el usuario, bases de datos e Internet Interfaces para el usuario Son las reglas físicas y lógicas que permiten la conexión y comunicación entre dos elementos, por ejemplo:

Entre usuario y computador

Entre disco duro y tarjeta de red

El teclado y el resto del equipo. _ El término interfaz es de uso muy frecuente en informática. Es un concepto abstracto, que puede referirse a un dispositivo físico (hardware) o a un dispositivo lógico (software). Se refiere al ámbito de conexión entre dos sistemas. CLASIFICACIÓN Dentro de las Interfaces de Usuario se distinguir básicamente dos tipos:

Una interfaz de hardware, a nivel de los dispositivos utilizados para ingresar, procesar y entregar los datos: teclado, ratón y pantalla visualizadora.

Una interfaz de software, destinada a entregar información acerca de los procesos y herramientas de control, a través de lo que el usuario observa habitualmente en la pantalla.

INTERFAZ FÍSICA

Se conoce como Interfaz Física a los medios utilizados para la conexión de un computador con el medio de transporte de la red.

Esto puede ser un módem, una tarjeta de red, un puerto serie, enlace infrarrojo, una conexión inalámbrica etc.

Se utiliza esta expresión para no referirse a ningún medio o tipo de conexión en concreto, así se refiere al dispositivo por el cual se accede a la red de forma genérica.

INTERFAZ LÓGICA

Una interfaz lógica es un conjunto de valores que pueden asignarse a los parámetros variables de una interfaz física.

Por ejemplo, asignar una dirección IPv4 a la tarjeta de red de su PC. INTERFACES DE LÍNEA DE MANDATOS (COMMANDLINE INTERFACES, CLI).

Es el característico del DOS, el sistema operativo de los primeros PC, y es el estilo más antiguo de interacción hombre-máquina.

El usuario escribe órdenes utilizando un lenguaje formal con un vocabulario y una sintaxis propia (los mandatos en el caso del DOS).

Se usa un teclado, típicamente, y las órdenes están encaminadas a realizar una acción.

Page 12: programacion de interfaces

12

INTERFACES DE MENÚS

Un menú es una lista de opciones que se muestran en la pantalla o en una ventana de la pantalla para que los usuarios elijan la opción que deseen.

Los menús permiten dos cosas: 1. navegar dentro de un sistema, presentando rutas que llevan de un sitio

a otro 2. seleccionar elementos de una lista, que representan propiedades o

acciones que los usuarios desean realizar sobre algún objeto. INTERFACES GRÁFICAS (GRAPHIC USER INTERFACES, GUI)

Un GUI es una representación gráfica en la pantalla del ordenador de los programas, datos y objetos, así como de la interacción con ellos.

Un GUI proporciona al usuario las herramientas para realizar sus operaciones, más que una lista de las posibles operaciones que el ordenador es capaz de hacer.

Bases de datos Que son las Bases de datos?

Una base de datos es un “almacén” que nos permite guardar grandes cantidades de información de forma organizada para que luego podamos encontrar y utilizar fácilmente. A continuación te presentamos una guía que te explicará el concepto y características de las bases de datos.

El término de bases de datos fue escuchado por primera vez en 1963, en un simposio celebrado en California, USA. Una base de datos se puede definir como un conjunto de información relacionada que se encuentra agrupada ó estructurada.

Desde el punto de vista informático, la base de datos es un sistema formado por un conjunto de datos almacenados en discos que permiten el acceso directo a ellos y un conjunto de programas que manipulen ese conjunto de datos.

Cada base de datos se compone de una o más tablas que guarda un conjunto de datos. Cada tabla tiene una o más columnas y filas. Las columnas guardan una parte de la información sobre cada elemento que queramos guardar en la tabla, cada fila de la tabla conforma un registro.

Definición de base de datos

Se define una base de datos como una serie de datos organizados y relacionados entre sí, los cuales son recolectados y explotados por los sistemas de información de una empresa o negocio en particular.

Page 13: programacion de interfaces

13

Características

Entre las principales características de los sistemas de base de datos podemos mencionar:

Independencia lógica y física de los datos. Redundancia mínima. Acceso concurrente por parte de múltiples usuarios. Integridad de los datos. Consultas complejas optimizadas. Seguridad de acceso y auditoría. Respaldo y recuperación. Acceso a través de lenguajes de programación estándar.

Sistema de Gestión de Base de Datos (SGBD)

Los Sistemas de Gestión de Base de Datos (en inglés DataBase Management System) son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan. Se compone de un lenguaje de definición de datos, de un lenguaje de manipulación de datos y de un lenguaje de consulta.

Ventajas de las bases de datos

Control sobre la redundancia de datos:

Los sistemas de ficheros almacenan varias copias de los mismos datos en ficheros distintos. Esto hace que se desperdicie espacio de almacenamiento, además de provocar la falta de consistencia de datos.

En los sistemas de bases de datos todos estos ficheros están integrados, por lo que no se almacenan varias copias de los mismos datos. Sin embargo, en una base de datos no se puede eliminar la redundancia completamente, ya que en ocasiones es necesaria para modelar las relaciones entre los datos.

Consistencia de datos:

Eliminando o controlando las redundancias de datos se reduce en gran medida el riesgo de que haya inconsistencias. Si un dato está almacenado una sola vez, cualquier actualización se debe realizar sólo una vez, y está disponible para todos los usuarios inmediatamente. Si un dato está duplicado y el sistema conoce esta redundancia, el propio sistema puede encargarse de garantizar que todas las copias se mantienen consistentes.

Compartición de datos:

En los sistemas de ficheros, los ficheros pertenecen a las personas o a los departamentos que los utilizan. Pero en los sistemas de bases de datos, la base de datos pertenece a la empresa y puede ser compartida por todos los usuarios que estén autorizados.

Page 14: programacion de interfaces

14

Mantenimiento de estándares:

Gracias a la integración es más fácil respetar los estándares necesarios, tanto los establecidos a nivel de la empresa como los nacionales e internacionales. Estos estándares pueden establecerse sobre el formato de los datos para facilitar su intercambio, pueden ser estándares de documentación, procedimientos de actualización y también reglas de acceso.

Mejora en la integridad de datos:

La integridad de la base de datos se refiere a la validez y la consistencia de los datos almacenados. Normalmente, la integridad se expresa mediante restricciones o reglas que no se pueden violar. Estas restricciones se pueden aplicar tanto a los datos, como a sus relaciones, y es el SGBD quien se debe encargar de mantenerlas.

Mejora en la seguridad:

La seguridad de la base de datos es la protección de la base de datos frente a usuarios no autorizados. Sin unas buenas medidas de seguridad, la integración de datos en los sistemas de bases de datos hace que éstos sean más vulnerables que en los sistemas de ficheros.

Mejora en la accesibilidad a los datos:

Muchos SGBD proporcionan lenguajes de consultas o generadores de informes que permiten al usuario hacer cualquier tipo de consulta sobre los datos, sin que sea necesario que un programador escriba una aplicación que realice tal tarea.

Mejora en la productividad:

El SGBD proporciona muchas de las funciones estándar que el programador necesita escribir en un sistema de ficheros. A nivel básico, el SGBD proporciona todas las rutinas de manejo de ficheros típicas de los programas de aplicación.

El hecho de disponer de estas funciones permite al programador centrarse mejor en la función específica requerida por los usuarios, sin tener que preocuparse de los detalles de implementación de bajo nivel.

Mejora en el mantenimiento:

En los sistemas de ficheros, las descripciones de los datos se encuentran inmersas en los programas de aplicación que los manejan.

Esto hace que los programas sean dependientes de los datos, de modo que un cambio en su estructura, o un cambio en el modo en que se almacena en disco, requiere cambios importantes en los programas cuyos datos se ven afectados.

Page 15: programacion de interfaces

15

Sin embargo, los SGBD separan las descripciones de los datos de las aplicaciones. Esto es lo que se conoce como independencia de datos, gracias a la cual se simplifica el mantenimiento de las aplicaciones que acceden a la base de datos.

Aumento de la concurrencia:

En algunos sistemas de ficheros, si hay varios usuarios que pueden acceder simultáneamente a un mismo fichero, es posible que el acceso interfiera entre ellos de modo que se pierda información o se pierda la integridad. La mayoría de los SGBD gestionan el acceso concurrente a la base de datos y garantizan que no ocurran problemas de este tipo.

Mejora en los servicios de copias de seguridad:

Muchos sistemas de ficheros dejan que sea el usuario quien proporcione las medidas necesarias para proteger los datos ante fallos en el sistema o en las aplicaciones. Los usuarios tienen que hacer copias de seguridad cada día, y si se produce algún fallo, utilizar estas copias para restaurarlos.

En este caso, todo el trabajo realizado sobre los datos desde que se hizo la última copia de seguridad se pierde y se tiene que volver a realizar. Sin embargo, los SGBD actuales funcionan de modo que se minimiza la cantidad de trabajo perdido cuando se produce un fallo.

Desventajas de las bases de datos

Complejidad:

Los SGBD son conjuntos de programas que pueden llegar a ser complejos con una gran funcionalidad. Es preciso comprender muy bien esta funcionalidad para poder realizar un buen uso de ellos.

Coste del equipamiento adicional:

Tanto el SGBD, como la propia base de datos, pueden hacer que sea necesario adquirir más espacio de almacenamiento. Además, para alcanzar las prestaciones deseadas, es posible que sea necesario adquirir una máquina más grande o una máquina que se dedique solamente al SGBD. Todo esto hará que la implantación de un sistema de bases de datos sea más cara.

Vulnerable a los fallos:

El hecho de que todo esté centralizado en el SGBD hace que el sistema sea más vulnerable ante los fallos que puedan producirse. Es por ello que deben tenerse copias de seguridad (Backup).

Page 16: programacion de interfaces

16

Tipos de Campos

Cada Sistema de Base de Datos posee tipos de campos que pueden ser similares o diferentes. Entre los más comunes podemos nombrar:

Numérico: entre los diferentes tipos de campos numéricos podemos encontrar enteros “sin decimales” y reales “decimales”.

Booleanos: poseen dos estados: Verdadero “Si” y Falso “No”. Memos: son campos alfanuméricos de longitud ilimitada. Presentan el

inconveniente de no poder ser indexados. Fechas: almacenan fechas facilitando posteriormente su explotación.

Almacenar fechas de esta forma posibilita ordenar los registros por fechas o calcular los días entre una fecha y otra.

Alfanuméricos: contienen cifras y letras. Presentan una longitud limitada (255 caracteres).

Autoincrementables: son campos numéricos enteros que incrementan en una unidad su valor para cada registro incorporado. Su utilidad resulta: Servir de identificador ya que resultan exclusivos de un registro.

Tipos de Base de Datos

Entre los diferentes tipos de base de datos, podemos encontrar los siguientes:

MySql: es una base de datos con licencia GPL basada en un servidor. Se caracteriza por su rapidez. No es recomendable usar para grandes volúmenes de datos.

PostgreSql y Oracle: Son sistemas de base de datos poderosos. Administra muy bien grandes cantidades de datos, y suelen ser utilizadas en intranets y sistemas de gran calibre.

Access: Es una base de datos desarrollada por Microsoft. Esta base de datos, debe ser creada bajo el programa access, el cual crea un archivo .mdb con la estructura ya explicada.

Microsoft SQL Server: es una base de datos más potente que access desarrollada por Microsoft. Se utiliza para manejar grandes volúmenes de informaciones.

Page 17: programacion de interfaces

17

Modelo entidad-relación

Los diagramas o modelos entidad-relación (denominado por su siglas, ERD “Diagram Entity relationship”) son una herramienta para el modelado de datos de un sistema de información. Estos modelos expresan entidades relevantes para un sistema de información, sus inter-relaciones y propiedades.

Page 18: programacion de interfaces

18

Cardinalidad de las Relaciones

El diseño de relaciones entre las tablas de una base de datos puede ser la siguiente:

Relaciones de uno a uno: una instancia de la entidad A se relaciona con una y solamente una de la entidad B.

Relaciones de uno a muchos: cada instancia de la entidad A se relaciona con varias instancias de la entidad B.

Relaciones de muchos a muchos: cualquier instancia de la entidad A se relaciona con cualquier instancia de la entidad B.

Estructura de una Base de Datos

Una base de datos, a fin de ordenar la información de manera lógica, posee un orden que debe ser cumplido para acceder a la información de manera coherente. Cada base de datos contiene una o más tablas, que cumplen la función de contener los campos.

En el siguiente ejemplo mostramos una tabla “comentarios” que contiene 4 campos.

Los datos quedarían organizados como mostramos en siguiente ejemplo:

Por consiguiente una base de datos posee el siguiente orden jerárquico:

Tablas Campos Registros Lenguaje SQL

El lenguaje SQL es el más universal en los sistemas de base de datos. Este lenguaje nos permite realizar consultas a nuestras bases de datos para mostrar, insertar, actualizar y borrar datos.

Page 19: programacion de interfaces

19

A continuación veremos un ejemplo de ellos:

Mostrar: para mostrar los registros se utiliza la instrucción Select. Select * From comentarios.

Insertar: los registros pueden ser introducidos a partir de sentencias que emplean la instrucción Insert. Insert Into comentarios (titulo, texto, fecha) Values ('saludos', 'como esta', '22-10-2007')

Borrar: Para borrar un registro se utiliza la instrucción Delete. En este caso debemos especificar cual o cuales son los registros que queremos borrar. Es por ello necesario establecer una selección que se llevara a cabo mediante la cláusula Where. Delete From comentarios Where id='1'.

Actualizar: para actualizar los registros se utiliza la instrucción Update. Como para el caso de Delete, necesitamos especificar por medio de Where cuáles son los registros en los que queremos hacer efectivas nuestras modificaciones. Además, tendremos que especificar cuáles son los nuevos valores de los campos que deseamos actualizar. Update comentarios Set titulo='Mi Primer Comentario' Where id='1'.

INTERNET

Internet es un conjunto descentralizado de redes de comunicación interconectadas que utilizan la familia de protocolos TCP/IP, garantizando que las redes físicas heterogéneas que la componen funcionen como una red lógica única, de alcance mundial. Sus orígenes se remontan a 1969, cuando se estableció la primera conexión de computadoras, conocida como ARPANET, entre tres universidades en California y una en Utah, Estados Unidos.

Uno de los servicios que más éxito ha tenido en Internet ha sido la World Wide Web (WWW, o "la Web"), hasta tal punto que es habitual la confusión entre ambos términos. La WWW es un conjunto de protocolos que permite, de forma sencilla, la consulta remota de archivos de hipertexto. Ésta fue un desarrollo posterior (1990) y utiliza Internet como medio de transmisión.

Existen, por tanto, muchos otros servicios y protocolos en Internet, aparte de la Web: el envío de correo electrónico (SMTP), la transmisión de archivos (FTP y P2P), las conversaciones en línea (IRC), la mensajería instantánea y presencia, la transmisión de contenido y comunicación multimedia -telefonía (VoIP), televisión (IPTV)-, los boletines electrónicos (NNTP), el acceso remoto a otros dispositivos (SSH y Telnet) o los juegos en línea.

Internet y su evolución

Inicialmente Internet tenía un objetivo claro. Se navegaba en Internet para algo muy concreto: búsquedas de información, generalmente. Ahora quizás también, pero sin duda alguna hoy es más probable perderse en la red, debido al inmenso abanico de posibilidades que brinda. Hoy en día, la sensación que produce

Page 20: programacion de interfaces

20

Internet es un ruido, una serie de interferencias, una explosión de ideas distintas, de personas diferentes, de pensamientos distintos de tantas posibilidades que, en ocasiones, puede resultar excesivo. El crecimiento o más bien la incorporación de tantas personas a la red hace que las calles de lo que en principio era una pequeña ciudad llamada Internet se conviertan en todo un planeta extremadamente conectado entre sí entre todos sus miembros. El hecho de que Internet haya aumentado tanto implica una mayor cantidad de relaciones virtuales entre personas. es posible concluir que cuando una persona tenga una necesidad de conocimiento no escrito en libros, puede recurrir a una fuente más acorde a su necesidad. Como ahora esta fuente es posible en Internet. Como toda gran revolución, Internet augura una nueva era de diferentes métodos de resolución de problemas creados a partir de soluciones anteriores. Algunos sienten que Internet produce la sensación que todos han sentido sin duda alguna vez; produce la esperanza que es necesaria cuando se quiere conseguir algo. Es un despertar de intenciones que jamás antes la tecnología había logrado en la población mundial. Para algunos usuarios Internet genera una sensación de cercanía, empatía, comprensión y, a la vez, de confusión, discusión, lucha y conflictos que los mismos usuarios consideran la vida misma.

Preponderancia como fuente de información

En 2009, un estudio realizado en Estados Unidos indicó que un 56% de los 3.030 adultos estadounidenses entrevistados en una encuesta online manifestó que si tuviera que escoger una sola fuente de información, elegiría Internet, mientras que un 21% preferiría la televisión y tanto los periódicos como la radio sería la opción de un 10% de los encuestados. Dicho estudio posiciona a los medios digitales en una posición privilegiada en cuanto a la búsqueda de información y refleja un aumento de la credibilidad en dichos medios.7 8

Trabajo

Con la aparición de Internet y de las conexiones de alta velocidad disponibles al público, Internet ha alterado de manera significativa la manera de trabajar de algunas personas al poder hacerlo desde sus respectivos hogares. Internet ha permitido a estas personas mayor flexibilidad en términos de horarios y de localización, contrariamente a la jornada laboral tradicional, que suele ocupar la mañana y parte de la tarde, en la cual los empleados se desplazan al lugar de trabajo.

Un experto contable asentado en un país puede revisar los libros de una compañía en otro país, en un servidor situado en un tercer país que sea mantenido remotamente por los especialistas en un cuarto.

Internet y sobre todo los blogs han dado a los trabajadores un foro en el cual expresar sus opiniones sobre sus empleos, jefes y compañeros, creando una cantidad masiva de información y de datos sobre el trabajo que está siendo recogido actualmente por el colegio de abogados de Harvard.

Internet ha impulsado el fenómeno de la Globalización y junto con la llamada desmaterialización de la economía ha dado lugar al nacimiento de una Nueva

Page 21: programacion de interfaces

21

Economía caracterizada por la utilización de la red en todos los procesos de incremento de valor de la empresa

Buscadores

Un buscador se define como el sistema informático que indexa archivos almacenados en servidores web cuando se solicita información sobre algún tema. Por medio de palabras clave, se realiza la exploración y el buscador muestra una lista de direcciones con los temas relacionados. Existen diferentes formas de clasificar los buscadores según el proceso de sondeo que realizan. La clasificación más frecuente los divide en: índices o directorios temáticos, motores de búsqueda y metabuscadores.

Índices o directorios temáticos

Los índices o buscadores temáticos son sistemas creados con la finalidad de diseñar un catálogo por temas, definiendo la clasificación por lo que se puede considerar que los contenidos ofrecidos en estas páginas tienes ya cierto orden y calidad.

La función de este tipo de sistemas es presentar algunos de los datos de las páginas más importantes, desde el punto de vista del tema y no de lo que se contiene. Los resultados de la búsqueda de esta de estos índices pueden ser muy limitados ya que los directorios temáticos, las bases de datos de direcciones son muy pequeñas, además de que puede ser posible que el contenido de las páginas no esté completamente al día.

Motores de búsqueda

Este tipo de buscadores son los de uso más común, basados en aplicaciones llamadas spiders ("arañas") o robots, que buscan la información con base en las palabras escritas, haciendo una recopilación sobre el contenido de las páginas y mostrando como resultado aquéllas que contengan la palabra o frase en alguna parte del texto.

Metabuscadores

Los metabuscadores son sistemas que localizan información en los motores de búsqueda más utilizados, realizan un análisis y seleccionan sus propios resultados. No tienen una base de datos, por lo que no almacenan páginas web y realizan una búsqueda automática en las bases de datos de otros buscadores, tomando un determinado rango de registros con los resultados más relevantes.

Publicidad en Internet

Internet se ha convertido en el medio más fácilmente medible y de más alto crecimiento en la historia. Actualmente existen muchas empresas que obtienen dinero de la publicidad en Internet. Además, existen mucha ventajas que la publicidad interactiva ofrece tanto para el usuario como para los anunciantes

Page 22: programacion de interfaces

22

Acceso y servicios a Internet

Internet incluye aproximadamente 5.000 redes en todo el mundo y más de 100 protocolos distintos basados en TCP/IP, que se configura como el protocolo de la red. Los servicios disponibles en la red mundial de PC, han avanzado mucho gracias a las nuevas tecnologías de transmisión de alta velocidad, como ADSL y Wireless, se ha logrado unir a las personas con videoconferencia, ver imágenes por satélite (ver tu casa desde el cielo), observar el mundo por webcams, hacer llamadas telefónicas gratuitas, o disfrutar de un juego multijugador en 3D, un buen libro PDF, o álbumes y películas para descargar.

El método de acceso a Internet vigente hace algunos años, la telefonía básica, ha venido siendo sustituido gradualmente por conexiones más veloces y estables, entre ellas el ADSL, Cable Módems, o el RDSI. También han aparecido formas de acceso a través de la red eléctrica, e incluso por satélite (generalmente, sólo para descarga, aunque existe la posibilidad de doble vía, utilizando el protocolo DVB-RS).

Internet también está disponible en muchos lugares públicos tales como bibliotecas, bares, restaurantes, hoteles o cibercafés y hasta en centros comerciales. Una nueva forma de acceder sin necesidad de un puesto fijo son las redes inalámbricas, hoy presentes en aeropuertos, subterráneos, universidades o poblaciones enteras

Page 23: programacion de interfaces

23

3.- Lenguajes de programación para el desarrollo de interfaces

Clasificación de lenguajes de programación

Un lenguaje de programación es un lenguaje inventado para controlar una máquina, (normalmente, un ordenador). Hay muchísimos, de toda clase de tipos y características, inventados para facilitar el abordaje de distintos problemas, el mantenimiento del software, su reutilización, mejorar la productividad, etc.

Los lenguajes de programación se pueden clasificar según varios criterios. He encontrado doce en total: Nivel de abstracción, propósito, evolución histórica, manera de ejecutarse, manera de abordar la tarea a realizar, paradigma de programación, lugar de ejecución, concurrencia, interactividad, realización visual, determinismo y productividad.

Hay que tener en cuenta también, que en la práctica, la mayoría de lenguajes no pueden ser puramente clasificados en una categoría, pues surgen incorporando ideas de otros lenguajes y de otras filosofías de programación, pero no importa al establecer las clasificaciones, pues el auténtico objetivo de las mismas es mostrar los rangos, las posibilidades y tipos de lenguajes que hay.

1. Nivel de abstracción.

Según el nivel de abstracción, o sea, según el grado de cercanía a la máquina:

Lenguajes de bajo nivel: La programación se realiza teniendo muy en cuenta las características del procesador. Ejemplo: Lenguajes ensamblador.

Lenguajes de nivel medio: Permiten un mayor grado de abstracción pero al mismo tiempo mantienen algunas cualidades de los lenguajes de bajo nivel. Ejemplo: C puede realizar operaciones lógicas y de desplazamiento con bits, tratar todos los tipos de datos como lo que son en realidad a bajo nivel (números), etc.

Lenguajes de alto nivel: Más parecidos al lenguaje humano. Manejan conceptos, tipos de datos, etc., de una manera cercana al pensamiento humano ignorando (abstrayéndose) del funcionamiento de la máquina. Ejemplos: Java, Ruby.

Hay quien sólo considera lenguajes de bajo nivel y de alto nivel, (en ese caso, C es considerado de alto nivel).

2. Propósito.

Según el propósito, es decir, el tipo de problemas a tratar con ellos:

Lenguajes de propósito general: Aptos para todo tipo de tareas: Ejemplo: C.

Page 24: programacion de interfaces

24

Lenguajes de propósito específico: Hechos para un objetivo muy concreto. Ejemplo: Csound (para crear ficheros de audio).

Lenguajes de programación de sistemas: Diseñados para realizar sistemas operativos o drivers. Ejemplo: C.

Lenguajes de script: Para realizar tareas varias de control y auxiliares. Antiguamente eran los llamados lenguajes de procesamiento por lotes (batch) o JCL (“Job Control Languages”). Se subdividen en varias clases (de shell, de GUI, de programación web, etc.). Ejemplos: bash (shell), mIRC script, JavaScript (programación web).

3. Evolución histórica.

Con el paso del tiempo, se va incrementando el nivel de abstracción, pero en la práctica, los de una generación no terminan de sustituir a los de la anterior:

Lenguajes de primera generación (1GL): Código máquina. Lenguajes de segunda generación (2GL): Lenguajes ensamblador. Lenguajes de tercera generación (3GL): La mayoría de los lenguajes

modernos, diseñados para facilitar la programación a los humanos. Ejemplos: C, Java.

Lenguajes de cuarta generación (4GL): Diseñados con un propósito concreto, o sea, para abordar un tipo concreto de problemas. Ejemplos: NATURAL, Mathematica.

Lenguajes de quinta generación (5GL): La intención es que el programador establezca el qué problema ha de ser resuelto y las condiciones a reunir, y la máquina lo resuelve. Se usan en inteligencia artificial. Ejemplo: Prolog.

4. Manera de ejecutarse.

Según la manera de ejecutarse:

Lenguajes compilados: Un programa traductor traduce el código del programa (código fuente) en código máquina (código objeto). Otro programa, el enlazador, unirá los ficheros de código objeto del programa principal con los de las librerías para producir el programa ejecutable. Ejemplo: C.

Lenguajes interpretados: Un programa (intérprete), ejecuta las instrucciones del programa de manera directa. Ejemplo: Lisp.

También los hay mixtos, como Java, que primero pasan por una fase de compilación en la que el código fuente se transforma en “bytecode”, y este “bytecode” puede ser ejecutado luego (interpretado) en ordenadores con distintas arquitecturas (procesadores) que tengan todos instalados la misma “máquina virtual” Java.

5. Manera de abordar la tarea a realizar.

Según la manera de abordar la tarea a realizar, pueden ser:

Page 25: programacion de interfaces

25

Lenguajes imperativos: Indican cómo hay que hacer la tarea, es decir, expresan los pasos a realizar. Ejemplo: C.

Lenguajes declarativos: Indican qué hay que hacer. Ejemplos: Lisp, Prolog. Otros ejemplos de lenguajes declarativos, pero que no son lenguajes de programación, son HTML (para describir páginas web) o SQL (para consultar bases de datos).

6. Paradigma de programación.

El paradigma de programación es el estilo de programación empleado. Algunos lenguajes soportan varios paradigmas, y otros sólo uno. Se puede decir que históricamente han ido apareciendo para facilitar la tarea de programar según el tipo de problema a abordar, o para facilitar el mantenimiento del software, o por otra cuestión similar, por lo que todos corresponden a lenguajes de alto nivel (o nivel medio), estando los lenguajes ensambladores “atados” a la arquitectura de su procesador correspondiente. Los principales son:

Lenguajes de programación procedural: Divide el problema en partes más pequeñas, que serán realizadas por subprogramas (subrutinas, funciones, procedimientos), que se llaman unas a otras para ser ejecutadas. Ejemplos: C, Pascal.

Lenguajes de programación orientada a objetos: Crean un sistema de clases y objetos siguiendo el ejemplo del mundo real, en el que unos objetos realizan acciones y se comunican con otros objetos. Ejemplos: C++, Java.

Lenguajes de programación funcional: La tarea se realiza evaluando funciones, (como en Matemáticas), de manera recursiva. Ejemplo: Lisp.

Lenguajes de programación lógica: La tarea a realizar se expresa empleando lógica formal matemática. Expresa qué computar. Ejemplo: Prolog.

Hay muchos paradigmas de programación: Programación genérica, programación reflexiva, programación orientada a procesos, etc.

7. Lugar de ejecución.

En sistemas distribuidos, según dónde se ejecute:

Lenguajes de servidor: Se ejecutan en el servidor. Ejemplo: PHP es el más utilizado en servidores web.

Lenguajes de cliente: Se ejecutan en el cliente. Ejemplo: JavaScript en navegadores web.

8. Concurrencia.

Según admitan o no concurrencia de procesos, esto es, la ejecución simultánea de varios procesos lanzados por el programa:

Lenguajes concurrentes. Ejemplo: Ada. Lenguajes no concurrentes. Ejemplo: C.

Page 26: programacion de interfaces

26

9. Interactividad.

Según la interactividad del programa con el usuario u otros programas:

Lenguajes orientados a sucesos: El flujo del programa es controlado por la interacción con el usuario o por mensajes de otros programas/sistema operativo, como editores de texto, interfaces gráficos de usuario (GUI) o kernels. Ejemplo: VisualBasic, lenguajes de programación declarativos.

Lenguajes no orientados a sucesos: El flujo del programa no depende de sucesos exteriores, sino que se conoce de antemano, siendo los procesos batch el ejemplo más claro (actualizaciones de bases de datos, colas de impresión de documentos, etc.). Ejemplos: Lenguajes de programación imperativos.

10. Realización visual.

Según la realización visual o no del programa:

Lenguajes de programación visual: El programa se realiza moviendo bloques de construcción de programas (objetos visuales) en un interfaz adecuado para ello. No confundir con entornos de programación visual, como Microsoft Visual Studio y sus lenguajes de programación textuales (como Visual C#). Ejemplo: Mindscript.

Lenguajes de programación textual: El código del programa se realiza escribiéndolo. Ejemplos: C, Java, Lisp.

11. Determinismo.

Según se pueda predecir o no el siguiente estado del programa a partir del estado actual:

Lenguajes deterministas. Ejemplos: Todos los anteriores. Lenguajes probabilísticos o no deterministas: Sirven para explorar

grandes espacios de búsqueda, (como gramáticas), y en la investigación teórica de hipercomputación. Ejemplo: mutt (generador de texto aleatorio).

12. Productividad.

Según se caractericen por tener virtudes útiles o productivas, u oscuras y enrevesadas:

Lenguajes útiles o productivos: Sus virtudes en cuanto a eficiencia, sencillez, claridad, productividad, etc., motiva que sean utilizados en empresas, administraciones públicas y/o en la enseñanza. Ejemplos: Cualquier lenguaje de uso habitual (C, Java, C++, Lisp, Python, Ruby, …).

Lenguajes esotéricos o exóticos: Inventados con la intención de ser los más raros, oscuros, difíciles, simples y/o retorcidos de los lenguajes, para diversión y entretenimiento de frikis programadores. A veces exploran nuevas ideas en programación

Page 27: programacion de interfaces

27

Bibliografía 1.- MANUAL DISEÑO GRÁFICO Y COMUNICACIÓN VISUAL * UNIVERSIDAD DE LA LAGUNA * TENERIFE * 2006 Bibliografía Coplementaria Abadal, Ernest (2002). "Elementos para la evaluación de interfaces de consulta de bases de datos". El profesional de la información , septiembre-octubre, 11: 5, p. 349-360. Chávez, Sergi; Alcàzar, Noemi (2003). "GenIsisWeb: la herramienta para publicar en Internet las bases de datos CDS/ISIS". BiD: textos universitaris de biblioteconomia i documentació , desembre, 11. < http://www2.ub.es/bid/consulta_articulos.php?fichero=11chave2.htm > [Consulta: 27-01-2005]. Codina, Lluís; Abadal, Ernest (1992). "Gestió documental amb microordinadors: característiques, estructura i tecnologia dels sistemes de gestió documental". Item , 11,p. 72-100. CMS-Spain: portal sobre tecnologías para la información y la colaboración. <http://www.ecm-spain.com/home.asp>. [Consulta: 14/02/2005] Directorio español de software para la gestión bibliotecaria, documental y de contenidos. Grupo Activa. SEDIC. Coordinación: Luis Rodríguez Yunta, Carlos Tejada Artigas. Madrid: Consejo Superior de Investigaciones Científicas, 2003. Marcos, Mari Carmen (2004). Interacción en interfaces de recuperación de información: conceptos, metáforas y visualización. Gijón: Trea.

Ligas Programación de interfaces http://fcasua.contad.unam.mx/clases_virtuales/informatica/1766.html Lenguajes de programación http://qbitacora.wordpress.com/2007/09/21/clasificacion-de-lenguajes-de-programacion/ http://www.articulandia.com/premium/article.php/06-09-2006Clasificacion-de-los-lenguajes-de-programacion.htm http://html.rincondelvago.com/lenguajes-de-programacion_10.html

Page 28: programacion de interfaces

28

II. LENGUAJES DE PROGRAMACIÓN PARA EL DESARROLLO DE INTERFACES.

1.- ¿QUE ES JAVA?

Originalmente el equipo de Sun Microsystems que en los primeros 90 desarrolló Java se planteó la posibilidad de desarrollar software que pudiese utilizarse en electrodomésticos con componentes electrónicos diversos, tales como equipos de vídeo o de audio. En los electrodomésticos se producen continuas renovaciones de hardware, bien por motivos comerciales que conlleven el deseo de la actualización del producto, bien por las prosaicas pero siempre prioritarias motivaciones de costos. El objetivo del equipo era conseguir evitar tener que desarrollar en C o C++ por la sencilla razón de que estos lenguajes obligan a recompilar el código para cada nueva plataforma en la que quiera implantarse. Todos aquellos que hayan desarrollado o reflexionado en torno a la problemática de crear contenidos en WWW habrán pensado alguna vez en la naturaleza heterogénea de la red y los problemas que ello provoca a la hora de desarrollar programas. Si Java había nacido como un lenguaje que podía ejecutarse en cualquier máquina, qué podía ser más apropiado para un entorno, el web, en el que jamás puedes saber qué equipo, ni tan siquiera qué sistema operativo estará utilizando el usuario de tu futuro módulo de software. Esta universalidad, que conlleva obvias repercusiones económicas en el ahorro de las empresas de desarrollo, se expresa en el adagio de Sun "Write Once, run anywhere", algo así como "escribe tu programa una vez, y ejecútalo en cualquier parte". La independencia de la plataforma se expresa en que los programas Java no necesitan ser recompilados cuando se desea cambiar de plataforma porque los ejecutables Java, a diferencia de los de la mayoría de los lenguajes compilables, no están formados por un conjunto de instrucciones en el código máquina del procesador sobre el que serán ejecutados, sino que contienen lo que la terminología Java se denominan bytecodes, parte de un juego ficticio de instrucciones independiente del procesador.

Java como lenguaje de programación Java es un lenguaje de programación orientado a objetos que, en buena medida, proviene de C y C++, y por tanto hereda la mayoría de su sintaxis y mecanismos de orientación a objetos. Incluye una librería de clases, que proporciona una base para posteriores desarrollos, los tipos básicos, las esenciales funcionalidad de entrada/salida y de trabajo en red, y los protocolos Internet más comunes. Sin embargo, a pesar de que Java resulta similar a C++, tiene la agradable vocación de ser sencillo y carece de los aspectos más complejos de este lenguaje. Como ejemplo basta reseñar que no existen punteros y sí cadenas de caracteres (strings) o matrices (arrays) como auténticos objetos o que el manejo de memoria resulta en buena medida automático. Es decir, Java presume de ser un lenguaje de aprendizaje sencillo. Bien, esto es cierto, sobretodo si ya sabes programar en

Page 29: programacion de interfaces

29

C++. Vamos a enunciar, siquiera brevemente, algunos aspectos reseñables del lenguaje. Clases e interfaces Java agrupa las clases en librerías que se llaman paquetes (packages). Los paquetes también pueden contener definiciones de interfaces. Además, Java permite la creación de clases abstractas. Por otra parte, Java crea de manera explícita la entidad denominada interfaz, y que no es más que es una colección de declaraciones de métodos, sin implementación que representan una suerte de contrato entre el desarrollador que crea una clase que implementa una interfaz y los que reutilicen su código Las interfaces se utilizan para definir un tipo de comportamiento que puede ser implementado por cualquier clase y resultan útiles para capturar similitudes entre clases que no están relacionadas, sin forzar una relación directa, revelar la interfaz de programación de un objeto sin revelar su clase o para reflejar el comportamiento y la naturaleza de los objetos componentes reutilizables que, por ejemplo, se definen en COM. Liberación de memoria Java es Garbage Collected. El sistema, a la hora de ejecución, mantiene un control de la memoria que actualmente se está utilizando y de la que está libre. Cuando una porción de memoria ya no se está utilizando por el programa, el sistema la devuelve. Esta característica resulta importante porque en los lenguajes orientados a objetos es común que existan métodos que se encarguen de destruir el objeto que se está utilizando (destructores), algo que en Java no tiene un sentido tan estricto. Soporte de excepciones Java incorpora las excepciones como partes esenciales del lenguaje. Una excepción es una condición de error que se supone no debe ocurrir al tiempo de ejecución. Por ejemplo, en una división por cero, el programa se detiene si la situación no se evita por parte del programador. Un buen programador trata de evitar que esto suceda y muchas veces hay que añadir muchas validaciones para lograrlo. Es muy incómodo que un usuario tenga que volver a empezar el programa por algún error de ejecución, y ello debe evitarse, por ejemplo, indicando cual fue el error y como remediarlo. Multitarea El concepto de multithreading puede resumirse de manera grosera en que podemos realizar más de una cosa al mismo tiempo. Esto quiere decir que mi programa puede realizar más de una operación en un mismo momento. Para hacer esto se debe dividir el programa en diferentes caminos de ejecución, los threads. Java proporciona soporte completo para esta técnica de programación.

Page 30: programacion de interfaces

30

Que podemos desarrollar con java? Java es un lenguaje de programación de propósito general y, en contra de una creencia bastante extendida, su uso no se limita al WWW. De hecho, existen aplicaciones completas en Java, y proyectos (algunos de ellos en revisión) para desarrollar versiones de suites de aplicaciones en este lenguaje. Sin embargo, el uso más común está relacionado con WWW y no es otro que el desarrollo de applets. Un applet es un pequeño programa interactivo que se ejecuta en el seno de una página Web. Pueden utilizarse para presentar animaciones, figuras, juegos, para responder a acciones del usuario, o cualquier otra tarea. El proceso para incluir un applet en una página Web consiste en escribir el código Java, compilarlo, e insertar el applet utilizando el lenguaje HTML. Versiòn de Java 2 Enterprise Edition 1.4 Enterprise Edition (J2EE) es la plataforma de tecnología Java más avanzada, la cual provee un rango completo de funcionalidad empresarial para la computación de servidores. Esta plataforma ha sido diseñada con el fin de proporcionar un ambiente integrado para crear aplicaciones de Java empresariales de n-niveles (n=número).

Como software libre podemos bajar el software bundles de la pagina de Sun en internet. Ruta: http://java.sun.com/j2ee/1.4/download.html#sdk

Page 31: programacion de interfaces

31

Instalación

Crear una carpeta Java2EE bajo mis documentos

Bajar y ejecutar el programa j2eesdk-1_4-windows (según sea el archivo que bajaste en la pagina de Sun)

Ruta de aplicaciones: c:\sun\appServer\sdk\bin\

Compilación de programas de Java.

Desde el escritorio de Windows: inicio, ejecutar, command

Entrar a la ruta de aplicaciones: c:\sun\appServer\sdk\bin\ Nota: en caso de no dar acceso al directorio appServer, renombrarlo por server c:\sun\Server\sdk\bin\ Compilación y ejecución de un programa fuente en J2EE: archivos para compilar y ejecutar: código fuente de java <nombre del programa + extensión ‘.java’ > por ejemplo: java1.java /** Primer programa de Java en simple formato * de clases : java1.java */ class java1 { public static void main (String args[]) { System.out.println("Diplomado de Desarrollo de Sistemas con J2EE ...!!"); } } cree este archivo con Bloc de Notas y guárdelo en la ruta de la aplicación de J2EE : c:\sun\Server\sdk\bin\ Nota: el nombre de la clase del codigo fuente debe ser el mismo que el archivo fuente físico Compilación: javac <nombre de código fuente de java> Desde la ruta de la aplicación de J2EE javac java1.java Nota: si la compilación fue correcta genera un ejecutable byte-codes en vez de un código máquina, extensión .class Ejem: java1.class

Page 32: programacion de interfaces

32

Para ejecutar nuestro programa C:\SUN\SERVER\JDK\BIN>java java1 Diplomado de Desarrollo de Sistemas con J2EE ...!!

Característica de java.

Las características principales que nos ofrece Java son:

1.- Lenguaje Simple:

Se lo conoce como lenguaje simple porque viene de la misma estructura de c y c++; ya que c++ fue un referente para la creación de java por eso utiliza determinadas características de c++ y se han eliminado otras.

2.- Orientado a Objeto:

Toda la programación en java en su mayoría está orientada a objeto, ya que al estar agrupados en estructuras encapsuladas es más fácil su manipulación.

3.- Distribuido:

Permite abrir sockets, establecer y aceptar conexiones con los servidores o clientes remotos; facilita la creación de aplicaciones distribuidas ya que proporciona una colección de clases para aplicaciones en red.

4.- Robusto:

Es altamente fiable en comparación con c, se han eliminado muchas características con la aritmética de punteros, proporciona numerosas comprobaciones en compilación y en tiempo de ejecución.

5.- Seguro:

La seguridad es una característica muy importante en java ya que se han implementado barreras de seguridad en el lenguaje y en el sistema de ejecución de tiempo real.

6.- Indiferente a la arquitectura:

Java es compatible con los más variados entornos de red, cualquiera sean estos desde Windows 95, Unix a Windows Nt y Mac, para poder trabajar con diferentes sistemas operativos.

Page 33: programacion de interfaces

33

Java es muy versátil ya que utiliza byte-codes que es un formato intermedio que sirve para transportar el código eficientemente o de diferentes plataformas (Hardware - Software).

7.- Portable:

Por ser indiferente a la arquitectura sobre la cual está trabajando, esto hace que su portabilidad sea muy eficiente, sus programas son iguales en cualquiera de las plataformas, ya que java especifica tamaños básicos, esto se conoce como la máquina virtual de java.

8.- Interpretado y compilado a la vez:

Java puede ser compilado e interpretado en tiempo real, ya que cuando se construye el código fuente este se transforma en una especie de código de máquina.

9.- Multihebra o Multihilos:

Java tiene una facilidad de cumplir varias funciones al mismo tiempo, gracias a su función de multahilos ya que por cada hilo que el programa tenga se ejecutaran en tiempo real muchas funciones al mismo tiempo.

10.- Dinámico:

El lenguaje java es muy dinámico en la fase de enlazado, sus clases solamente actuaran en medida en que sean requeridas o necesitadas con esto permitirá que los enlaces se puedan incluir incluso desde fuentes muy variadas o desde la red.

11.- Produce Applets:

En java se pueden crear aplicaciones independientes y applets.

Independientes porque se pueden comportar como cualquier programa escrito en cualquier lenguaje.

Por otra parte los applets considerados pequeños programas, tienen la capacidad de ejecutar funciones muy complejas.

12.- Alto rendimiento

Java es considerado de alto rendimiento por ser tan veloz en el momento de correr los programas y por ahorrase muchas líneas de código.

Page 34: programacion de interfaces

34

El API Java es una Interfaz de Programación de Aplicaciones (API: por sus siglas en inglés) provista por los creadores del lenguaje Java, y que da a los programadores los medios para desarrollar aplicaciones Java.

Como el lenguaje Java es un Lenguaje Orientado a Objetos, la API de Java provee de un conjunto de clases utilitarias para efectuar toda clase de tareas necesarias dentro de un programa.

La API Java está organizada en paquetes lógicos, donde cada paquete contiene un conjunto de clases relacionadas semánticamente.

Identificadores

Un identificador es un nombre que identifica a una variable, a un método o función miembro, a una clase. Todos los lenguajes tienen ciertas reglas para componer los identificadores:

Todos los identificadores han de comenzar con una letra, el carácter subrayado ( _ ) o el carácter dolar ( $ ).

Puede incluir, pero no comenzar por un número No puede incluir el carácter espacio en blanco Distingue entre letras mayúsculas y minúsculas No se pueden utilizar las palabras reservadas como identificadores

Además de estas restricciones, hay ciertas convenciones que hacen que el programa sea más legible, pero que no afectan a la ejecución del programa. La primera y fundamental es la de encontrar un nombre que sea significativo, de modo que el programa sea lo más legible posible. El tiempo que se pretende ahorrar eligiendo nombres cortos y poco significativos se pierde con creces cuando se revisa el programa después de cierto tiempo.

Tipo de identificador

Convención Ejemplo

nombre de una clase

Comienza por letra mayúscula

String, Rectangulo, CinematicaApplet

nombre de función

comienza con letra minúscula

calcularArea, getValue, setColor

nombre de variable

comienza por letra minúscula

area, color, appletSize

nombre de constante

En letras mayúsculas PI, MAX_ANCHO

Comentarios

Un comentario es un texto adicional que se añade al código para explicar su funcionalidad, bien a otras personas que lean el programa, o al propio autor como recordatorio. Los comentarios son una parte importante de la documentación de un programa. Los comentarios son ignorados por el compilador, por lo que no

Page 35: programacion de interfaces

35

incrementan el tamaño del archivo ejecutable; se pueden por tanto, añadir libremente al código para que pueda entenderse mejor.

La programación orientada a objetos facilita mucho la lectura del código, por lo que lo que no se precisa hacer tanto uso de los comentarios como en los lenguajes estructurados. En Java existen tres tipos de comentarios

Comentarios en una sola línea Comentarios de varias líneas Comentarios de documentación

Como podemos observar un comentario en varias líneas es un bloque de texto situado entre el símbolo de comienzo del bloque /*, y otro de terminación del mismo */. Teniendo encuentra este hecho, los programadores diseñan comentarios como el siguiente:

/*--------------------------------| | (C) Angel Franco García | | fecha: Marzo 1999 | | programa: PrimeroApp.java | |---------------------------------*/

Los comentarios de documentación es un bloque de texto situado entre el símbolo de comienzo del bloque /**, y otro de terminación del mismo */. El programa javadoc utiliza estos comentarios para generar la documentación del código.

/** Este es el primer programa de una serie dedicada a explicar los fundamentos del lenguaje Java */

Habitualmente, usaremos comentarios en una sola línea //, ya que no tiene el inconveniente de aprendernos los símbolos de comienzo y terminación del bloque, u olvidarnos de poner este último, dando lugar a un error en el momento de la compilación. En la ventana de edición del Entorno Integrado de Desarrollo (IDE) los comentarios se distinguen del resto del código por el color del texto.

public class PrimeroApp{ public static void main(String[] args) { //imprime un mensaje System.out.println("El primer programa"); } }

Un procedimiento elemental de depuración de un programa consiste en anular ciertas sentencias de un programa mediante los delimitadores de comentarios. Por ejemplo, se puede modificar el programa y anular la sentencia que imprime el mensaje, poniendo delante de ella el delimitador de comentarios en una sola línea.

//System.out.println("El primer programa");

Al correr el programa, observaremos que no imprime nada en la pantalla.

Page 36: programacion de interfaces

36

La sentencia System.out.println() imprime un mensaje en la consola, una ventana DOS que se abre en el escritorio de Windows 95. La función println tiene un sólo argumento una cadena de caracteres u objeto de la clase String.

Sentencias

Una sentencia es una orden que se le da al programa para realizar una tarea específica, esta puede ser: mostrar un mensaje en la pantalla, declarar una variable (para reservar espacio en memoria), inicializarla, llamar a una función, etc. Las sentencias acaban con ;. este carácter separa una sentencia de la siguiente. Normalmente, las sentencias se ponen unas debajo de otras, aunque sentencias cortas pueden colocarse en una misma línea. He aquí algunos ejemplos de sentencias

int i=1; import java.awt.*; System.out.println("El primer programa"); rect.mover(10, 20);

En el lenguaje Java, los caracteres espacio en blanco se pueden emplear libremente. Como podremos ver en los sucesivos ejemplos, es muy importante para la legibilidad de un programa la colocación de unas líneas debajo de otras empleando tabuladores. El editor del IDE nos ayudará plenamente en esta tarea sin apenas percibirlo.

Bloques de código

Un bloque de código es un grupo de sentencias que se comportan como una unidad. Un bloque de código está limitado por las llaves de apertura { y cierre }. Como ejemplos de bloques de código tenemos la definición de una clase, la definición de una función miembro, una sentencia iterativa for, los bloques try ... catch, para el tratamiento de las excepciones, etc.

Expresiones

Una expresión es todo aquello que se puede poner a la derecha del operador asignación =. Por ejemplo:

x=123; y=(x+100)/4; area=circulo.calcularArea(2.5); Rectangulo r=new Rectangulo(10, 10, 200, 300); La primera expresión asigna un valor a la variable x. La segunda, realiza una operación La tercera, es una llamada a una función miembro calcularArea desde un objeto circulo de una clase determinada La cuarta, reserva espacio en memoria para un objeto de la clase Rectangulo mediante la llamada a una función especial denominada constructor.

Page 37: programacion de interfaces

37

Variables

Una variable es un nombre que se asocia con una porción de la memoria del ordenador, en la que se guarda el valor asignado a dicha variable. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos.

Todas las variables han de declararse antes de usarlas, la declaración consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Una vez declarada se le podrá asignar valores.

Java tiene tres tipos de variables:

de instancia de clase locales

Las variables de instancia o miembros dato como veremos más adelante, se usan para guardar los atributos de un objeto particular.

Las variables de clase o miembros dato estáticos son similares a las variables de instancia, con la excepción de que los valores que guardan son los mismos para todos los objetos de una determinada clase. En el siguiente ejemplo, PI es una variable de clase y radio es una variable de instancia. PI guarda el mismo valor para todos los objetos de la clase Circulo, pero el radio de cada círculo puede ser diferente

class Circulo{ static final double PI=3.1416; double radio; //... }

Las variables locales se utilizan dentro de las funciones miembro o métodos. En el siguiente ejemplo area es una variable local a la función calcularArea en la que se guarda el valor del área de un objeto de la clase Circulo. Una variable local existe desde el momento de su definición hasta el final del bloque en el que se encuentra.

Page 38: programacion de interfaces

38

class Circulo{ //... double calcularArea(){ double area=PI*radio*radio; return area; } }

En el lenguaje Java, las variables locales se declaran en el momento en el que son necesarias. Es una buena costumbre inicializar las variables en el momento en el que son declaradas. Veamos algunos ejemplos de declaración de algunas variables

int x=0; String nombre="Angel"; double a=3.5, b=0.0, c=-2.4; boolean bNuevo=true; int[] datos;

Delante del nombre de cada variable se ha de especificar el tipo de variable que hemos destacado en letra negrita. Las variables pueden ser

Un tipo de dato primitivo El nombre de una clase Un array

El lenguaje Java utiliza el conjunto de caracteres Unicode, que incluye no solamente el conjunto ASCII sino también carateres específicos de la mayoría de los alfabetos. Así, podemos declarar una variable que contenga la letra ñ

int año=1999;

Se ha de poner nombres significativos a las variables, generalmente formados por varias palabras combinadas, la primera empieza por minúscula, pero las que le siguen llevan la letra inicial en mayúsculas. Se debe evitar en todos los casos nombres de variables cortos como xx, i, etc.

double radioCirculo=3.2;

Las variables son uno de los elementos básicos de un programa, y se deben

Declarar Inicializar Usar

Page 39: programacion de interfaces

39

Tipos de datos primitivos

Tipo Descripcion

boolean Tiene dos valores true o false.

char Caracteres Unicode de 16 bits Los caracteres alfa-numéricos son los mismos que los ASCII con el bit alto puesto a 0. El intervalo de valores va desde 0 hasta 65535 (valores de 16-bits sin signo).

byte Tamaño 8 bits. El intervalo de valores va desde -27 hasta 27 -1 (-128 a 127)

short Tamaño 16 bits. El intervalo de valores va desde -215 hasta 215-1 (-32768 a 32767)

int Tamaño 32 bits. El intervalo de valores va desde -231 hasta 231-1 (-2147483648 a 2147483647)

long Tamaño 64 bits. El intervalo de valores va desde -263 hasta 263-1 (-9223372036854775808 a 9223372036854775807)

float Tamaño 32 bits. Números en coma flotante de simple precisión. Estándar IEEE 754-1985 (de 1.40239846e–45f a 3.40282347e+38f)

double Tamaño 64 bits. Números en coma flotante de doble precisión. Estándar IEEE 754-1985. (de 4.94065645841246544e–324d a 1.7976931348623157e+308d.)

Los tipos básicos que utilizaremos en la mayor parte de los programas serán boolean, int y double.

Caracteres

En Java los caracteres no están restringidos a los ASCII sino son Unicode. Un carácter está siempre rodeado de comillas simples como 'A', '9', 'ñ', etc. El tipo de dato char sirve para guardar estos caracteres.

Un tipo especial de carácter es la secuencia de escape, similares a las del lenguaje C/C++, que se utilizan para representar caracteres de control o caracteres que no se imprimen. Una secuencia de escape está formada por la barra invertida (\) y un carácter. En la siguiente tabla se dan las secuencias de escape más utilizadas.

Carácter Secuencia de escape

retorno de carro

\r

tabulador horizontal

\t

nueva línea \n

barra invertida

\\

Page 40: programacion de interfaces

40

Variables booleanas

En el lenguaje C/C++ el valor 0 se toma como falso y el 1 como verdadero. En el lenguaje Java existe el tipo de dato boolean. Una variable booleana solamente puede guardar uno de los dos posibles valores: true (verdadero) y false (falso).

boolean encontrado=false; {...} encontrado=true;

Variables enteras

Una variable entera consiste en cualquier combinación de cifras precedidos por el signo más (opcional), para los positivos, o el signo menos, para los negativos. Son ejemplos de números enteros:

12, -36, 0, 4687, -3598

Como ejemplos de declaración de variable enteras tenemos:

int numero=1205; int x,y; long m=30L;

int es la palabra reservada para declarar una variable entera. En el primer caso, el compilador reserva una porción de 32 bits de memoria en el que guarda el número 1205. Se accede a dicha porción de memoria mediante el nombre de la variable, numero. En el segundo caso, las porciones de memoria cuyos nombres son x e y, guardan cualquier valor entero si la variable es local o cero si la variable es de instancia o de clase. El uso de una variaable local antes de ser convenientemente inicializada puede conducir a consecuencias desastrosas. Por tanto, declarar e inicializar una variable es una práctica aconsejable.

En la tercera línea 30 es un número de tipo int por defecto, le ponemos el sufijo L en mayúsculas o minúsculas para indicar que es de tipo long.

Existen como vemos en la tabla varios tipos de números enteros (byte, short, int, long), y también existe una clase denominada BigInteger cuyos objetos pueden guardar un número entero arbitrariamente grande.

Page 41: programacion de interfaces

41

Variables en coma flotante

Las variables del tipo float o double (coma flotante) se usan para guardar números en memoria que tienen parte entera y parte decimal.

double PI=3.14159; double g=9.7805, c=2.9979e8;

El primero es una aproximación del número real p, el segundo es la aceleración de la gravedad a nivel del mar, el tercero es la velocidad de la luz en m/s, que es la forma de escribir 2.9979 108. El carácter punto '.', separa la parte entera de la parte decimal, en vez del carácter coma ',' que usamos habitualmente en nuestro idioma.

Otras ejemplos son los siguientes

float a=12.5f; float b=7f; double c=7.0; double d=7d;

En la primera línea 12.5 lleva el sufijo f, ya que por defecto 12.5 es double. En la segunda línea 7 es un entero y por tanto 7f es un número de tipo float. Y así el resto de los ejemplos.

Conceptualmente, hay infinitos números de valores entre dos números reales. Ya que los valores de las variables se guardan en un número prefijado de bits, algunos valores no se pueden representar de forma precisa en memoria. Por tanto, los valores de las variables en coma flotante en un ordenador solamente se aproximan a los verdaderos números reales en matemáticas. La aproximación es tanto mejor, cuanto mayor sea el tamaño de la memoria que reservamos para guardarlo. De este hecho, surgen las variables del tipo float y double. Para números de precisión arbitararia se emplea la clase BigDecimal.

Valores constantes

Cuando se declara una variable de tipo final, se ha de inicializar y cualquier intento de modificarla en el curso de la ejecución del programa da lugar a un error en tiempo de compilación.

Normalmente, las constantes de un programa se suelen poner en letras mayúsculas, para distinguirlas de las que no son constantes. He aquí ejemplos de declaración de constantes.

final double PI=3.141592653589793; final int MAX_DATOS=150;

Page 42: programacion de interfaces

42

Las cadenas de caracteres o strings

Además de los ocho tipos de datos primitivos, las variables en Java pueden ser declaradas para guardar una instancia de una clase, como veremos en el siguiente capítulo (Clases y objetos). Las cadenas de caracteres o strings son distintas en Java y en el lenguaje C/C++, en este último, las cadenas son arrays de caracteres terminados en el carácter '\0'. Sin embargo, en Java son objetos de la clase String.

String mensaje="El primer programa";

Empleando strings, el primer programa quedaría de la forma equivalente

public class PrimeroApp{ public static void main(String[] args) { //imprime un mensaje String mensaje="El primer programa"; System.out.println(mensaje); } }

En una cadena se pueden insertar caracteres especiales como el carácter tabulador '\t' o el de nueva línea '\n'

String texto="Un string con \t un carácter tabulador y \n un salto de línea";

Palabras reservadas

En el siguiente cuadro se listan las palabras reservadas, aquellas que emplea el lenguaje Java, y que el programador no puede utilizar como identificadores. Algunas de estas palabras le resultarán familiares al programador del lenguaje C/C++. Las palabras reservadas señaladas con un arterisco (*) no se utilizan.

abstract boolean break byte byvalue*

case cast* catch char class

const* continue default do double

else extends false final finally

float for future* generic* goto*

if implements import inner* instanceof

int interface long native new

null operator* outer* package private

protected public rest* return short

satatic super switch synchronized this

throw transient true try var*

void volatile while

Page 43: programacion de interfaces

43

Las palabras reservadas se pueden clasificar en las siguientes categorías:

Tipos de datos: boolean, float, double, int, char Sentencias condicionales: if, else, switch Sentencias iterativas: for, do, while, continue Tratamiento de las excepciones: try, catch, finally, throw Estructura de datos: class, interface, implements, extends Modificadores y control de acceso: public, private, protected, transient Otras: super, null, this.

Page 44: programacion de interfaces

44

2.-PHP PHP es lo que llamamos un lenguaje de programacion del lado del servidor, esto significa que el código se interpreta en el servidor y no en el ordenador del usuario. El código php interpretado, produce un resultado que es enviado al navegador del visitante en forma de HTML, imagen, documento .doc... de ninguna manera el navegador del visitante accede al código fuente en php sino solo a su resultado en HTML.

El navegador pide un documento al servidor, en el caso que este documento sea un archivo PHP, el archivo es interpretado y se envía su resultado al navegador. Vamos a ver un ejemplo sencillo de código escrito en php para que nos sea mas fácil de comprender:

000 001 002 003 004 005 006 007 008 009 010 011

<html> <head> <title>Prueba</title> </head> <body> <? $texto = "Hola mundo"; echo $texto; ?> </body> </html> </CODE< code>

Page 45: programacion de interfaces

45

Este código producirá el siguiente resultado que es lo que se enviará al navegador del visitante:

000 001 002 003 004 005 006 007

<html> <head> <title>Prueba</title> </head> <body> Hola mundo </body> </html> </CODE< code>

Vemos que el código php esta delimitado por las etiquetas <? y ?>, aunque tambien puede usarse <?php en lugar de <?. Otra característica del php es que las variables se identifican con el signo del dolar ($) y que cada instruccion debe finalizarse con un punto y coma (;). Para poder empezar a aprender a programar en PHP, debemos tener un servidor web con PHP instalado, y lo más cómodo para trabajar es que lo tengamos en nuestro propio ordenador. Las herramientas que necesitamos, son un servidor web ( en el curso se utiliza Apache pero el IIS de Windows también puede servir ), el propio PHP y posiblemente el motor de bases de datos MySQL. Todo esto se puede instalar por separado, o se puede hacer con paquetes que instalan y configuran PHP, Apache y MySQL. Aunque en este capítulo enseñaré a instalar el XAMPP, existen otros como el WAMP ( ver Instalación de Wamp en windows ) o el easyPHP.

· El XAMPP · Otros paquetes.

El XAMPP El XAMPP es el único paquete de los que hemos comentado en este capítulo disponible para multiplataforma (Windows, Mac OS X, GNU/Linux y Solaris). Incluye, entre otros, aplicaciones como el Apache, el MySQL, el intérprete PHP, el OpenSSL, el phpMyAdmin, el Mercury Mail Transport System y el FileZilla FTP Server. El primer que hacemos es descargarnos el instalador. Os explicaré la instalación para WINDOWS, pero los paquetes de instalación de otros SO los encontramos en la misma página. Nos damos cuenta de que la versión para WINDOWS supera los 30 MB, así que tened paciencia los que no dispongan de conexión rápida a Internet o bajaos el WAMP Server o el EasyPHP (al final del artículo).

Page 46: programacion de interfaces

46

Una vez bajado el ejecutable, lo abrimos y vemos que nos pregunta por el idioma en que queremos realizar la instalación (hay 11, uno de ellos el español). Después de esto, nos dan la bienvenida al asistente de instalación i, al presionar sobre Siguiente, nos preguntan el directorio sobre el cual queremos realizar la instalación.

El asistente nos da la bienvenida.

Page 47: programacion de interfaces

47

Especificamos el directorio de instalación.

Si la instalación se produce sin problemas, presionamos sobre Acabar y el XAMPP ya estará listo.

Proceso de instalación.

Page 48: programacion de interfaces

48

La instalación se ha finalizado.

Si lo ejecutas, podrás visualizar el XAMPP Control Panel Application, donde podrás poner en funcionamiento el Apache, el MySQL, el FileZilla y el Mercury.

XAMPP Control Panel.

Tan solo por tener activado el Apache, puedes acceder al http://localhost, donde podrás ver si se ha instalado correctamente el servidor local.

Page 49: programacion de interfaces

49

Localhost por defecto de XAMPP.

Aunque lo puedes eliminar, el localhost por defecto de XAMPP puede ser muy útil: des de allí puedes acceder a todas las herramientas, y además puedes ver cuál es el estado de este y sus agujeros de seguridad. Arriba Otros paquetes. Además del XAMPP, hay otros paquetes de instalación del servidor local. No os quedéis tan solo con esto, probar ne tantos como podáis. Aquí os dejo dos: EasyPHP EasyPHP contiene el mínimo para poder trabajar bien: un servidor web (Apache), el intérprete PHP y el MySQL. La última versión está disponible en español (y en 27 lenguas más) y tan solo ocupa 7 MB la aplicación y 144 KB todo el conjunto de idiomas. Aún así, la última versión es muy antiguas y les versiones del Apache y el PHP están muy desfasadas (Apache 1.x y PHP4), para el que si te quieres introducir en programación orientada a objectos te recomiendo seguir leyendo.

Page 50: programacion de interfaces

50

Web para descargartelo: http://www.easyphp.org/telechargements.php3 WAMP Server WAMP es el acrónimo de Windows Apache MySQL PHP. Es bastante más completo, ya que incorpora el PHP5, el Apache 2 y el MySQL 5. No dispone de más idiomas que no sean el inglés o el francés y ocupa unos 17 MB. Web para descargar: http://www.wampserver.com/en/download.php Si os descargáis uno de los dos últimos y queréis trabajar con GD Images, tendréis de desbloquear la librería al archivo de configuración de PHP (php.ini a la carpeta conf_files de EasyPHP y a la carpeta Apache2/bin del WAMP). Buscad la línea ;extension=php_gd2.dll

i sacadle el punto y coma. Quedará así: extension=php_gd2.dll

También tenéis la opción de bajaros el Apache, el intérprete de PHP y todas les utilidades por separado y incorporarlas como se explica en estos dos artículos: Instalación de Apache2 en Windows y Instalar PHP en Windows Tipos de variables, características generales y aspectos específicos de PHP

de estos elementos básicos de la programación.

Las variables son uno de los primeros temas que tenemos que conocer en PHP y

en la mayoría de los lenguajes de programación. Así que a continuación vamos a

tratar este tema dentro del Manual de PHP, explicando los tipos de variables que

podremos encontrar.

Anteriormente en DesarrolloWeb.com, en el manual de páginas dinámicas, ya

habíamos introducido el concepto de variable. En el capítulo anterior

comentábamos que, para PHP, las variables eran definidas anteponiendo el

símbolo dólar ($) al nombre de la variable que estábamos definiendo.

Dependiendo de la información que contenga, una variable puede ser considerada

de uno u otro tipo:

Page 51: programacion de interfaces

51

Variables numéricas Almacenan cifras

Enteros $entero=2002; Numeros sin decimales

Real $real=3.14159; Numeros con o sin decimal

Variables alfanuméricas Almacenan textos compuestos de números y/o cifras

Cadenas Almacenan variables alfanuméricas

$cadena="Hola amigo";

Tablas Almacenan series de informaciones numéricas y/o alfanuméricas

Arrays Son las variables que guardan las tablas

$sentido[1]="ver"; $sentido[2]="tocar"; $sentido[3]="oir"; $sentido[4]="gusto"; $sentido[5]="oler";

Objetos Se trata de conjuntos de variables y funciones asociadas. Presentan una complejidad mayor que las variables vistas hasta ahora pero su

utilidad es más que interesante.

A diferencia de otros lenguajes, PHP posee una gran flexibilidad a la hora de

operar con variables. En efecto, cuando definimos una variable asignándole un

valor, el ordenador le atribuye un tipo. Si por ejemplo definimos una variable entre

comillas, la variable será considerada de tipo cadena:

$variable="5"; //esto es una cadena

Sin embargo si pedimos en nuestro script realizar una operación matemática con

esta variable, no obtendremos un mensaje de error sino que la variable cadena

será asimilada a numérica:

<?

$cadena="5"; //esto es una cadena

$entero=3; //esto es un entero

echo $cadena+$entero

?>

Page 52: programacion de interfaces

52

Ejecutar script

Este script dará como resultado "8". La variable cadena ha sido asimilada en

entero (aunque su tipo sigue siendo cadena) para poder realizar la operación

matemática. Del mismo modo, podemos operar entre variables tipo entero y real.

No debemos preocuparnos de nada, PHP se encarga durante la ejecución de

interpretar el tipo de variable necesario para el buen funcionamiento del programa.

Sin embargo, en contraste, hay que tener cuidado en no cambiar mayúsculas por

minúsculas ya que, en este sentido, PHP es sensible. Conviene por lo tanto

trabajar ya sea siempre en mayúsculas o siempre en minúsculas para evitar este

tipo de malentendidos a veces muy difíciles de localizar.

Variables asignadas por referencia

En PHP también podemos asignar variables por referencia. En ese caso no se les

asigna un valor, sino otra variable, de tal modo que las dos varialbles comparten

espacio en memoria para el mismo dato.

La notación para asignar por referencia es colocar un "&" antes del nombre de la

variable.

<?php

$foo = 'Bob'; // Asigna el valor 'Bob' a $foo

$bar = &$foo; // Referencia $foo vía $bar.

$bar = "Mi nombre es $bar"; // Modifica $bar...

echo $foo; // $foo también se modifica.

echo $bar;

?>

Esto dará como resultado la visualización dos veces del string "Mi nombre es

Bob". Algo como:

Mi nombre es BobMi nombre es Bob

Page 53: programacion de interfaces

53

3.-Python

¿Qué es Python? Python es un lenguaje de programación creado por Guido van Rossum a principios de los años 90 cuyo nombre está inspirado en el grupo de cómicos ingleses “Monty Python”. Es un lenguaje similar a Perl, pero con una sintaxis muy limpia y que favorece un código legible. Se trata de un lenguaje interpretado o de script, con tipado dinámico, fuertemente tipado, multiplataforma y orientado a objetos.

Tipado dinámico La característica de tipado dinámico se refiere a que no es necesario declarar el tipo de dato que va a contener una determinada variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del valor al que se asigne, y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo.

Fuertemente tipado No se permite tratar a una variable como si fuera de un tipo distinto al que tiene, es necesario convertir de forma explícita dicha variable al nuevo tipo previamente. Por ejemplo, si tenemos una variable que contiene un texto (variable de tipo cadena o string) no podremos tratarla como un número (sumar la cadena “9” y el número 8). En otros lenguajes el tipo de la variable cambiaría para adaptarse al comportamiento esperado, aunque esto es más propenso a errores.

Multiplataforma El intérprete de Python está disponible en multitud de plataformas (UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, etc.) por lo que si no utilizamos librerías específicas de cada plataforma nuestro programa podrá correr en todos estos sistemas sin grandes cambios.

Orientado a objetos La orientación a objetos es un paradigma de programación en el que los conceptos del mundo real relevantes para nuestro problema se trasladan a clases y objetos en nuestro programa. La ejecución del programa consiste en una serie de interacciones entre los objetos. Python también permite la programación imperativa, programación funcional y programación orientada a aspectos.

¿Por qué Python? Python es un lenguaje que todo el mundo debería conocer. Su sintaxis simple, clara y sencilla; el tipado dinámico, el gestor de memoria, la gran cantidad de librerías disponibles y la potencia del lenguaje, entre otros, hacen que desarrollar una aplicación en Python sea sencillo, muy rápido y, lo que es más importante, divertido.

Page 54: programacion de interfaces

54

La sintaxis de Python es tan sencilla y cercana al lenguaje natural quelos programas elaborados en Python parecen pseudocódigo. Por este motivo se trata además de uno de los mejores lenguajes para comenzar a programar. Python no es adecuado sin embargo para la programación de bajo nivel o para aplicaciones en las que el rendimiento sea crítico. Algunos casos de éxito en el uso de Python son Google, Yahoo, la NASA, Industrias Light & Magic, y todas las distribuciones Linux, en las que Python cada vez representa un tanto por ciento mayor de los programas disponibles.

Instalación de Python Existen varias implementaciones distintas de Python: CPython, Jython, IronPython, PyPy, etc. CPython es la más utilizada, la más rápida y la más madura. Cuando la gente habla de Python normalmente se refiere a esta implementación. En este caso tanto el intérprete como los módulos están escritos en C. Jython es la implementación en Java de Python, mientras que IronPython es su contrapartida en C# (.NET). Su interés estriba en que utilizando estas implementaciones se pueden utilizar todas las librerías disponibles para los programadores de Java y .NET. PyPy, por último, como habréis adivinado por el nombre, se trata de una implementación en Python de Python. CPython está instalado por defecto en la mayor parte de las distribuciones Linux y en las últimas versiones de Mac OS. Para comprobar si está instalado abre una terminal y escribe python. Si está instalado se iniciará la consola interactiva de Python y obtendremos parecido a lo siguiente: Python 2.5.1 (r251:54863, May 2 2007, 16:56:35) [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 Type “help”, “copyright”, “credits” or “license” for more information. >>> La primera línea nos indica la versión de Python que tenemos instalada. Al final podemos ver el prompt (>>>) que nos indica que el intérprete está esperando código del usuario. Podemos salir escribiendo exit(), o pulsando Control + D. Si no te muestra algo parecido no te preocupes, instalar Python es muy sencillo. Puedes descargar la versión correspondiente a tu sistema operativo desde la web de Python, en http://www.python.org/download/. Existen instaladores para Windows y Mac OS. Si utilizas Linux es muy probable que puedas instalarlo usando la herramienta de gestión de paquetes de tu distribución, aunque también podemos descargar la aplicación compilada desde la web de Python.

Herramientas básicas Existen dos formas de ejecutar código Python. Podemos escribir líneas de código en el intérprete y obtener una respuesta del intérprete para cada línea (sesión interactiva) o bien podemos escribir el código de un programa en un archivo de texto y ejecutarlo. A la hora de realizar una sesión interactiva os aconsejo instalar y utilizar iPython, en lugar de la consola interactiva de Python. Se puede encontrar en

Page 55: programacion de interfaces

55

http://ipython.scipy.org/. iPython cuenta con características añadidas muy interesantes, como el autocompletado o el operador ?. (para activar la característica de autocompletado en Windows es necesario instalar PyReadline, que puede descargarse desde http://ipython.scipy.org/ moin/PyReadline/Intro) La función de autocompletado se lanza pulsando el tabulador. Si escribimos fi y pulsamos Tab nos mostrará una lista de los objetos que comienzan con fi (file, filter y finally). Si escribimos file. y pulsamos Tab nos mostrará una lista de los métodos y propiedades del objeto file. El operador ? nos muestra información sobre los objetos. Se utiliza añadiendo el símbolo de interrogación al final del nombre del objeto del cual queremos más información. Por ejemplo: In [3]: str? Type: type Base Class: String Form: Namespace: Python builtin Docstring: str(object) -> string Return a nice string representation of the object. If the argument is a string, the return value is the same object. En el campo de IDEs y editores de código gratuitos PyDEV (http://pydev.sourceforge.net/) se alza como cabeza de serie. PyDEV es un plugin para Eclipse que permite utilizar este IDE multiplataforma para programar en Python. Cuenta con autocompletado de código (con información sobre cada elemento), resaltado de sintaxis, un depurador gráfico, resaltado de errores, explorador de clases, formateo del código, refactorización, etc. Sin duda es la opción más completa, sobre todo si instalamos las extensiones comerciales, aunque necesita de una cantidad importante de memoria y no es del todo estable. Otras opciones gratuitas a considerar son SPE o Stani’s Python Editor (http://sourceforge.net/projects/spe/), Eric (http://die-offenbachs.de/eric/), BOA Constructor (http://boa-constructor.sourceforge.net/) o incluso emacs o vim. Si no te importa desembolsar algo de dinero, Komodo (http://www.activestate.com/komodo_ide/) y Wing IDE (http://www.wingware.com/) son también muy buenas opciones, con montones de características interesantes, como PyDEV, pero mucho más estables y robustos. Además, si desarrollas software libre no comercial puedes contactar con Wing Ware y obtener, con un poco de suerte, una licencia gratuita para Wing IDE Professional :)

Mi primer programa en Python Como comentábamos en el capítulo anterior existen dos formas de ejecutar código Python, bien en una sesión interactiva (línea a línea) con el intérprete, o bien de la forma habitual, escribiendo el código en un archivo de código fuente y ejecutándolo. El primer programa que vamos a escribir en Python es el clásico Hola Mundo, y en este lenguaje es tan simple como: print “Hola Mundo”

Page 56: programacion de interfaces

56

Vamos a probarlo primero en el intérprete. Ejecuta python o ipython según tus preferencias, escribe la línea anterior y pulsa Enter. El intérprete responderá mostrando en la consola el texto Hola Mundo. Vamos ahora a crear un archivo de texto con el código anterior, de forma que pudiéramos distribuir nuestro pequeño gran programa entre nuestros amigos. Abre tu editor de texto preferido o bien el IDE que hayas elegido y copia la línea anterior. Guárdalo como hola.py, por ejemplo. Ejecutar este programa es tan sencillo como indicarle el nombre del archivo a ejecutar al intérprete de Python python hola.py

Tipos básicos En Python los tipos básicos se dividen en: Números, como pueden ser • 3 (entero), 15.57 (de coma flotante) o 7 + 5j (complejos) Cadenas de texto, como • “Hola Mundo” Valores booleanos: • True (cierto) y False (falso). Vamos a crear un par de variables a modo de ejemplo. Una de tipo cadena y una de tipo entero: # esto es una cadena c = “Hola Mundo” # y esto es un entero e = 23 # podemos comprobarlo con la función type type(c) type(e) Como veis en Python, a diferencia de muchos otros lenguajes, no se declara el tipo de la variable al crearla. En Java, por ejemplo, escribiríamos: String c = “Hola Mundo”; int e = 23; Este pequeño ejemplo también nos ha servido para presentar los comentarios inline en Python: cadenas de texto que comienzan con el carácter # y que Python ignora totalmente. Hay más tipos de comentarios, de los que hablaremos más adelante.

Page 57: programacion de interfaces

57

Números Como decíamos, en Python se pueden representar números enteros, reales y complejos.

Enteros Los números enteros son aquellos números positivos o negativos que no tienen decimales (además del cero). En Python se pueden representar mediante el tipo int (de integer, entero) o el tipo long (largo). La única diferencia es que el tipo long permite almacenar números más grandes. Es aconsejable no utilizar el tipo long a menos que sea necesario, para no malgastar memoria. Una variable de tipo int de Python podemos almacenar números de 2.147.483.648 a 2.147.483.647. En plataformas de 64 bits, el rango es de -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807. # type(entero) devolvería int entero = 23 También podemos indicar a Python que un número se almacene usando long añadiendo una L al final: # type(entero) devolvería long entero = 23L

Reales Los números reales son los que tienen decimales. En Python se expresan mediante el tipo float. Python siempre se utiliza doble precisión, y en concreto se sigue el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa. Esto significa que los valores que podemos representar van desde ±2,2250738585072020 x 10-308 hasta ±1,7976931348623157×10308. Para representar un número real en Python se escribe primero la parte entera, seguido de un punto y por último la parte decimal. real = 0.2703

Complejos Los números complejos son aquellos que tienen parte imaginaria. Si no conocías de su existencia, es más que probable que nunca lo vayas a necesitar, por lo que puedes saltarte este apartado tranquilamente. De hecho la mayor parte de lenguajes de programación carecen de este tipo, aunque sea muy utilizado por ingenieros y científicos en general. En el caso de que necesitéis utilizar números complejos, o simplemente tengáis curiosidad, os diré que este tipo, llamado complex en Python, también se almacena usando coma flotante, debido a que estos números son una extensión de los números reales. Los números complejos en Python se representan de la siguiente forma: complejo = 2.1 + 7.8j

Page 58: programacion de interfaces

58

Operadores Veamos ahora qué podemos hacer con nuestros números usando los operadores por defecto. Para operaciones más complejas podemos recurrir al módulo math.

Operadores aritméticos Operador Descripció

n Ejemplo

+ Suma r = 3 + 2 # r es 5

- Resta r = 4 - 7 # r es -

Operador Descripción Ejemplo

- Negación r = -7 # r es -7

* Multiplicación r = 2 * 6 # r es 12

** Exponente r = 2 ** 6 # r es 64

/ División r = 3.5 / 2 # r es 1.75

// División entera

r = 3.5 // 2 # r es 1.0

% Módulo r = 7 % 2 # r es 1

Operadores a nivel de bit Operador Descripción Ejemplo

& and r = 3 & 2 # r es 2

| or r = 3 | 2 # r es 3

^ xor r = 3 ^ 2 # r es 1

~ not r = ~3 # r es -4

Cadenas Las cadenas no son más que texto encerrado entre comillas simples (‘cadena’) o dobles (“cadena”). Dentro de las comillas se pueden añadir caracteres especiales escapándolos con \, como \n, el carácter de nueva línea, o \t, el de tabulación. Una cadena puede estar precedida por el carácter u o el carácter r, los cuales indican, respectivamente, que se trata de una cadena que utiliza codificación Unicode y una cadena raw (del inglés, cruda). Las cadenas raw se distinguen de las normales en que los caracteres escapados mediante la barra invertida (\) no se

Page 59: programacion de interfaces

59

sustituyen por sus contrapartidas. Esto es especialmente útil, por ejemplo, para las expresiones regulares, como veremos en el capítulo correspondiente. unicode = u”äóè” raw = r”\n” También es posible encerrar una cadena entre triples comillas (simples o dobles). De esta forma podremos escribir el texto en varias líneas, y al imprimir la cadena, se respetarán los saltos de línea que introdujimos sin tener que recurrir al carácter \n, así como las comillas sin tener que escaparlas. triple = “““primera linea esto se vera en otra linea””” Las cadenas también admiten operadores como +, que funciona realizando una concatenación de las cadenas utilizadas como operandos y *, en la que se repite la cadena tantas veces como lo indique el número utilizado como segundo operando. a = “uno” b = “dos” c = a + b # c es “unodos” c = a * 3 # c es “unounouno”

Booleanos Operador Descripción Ejemplo

and ¿se cumple a y b?

r = True and False # r es False

or ¿se cumple a o b?

r = True or False # r es True

not No a r = not True # r es False

¿es a menor o igual que b?

r = 5 <= 5 # r es True

>= ¿es a mayor o igual que b?

r = 5 >= 3 # r es True

Colecciones En el capítulo anterior vimos algunos tipos básicos, como los números, las cadenas de texto y los booleanos. En esta lección veremos algunos tipos de colecciones de datos: listas, tuplas y diccionarios.

Page 60: programacion de interfaces

60

Listas La lista es un tipo de colección ordenada. Sería equivalente a lo que en otros lenguajes se conoce por arrays, o vectores. Las listas pueden contener cualquier tipo de dato: números, cadenas, booleanos, … y también listas. Crear una lista es tan sencillo como indicar entre corchetes, y separados por comas, los valores que queremos incluir en la lista: l = [22, True, “una lista”, [1, 2]] Podemos acceder a cada uno de los elementos de la lista escribiendo el nombre de la lista e indicando el índice del elemento entre corchetes. Ten en cuenta sin embargo que el índice del primer elemento de la lista es 0, y no 1: l = [11, False] mi_var = l[0] # mi_var vale 11 Si queremos acceder a un elemento de una lista incluida dentro de otra lista tendremos que utilizar dos veces este operador, primero para indicar a qué posición de la lista exterior queremos acceder, y el segundo para seleccionar el elemento de la lista interior: l = [“una lista”, [1, 2]] mi_var = l[1][0] # mi_var vale 1

Tuplas Todo lo que hemos explicado sobre las listas se aplica también a las tuplas, a excepción de la forma de definirla, para lo que se utilizan paréntesis en lugar de corchetes. t = (1, 2, True, “python”) En realidad el constructor de la tupla es la coma, no el paréntesis, pero el intérprete muestra los paréntesis, y nosotros deberíamos utilizarlos, por claridad.

>>> t = 1, 2, 3 >>> type(t) type “tuple”

Además hay que tener en cuenta que es necesario añadir una coma para tuplas de un solo elemento, para diferenciarlo de un elemento entre paréntesis.

>>> t = (1) >>> type(t) type “int” >>> t = (1,) >>> type(t) type “tuple”

Page 61: programacion de interfaces

61

Para referirnos a elementos de una tupla, como en una lista, se usa el operador []:

mi_var = t[0] # mi_var es 1 mi_var = t[0:2] # mi_var es (1, 2)

Podemos utilizar el operador [] debido a que las tuplas, al igual que las listas, forman parte de un tipo de objetos llamados secuencias. Permitirme un pequeño inciso para indicaros que las cadenas de texto también son secuencias, por lo que no os extrañará que podamos hacer cosas como estas:

c = “hola mundo” c[0] # h c[5:] # mundo c[::3] # hauo

Diccionarios Los diccionarios, también llamados matrices asociativas, deben su nombre a que son colecciones que relacionan una clave y un valor. Por ejemplo, veamos un diccionario de películas y directores:

d = {“Love Actually “: “Richard Curtis”, “Kill Bill”: “Tarantino”, “Amélie”: “Jean-Pierre Jeunet”}

El primer valor se trata de la clave y el segundo del valor asociado a la clave. Como clave podemos utilizar cualquier valor inmutable: podríamos usar números, cadenas, booleanos, tuplas, … pero no listas o diccionarios, dado que son mutables. Esto es así porque los diccionarios se implementan como tablas hash, y a la hora de introducir un nuevo par clave-valor en el diccionario se calcula el hash de la clave para después poder encontrar la entrada correspondiente rápidamente. Si se modificara el objeto clave después de haber sido introducido en el diccionario, evidentemente, su hash también cambiaría y no podría ser encontrado. La diferencia principal entre los diccionarios y las listas o las tuplas es que a los valores almacenados en un diccionario se les accede no por su índice, porque de hecho no tienen orden, sino por su clave, utilizando de nuevo el operador [].

d[“Love Actually “] # devuelve “Richard Curtis” Al igual que en listas y tuplas también se puede utilizar este operador para reasignar valores.

d[“Kill Bill”] = “Quentin Tarantino” Sin embargo en este caso no se puede utilizar slicing, entre otras cosas porque los diccionarios no son secuencias, si no mappings (mapeados, asociaciones).

Page 62: programacion de interfaces

62

4.-Tcl/Tk Tcl (Tool Command Language) es un lenguaje de comandos interpretados, y Tk (Tool kit) es una extensión de Tcl que permite crear aplicaciones graficas de forma rápida y sencilla. Tcl y Tk fueron desarrollados por John K. Ousterhout en la Universidad de California, Berkeley. Tanto Tcl como Tk se distribuyen de forma totalmente gratuita, actualmente se encuentra liberada la versión 8.4. Un programa Tcl no es más que una serie de comandos, similares a los scripts de shell de UNIX tales como el Bourne Shell, C Shell, Korn Shell, y Perl. Una de las características más importantes de este lenguaje es la flexibilidad para crear nuevos comandos Tcl. Si una aplicación necesita alguna funcionalidad no ofrecida por los comandos estándar proporcionados por el lenguaje, es posible desarrollarlos utilizando el lenguaje C e integrarlos de forma sencilla. Éste es el principal motivo por el cual se encuentran en Internet muchas extensiones de Tcl, entre las que se encuentran: Expect, Incr Tcl /Tk, Incr Widgets, Tix, OraTcl, VisualTcl, BLT. Tk surgió ante la idea de crear interfaces combinando una serie de elementos básicos, por ejemplo: botones, etiquetas o ventanas de texto. Tk ofrece la posibilidad de desarrollar una interfaz independiente de la aplicación, y permite además la utilización del lenguaje de comandos Tcl para agrupar todos los componentes de la aplicación y establecer la conexión con los elementos de la interfaz. Tk es un conjunto de herramientas de desarrollo para la generación rápida de GUIs (Graphical User Interfaces). El elemento básico es el widget, el cual es una ventana con una aspecto determinado y utilizado para fines concretos en la interfaz, dentro de los widgets se encuentran los botones, menús, barras de scroll, etiquetas, ventanas de texto, cuadros de dibujo (canvas). Los widgets se encuentran bajo la inspección del administrador de geometría encargado de controlar su posición y tamaño dentro de la pantalla. La estructura habitual de un programa Tk sigue las siguientes líneas básicas: creación de widgets, declaración del administrador de ventanas que definirá la presentación de los widgets en la pantalla, y asociación de instrucciones a eventos del ratón y/o teclado.

Page 63: programacion de interfaces

63

Visual TCL

• 100% Tcl/Tk y genera código en Tcl/Tk. • Interfaz GUI para mayores aspectos de desarrollo en Tcl/Tk • Nuevas caracteristicas de widgets: combo box, multicolumn listbox,

progress bar. • Incluye componentes predefinidos: scrolled text, scrolled listbox, scrolled

canvas.

• BLT es una extensión del toolkit Tk, añade nuevos widgets, administrador

de geometrías, y una miscelánea de comandos. • Table. Administrador de geometría basado en tablas para Tk. • Graph. Un widget para graficar X-Y. • Barchart. Un widget para barras. • Vector. Crea un vector de valores punto flotante. • Bgexec. Utilizado para verificar el estado de los subprocesos. • Watch. Utilizado para el trazado o depurado de código Tcl • Bltdebug. Se utiliza para mostrar la salida del comando Tcl

antes de su ejecuciòn.

Page 64: programacion de interfaces

64

5.- VISUAL BASIC Visual Basic 6.0 es uno de los lenguajes de programación que más entusiasmo despiertan entre los programadores de PCs, tanto expertos como novatos. En el caso de los programadores expertos por la facilidad con la que desarrollan aplicaciones complejas en poquísimo tiempo (comparado con lo que cuesta programar en Visual C++, por ejemplo). En el caso de los programadores novatos por el hecho de ver de lo que son capaces a los pocos minutos de empezar su aprendizaje. El precio que hay que pagar por utilizar Visual Basic 6.0 es una menor velocidad o eficiencia en las aplicaciones. Visual Basic 6.0 es un lenguaje de programación visual, también llamado lenguaje de 4ª generación. Esto quiere decir que un gran número de tareas se realizan sin escribir código, simplemente con operaciones gráficas realizadas con el ratón sobre la pantalla. Visual Basic 6.0 es también un programa basado en objetos, aunque no orientado a objetos como C++ o Java. La diferencia está en que Visual Basic 6.0 utiliza objetos con propiedades y métodos, pero carece de los mecanismos de herencia y polimorfismo propios de los verdaderos lenguajes orientados a objetos como Java y C++. En este primer capítulo se presentarán las características generales de Visual Basic 6.0, junto con algunos ejemplos sencillos que den idea de la potencia del lenguaje y del modo en que se utiliza. PROGRAMAS PARA EL ENTORNO WINDOWS Visual Basic 6.0 está orientado a la realización de programas para Windows, pudiendo incorporar todos los elementos de este entorno informático: ventanas, botones, cajas de diálogo y de texto, botones de opción y de selección, barras de desplazamiento, gráficos, menús, etc. Prácticamente todos los elementos de interacción con el usuario de los que dispone Windows 95/98/NT pueden ser programados en Visual Basic 6.0 de un modo muy sencillo. En ocasiones bastan unas pocas operaciones con el ratón y la introducción a través del teclado de algunas sentencias para disponer de aplicaciones con todas las características de Windows 95/98/NT. En los siguientes apartados se introducirán algunos conceptos de este tipo de programación. Modo de Diseño y Modo de Ejecución La aplicación Visual Basic de Microsoft puede trabajar de dos modos distintos: en modo de diseño y en modo de ejecución. En modo de diseño el usuario construye interactivamente la aplicación, colocando controles en el formulario, definiendo sus propiedades, y desarrollando funciones para gestionar los eventos. La aplicación se prueba en modo de ejecución. En ese caso el usuario actúa sobre el programa (introduce eventos) y prueba cómo responde el programa. Hay algunas propiedades de los controles que deben establecerse en modo de

Page 65: programacion de interfaces

65

diseño, pero muchas otras pueden cambiarse en tiempo de ejecución desde el programa escrito en Visual Basic 6.0, en la forma en que más adelante se verá. También hay propiedades que sólo pueden establecerse en modo de ejecución y que no son visibles en modo de diseño. Todos estos conceptos –controles, propiedades, eventos, etc.- se explican en los apartados siguientes. Formularios y Controles Cada uno de los elementos gráficos que pueden formar parte de una aplicación típica de Windows 95/98/NT es un tipo de control: los botones, las cajas de diálogo y de texto, las cajas de selección desplegables, los botones de opción y de selección, las barras de desplazamiento horizontales y verticales, los gráficos, los menús, y muchos otros tipos de elementos son controles para Visual Basic 6.0. Cada control debe tener un nombre a través del cual se puede hacer referencia a él en el programa. Visual Basic 6.0 proporciona nombres por defecto que el usuario puede modificar. En el Apartado 1.2.4 se exponen algunas reglas para dar nombres a los distintos controles. En la terminología de Visual Basic 6.0 se llama formulario (form) a una ventana. Un formulario puede ser considerado como una especie de contenedor para los controles. Una aplicación puede tener varios formularios, pero un único formulario puede ser suficiente para las aplicaciones más sencillas. Los formularios deben también tener un nombre, que puede crearse siguiendo las mismas reglas que para los controles. Objetos y Propiedades Los formularios y los distintos tipos de controles son entidades genéricas de las que puede haber varios ejemplares concretos en cada programa. En programación orientada a objetos (más bien basada en objetos, habría que decir) se llama clase a estas entidades genéricas, mientras que se llama objeto a cada ejemplar de una clase determinada. Por ejemplo, en un programa puede haber Capítulo 1: Introducción página 3 varios botones, cada uno de los cuales es un objeto del tipo de control command button, que sería la clase. Cada formulario y cada tipo de control tienen un conjunto de propiedades que definen su aspecto gráfico (tamaño, color, posición en la ventana, tipo y tamaño de letra, etc.) y su forma de responder a las acciones del usuario (si está activo o no, por ejemplo). Cada propiedad tiene un nombre que viene ya definido por el lenguaje. Por lo general, las propiedades de un objeto son datos que tienen valores lógicos (True, False) o numéricos concretos, propios de ese objeto y distintos de las de otros objetos de su clase. Así pues, cada clase, tipo de objeto o control tiene su conjunto de propiedades, y cada objeto o control concreto tiene unos valores determinados para las propiedades de su clase. Casi todas las propiedades de los objetos pueden establecerse en tiempo de diseño y también -casi siempre- en tiempo de ejecución. En este segundo caso se accede a sus valores por medio de las sentencias del programa, en forma análoga a como se accede a cualquier variable en un lenguaje de programación. Para ciertas propiedades ésta es la única forma de acceder a ellas. Por supuesto Visual Basic 6.0 permite crear distintos tipos de variables, como más adelante se verá.

Page 66: programacion de interfaces

66

Se puede acceder a una propiedad de un objeto por medio del nombre del objeto a que pertenece, seguido de un punto y el nombre de la propiedad, como por ejemplo optColor.objName. En el siguiente apartado se estudiarán las reglas para dar nombres a los objetos. Nombres de objetos En principio cada objeto de Visual Basic 6.0 debe tener un nombre, por medio del cual se hace referencia a dicho objeto. El nombre puede ser el que el usuario desee, e incluso Visual Basic 6.0 proporciona nombres por defecto para los diversos controles. Estos nombres por defecto hacen referencia al tipo de control y van seguidos de un número que se incrementa a medida que se van introduciendo más controles de ese tipo en el formulario (por ejemplo VScroll1, para una barra de desplazamiento -scroll bar- vertical, HScroll1, para una barra horizontal, etc.). Los nombres por defecto no son adecuados porque hacen referencia al tipo de control, pero no al uso que de dicho control está haciendo el programador. Por ejemplo, si se utiliza una barra de desplazamiento para introducir una temperatura, conviene que su nombre haga referencia a la palabra temperatura, y así cuando haya que utilizar ese nombre se sabrá exactamente a qué control corresponde. Un nombre adecuado sería por ejemplo hsbTemp, donde las tres primeras letras indican que se trata de una horizontal scroll bar, y las restantes (empezando por una mayúscula) que servirá para definir una temperatura. Existe una convención ampliamente aceptada que es la siguiente: se utilizan siempre tres letras minúsculas que indican el tipo de control, seguidas por otras letras (la primera mayúscula, a modo de separación) libremente escogidas por el usuario, que tienen que hacer referencia al uso que se va a dar a ese control. La Tabla 1.1 muestra las abreviaturas de los controles más usuales, junto con la nomenclatura inglesa de la que derivan. En este mismo capítulo se verán unos cuantos ejemplos de aplicación de estas reglas para construir nombres.

Page 67: programacion de interfaces

67

Eventos Ya se ha dicho que las acciones del usuario sobre el programa se llaman eventos. Son eventos típicos el clicar sobre un botón, el hacer doble clic sobre el nombre de un fichero para abrirlo, el arrastrar un icono, el pulsar una tecla o combinación de teclas, el elegir una opción de un menú, el escribir en una caja de texto, o simplemente mover el ratón. Más adelante se verán los distintos tipos de eventos reconocidos por Windows 95/98/NT y por Visual Basic 6.0. Cada vez que se produce un evento sobre un determinado tipo de control, Visual Basic 6.0 arranca una determinada función o procedimiento que realiza la acción programada por el usuario para ese evento concreto. Estos procedimientos se llaman con un nombre que se forma a partir del nombre del objeto y el nombre del evento, separados por el carácter (_), como por ejemplo txtBox_click, que es el nombre del procedimiento que se ocupará de responder al evento click en el objeto txtBox. Métodos Los métodos son funciones que también son llamadas desde programa, pero a diferencia de los procedimientos no son programadas por el usuario, sino que vienen ya pre-programadas con el lenguaje. Los métodos realizan tareas típicas, previsibles y comunes para todas las aplicaciones. De ahí que vengan con el lenguaje y que se libere al usuario de la tarea de programarlos. Cada tipo de objeto o de control tiene sus propios métodos. Por ejemplo, los controles gráficos tienen un método llamado Line que se encarga de dibujar líneas rectas. De la misma forma existe un método llamado Circle que dibuja circunferencias y arcos de circunferencia Es obvio que el dibujar líneas rectas o circunferencias es una tarea común para todos los programadores y que Visual Basic 6.0 da ya resuelta. Proyectos y ficheros Cada aplicación que se empieza a desarrollar en Visual Basic 6.0 es un nuevo proyecto. Un proyecto comprende otras componentes más sencillas, como por ejemplo los formularios (que son las ventanas de la interface de usuario de la nueva aplicación) y los módulos (que son conjuntos de funciones y procedimientos sin interface gráfica de usuario). ¿Cómo se guarda un proyecto en el disco? Un proyecto se compone siempre de varios ficheros (al menos de dos) y hay que preocuparse de guardar cada uno de ellos en el directorio adecuado y con el nombre adecuado. Existe siempre un fichero con extensión *.vbp (Visual Basic Project) que se crea con el comando File/Save Project As. El fichero del proyecto contiene toda la información de conjunto. Además hay que crear un fichero por cada formulario y por cada módulo que tenga el proyecto. Los ficheros de los formularios se crean con File/Save Filename As teniendo como extensión *.frm. Los ficheros de código o módulos se guardan también con el comando File/Save Filename As y tienen como extensión *.bas si se trata de un módulo estándar o *.cls si se trata de un módulo de clase (class module).

Page 68: programacion de interfaces

68

Clicando en el botón Save en la barra de herramientas se actualizan todos los ficheros del proyecto. Si no se habían guardado todavía en el disco, Visual Basic 6.0 abre cajas de diálogo Save As por cada uno de los ficheros que hay que guardar. EL ENTORNO DE PROGRAMACIÓN VISUAL BASIC 6.0 Cuando se arranca Visual Basic 6.0 aparece en la pantalla una configuración similar a la mostrada en la Figura 1.1. En ella se pueden distinguir los siguientes elementos:

1. La barra de títulos, la barra de menús y la barra de herramientas de Visual Basic 6.0 en modo Diseño (parte superior de la pantalla).

2. Caja de herramientas (toolbox) con los controles disponibles (a la izquierda de la ventana).

3. Formulario (form) en gris, en que se pueden ir situando los controles (en el centro). Está dotado de una rejilla (grid) para facilitar la alineación de los controles.

4. Ventana de proyecto, que muestra los formularios y otros módulos de programas que forman parte de la aplicación (arriba a la derecha).

5. Ventana de Propiedades, en la que se pueden ver las propiedades del objeto seleccionado o del propio formulario (en el centro a la derecha). Si esta ventana no aparece, se puede hacer visible con la tecla <F4>.

6. Ventana FormLayout, que permite determinar la forma en que se abrirá la aplicación cuando comience a ejecutarse (abajo a la derecha).

7. Existen otras ventanas para edición de código (Code Editor) y para ver variables en tiempo de ejecución con el depurador o Debugger (ventanas Immediate, Locals y Watch). Todo este conjunto de herramientas y de ventanas es lo que se llama un entorno integrado de desarrollo o IDE (Integrated Development Environment).

Construir aplicaciones con Visual Basic 6.0 es muy sencillo: basta crear los controles en el formulario con ayuda de la toolbox y del ratón, establecer sus propiedades con ayuda de la ventana de propiedades y programar el código que realice las acciones adecuadas en respuesta a los eventos o acciones que realice el usuario. A continuación, tras explicar brevemente cómo se utiliza el Help de Visual Basic, se presentan algunos ejemplos ilustrativos.

Page 69: programacion de interfaces

69

Page 70: programacion de interfaces

70

1.4 EL HELP DE VISUAL BASIC 6.0 El Help de Visual Basic 6.0 es de los mejores que existen. Además de que se puede buscar cualquier tipo de información con la función Index, basta seleccionar una propiedad cualquiera en la ventana de propiedades o un control cualquiera en el formulario (o el propio formulario), para que pulsando la tecla <F1> aparezca una ventana de ayuda muy completa. De cada control de muestran las propiedades, métodos y eventos que soporta, así como ejemplos de aplicación. También se muestra información similar o relacionada. Existe además un breve pero interesante curso introductorio sobre Visual Basic 6.0 que se activa con la opción Help/Contents, seleccionando luego MSDN Contents/Visual Basic Documentation/ Visual Basic Start Page/Getting Started. Tipos de datos Al igual que C y otros lenguajes de programación, Visual Basic dispone de distintos tipos de datos, aplicables tanto para constantes como para variables. La Tabla 3.2 muestra los tipos de datos disponibles en Visual Basic.

Page 71: programacion de interfaces

71

Elección del tipo de una variable Si en el código del programa se utiliza una variable que no ha sido declarada, se considera que esta variable es de tipo Variant. Las variables de este tipo se adaptan al tipo de información o dato que se les asigna en cada momento. Por ejemplo, una variable tipo Variant puede contener al principio del programa un string de caracteres, después una variable de doble precisión, y finalmente un número entero. Son pues variables muy flexibles, pero su uso debe restringirse porque ocupan más memoria (almacenan el tipo de dato que contienen, además del propio valor de dicho dato) y requieren más tiempo de CPU que los restantes tipos de variables. En general es el tipo de dato (los valores que puede tener en la realidad) lo que determina qué tipo de variable se debe utilizar. A continuación se muestran algunos ejemplos:

Integer para numerar las filas y columnas de una matriz no muy grande

Long para numerar los habitantes de una ciudad o los números de teléfonos

Boolean para una variable con sólo dos posibles valores (sí o no)

Single para variables físicas con decimales que no exijan precisión

Double para variables físicas con decimales que exijan precisión

Currency para cantidades grandes de dinero Es muy importante tener en cuenta que se debe utilizar el tipo de dato más sencillo que represente correctamente el dato real ya que en otro caso se ocupará más memoria y la ejecución de los programas o funciones será más lenta. OPERADORES

Page 72: programacion de interfaces

72

SENTENCIAS DE CONTROL Las sentencias de control, denominadas también estructuras de control, permiten tomar decisiones y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. Este tipo estructuras son comunes en cuanto a concepto en la mayoría de los lenguajes de programación, aunque su sintaxis puede variar de un lenguaje de programación a otro. Se trata de unas estructuras muy importantes ya que son las encargadas de controlar el flujo de un programa según los requerimientos del mismo. Visual Basic 6.0 dispone de las siguientes estructuras de control: If ... Then ... Else Select Case For ... Next Do ... Loop While … Wend For Each … Next

Bibliografía Programación de interfaces

http://fcasua.contad.unam.mx/clases_virtuales/informatica/1766.html

PHP

http://www.programacionweb.net/articulos/articulo/?num=483

Pytohon

https://launchpadlibrarian.net/18980633/Python%20para%20todos.pdf

http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/herencia/interfaces.htm http://agcortes.com/2012/03/05/aplicacion-grafica-sencilla-con-python-y-wxpython/#more-29 http://www.profesionalhosting.com/hosting/definicion/php-17.html • Graphical Applications with Tcl&Tk, Eric Foster, M&T Books. • Practical Programming Tcl and Tk, Brent B. Welch, Prentice Hall. • Programmer's Reference Tcl/Tk, Christopher Nelson, McGraw Hill. • Building Network Management Tools with Tcl/Tk, Dave Zeltserman, Prentice Hall. • [Incr TclTk] from the ground Up. The Accelerated track for professional programmers, Chad Smith, Osborne. http://msdn.microsoft.com/es-es/library/28e2e18x(v=vs.80).aspx

Page 73: programacion de interfaces

73

III. INTERFACES GRÁFICAS Interfaces gráficas orientadas al usuario Introducción Entendemos por Interfaz Gráfica de Usuario (GUI) al software que permite la interacción entre el usuario y los servicios que proporciona el sistema operativo, utilizando para ello una representación gráfica intuitiva de alto nivel La informática moderna no puede entenderse sin el impacto que supuso la generalización de los entornos gráficos de usuario a partir de los 80 Hoy en día, la mayor parte de las aplicaciones destinadas a usuarios finales se realizan para este tipo de entornos Historia de las interfaces Una Interfaz Grafica de Usuario (GUI) permite interactuar con el computador usando iconos gráficos, indicadores visuales, o elementos especiales llamados Widgets. Las acciones se realizan al manipular estos elementos directamente con el teclado, mouse, etc.

La historia de la interfaz gráfica ha estado marcada en su evolución por dos factores decisivos: la investigación y el negocio.

La historia que se sintetiza a continuación, no recoge todas las interfaces producidas, en cambio intenta trazar una síntesis cronológica, localizando los momentos decisivos y los elementos más importantes en el contexto de los ordenadores personales y la informática de consumo.

Page 74: programacion de interfaces

74

Page 75: programacion de interfaces

75

Page 76: programacion de interfaces

76

Page 77: programacion de interfaces

77

Page 78: programacion de interfaces

78

Características de un GUI

Posee un monitor gráfico de alta resolución.

Posee un dispositivo apuntador (típicamente un ratón).

Promueve la consistencia de la interfaz entre programas.

Los usuarios pueden ver en la pantalla los gráficos y textos tal como se verán impresos.

Sigue el paradigma de la interacción objeto-acción.

Permite la transferencia de información entre programas.

Se puede manipular en la pantalla directamente los objetos y la información.

Provee elementos de interfaz estándar como menús y diálogos.

Existe una muestra visual de la información y los objetos (iconos y ventanas).

Proporciona respuesta visual a las acciones del usuario.

Existe información visual de las acciones y modos del usuario/sistema (menús, paletas).

Existen controles gráficos (widgets) para la selección e introducción de la información.

Permite a los usuarios personalizar la interfaz y las interacciones.

Proporciona flexibilidad en el uso de dispositivos de entrada (teclado/ratón).

Una característica importante es que el GUI permite manipular los objetos e información de la pantalla, no sólo presentarla.

Para usar un GUI, los usuarios deben conocer (o aprender) una serie de conceptos: organización del sistema (ficheros, directorios en Win95), diferentes tipos de iconos y efecto de las acciones sobre ellos, elementos básicos de una ventana, uso de los controles del GUI, uso del ratón.

Los GUI usan el estilo objeto-acción, en contraposición al acción-objeto de los CUI o las interfaces de menú. El usuario selecciona un objeto, y después la acción a realizar sobre dicho objeto. Los objetos son el principal foco de atención del usuario, lo cual resulta más natural y próximo a su modelo mental.

Pasos para el diseño de interfaz

Pasos Clásicos

En el proceso de diseño de una interfaz de usuario se pueden distinguir cuatro fases o pasos fundamentales:

Reunir y analizar la información del usuario

Diseñar la interfaz de usuario

Construir la interfaz de usuario

Validar la interfaz de usuario

Page 79: programacion de interfaces

79

Construir la interfaz de usuario.

Es interesante realizar un prototipo previo, una primera versión del programa que se realice rápidamente y permita visualizar el producto para poderlo probar antes de codificarlo definitivamente

Validar la interfaz de usuario.

Se deben realizar pruebas de usabilidad del producto, a ser posible con los propios usuarios finales del mismo.

Es importante, en suma, realizar un diseño que parta del usuario, y no del sistema.

Existen 11 pasos en el proceso de diseño "centrado en las tareas", similar al anterior pero que desglosa algunas actividades implícitas en otras, así:

1.- Entender quien usará el sistema para hacer qué.

2.- Elegir tareas representativas para el diseño.

3.- Plagiar o copiar.

4.- Bosquejar un diseño.

5.- Pensar acerca del diseño.

6.- Crear un prototipo.

7.- Evaluarla con los usuarios.

8.- Repetir.

9.- Construirla.

10.- Rastrearla.

11.- Cambiarla.

Técnicas y pasos avanzadas para el diseño de interfaces de usuario

2.-Criterios de uso - Selección de la Información: La información que será objeto de tratamiento futuro debe ser pertinente, pues el mensaje, tanto en imágenes como en palabras, es brevemente representado por las memorias sensoriales. Debido a lo limitado de la memoria activa, sólo algunas representaciones son conservadas para su tratamiento. - Organización de la Información: Es el proceso de ordenación mental de las representaciones auditivas y visuales. Éstas se clasifican en imágenes verbales y gráficas, las cuales deben ser coherentes entre sí.

Page 80: programacion de interfaces

80

- Integración de la Información: En este proceso se elaboran las conexiones entre los elementos de las representaciones gráficas y verbales, la nueva información y el conocimiento previo. Tal como lo plantea Reigeluth (1999), existen una serie de técnicas que permiten motivar “al que aprende”, llevar el mensaje a su memoria activa de una manera eficiente, tratando de obtener la integración de este mensaje con la “información previa”, etapa en la cual ocurre la elaboración de nuevas conductas o aprendizaje en el individuo. Este modelo de aprendizaje es particularmente interesante en los planteamientos de sus técnicas de estimulación de los procesos cognitivos, porque brinda el fundamento teórico con el cual se propone establecer pautas que permitan estandarizar el diseño de interfaces gráficas de aplicaciones de software y, en consecuencia, obtener la ganancia de usabilidad para los diseños visuales que se realicen.

Page 81: programacion de interfaces

81

3.-Principios de composición en el diseño de las ventanas

Usabilidad

Definición

Definimos Usabilidad de un sistema o herramienta como una medida de su utilidad, facilidad de uso, facilidad de aprendizaje y apreciación para una tarea, un usuario y un contexto dado.

El peso relativo de cada una de estas medias está relacionado con el usuario, la tarea y el contexto. Por ejemplo, la facilidad de aprendizaje puede ser crucial para un producto y poco importante en otro.

Si bien no está incluida en la definición usual de usabilidad, se está comenzando a hablar de la evolución de estos factores a lo largo del tiempo. Por ejemplo, cómo una interfaz puede adaptarse al crecimiento en eficiencia y conocimientos de un usuario.

Utilidad La utilidad es la capacidad que tiene una herramienta para ayudar a cumplir tareas específicas. Aunque esta afirmación parece obvia, es importante observar que una herramienta que es muy usable para una tarea, puede ser muy poco usable para otra, aún incluso si se trata de una tarea similar pero no idéntica. Un martillo y una maza son muy similares. Sin embargo, cada uno de ellos es adecuado para una tarea y muy poco usable para otras.

Facilidad de uso

La facilidad de uso está en relación directa con la eficiencia o efectividad, medida como velocidad o cantidad de posibles errores. Una herramienta muy fácil de usar permitirá a su usuario efectuar más operaciones por unidad de tiempo (o menor tiempo para la misma operación) y disminuirá la probabilidad de que ocurran errores. Ninguna herramienta o sistema es perfecto, pero una alta probabilidad de error puede llegar incluso a derivar en una imposibilidad de uso por falta de calificación, según cuáles sean los criterios para evaluar la herramienta o sistema(3). Un caso especial de estas necesidades extremas son las herramientas de misión crítica como por ejemplo diagnóstico médico y aeronavegación. Son áreas que típicamente suelen requerir altísimos grados de eficiencia y precisión. Una falla en este tipo de aplicaciones puede tener serias consecuencias. Sin embargo, atención: la facilidad de uso no debe confundirse con la facilidad de aprendizaje.

Page 82: programacion de interfaces

82

Facilidad de aprendizaje

La facilidad de aprendizaje es una medida del tiempo requerido para trabajar con cierto grado de eficiencia en el uso de la herramienta, y alcanzar un cierto grado de retención de estos conocimientos luego de cierto tiempo de no usar la herramienta o sistema. Si bien la facilidad de aprendizaje suele tener una relación directa con la usabilidad, estrictamente hablando esto no necesariamente es así. La facilidad de aprendizaje debería ser una medida relativa, ya que hay sistemas muy complejos que no pueden ser aprendidos rápidamente. Que un software para control y monitoreo de maquinaria de producción requiera 6 meses de aprendizaje para un usuario típico, no quiere decir que es poco usable. Dada la complejidad del tema, difícilmente podría aprenderse en menos tiempo. Por lo tanto, lo importante es comparar entre varias posibles interfaces y ver cuál es la que requiere menos tiempo y/o queda mejor retenida. Si la versión siguiente, sin aumento en la complejidad del servicio brindado tomara 8 meses de aprendizaje, ahora sí estaríamos frente a un problema de usabilidad.

Apreciación Es una medida de las percepciones, opiniones, sentimientos y actitudes generadas en el Usuario por la herramienta o sistema; una medida, si se quiere, de su seducción o elegancia. La apreciación es una medida menos objetiva que las anteriores, pero sin embargo, no menos importante. Lo importante de esta medida no es tenerla en forma absoluta sino, otra vez, compararla o analizarla en forma relativa. Esta comparación puede ser contra la competencia, contra la versión anterior del mismo producto, contra otras posibilidades que se estén tomando en cuenta. El otro punto importante respecto de la apreciación es tratar de analizar hasta donde “tiñe” el resto de las medidas. Un usuario al que no le “gusta” una interfaz puede generar mas errores, o tardar más en aprenderla. Debemos aprender a separar las medidas estrictas de las que puedan tener desviaciones debidas a una apreciación negativa.

La intención del diseño visual no es que las aplicaciones luzcan “bonitas”. Un buen Diseño Visual está centrado en la Comunicación. La información visual es un complemento del diseño estructural de una aplicación. El uso de pautas de Diseño de Interfaces sobre sus formularios hace que el usuario pueda entender fácilmente la información presentada, mostrándosele claramente cómo puede y debe interactuar con la misma. Si esto se hace, aunque las pantallas no tengan un despliegue gráfico grandilocuente, su aplicación tendrá un excelente aspecto para los usuarios. A continuación se presentan los principios que rigen la composición de elementos en el diseño de la ventana:

Page 83: programacion de interfaces

83

Diseño de interfaces

¿Qué es el diseño de interfaces?

El diseño de interfaces es una disciplina que estudia y trata de poner en práctica procesos orientados a construir la interfaz más usable posible, dadas ciertas condiciones de entorno.

El entorno dentro del cual se inscribe el diseño de una interfaz y la medida de su usabilidad, está dado por tres factores:

1. Una persona. 2. Una tarea. 3. Un contexto.

Áreas y profesiones relacionadas

Factores Humanos y Ergonomía

Se denomina Factores Humanos y Ergonomía al estudio de las características de los sentidos, percepción, antropometría y acción de los seres humanos (ver Human Factors and Ergonomics Society, en los apéndices de Asociaciones Profesionales).

Esta disciplina relaciona la fisiología con la percepción, el procesamiento de esas percepciones y las acciones posibles.

Algunos ejemplos: debido a la conformación de los bastoncillos y conos de la retina humana, el azul es el color para el que el ojo tiene una menor sensibilidad; en una población occidental existe un porcentaje documentado de personas, dependiente del segmento de edad, con problemas de visión por miopía o hipermetropía. Eso, sin contar con un casi 5% de discromatópticos con grados variables de severidad.

Resultados prácticos de estos conocimientos: cuidado con el texto azul, especialmente en tipografías pequeñas. Trate de evitarlo si sus usuarios son personas mayores de 35 años.

Page 84: programacion de interfaces

84

Diseño Gráfico

El diseño gráfico como actividad comunicacional, anclada y relacionada con una cierta cultura en un momento dado, es de importancia fundamental en el diseño de interfaces y en el arte de hacerlas más usables.

Los condicionamientos o convenciones culturales y la apreciación estética, junto con los factores humanos y la ergonomía, pueden potenciar o desalentar el uso y la venta de un sistema o herramienta.

Interacción y Ciencias Cognitivas

Dentro del diseño de interfaces, las ciencias cognitivas juegan un papel preponderante y han sido desde el comienzo, uno de los pilares del área.

Las ciencias cognitivas estudian los procesos de la mente humana: cómo aprendemos, cómo recordamos, cómo procesamos la información y qué hacemos con ella.

Es muy importante, cuando se analiza la relación ente un usuario y una tarea, comprender cuáles son los procesos internos del usuario, sus modelos mentales, etc.

Por ejemplo, existen técnicas para mapear conocimientos y presentarlos de manera que al usuario su organización le parezca la “natural”.

Un ejemplo claro de una aplicación incorrecta del mapeo mental de un usuario: en los primeros tiempos de la web, las empresas organizaban sus sitios de acuerdo con su propia estructura interna. Los tests de usabilidad demostraron que este tipo de organización es completamente inútil para el usuario que no forma parte de la compañía. Ergo, ahora se trata de ver cómo organizar la información según los usuarios y no según los preconceptos de la empresa. De hecho, existen técnicas y actividades para mapear la percepción de un grupo de personas acerca de un dominio dado de conocimientos.

Ciencias de la Computación

Si bien interactuamos con todo lo que nos rodea a través de interfaces, en esta ponencia, nos centramos básicamente en las interfaces de sistemas informáticos.

Por lo tanto, las ciencias de la computación están íntimamente ligadas al diseño de interfaces en este contexto.

No siempre estamos en el caso ideal de armar una interfaz sin limitaciones, por lo que muchas veces tenemos que alcanzar un equilibrio entre el ideal inexistente y lo menos-que-ideal pero alcanzable.

En todos estos casos, el profesional responsable de la implementación (de la programación, más específicamente) puede ayudarnos con una evaluación certera del balance entre esfuerzo y valor para cada opción.

Page 85: programacion de interfaces

85

Esto es válido siempre que no estemos trabajando sobre una aplicación crítica. En estos casos, no hay opciones válidas que no sean las óptimas y el costo de la implementación depende exclusivamente de los recursos que sean necesarios, sin límites previos.

El proceso de desarrollo de interfaces

Diseño iterativo

El diseño iterativo de interfaces es un proceso independiente de la/s técnica/s utilizada/s para llevarlo a cabo.

Actualmente, el proceso del desarrollo de una interfaz se concibe como un ciclo que consta de 4 etapas, en varios niveles:

1. Diseño 2. Implementación 3. Medición 4. Evaluación

El resultado (o output) de cada etapa es la alimentación (o input) de la que sigue, incluso el de la última. Los resultados de la etapa de evaluación se toman para re-diseñar la interfaz, implementarla nuevamente, medir, y así sucesivamente.

Debido a esa repetición o auto-alimentación se lo llama diseño iterativo.

Es importante comprender que este ciclo no sólo se cumple dentro del ciclo de vida de un producto, sino también entre productos y dentro de cada etapa misma. Mientras tengamos tiempo, trataremos de hacer tantos ciclos de mejoramiento como nos sea posible, hasta la fecha límite.

La siguiente versión, tomará al producto existente como su comienzo y otra vez comenzará el ciclo.

El proceso de diseño y el equipo de desarrollo

Además de la recursividad, otra característica del enfoque actual del diseño de interfaces es que involucra no sólo a los especialistas en usabilidad o diseño, sino a todo el equipo de desarrollo.

¿Quiénes constituyen el equipo de desarrollo?

Todos aquellos que participen de alguna manera en desarrollo o comercialización del sistema o herramienta: gente de marketing, comunicación, documentación, sistemas e informática, diseño y usabilidad, packaging, etc.

Page 86: programacion de interfaces

86

Cada uno tiene conocimiento acerca de un área específica, y su participación a lo largo del desarrollo aumenta las probabilidades de éxito.

Todos los equipos pueden tener discusiones acerca de la usabilidad de un sitio, o el uso de la aplicación que están haciendo. Muchas de esas discusiones no están basadas en hechos u observaciones, sino en mitos que nos influyen sin que nos demos cuenta (más sobre los mitos en los workshops).

Nada mejor para terminar esas discusiones que un pequeño test de usabilidad: no sólo elimina reuniones interminables y defensas acaloradas por opiniones personales, sino que tiene un poder de convencimiento y demostración casi imposible de igualar.

No hay nada tan claro como ver a un usuario tratando infructuosamente de usar ese software que creíamos tan simple, para volver al laboratorio sin discusiones y aceptar que es necesario cambiar la versión actual.

Las etapas y tareas del ciclo

Diseño Análisis de requerimientos del producto. Análisis de las tareas. Conocimiento del usuario. Generación de posibles metáforas y análisis de tipo de

diálogo. Revisión de posibilidades para la implementación.

Implementación Generación de prototipos (profundos o amplios, para investigación general o de ajustes).

Desarrollo de la aplicación, sitio o sistema.

Medición (Test de usabilidad)

Planificación (desarrollo del plan, definición de las medidas, selección de participantes, formación de observadores, preparación de los materiales).

Test (prueba piloto, tests con usuarios).

Evaluación Conclusión (análisis de los datos, elaboración del informe, resultados y recomendaciones).

Comparación contra estándares (internos y/o externos), versiones anteriores del mismo producto y productos competidores.

Verificación de las diferencias. Generación de nuevas metas.

Page 87: programacion de interfaces

87

4.-Color El color debe ser considerado como una herramienta adicional en el diseño y no como una necesidad básica. No hay que depender de colores para mostrar la información importante; si los colores no son correctamente percibidos, en caso de que el usuario tenga sistemas de poca resolución o posea algún impedimento visual leve, la aplicación debe continuar siéndole usable. En el uso del color es conveniente aplicar: 1. El color es una forma de información secundaria: evite confiar en el color como único medio de informar una condición o valor. 2. Aplique conjunto limitado de colores: los colores apagados, sutiles y complementarios suelen ser los más apropiados en el diseño de interfaces para aplicaciones de corte empresarial y académicas (Andragogía). En el caso de que la audiencia de los componentes instruccionales sea infantil, debe diseñarse la interfaz, como corresponde siempre, en función de sus intereses: edad, cultura, conocimientos, conductas previas, etc. En este caso particular, se recomiendan los colores primarios y cálidos, sin tender a “carnavalizar” la interfaz, a menos que así lo requiera la intencionalidad del diseño instruccional del componente de software. 3. Uso de Paletas: el uso de paletas de combinación de colores aplicables en los formularios brinda una apariencia de unificación, consistencia y formalidad, lo que minimiza la posibilidad de crear distractores visuales.

5.-Disposición de la ventana La localización de los componentes en la ventana determina la relación entre estos, de allí la importancia de la posición que se le asigne. Esto se llama “Layout” en diseño de Interfaces. Un layout limpio es crucial para crear un flujo visual de información sin problemas para el usuario. En esta sección se describen la ubicación adecuada de los componentes y el espaciado recomendado por el Proyecto de Usabilidad de GNOME (Group GNOME, 2002). La mayoría de los componentes analizados serán etiquetas, íconos, botones de opción, de chequeo, campos de texto y botones de comando. Cuadros de Diálogos Cuando un usuario revisa un cuadro de diálogo complejo, que contiene muchas etiquetas, cuadros de textos, botones varios, etc., esta Interface puede convertirse en algo engorroso. Cuando el layout es deficiente, en consecuencia, el

Page 88: programacion de interfaces

88

diseño visual también lo es. Fíjese en el ejemplo siguiente: El cuadro de diálogo de la izquierda presenta las etiquetas sin alinear, al pasar la vista notará la dificultad de un “escaneo” o revisión rápida de la pantalla. 6.-Alineación Debe proporcionarse una alineación a los controles, de manera que se brinde al usuario un margen firme, “un punto de ancla” o eje que permita la lectura vertical en forma organizada y rápida. 1. Cuando los controles (cuadro de texto) tengan la misma longitud, se recomienda alineación izquierda. 2. Si la mayoría de un grupo de etiquetas difiere en longitud, se recomienda alineación derecha, así como cuidar que el final del control no esté ubicado demasiado lejos de su respectiva etiqueta. 3. No es recomendable el uso de marcos con bordes visibles para separar grupos de datos. Se sugiere usar espaciado y encabezados en negrita en su lugar. Esto es más efectivo porque garantiza el menor número de líneas adicionales que distraerían al usuario del contenido principal de la ventana. Su uso se reserva a lo estrictamente necesario. 4. Se debe mantener la consistencia de los componentes de la ventana en términos de alineación y tamaño. Esto es particularmente importante cuando se requiere agrupar muchos controles, para que la habilidad del usuario de escanear la información rápidamente no sea sacrificada. En consecuencia, se recomienda minimizar, tanto como sea posible, la necesidad de que los ojos del usuario tengan que dar saltos de un lado a otro cuando revisa el layout de la ventana. Especificaciones de Layout En la siguiente imagen se pueden verificar gráficamente algunas recomendaciones generales, que serán detalladas más adelante:

Page 89: programacion de interfaces

89

1. Deje un mínimo de 12- píxel ó 120 Twips entre el borde de la ventana y el control más cercano. 2. Deje 12- píxel ó 120 Twips horizontales entre el control y su etiqueta (esta distancia puede ser mayor entre controles de un mismo grupo, dependiendo del tamaño de la etiqueta). 3. Las etiquetas deben ser concisas y tener sentido, aun leyendo la ventana fuera de contexto. 4. Asigne teclas de acceso a todos los controles editables. 5. Asegúrese de tener un orden adecuado de TAB ORDER de manera que, si se accede por teclado, el orden de los controles sea el correspondiente. 7.-Espaciado 1. Proporcione un espacio adecuado entre controles y grupo de controles, esto facilitará al usuario encontrar y organizar mentalmente la información. 2. Como regla básica, se debe usar un espaciado mínimo de 12 píxels (o 120 Twips) horizontales entre etiquetas y controles asociados. Para espaciado vertical entre grupos de componentes, deben emplearse 18 píxels (o 440 Twips) aproximadamente. 3. Diseñe listas de selección de grupos pequeños. Aplique botones de opción o de chequeo para menos de 8 valores. En caso de poseer mayor cantidad de valores, aplique menú o listas deplegables. 4. Ubique los componentes de grupo a 12 píxels (ó 120 Twips) de un rótulo para denotar jerarquía. 5. Minimice los puntos de alineación en su ventana. Un punto de alineación es una línea imaginaria horizontal o vertical que atraviesa la ventana y que es reflejada por el borde de uno o más controles dentro de la misma. 6. Estructure los componentes de la Interfaz de izquierda a derecha y de arriba hacia abajo, en orden de importancia. El primer elemento significativo debe ubicarse en la esquina superior izquierda y el menos significativo en la esquina inferior derecha. 7. Use espacios en blanco e identación para delimitar grupos de información. De esta manera resulta más claro y preferible a líneas gráficas. 8. Sea consistente en cuanto a alineación, espaciado y tamaño de los componentes en toda su aplicación. 9. No diseñe ventanas que sean 50% más largas en una dimensión que en otra. 8.-Menús Menús de tipo índice, mediante una lista de palabras o frases muy cortas que describen o indican lo que la opción puede hacer. Se pueden utilizar tipos de letras, estilos y tamaños para hacer el menú más legible y más estructurado. b. menús mediante pequeños iconos que describen las acciones que el programa ofrece en un momento determinado. Encontrar estos iconos no es tarea fácil en general. Los dibujos deberían indicar la acción que su selección desencadena. Los iconos de los menús son generalmente iconos del tipo "índice". Menús anidados: Los menús se pueden presentar como menús de menús o menús anidados. Cada opción del menú abre otro menú y la selección final se

Page 90: programacion de interfaces

90

hace en las hojas del árbol de menús. Este recorrido de un árbol de selecciones no debe ser muy profundo, máximo 3 niveles. Generalmente los submenús se abren a la derecha ya hacia abajo. Cuando los menús encuentran el borde derecho e inferior de la ventana se deben abrir hacia arriba y a la izquierda.

Menús pull-down (emergentes): Este menú se desenrolla hacia abajo al pisar la cabeza del menú. Pase el Mouse.

Reglas para el diseño de menús No deben ser muy largos ni muy anidados. El estilo, tipo y tamaño del texto debe ayudar a la presentación del menú. El menú puede contener al lado de su texto la clave o tecla a pisar para una selección rápida desde el teclado, para usuarios expertos. El menú no debe tapar los elementos presentes en la pantalla que son necesarios para tomar una decisión.

9.-Cuadros de texto, botones, tablas, etiquetas etcétera Cuadros de texto, botones, tablas, etiquetas etcétera En la generación de Interfaces Gráficas de Usuario, se emplean distintos elementos de control, y para este caso se toma como referencia la colección de controles de Visual Basic. Cuadros de Texto TextBox Las aplicaciones utilizan el control TextBox para que los usuarios puedan escribir una cadena. El control TextBox puede enmascarar los datos correspondientes a

Page 91: programacion de interfaces

91

contraseñas si el dispositivo del usuario admite esta funcionalidad. Un control TextBox debe colocarse en un control Form o Panel, o dentro de la plantilla de un control de una página Web de ASP.NET Mobile. Botones Botones de Comando CommanButton Los botones de comando suelen emplearse para iniciar un evento que lleva a cabo una acción, como cerrar un formulario, moverse a otro registró, imprimir un informe, etc. Utilice el control CommandGroup para crear un conjunto de botones de comando que pueden manipularse individualmente o como grupo. Utilice la propiedad Caption para especificar el texto que aparece en un botón de comando. Utilice la propiedad Picture para especificar una imagen para un botón de comando. Puede elegir un botón de comando al hacer clic en él y si está establecida la propiedad Default en el valor verdadero (.T.), al presionar la tecla ENTRAR cuando está seleccionado el botón de comando. Si la propiedad Cancel del botón de comando se establece en el valor verdadero (.T.), puede elegir el botón de comando al presionar la tecla ESC. Botones de Opción RadioButton, OptionButton El control OptionButton de Visual Basic 6.0 se ha reemplazado por el control RadioButton de formularios Windows Forms Tema III Interfaces Gráficas. Página 8 en Visual Basic 2005. Los nombres de algunas propiedades, métodos, eventos y constantes son diferentes y, en algunos casos, existen diferencias de comportamiento. Diferencias conceptuales En Visual Basic 6.0, el evento Click del control OptionButton sólo se producía cuando su propiedad Value se cambiaba a True. En Visual Basic 2005, el evento CheckedChanged del control RadioButton se produce cada vez que el valor de la propiedad Checked cambia a True o False. Casillas de Verificación CheckBox El control CheckBox de los formularios Windows Forms indica si una condición determinada está activada o desactivada. Se utiliza habitualmente para presentar al usuario una selección de tipo Sí/No o Verdadero/Falso. Puede utilizar grupos de casillas de verificación para mostrar múltiples opciones entre las cuales el usuario puede elegir una o más. Es similar al control RadioButton aunque en este caso puede seleccionarse cualquier número de controles CheckBox agrupados.

Page 92: programacion de interfaces

92

Tablas DataGridView El control DataGridView proporciona una forma eficaz y flexible de mostrar datos en formato de tabla. Puede utilizar el control DataGridView para mostrar vistas de sólo lectura de una cantidad pequeña de datos o puede ajustar su tamaño para mostrar vistas modificables de conjuntos muy grandes de datos. Puede ampliar el control DataGridView de varias maneras para crear comportamientos personalizados en las aplicaciones. Por ejemplo, puede especificar mediante programación sus propios algoritmos de ordenación y crear sus propios tipos de celdas. Puede personalizar con facilidad la apariencia del control DataGridView seleccionando entre varias propiedades. Se pueden utilizar muchos tipos de almacenes de datos como origen de datos o el control DataGridView puede operar sin tener ningún origen de datos enlazado. Etiquetas Label Un control Label es un control gráfico que muestra texto que no puede cambiarse directamente. Sin embargo, puesto que un control Label tiene un amplio conjunto de propiedades, eventos y métodos en común con otros controles, puede responder a eventos y cambiarse dinámicamente en tiempo de ejecución. Para asignar una tecla de acceso a una etiqueta, incluya una barra inversa y un signo menor que (\<) en el título justo delante del carácter que desee designar como tecla de acceso. Cuando se muestre la etiqueta, este carácter aparecerá subrayado. Al presionar la tecla de acceso de una etiqueta se activa el siguiente control en el orden de tabulación. Utilice la propiedad TabIndex para asignar un orden de tabulación a una etiqueta. Cuadros de Lista ListBox El control ListBox permite a los usuarios seleccionar uno o varios elementos de una lista predefinida. Se diferencia de un control DropDownList en que puede mostrar varios elementos a la vez y, de manera opcional, permite que el usuario pueda seleccionar varios elementos. Cuadros Combinados ComboBox Cuando se selecciona un control ComboBox, se abre y muestra una lista de elementos en la que se puede elegir uno. Un control ComboText combina las características de un control TextBox y un control ListBox. Se puede escribir la información en la parte del cuadro de texto o seleccionar un elemento en la parte de cuadro de lista del control. Para deshabilitar un elemento de un cuadro combinado, inserte al principio de la expresión una sola barra diagonal inversa ("\"). A causa de esta funcionalidad, las barras invertidas se tratan de forma diferente para este control. Por cada barra diagonal inversa que necesite mostrar en el texto, deberá insertar dos. Por

Page 93: programacion de interfaces

93

ejemplo, el código siguiente contiene un elemento de cuadro combinado que incluye una ruta UNC. Bibliografía http://www.ucv.ve/fileadmin/user_upload/sadpro/Documentos/docencia_vol4_n2_2003/7_Art.4_Gregoria_Romero.pdf http://www.virtual.unal.edu.co/cursos/sedes/manizales/4060030/lecciones/Capitulo%205/gui.htm http://es.scribd.com/doc/93497223/Prog-de-Interf-Tema-III

Page 94: programacion de interfaces

94

IV. INTERFACES A BASES DE DATOS 1.-Utilizando Java

Introducción a los Drivers JDBC

Una inspección casual del API JDBC muestra rápidamente la dominación de los interfaces

dentro del API, lo que podría llevar al usuario a preguntarse dónde se realiza el trabajo.

Realmente esta es sólo una aproximación que tocan los desarrolladores JDBC porque la

implementación real es la proporcionada por los vendedores de Drivers JDBC, que a su vez

proporcionan las clases que implementan los interfaces necesarios. Esta aproximación

presenta la competición que proporciona al consumidor más opciones, y para la mayor

parte, produce mejor software. Con todos los drivers disponibles. elegir uno puede ser

díficil. Aforturnadamente, Sun Microsystems mantiene una base de datos con más de 150

drivers JDBC de una amplia variedad de vendedores. Esta debería ser la primera parada

después de seleccionar una base de datos.

Desde una perspectiva de programación, hay dos clases principales respnsables para el

establecimiento de una conexión con una base de datos. La primera clase es

DriverManager, que es una de las clases que realmente proprociona el API JDBC.

DriverManager es responsable de manejar un almacen de drivers registrados, esencialmente

abstrayendo los detalles del uso de un driver para que el programador no tenga que tratar

con ellos directamente. La segunda clase es la clase real del Driver JDBC. Estas son

proporcionadas por vendedores independientes. La clase Driver JDBC es la responsable de

establecer la conexión con la base de datos y de manejar todas las comunicaciones con la

base de datos. Los drivers JDBC vienen en cuatro tipos diferentes

Registrar un Driver JDBC

El primer paso en el proceso de crear una conexión entre una aplicación Java y una base de

datos es el registro de un driver JDBC con la Máquina Virtual Java (JVM) en la que se está

ejecutando la aplicación Java. En el mecanimso de conexión tradicional (en oposición al

mecanismo de conexión del DataSource) la conexión y todas las comunicación con la base

de datos son controladas por un objeto DriverManager. Para establecer una conexión, se

debe registrar un driver JDBC adecuado para la base de datos objetivo con el objeto

DriverManager. La especificación JDBC, dice que se supone que los dirvers JDBC se

registran automáticamente a sí mismos con el objeto DriverManager cuando se cargan en la

JVM. Por ejemplo, el siguiente fragmento de código usa un inicializador estático para

primero crear un ejemplar del driver JDBC persistentjava y luego resgistrarlo con el

DriverManager: static {

java.sql.DriverManager.registerDriver(new com.persistentjava.JdbcDriver()) ;

} Registrar un driver es tan simple como cargar la clase del driver en la JVM, lo que puede

hacerse de muchas maneras. Una forma es con el ClassLoader

Class.forName(com.persistentjava.JdbcDriver). Otro método, que no es

tan bien conocido, usa la propidad del sistema jdbc.drivers. Este método se puede usar de

tres formas distintas:

Desde la línea de comandos: java -Djdbc.drivers=com.persistentjava.JdbcDriver Connect

Dentro de la palicación Java:

Page 95: programacion de interfaces

95

System.setProperty("jdbc.drivers","com.persistentjava.JdbcDriver") ;

Seleccionando la propiedad jdbc.drivers en el fichero de propiedades del sistema, que

generalmente depende del sistema.

Separando los drivers con una coma, se pueden registrar varios drivers usando la técnica de

la propiedad del sistema mostrada arriba. Uno de los beneficios de usar la técnica de la

propiedad del sistema es que se los drivers se pueden intercambiar fácilmente sin modificar

ningún código (o al menos con unos mínimos cambios). Si se registran varios drivers, su

orden de precedencia es:

Drivers JDBC registrados por la propiedad jdbc.drivers en la inicialización de la JVM, y

Drivers JDBC cargados dinámicamente.

Como la propiedad jdbc.drivers sólo se chequea una vez durante la primera invocación del

método DriverManager(), es importante asegurarse de que todos los drivers están

registrados correctamente antes de establecer la conexión con la base de datos. Sin

embargo, no todas las JVM están creadas igual, y algunas de ellas no siguen la

especificación JVM. Como resultado, los inicializadores estáticos no siempre funcionan

como hemos dibujado. Esto resulta en múltiples formas de registrar un driver JDBC,

incluyendo: Class.forName("com.persistentjava.JdbcDriver").newInstance();

DriverManager.registerDriver(new

com.persistentjava.JdbcDriver()) ;

Estas alternativas deberían funcionar bien en todas las JVMs, por eso deberíamos sentirnos

agusto usándolas a lo largo del amplio conjunto de JVM disponibles. Un problema final es

que Class.forname() puede lanzar una ClassNotFoundException, por eso debemos envolver

el código de registro en un manejador de excepción apropiado.

URLs de Drivers JDBC

Una vez que un Driver JDBC se ha registrado con el DriverManager, puede usarse para

establecer una conexión a una base de datos. ¿Pero cómo selecciona DriverManager el

driver correcto, dado que puede haber realmente rigstrados cualquier número de drivers?

(Recuerda, una sóla JVM podría soportar múltiples aplicaciones concurrentes, que podrían

conectarse con diferentes bases de datos con diferentes drivers). La técnica es bastante

simple: cada driver JDBC usa una URL JDBC específica (que tiene el mismo formato que

una dirección Web) como un significado de auto-identificación. El formato de la URL es

correcto y probablemente parece familiar: jdbc:sub-protocol:database locator. El sub-

protocol es específico del driver JDBC y puede ser odbc, oracle, db2, etc., dependiendo

del vendedor del driver real. El localizador de la base de datos es un indicador específico

del driver para específicar de forma única la base de datos con la que una aplicación quiere

interactúar. Dependiendo del tipo de driver, este localizador incluye un nombre de host, un

puerto, y un nombre de sistema de base de datos.

Cuando se presenta con una URL específica, el DriverManager itera sobre la colección de

drivers registrados hasta que uno de ellos reconoce la URL específicada. Si no se encuentra

ningún driver adecuado, se lanza una SQLException. La siguiente lista presenta varios

ejemplos específicos de URLs JDBC reales: jdbc:odbc:jdbc

jdbc:oracle:thin:@persistentjava.com:1521:jdbc";

jdbc:db2:jdbc

Page 96: programacion de interfaces

96

Muchos drivers, incluyendo el driver puente JDBC-ODBC, acepta parámetros adicionales

al final de la URL como un nombre de usuario y una password.

El método para obtener una conexión a una base de datos, dando una URL JDBC

específica, es llamar a getConnection() sobre el objeto DriverManager. Este método tiene

varias formas: DriverManager.getConnection(url) ;

DriverManager.getConnection(url, username, password) ;

DriverManager.getConnection(url, dbproperties) ;

Aquí url es un objeto String que es la URL JDBC, username y password son objetos String

que representan el nombre de usuario y la password que la aplicación JDBC debería usar

para conectar con la fuente de datos; y dbproperties es un objeto Properties de Java que

encapsula todos los parámetros (posiblemente incluyendo nombre de usuario y la

password) que requiere un driver JDBC para hacer una conexión con éxito. Ahora que

tenemos el driver básico en la mano, podemos examinar los tipos de drivers individuales

con más detalle:

Page 97: programacion de interfaces

97

Drivers del Tipo 1

Los drivers del tipo uno tienen algo en común: todos usan el puente JDBC-ODBC, que

está incluido como parte estándard del JDK. Los drivers del tipo uno son diferentes al

driver ODBC (Open DataBase Connectivity) adjunto al puente JDBC-ODBC. Para

conectar con una fuente de datos diferente, simplemente tenemos que registrar (o unir

efectivamente) una fuente de datos ODBC diferente, usando el Administrador ODBC, al

nombre de la fuente de datos apropiada.

Como ODBC se ha estado utilizando desde hace bastante tiempo (más que el lenguaje

Java), los drivers ODBC son ubicuos. Esto hace de este tipo de drivers una buena elección

para aprender cómo conectar programas Java a bases de datos. De hecho, incluso hay

drivers ODBC que nos permiten asignar fuentes de datos ODBC a una aplicación Microsoft

Excel o ficheros de texto plano. Sin embargo, el nivel extra de indirección, puede resultar

en una pérdida de rendimiento ya que el JDBC es transferido dentro de ODBC, que luego

es transferido en el protocolo específico de la base de datos.

Otro problema potencial de los drivers del tipo uno es su utilización en aplicaciones

distribuidas. Como el propio puente no soporta comunicación distribuida, la única forma de

que los drivers del tipo uno puedan trabajar a través de la red es si el propio driver ODBC

soporta interacción remota. Para drivers ODBC sencillos, esta no es una opción, y mientras

que las grandes bases de datos tienen drivers ODBC que pueden trabajar de forma remota,

no pueden competir con el mejor rendimiento de los drivers JDBC puro Java.

Page 98: programacion de interfaces

98

Codificación para Drivers del Tipo 1

El nombre de clase para el driver puente JDBC-ODBC es sun.jdbc.odbc.JdbcOdbcDriver y

al URL JDBC toma la forma jdbc:odbc:dsn, donde dsn es el Data Source Name (nombre de

la fuente de datos) usado para registrar la base de datos con el Administrador ADBC. Por

ejemplo, si una base de datos se registra con una fuente de datos ODBC llamada jdbc; un

nombre de usuario de java y una password de sun, se puede usar el siguiente fragmento de

código para establecer una conexión.

Nota: En interés de la claridad y la brevedad, se ha eliminado del listado el

chequeo y manejo de errores. Posteriores ejemplos, demostrarán la

importancia de estos mecanismos (específicamente, la captura de errores

encadenando sentencias SQLException).

String url = "jdbc:odbc:jdbc" ;

Connection con ;

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;

} catch(java.lang.ClassNotFoundException e) {

System.err.print("ClassNotFoundException: ") ;

System.err.println(e.getMessage()) ;

return ;

}

try {

con = DriverManager.getConnection(url, "java", "sun");

} catch(SQLException ex) {

System.err.println("SQLException: " + ex.getMessage());

} finally {

try{

con.close ;

} catch(SQLException ex) {

System.err.println(SQLException: " + ex.getMessage()) ;

}

}

Page 99: programacion de interfaces

99

Drivers del Tipo 2

Los drivers del tipo dos también son conocidos como drivers Java parciales, porque

traducen directamente el API JDBC en un API específico de la base de datos. La aplicación

cliente de base de datos (para el propóstio de este tutorial, el host que está ejecutando la

JVM) debe tener las librerías cliente apropiadas para la base de datos, que podrían incluir

código binario instalado y posiblemente ejecutándose. Para una aplicación distribuida, este

requerimietno puede introducir problemas extra con las licencias, así como posibles

pesadillas con los problemas de distribución de código. Por ejemplo, usar un modelo del

tipo dos restringe a los desarrolladores a utilizar plataformas y sistemas operativos

soportados por la librería cliente de la base de datos.

Sin embargo, este modelo puede funcionar eficientemente, cuando la base cliente está

fuertemente controlada.. Esto ocurre típicamente en LANs corporativas. Un ejemplo de

driver del tipo dos es el driver de aplicación JDBC para DB2. El siguiente ejemplo

demuestra cómo establecer una conexión usando un driver DB2: String url = "jdbc:db2:jdbc" ;

try {

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver") ;

} catch(java.lang.ClassNotFoundException e) {

System.err.print("ClassNotFoundException: ") ;

System.err.println(e.getMessage()) ;

return ;

}

...

Observa la similitud que tiene este fragmento de código con el del ejemplo 1. Esta es la

principal característica del modelo del tipo 2: la curva de aprendizaje para un programador

que se mueve de un modelo a otro es prácticamente inexistente.

Page 100: programacion de interfaces

100

Los dos últimos tipos de drivers son drivers puro Java. El beneficio de los drivers puro Java

es su fácil despliegue en entonos altamente distribuidos.

Drivers del Tipo 3

Los drivers del tipo tres son drivers puro Java que transforman el API JDBC en un

protocolo independiente de la base de datos. El driver JDBC no comunica directamente con

la base de datos; comunica con un servidor de capa media, que a su vez comunica con la

base de datos. Este nivel extra de indirección proporciona flexibilidad en que se puede

acceder a diferentes bases de datos desde el mismo código porque el servidor de la capa

media oculta las especificidades a la aplicación Java. Para cambiar a una base de datos

diferente, sólo necesitamos cambiar los parámetros en el servidor de la capa media. (Un

punto a observar: el formato de la base de datos a la que estamos accediendo debe ser

soportado por el servidor de la capa media).

El lado negativo de los drivers del tipo tres es que el nivel extra de indirección puede

perjudicar el rendimiento general del sistema. Por otro lado, si una aplicación necesita

interactúar con una variedad de formatos de bases de datos, un driver del tipo tres en una

aproximación adecuada debido al hecho de que se usa el mismo driver JDBC sin importar

la base de datos subyacente. Además, como el servidor de la capa media se puede instalar

sobre una plataforma hardware específica, se pueden realizar ciertas optimizaciones para

capitalizar los resultados perfilados.

Page 101: programacion de interfaces

101

Drivers del Tipo 4

Los drivers del tipo cuatro son drivers puro Java que se comunican directamente con la

base de datos. Muchos programadores consideran éste el mejor tipo de driver, ya que

normalmente proporciona un rendimiento óptimo y permite al desarrollador utilizar las

funcionalidades específicas de la base de datos. Por supuesto este acoplamiento puede

reducir la flexibilidad, especialmente si necesitamos cambiar la base de datos subyacente en

una aplicación. Este tipo de driver se usa frecuentemente en applets y otras aplicaciones

altamente distribuidas. El siguiente fragmento de código muestra cómo usar un driver DB2

del tipo cuatro: String url = "jdbc:db2://persistentjava.com:50000/jdbc" ;

try {

Class.forName("COM.ibm.db2.jdbc.net.DB2Driver") ;

} catch(java.lang.ClassNotFoundException e) {

System.err.print("ClassNotFoundException: ") ;

System.err.println(e.getMessage()) ;

return ; }

...

Page 102: programacion de interfaces

102

Un Ejemplo Completo de Driver del Tipo 4

El siguiente ejemplo muestra cómo usar un driver JDBC de un vendedor de terceras partes,

en este caso Merant, para conectar con una base de datos DB2. DB2 UDB requiere

información adicional, no estándard para establecer la conexión a la base de datos, que en

este ejemplo están añadidos a la URL JDBC como parámetros opcionales.

package com.persistentjava;

import java.sql.*;

public class ConnectMerantDB2 {

static {

try {

Class.forName("com.merant.datadirect.jdbc.db2.DB2Driver").newInstance();

} catch (Exception e) {

System.out.println(e);

}

}

public static void main(String args[]) {

String url = "jdbc:merant:db2://persistentjava.com:50000;" ;

url += "DatabaseName=jdbc;CollectionId=DEFAULT;" ;

url += "PackageName=JDBCPKG;CreateDefaultPackage=TRUE";

Connection con;

System.out.println("Connecting");

try {

con = DriverManager.getConnection(url, "java", "sun");

System.out.println("Connection Established");

con.close();

// In this example, the proper handling of SQLExceptions is

// demonstrated as they can be potentially chained.

} catch (SQLException e) {

System.out.println("\nERROR:----- SQLException -----\n");

while (e != null) {

System.out.println("Message: " + e.getMessage());

System.out.println("SQLState: " + e.getSQLState());

System.out.println("ErrorCode: " + e.getErrorCode());

e.printStackTrace();

e = e.getNextException();

}

}

}

}

Page 103: programacion de interfaces

103

Transaciones con Bases de Datos

Transaciones Básicas

Uno concepto que causa problemas a los principiantes en el mundo del desarrollo de

aplicaciones de base de datos es la idea de transaciones. Fundamentalmente, una transación

representa una unidad de trabajo lógica. Como la principal responsabilidad de una base de

datos es preservar la información, necesita tener algo que le indique a un usuario que se

debe salvar el estado actual del programa. De igual forma, cuando las cosas han ido mal,

necesita una forma para indicar que una base de datos deberia ignorar el estado actual y

volver a atrás, al estado del programa salvado anteriormente.

En el idioma de las bases de datos, estas funciones se llaman entregar una transación y

deshacer una transación, respectivamente. Para realizar estas tareas, el API JDBC incluye

dos métodos como parte del interface Connection. Dando un objeto Connection llamado

con, el estado del programa se graba llamando a con.commit(), para volver al estado

salvado anteriormente, con.rollback(). Estos dos métodos pueden lanzar

SQLExceptions si algo va mal cuando la base de datos realice realmente la operación, por

eso necesitamos envolverlos en bloques try ... catch.

Más sobre Transaciones

En un entorno mono-usuairo, las transaciones son bastantes sencillas de entender --

simplemente implican salvar o deshacer el estado de una aplicación. Sin embargo, en modo

multi-usuario, las transaciones son más complejas. La demostración clásica de una

transación multi-usuario es una cuenta bancaria donde una aplicación está intentando hacer

un cargo mientras otra aplicación está intentando hacer un depósito en la misma cuenta. Si

estas familiarizado con la programación concurrente (también conocida como

programación multi-thread), probablemente hayas visto este problema antes. El problema

fundamental es que a menos que las dos transaciones estén aisladas la una de la otra, una

aplicación podría interrumpir a la otra resultando en un estado del programa incorrecto. En

nuestra sencilla demostración, esto podría significar una cuenta con un saldo erróneo, algo

que no es precisamente bueno para retener clientes.

Pueden aparecer tres problemas comunes cuando tratamos con varios usuarios que acceden

a los mismos datos:

Lecturas sucias. Un lectura sucia ocurre cuando una aplicación usa datos que han sido

modificados por otra aplicación, y esos datos están en un estado sin entregar. La segunda

aplicación entonces solicita que los datos que fueron modificados sean desechos. Entonces

los datos de la primera transación están corruptos o "sucios".

Lecturas no-repetibles. Una lectura no-repetible ocurre cuando una transación obtiene

datos, que posteriormente son alterados por una transación separada, y la primera

transación re-lee los datos ahora alterados. Así, la primera transación hizo una lectura no-

repetible.

Lecturas fantasmas. Una lectura fantasma ocurre cuando una transación adquiere datos

mediante alguna consulta, otra transación modifica algunos de los datos, y la transación

original recupera los datos una segunda vez. La primera transación ahora tendrá un

conjunto de resultados diferentes, que podrían contener datos fantasmas.

Niveles de Transación

Para resolver los problemas asociados a múltiples threads solicitando los mismos datos, las

transaciones están aisladas unas de otras por bloqueos. La mayoría de las bases de datos

Page 104: programacion de interfaces

104

soportan diferentes tipos de bloqueo; por lo tanto, el API JDBC soporta diferentes tipos de

transaciones, que son asignadas o determinadas por el objeto Connection. En el API JDBC

tiene disponibles los siguientes niveles de transaciones:

TRANSACTION_NONE indica que las transaciones no están soportadas.

TRANSACTION_READ_UNCOMMITTED indica que una transación puede ver los

cambios de otra transación antes de ser entregada. Así están permitidas las lecturas sucias,

las lecturas no-repetibles, y las lecturas fantasmas.

TRANSACTION_READ_COMMITTED indica que la lectura de datos no entregados, no

está permitida. Este nivel todavía permite que ocurran las lecturas no-repetibles y las

lecturas fantasmas.

TRANSACTION_REPEATABLE_READ indica que una transación está garantizada que

pueda re-leer el mismo dato sin fallar, pero las lecturas fantasmas todavía pueden ocurrir.

TRANSACTION_SERIALIZABLE es la transación de más alto nivel y evita que ocurran

las lecturas sucias, las lecturas no-repetibles y las lecturas fantasmas. Podríamos

preguntarnos porqué todas las transaciones no operan en modo

TRANSACTION_SERIALIZABLE para garantizar el grado más alto de integridad de

datos. El problema es, de forma similar a los problemas implicados con el manejo de la

programación de múltiples threads, que cuanto más sea el nivel de protección de transación,

más alta será la pérdida de rendimiento.

Dando un objeto Connection podemos seleccionar explícitamente el nivel de transación,

asumiendo que nuestra base de datos y nuestro driver JDBC soporten esta característica: con.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;

También podemos determinar el nivel de transación actual: if(con.getTransactionLevel() == TRANSACTION_SERIALIZABLE)

System.out.println("Highest Transaction Level in

operation.") ; Lotes y Transaciones

Por defecto, los drivers JDBC operan en lo que se llama modo autoentrega. En este modo,

todos los comandos enviados a la base de datos operan en su propia transación. Aunque

esto puede ser útil para los principiantes, implica una pérdida de rendimiento porque las

transaciones requieren una cierta cantidad de sobrecarga para configurar todo

apropiadamente. Si queremos poder controlar explícitamente las entregas y los retrocesos

(deshacer la transación), necesitamos desactivar el modo autocommit: con.setAutoCommit(false) ;

También podemos determinar rápidamente el modo autocommit de un objeto Connection

dado: if(con.getAutoCommit() == true)

System.out.println("Auto Commit mode");

Muchas bases de datos soportan lotes, en los que se minimiza la sobrecarga de transaciones

realizando múltiples operaciones update de la base de datos en una sóla operación, o lote.

Las operaciones por lotes fueron introducidas en JDBC 2.0 y requieren que una transación

no esté en modo autocommit. En el siguiente ejemplo tenemos una operación por lotes, que

asume que existe una Connection a una base de datos que tiene una sola tabla: con.setAutoCommit(false) ;

Statement stmt = connection.createStatement() ;

stmt.addBatch("INSERT INTO people VALUES('Joe Jackson', 0.325, 25, 105) ;

stmt.addBatch("INSERT INTO people VALUES('Jim Jackson', 0.349, 18, 99) ;

stmt.addBatch("INSERT INTO people VALUES('Jack Jackson', 0.295, 15, 84) ;

int[] updateCounts = stmt.executeBatch() ;

con.commit() ;

Page 105: programacion de interfaces

105

Observa que el método executeBatch() devuelve un array de cuentas actualizadas, una por

cada operación del lote. Un último problema con las operaciones por lotes es que pueden

lanzar una nueva excepción del tipo BatchUpdateException, lo que indica que falló al

menos uno de los comandos del lote. Por eso, necesitamos añadir un manejador de

excepciones correspondiente a nuestras operaciones por lotes.

Control Fino de las Transaciones

Empezando con el API JDBC 3.0, se añadió un nuevo elemento interface relacionado con

las transaciones. Este interface presenta el concepto de savepoints. Los Savepoints

proporcionan un marca dentro de una aplicación de base de datos que puede usarse como

un argumento cuando se llama al método rollback. Como resultado, usando el API JDBC

3.0, ahora es posible seleccionar un savepoint antes de empezar una interacción complicada

con la base de datos y, dependiendo del resultado, entregar la transación completa o

deshacer hasta el savepoint y devolver la aplicación a un punto conocido.

Page 106: programacion de interfaces

106

Para seleccionar un punto de salvado, creamos un objeto Savepoint desde el objeto

Connection, como se ve aquí: Savepoint svpt = con.setSavepoint("Savepoint") ;

Para deshacer hasta un Savepoint dado, simplemente le pasamos el objeto Savepoint

deseado al método rollback: con.rollback(svpt) ;

Cuando no se necesitan más, liberamos todos los objetos Savepoint para liberar los caros

recursos de la base de datos para otros usuarios: con.releaseSavepoint(svpt) ;

Observa que cuando entregamos o deshacemos una transación, cualquier Savepoints creado

podría convertirse en inválido dependiendo del orden exacto y del tipo de operación.

Puedes ver la especificación del API JDBC 3.0 o el manual de tu driver para más

información.

Page 107: programacion de interfaces

107

Fuentes de Datos

Fuentes de Datos Básicas

Uno de los principales benficios de usar el API JDBC es facilitar una programación

independiente de la base de datos, así la mayoría de las aplicaciones JDBC pueden

transferirse fácilmente a otra base de datos diferente. Sin embargo, todavía hay dos ítems

que permacenen unidos a una base de datos particular, la clase JDBC Driver y la URL

JDBC. Con la introdución de las fuentes de datos en el API JDBC 2.0, se eliminaron

incluso estas dependencias.

Esencialmente un objeto DataSource representa una fuente de datos particular en una

aplicación Java. Además de encapsular la información específica de la base de datos y del

driver JDBC en un sólo objeto estándarizado, las fuentes de datos pueden actuar como una

factoría de Connection y proporcionar métodos para seleccionar y obtener propiedades

particulares que requiere el objeto DataSource para una operación satisfactoria. Algunas

propiedades estándar que podría requerir un objeto DataSource incluyen:

·databaseName

·serverName

·portNumber

·userName

·password

Un beneficio adicional de usar una DataSource, que podrías haber adivinado de la lista

anterior, es que la información sensible relacionada con la seguridad como el nombre de

usuario, la password, e incluso el servidor de la base de datos están códificados sólo en un

lugar, lo que puede hacer un administrador de sistemas. Mientras que la interacción con un

objeto DataSource se puede hacer con una aplicación gráfica, es instructivo ver como

trabajan realmente los ejemplos. Aunque los conceptos de un objeto DataSource son

bastantes simples, para usarlo dentro de una aplicación Java, un objeto DataSource es

referenciado usando Java Naming and Directory Interface, o JNDI. Antes de saltar dentro

del código de ejemplo de DataSource, el siguiente punto presenta conceptos relevantes de

JNDI que son necesarios para usar apropiadamente un objeto DataSource.

Repaso Rápido de JNDI

JNDI es un API Java que encapsula el concepto de servidores de nombres y directorios de

la misma forma que JDBC encapsula los conceptos que hay detrás de la comunicación con

una base de datos. Aunque podría parecer confuso, es bastante sencillo -- todos lo usuarios

de ordenadores usan servicios de nombres y directorios todos los días. Por ejempo, los

discos duros trabajan con pistas y sectores, aunque un usuario sólo se preocupa de nombres

de ficheros y directorios. El sistema de ficheros maneja el servicio de nombrado que asocia

un nombre de fichero dado con una localización específica en el disco duro. Otro ejemplo

es la Web, donde la mayoría de los usuarios sólo se preocupan del nombre de la Web site,

como www.persistentjava.com, y no de la dirección IP subyacente. Sin embargo, la

comunicación TCP/IP se hace usando la dirección IP y no usando el nombre que leemos los

humanos. La transformación entre las dos representaciones la realiza el DNS, o Domain

Name System.

Aunque JDNI proporciona un API ámplio y útil por sí mismo, nuestras necesidades son

considerablemente simples. En breve, necesitamos conocer como hacer cuatro cosas:

·Crear un nombre y unirlo a un objeto Java.

Page 108: programacion de interfaces

108

·Buscar un nombre para recuperar un objeto Java.

·Borrar un nombre.

·Re-unir un nombre a nuevo objeto Java.

En vez de proporcionar ejemplos JNDI imaginarios para las tareas anteriores, las siguientes

secciones muestran ejemplos de estas tareas usando fuentes de datos JDBC. Todos estos

ejemplos usan el proveedor de sistema de ficheros, que es una descarga separada.

Page 109: programacion de interfaces

109

Registrar una Fuente de Datos

Este ejemplo es una implementación de un DataSource de tereceras partes de i-net

software para conectar con una base de datos MS SQL Server. Los comentarios en el

código marcan los puntos importantes de registro (o inicialziación) de una fuente de datos

JDBC: // We need to import the actual DataSource implementation

import com.inet.tds.TdsDataSource;

import java.util.Hashtable;

import javax.naming.*;

import javax.naming.directory.*;

import java.sql.* ;

import javax.sql.* ;

public class InitializeJNDI {

// First we define the relevant parameters for this datasource

private String serverName = "persistentjava.com";

private int portNumber = 1433;

private String login = "java";

private String password = "sun";

private String databaseName = "jdbc";

// This is the name we will assign to our datasource. Because we are

// using the file system provider, our name follows the file system

// naming rules. The JNDI reserved subcontext for JDBC applications is

// jdbc, thus our name starts appropriately.

private String filePath = "jdbc/pjtutorial";

public InitializeJNDI() {

// To pass in the necessary parameters, we need to create and then

// populate a Hashtable.

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

// Create the initial context

Context ctx = new InitialContext(env);

// Here we create the actual DataSource and then set the relevant

// parameters.

TdsDataSource ds = new TdsDataSource();

ds.setServerName(serverName);

ds.setPortNumber(portNumber);

ds.setDatabaseName(databaseName);

ds.setUser(login);

ds.setPassword(password);

ds.setDescription("JDBC DataSource Connection");

// Now we bind the DataSource object to the name we selected earlier.

ctx.bind(filePath, ds);

ctx.close();

// Generic Exception handler, in practice, this would be replaced by an

// appropriate Exception handling hierarchy.

} catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage());

}

}

public static void main(String args[]) {

new InitializeJNDI();

}

}

Page 110: programacion de interfaces

110

Usar una Fuente de Datos

El ejemplo anterior establece la relación de unión entre el objeto DataSource y un nombre

particular. La mágia de JNDI realmente la realiza el proveedor de servicio apropiado. En

nuestro caso, usamos el proveedor del sistema de ficheros. Existen otras opciones,

incluyendo LDAP (Lightweight Directory Access Protocol) o incluso un DNS. Para hacer

realmente una conexión, necesitamos buscar el objeto DataSource usando el nombre al que

fue unido. Observa en el siguiente ejemplo que no hay ningún código específico de base de

datos en ningún lugar: import java.util.Hashtable ;

import javax.naming.* ;

import java.sql.* ;

import javax.sql.* ;

public class UtilizeJNDI {

public UtilizeJNDI(){

try {

// We need to set up the JNDI context so that we can properly interface

// to the correct service provider, in this case the file system.

Hashtable env = new Hashtable() ;

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory") ;

Context ctx = new InitialContext(env) ;

// Given the JNDI Context, we lookup the object and are returned

// our DataSource

DataSource ds = (DataSource)ctx.lookup("jdbc/pjtutorial") ;

// Now we get a database connection and proceed to do our job.

Connection con = ds.getConnection() ;

System.out.println("Connection Established.") ;

con.close();

// Note that proper error handling is not included here in order to keep

// the example short.

}catch(Exception e ) {

e.printStackTrace();

}

}

public static void main (String args[]){

new UtilizeJNDI() ;

}

}

Page 111: programacion de interfaces

111

Re-Unir una Fuente de Datos

Cuando queremos cambiar la base de datos particular o incluso el vendedor del DataSource

JDBC con el que queremos que comunique nuestro código, todo lo que necesitamos hacer

es re-unir un nuevo DataSource al nombre original. En este ejemplo, usamos el mismo

driver, pero cambiamos varios parámetros relevantes: // We need to import the actual DataSource

import com.inet.tds.TdsDataSource;

import java.util.Hashtable;

import javax.naming.*;

import javax.naming.directory.*;

import java.sql.* ;

import javax.sql.* ;

public class InitializeJNDI {

// First we define the relevant parameters for this datasource

private String serverName = "persistentjava.com";

private int portNumber = 1434; // Note the new port number

private String login = "sun"; // New username/password combination

private String password = "java";

private String databaseName = "ds"; // And even a new database name.

// We keep the same name for our datasource, just bind a new DataSource

// to it.

private String filePath = "jdbc/pjtutorial";

public InitializeJNDI() {

// Establish the proper JNDI Context

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

// Create the context

Context ctx = new InitialContext(env);

TdsDataSource ds = new TdsDataSource();

ds.setServerName(serverName);

ds.setPortNumber(portNumber);

ds.setDatabaseName(databaseName);

ds.setUser(login);

ds.setPassword(password);

ds.setDescription("JDBC DataSource Connection, take two");

// Now we just call the rebind method with the new DataSource.

ctx.rebind(filePath, ds);

ctx.close();

// Replace this with real Exception handlers in production code.

} catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage());

}

}

public static void main(String args[]) {

new InitializeJNDI();

}

}

Page 112: programacion de interfaces

112

Borrar una Fuente de Datos

Algunas veces, querremos borrar un nombre de DataSource para que no pueda volver a ser

usado: import java.util.Hashtable ;

import javax.naming.* ;

import java.sql.* ;

import javax.sql.* ;

public class DeleteJNDI {

public DeleteJNDI() {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

Context ctx = new InitialContext(env);

// unbinding the name object association effectively deletes the object.

ctx.unbind("jdbc/pjtutorial") ;

ctx.close() ;

}catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage()) ;

}

}

public static void main (String args[]){

new DeleteJNDI() ;

}

}

Page 113: programacion de interfaces

113

Almacenes de Conexiones

¿Por qué necesitamos Almacenes de Conexiones

Cuando usamos el DriverManager o el método DataSource para obtener conexiones a bases

de datos, cada solicitud para una nueva conexión implica una sobrecarga significante. Esto

puede impactar en el rendimiento si la obtención de nuevas conexiones ocurre con cierta

frecuencia, como podría ser el caso en un entorno de servidor Web. Para enfatizar por qué

esto es cierto, sigamos un camino potencial de una solicitud de conexión típica con una

base de datos:

La aplicación Java llama a getConnection().

El código del vendedor JDBC (la implementación del driver o del DataSource) solicita una

conexión socket desde la JVM.

La JVM necesita chequear los aspectos de seguridad de la llamada potencial. Por ejemplo,

los applets sólo se pueden comunicar con el servidor del que son originarios.

Si lo aprueba, la llamada necesita pasar a través del interface de red del host hasta la LAN

corporativa.

La llamada podría necesitar pasar a través de un cortafuegos para alcanzar Internet o una

WAN.

La llamada alcanza eventualmente su subred de destino, donde podría necesitar pasar a

través de otro cortafuegos.

La llamada alcanza el host de la base de datos.

El servidor de base de datos procesa la solicitud de la nueva conexión.

Se podría necesitar requerir la licencia del servidor para determinar si hay una licencia

apropiada disponible.

La base de datos inicializa una nueva conexión cliente, incluyendo toda las sobrecargas de

memoria y sistema operativo.

La llamada de retorno es enviada de vuelta al cliente JDBC (donde tiene que pasar por

todos los cortafuegos y routers).

La JVM recibe la llamada de retorno y crea un objeto Connection apropiado.

La aplicación Java recibe el objeto Connection.

Claramente, solicitar un nuevo objeto Connection presenta una gran sobrecarga y muchos

puntos de fallo potenciales. Para minimizar esta sobrecarga, ¿por qué no reutilizar

conexiones a bases de datos en vez de borrarlas cuando hayamos terminado con ellas? Los

diseñadores de JDBC usaron este patrón de diseño popular cuando crearon el

ConnectionPoolDataSource, que nos permite crear un almacen de conexiones a bases de

datos que son reutilizadas en vez de eliminarlas cuando se cierran.

¿Qué es una PooledConnection?

Una PooledConnection es un tipo especial de conexión a base de datos que no se borra

cuando se cierra, al contrario que los objetos Connection normales (el recolector de basura

puede borrar las conexiones normales una vez que ya no son referenciadas). En en vez de

esto, la PooledConnection es almacenada para una reutilización posterior, produciendo

potencialmente una gran mejora del rendimiento. Trabajar con un almacen de conexiones a

bases de datos es casi idéntico a trabajar con objetos DataSource. Primero, en vez de crear

un ejemplar de una clase que implemente el interface DataSource, creamos un ejemplar de

una clase que implemente ConnectionPoolDataSource. Podemos usar JDNI para unir esta

nueva fuente de datos a un nombe como antes.

Para usar realmente un objeto de fuente de datos almacenado, llamamos a

getPooledConnection() sobre el ConnectionPooledDataSource, que a su vez establece

conexiones con la base de datos. Para crear un objeto Connection que será usado, llamamos

Page 114: programacion de interfaces

114

a getConnection() sobre el objeto PooledConnection en vez sobre los objetos

DriverManager o DataSource como antes. Un beneficio adicional de esta aproximación es

que es mucho más fácil manejar varios conjuntos de conexiones a bases de datos con un

ConnectionPool porque él tiene cuidado automáticamente. Esta automatización puede ser

muy importante si nuestra licencias de cliente limitan el número de clientes que pueden

conectarse simultáneamente a la base de datos. El proceso completo es mucho más sencillo

de lo que suena, como muestran los siguientes ejemplos.

Inicialiar un Almacen de Conexiones

En este ejemplo, usamos una base de datos mSQL y el driver JDBC de código abierto

mSQL para crear un PooledDataSource. Todo el código específico de la base de datos está

contenido en los procesos de inicialización o de unión. // First we import the relevant package

import com.imaginary.sql.msql.* ;

import java.util.Hashtable ;

import javax.naming.* ;

public class InitializeJNDI {

private String serverName = "localhost" ;

private String databaseName = "jdbc" ;

private String userName = "java" ;

private String password = "sun" ;

// The appropriate JNDI subcontext for PooledDataSources is jdbcpool

private String filePath = "jdbcPool/pjtutorial" ;

private int portNumber = 1114 ;

private int poolSize= 10 ; // We want to create a pool with 10 connections.

public InitializeJNDI() {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

Context ctx = new InitialContext(env);

// Create the PooledDataSource and set the relevant parameters.

MsqlPooledDataSource ds = new MsqlPooledDataSource() ;

ds.setServerName(serverName) ;

ds.setPort(portNumber) ;

ds.setDatabaseName(databaseName) ;

ds.setUser(userName) ;

ds.setPassword(password) ;

ds.setMaxPoolSize(poolSize) ;

// Bind the name and the DataSource object together

ctx.bind(filePath, ds) ;

ctx.close() ;

} catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage()) ;

}

}

public static void main (String args[]){

new InitializeJNDI() ;

}

}

Page 115: programacion de interfaces

115

Usar un Almacen de Conexiones

Una vez que hemos inicializado el PooledDataSource, ahora podemos usarlo en

aplicaciones Java para crear almacenes de conexiones a bases de datos. El siguiente

ejemplo, es imaginario, pero efectivamente demuestra los puntos importantes. Un ejemplo

más realista podría ser un servlet, que configuraría el almacen de conexiones en el método

init() del servlet y (re-)utilizaría la conexión por cada nueva solicitud del servicio: import java.util.Hashtable ;

import javax.naming.* ;

import java.sql.* ;

import javax.sql.* ;

public class UtilizeJNDI {

public UtilizeJNDI(){

try {

Hashtable env = new Hashtable() ;

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory") ;

Context ctx = new InitialContext(env) ;

// Look up the DataSource given the appropriate name.

ConnectionPoolDataSource ds

= (ConnectionPoolDataSource)ctx.lookup("jdbcPool/pjtutorial") ;

// A PooledConnection provides a special Connection which is not

// destroyed when it is closed, but is instead placed back into the

// pool of connections.

PooledConnection pcon = ds.getPooledConnection() ;

Connection con = pcon.getConnection() ;

System.out.println("Connection Established") ;

con.close();

}

catch(Exception e ) {

e.printStackTrace();

}

}

public static void main (String args[]){

new UtilizeJNDI() ;

}

}

Page 116: programacion de interfaces

116

Optimizar las Comunicaciones con Bases de Datos

Métodos JDBC DataSource y Driver

Esta sección ecplia algunos de los métodos menos conocidos del API JDBC que pueden ser

utilizados para mejorar el rendimiento del sistema. Primero, todas las clases de fuentes de

datos JDBC, el Driver , el DataSource, o el ConnectionPooledDataSource, proporcionan la

habilidad de designar explícitamente un stream de salida del tipo caracter, setLogWriter().

Este stream acepta todos los logs y mensajes de seguimiento. También hay un método

disponible para obtener el stream actual, getLogWriter(). Este puede ser extremadamente

valioso cuando intentamos diagnosticar extraños bugs o para seguir el flujo de la

aplicación. Además, todas las clases de fuentes de datos JDBc proporcionan un medio para

asignar (setLoginTimeout()) u obtener (getLoginTimeout()) la cantidad de tiempo máxima

que la clase de fuente de datos debería esperar a que se estalezca una conexión.

Una clase interesante y rara vez utilizada es la clase DriverPropertyInfo. Esta clase

encapsula toda la información de propiedades que necesita un driver para establecer una

conexión a una base de datos. DriverPropertyInfo puede usarse en una herramienta gráfica

para encontrar interactivamente los parámetros que un driver necesita y pedirle al usuario

de la base de datos los valores correctos.

Métodos JDBC Connection

Un objeto Connection o PooledConnection también tienen varios métodos que se pueden

utilizar para mejorar el rendimiento del sistema, tanto directa como indirectamente.

Primero, asumiendo que el driver JDBC y la base de datos subyacente lo soportan, un

objeto connection se puede configurar para ser de sólo lectura, setReadOnly(). Esto puede

mejorar el rendimiento del sistema para aplicaciones que no necesitan hacer cambios en la

base de datos, ya que la base de datos no necesita preocuparse de almacenar nuevas

páginas, mantener entradas de diario, o adquirir bloqueos de escritura sobre cualquiera de

los datos.

Otros métodos que están relacioandos de alguna forma son setAutoCommit() y

setTransactionIsolation(). Como el descontrol de las transaciones puede causar grandes

pérdidas de rendimiento en la base de datos, estos métodos métodos y sus efecto deberían

ser claramente entenedidos y cuidadosamente aplicados.

Finalmente, un último y frecuentemente olvidado método es nativeSQL(), que taduce una

consulta SQL dada en el lenguaje de consulta nativo de la base de datos subyacente.

Examinando la versión nativa SQL de nuestra consulta, podriamos entender mejor cómo la

base de datos está intepretando nuestra consulta, y entonces hacer las modificaciones

adecuadas a nuestra aplicación para mejorar el rendimiento general.

2.-Utilizando PHP Se define a una Base de Datos, como una colección de datos almacenados en una cierta

cantidad de ficheros que reciben el nombre de Tablas. Es decir que una Base de Datos es

básicamente un conjunto de Tablas que guardan una cierta relación ente ellas. Estas Tablas

están conformadas por Registros y estos a su vez por Campos.

Cada Campo debe tener un nombre y un cierto tipo de acuerdo a las características del

dato que almacenará.

Page 117: programacion de interfaces

117

La mayoría de los sitios web, que generalmente manejan un volumen de información

importante, utilizan base de datos para poder almacenar información y modificarla o

borrarla en tiempo real.

Tipos de Base de Datos

Se distinguen mochos tipos de Base de Datos en el mercado, de distintos fabricantes, con

alguna diferencias en sus aspectos funcionales. Las Base de Datos mayormente usadas son:

1. Oracle

2. Mysql

3. MS SQL Server

4. Acces

Concepto de Base de Datos Nativas y Base de Datos

Genéricas

Las Base de Datos nativas son mas rápidas que las Bases de Datos que necesitan interface,

como por ejemplo: ODBC (Open Data Base Conectivity) o JDBC (Java Data Base

Conectivity). La rapidez es debido a que las Base de Datos “nativas” no necesitan realizar

ningún paso para conectar la interfaz con el motor de Base de Datos, mientras que una “no

nativa”, necesita de un interprete como ODBC, o similares para conectarse con la interfaz.

La ventaja de usar una Base de Datos Genérica, es que se puede cambiar de Base de Datos

fácilmente sin realizar cambios en el programa. PHP soporta interface tanto con Base de

Datos nativas como genéricas.

Diseño de Base de Datos

Para el diseño de una Base de Datos, se sugiere dedicar un tiempo al análisis de los datos y

al tipo de aplicación a desarrollar, además también se debe prestar interés a la relación entre

los datos de las diferentes tablas. El análisis no es algo que se aprende en un instante, sino

que requiere ejercitación y práctica.

Page 118: programacion de interfaces

118

La interacción con la Base de Datos se realiza a través del lenguaje SQL (Structured Query

Language) que es el estándar para el acceso y manipulación de información de una Base de

Datos Relacional. SQL es soportado por la mayoría de las Base de Datos Relacionales,

aunque cada una tiene sus particularidades.

3.- Utilizando Python Existen cientos de bases de datos en el mercado, tanto comerciales como gratuitas. También existen decenas de módulos distintos para trabajar con dichas bases de datos en Python, lo que significa decenas de APIs distintas por aprender. En Python, como en otros lenguajes como Java con JDBC, existe una propuesta de API estándar para el manejo de bases de datos, de forma que el código sea prácticamente igual independientemente de la base de datos que estemos utilizando por debajo. Esta especificación recibe el nombre de Python Database API o DB-API y se recoge en el PEP 249 (http://www.python.org/dev/peps/pep-0249/). DB-API se encuentra en estos momentos en su versión 2.0, y existen implementaciones para las bases de datos relacionales más conocidas, así como para algunas bases de datos no relacionales. A lo largo de este capítulo utilizaremos la base de datos SQLite para los ejemplos, ya que no se necesita instalar y ejecutar un proceso servidor independiente con el que se comunique el programa, sino que se trata de una pequeña librería en C que se integra con la aplicación y que viene incluida con Python por defecto desde la versión 2.5. Desde la misma versión Python también incorpora un módulo compatible con esta base de datos que sigue la especificación de DB API 2.0: sqlite3, por lo que no necesitaremos ningún tipo de configuración extra. Nada impide al lector, no obstante, instalar y utilizar cualquier otra base de datos, como MySQL, con la cuál podemos trabajar a través del driver compatible con DB API 2.0 MySQLdb (http://mysql-python.sourceforge.net/). Variables globales Antes de comenzar a trabajar con sqlite3, vamos a consultar algunos datos interesantes sobre el módulo. Todos los drivers compatibles con DB-API 2.0 deben tener 3 variables globales que los describen. A saber:

apilevel: una cadena con la versión de DB API que utiliza. Actualmente sólo puede tomar como valor “1.0″ o “2.0″. Si la variable no existe se asume que es 1.0.

threadsafety: se trata de un entero de 0 a 3 que describe lo seguro que es el módulo para el uso con threads. Si es 0 no se puede compartir el módulo entre threads sin utilizar algún tipo de mecanismo de sincronización; si es 1, pueden compartir el módulo pero no las conexiones; si es 2, módulos y conexiones pero no cursores y, por último, si es 3, es totalmente thread-safe.

paramstyle: informa sobre la sintaxis a utilizar para insertar valores en la consulta SQL de forma dinámica.

o qmark: interrogaciones. sql = “select all from t where valor=?”

Page 119: programacion de interfaces

119

o numeric: un número indicando la posición. sql = “select all from t where valor=:1″

o named: el nombre del valor. sql = “select all from t where valor=:valor”

o format: especificadores de formato similares a los del printf de C. sql = “select all from t where valor=%s”

o pyformat: similar al anterior, pero con las extensiones de Python. sql = “select all from t where valor=%(valor)”

o Veamos los valores correspondientes a sqlite3: >>> import sqlite3 as dbapi >>> print dbapi.apilevel 2.0 >>> print dbapi.threadsafety 1 >>> print dbapi.paramstyle Qmark Excepciones A continuación podéis encontrar la jerarquía de excepciones que deben proporcionar los módulos, junto con una pequeña descripción de cada excepción, a modo de referencia. StandardError |__Warning |__Error |__InterfaceError |__DatabaseError |__DataError |__OperationalError |__IntegrityError |__InternalError |__ProgrammingError |__NotSupportedError

StandardError: Super clase para todas las excepciones de DB API. Warning: Excepción que se lanza para avisos importantes. Error: Super clase de los errores. InterfaceError: Errores relacionados con la interfaz de la base de datos, y

no con la base de datos en sí. DatabaseError: Errores relacionados con la base de datos. DataError: Errores relacionados con los datos, como una división entre

cero. OperationalError: Errores relacionados con el funcionamiento de la base de

datos, como una desconexión inesperada. IntegrityError: Errores relacionados con la integridad referencial. InternalError: Error interno de la base de datos. ProgrammingError: Errores de programación, como errores en el código

SQL. NotSupportedError: Excepción que se lanza cuando se solicita un método

que no está soportado por la base de datos.

Page 120: programacion de interfaces

120

Uso básico de DB-API Pasemos ahora a ver cómo trabajar con nuestra base de datos a través de DB-API. Lo primero que tendremos que hacer es realizar una conexión con el servidor de la base de datos. Esto se hace mediante la función connect, cuyos parámetros no están estandarizados y dependen de la base de datos a la que estemos conectándonos. En el caso de sqlite3 sólo necesitamos pasar como parámetro una cadena con la ruta al archivo en el que guardar los datos de la base de datos, o bien la cadena ":memory:" para utilizar la memoria RAM en lugar de un fichero en disco. Por otro lado, en el caso de MySQLdb, connect toma como parámetros la máquina en la que corre el servidor (host), el puerto (port), nombre de usuario con el que autenticarse (user), contraseña (password) y base de datos a la que conectarnos de entre las que se encuentran en nuestro SGBD (db). La función connect devuelve un objeto de tipo Connection que representa la conexión con el servidor. >>> bbdd = dbapi.connect("bbdd.dat") >>> print bbdd <sqlite3.Connection object at 0x00A71DA0> Las distintas operaciones que podemos realizar con la base de datos se realizan a través de un objeto Cursor. Para crear este objeto se utiliza el método cursor() del objeto Connection: view plaincopy to clipboardprint?

1. c = bbdd.cursor() Las operaciones se ejecutan a través del método execute de Cursor, pasando como parámetro una cadena con el código SQL a ejecutar. Como ejemplo creemos una nueva tabla empleados en la base de datos: view plaincopy to clipboardprint?

1. c.execute("""create table empleados (dni text, 2. nombre text, 3. departamento text)""")

y a continuación, insertemos una tupla en nuestra nueva tabla: view plaincopy to clipboardprint?

1. c.execute("""insert into empleados 2. values ('12345678-A', 'Manuel Gil', 'Contabilidad')""")

Si nuestra base de datos soporta transacciones, si estas están activadas, y si la característica de auto-commit está desactivada, será necesario llamar al método commit de la conexion para que se lleven a cabo las operaciones definidas en la transacción. Si en estas circunstancias utilizáramos una herramienta externa para comprobar el contenido de nuestra base de datos sin hacer primero el commit nos encontraríamos entonces con una base de datos vacía. Si comprobáramos el contenido de la base de datos desde Python, sin cerrar el cursor ni la conexión, recibiríamos el resultado del contexto de la transacción, por lo que parecería que se han llevado a cabo los cambios, aunque no es así, y los cambios sólo se aplican, como comentamos, al llamar a commit. Para bases de datos que no soporten transacciones el estándar dicta que debe proporcionarse un método commit con implementación vacía, por lo que no es

Page 121: programacion de interfaces

121

mala idea llamar siempre a commit aunque no sea necesario para poder cambiar de sistema de base de datos con solo modificar la línea del import. Si nuestra base de datos soporta la característica de rollback también podemos cancelar la transacción actual con: view plaincopy to clipboardprint?

1. bbdd.rollback() Si la base de datos no soporta rollback llamar a este método producirá una excepción. Veamos ahora un ejemplo completo de uso: view plaincopy to clipboardprint?

1. import sqlite3 as dbapi 2. 3. bbdd = dbapi.connect("bbdd.dat") 4. cursor = bbdd.cursor() 5. 6. 7. cursor.execute("""create table empleados (dni text, 8. nombre text, 9. departamento text)""") 10. 11. cursor.execute("""insert into empleados 12. values ('12345678-A', 'Manuel Gil', 'Contabilidad')""") 13. 14. bbdd.commit() 15. 16. 17. cursor.execute("""select * from empleados 18. where departamento='Contabilidad'""") 19. 20. for tupla in cursor.fetchall(): 21. print tupla

Como vemos, para realizar consultas a la base de datos también se utiliza execute. Para consultar las tuplas resultantes de la sentencia SQL se puede llamar a los métodos de Cursor fetchone, fetchmany o fetchall o usar el objeto Cursor como un iterador. view plaincopy to clipboardprint?

1. cursor.execute("""select * from empleados 2. where departamento='Contabilidad'""") 3. 4. for resultado in cursor: 5. print tupla

El método fetchone devuelve la siguiente tupla del conjunto resultado o None cuando no existen más tuplas, fetchmany devuelve el número de tuplas indicado por el entero pasado como parámetro o bien el número indicado por el atributo Cursor.arraysize si no se pasa ningún parámetro (Cursor.arraysize vale 1 por defecto) y fetchall devuelve un objeto iterable con todas las tuplas. A la hora de trabajar con selects u otros tipos de sentencias SQL es importante tener en cuenta que no deberían usarse los métodos de cadena habituales para construir las sentencias, dado que esto nos haría vulnerables a ataques de

Page 122: programacion de interfaces

122

inyección SQL, sino que en su lugar debe usarse la característica de sustitución de parámetros de DB API. Supongamos que estamos desarrollando una aplicación web con Python para un banco y que se pudiera consultar una lista de sucursales del banco en una ciudad determinada con una URL de la forma http://www.mibanco.com/sucursales?ciudad=Madrid Podríamos tener una consulta como esta: view plaincopy to clipboardprint?

1. cursor.execute("""select * from sucursales 2. where ciudad='" + ciudad + "'""")

A primera vista podría parecer que no existe ningún problema: no hacemos más que obtener las sucursales que se encuentren en la ciudad indicada por la variable ciudad. Pero, ¿qué ocurriría si un usuario malintencionado accediera a una URL como “http://www.mibanco.com/sucursales?ciudad=Madrid’;SELECT * FROM contrasenyas”? Como no se realiza ninguna validación sobre los valores que puede contener la variable ciudad, sería sencillo que alguien pudiera hacerse con el control total de la aplicación. Lo correcto sería, como decíamos, utilizar la característica de sustitución de parámetros de DB API. El valor de paramstyle para el módulo sqlite3 era qmark. Esto significa que debemos escribir un signo de interrogación en el lugar en el que queramos insertar el valor, y basta pasar un segundo parámetro a execute en forma de secuencia o mapping con los valores a utilizar para que el módulo cree la sentencia por nosotros. view plaincopy to clipboardprint?

1. cursor.execute("""select * from sucursales 2. where ciudad=?""", (ciudad,))

Por último, al final del programa se debe cerrar el cursor y la conexion: view plaincopy to clipboardprint?

1. cursor.close() 2. bbdd.close()

Tipos SQL En ocasiones podemos necesitar trabajar con tipos de SQL, y almacenar, por ejemplo, fechas u horas usando Date y Time y no con cadenas. La API de bases de datos de Python incluye una serie de constructores a utilizar para crear estos tipos. Estos son:

Date(year, month, day): Para almacenar fechas. Time(hour, minute, second): Para almacenar horas. Timestamp(year, month, day, hour, minute, second): Para almacenar

timestamps (una fecha con su hora). DateFromTicks(ticks): Para crear una fecha a partir de un número con los

segundos transcurridos desde el epoch (el 1 de Enero de 1970 a las 00:00:00 GMT).

TimeFromTicks(ticks): Similar al anterior, para horas en lugar de fechas. TimestampFromTicks(ticks): Similar al anterior, para timestamps. Binary(string): Valor binario.

Otras opciones

Page 123: programacion de interfaces

123

Por supuesto no estamos obligados a utilizar DB-API, ni bases de datos relacionales. En Python existen módulos para trabajar con bases de datos orientadas a objetos, como ZODB (Zope Object Database) y motores para mapeo objeto-relacional (ORM) como SQLAlchemy, SQLObject o Storm. Además, si utilizamos IronPython en lugar de CPython tenemos la posibilidad de utilizar las conexiones a bases de datos de .NET, y si utilizamos Jython, las de Java. 4.- Utilizando Tcl/Tk

Actividades a realizar

Crear Conexión

Abrir Conexión (Openconnection)

Iniciar Transacción (Begin Transaction)

Queries... (Insert, Select, Update, Delete...)

-Error (Abort Transaction)

Procesar resultados (Print, a= , b= )

Asegurar Transacción (End Transaction)

Cerrar Conexión (Closeconnection)

Error Handling

Es muy importante manejar los errores:

1) Mantener informado al usuario 2) Poder recuperarse de ellos

Causas de errores

Page 124: programacion de interfaces

124

1) Errores de sintáxis en expresiones de queries 2) Problemas de privilegios en determinadas tablas o bases de datos 3) Caídas del DBMS: luz, espacio en disco, NFS.

8.1.4 Terminología

Conexión: Línea de comunicación entre nuestro programa y el dbms

Result Set:

Resultados de un querie (select)a la base de datos, se compone de renglones (rows).

valor valor valor

valor valor valor

valor valor valor

valor valor valor

Nota:

Queries que no involucren resultsets devuelven un número entero asociado a las tuplas afectadas

Result Set MetaData:

Metadatos de un result set (nombres de atributos, tipos de datos)

Atrib1, Tipo

Atrib2, Tipo

Atrib3, Tipo

Row:

Un renglón (tupla) obtenidas de un query y que a su vez contiene las distintas columnas (valores atributos) de dicha operación.

valor valor valor

Transacción: Unidad de programa que accede y posiblemente actualiza varios elementos de información

5.- Utilizando Visual Basic Para enteder como funciona la tecnologia de ADO.Net necesitamos dejar claros algunos conceptos: Connection: Proporciona una conexión usada para comunicarse con la fuente de datos. También actúa como Abstract Factory para los objetos command. Command: Usado para realizar alguna acción en la fuente de datos, como lectura, actualización, o borrado de datos relacionales. Parameter: Describe un simple parámetro para un command. Un ejemplo común es un parámetro para ser usado en un procedimiento almacenado.

Page 125: programacion de interfaces

125

DataAdapter: “Puente” utilizado para transferir data entre una fuente de datos y un objeto DataSet (ver abajo). DataReader: Es una clase usada para procesar eficientemente una lista grande de resultados, un registro a la vez. Como verán nos ofrece interactuar con una base de datos, sin importar el proveedor. Crear la base de datos: Lo primero será crear una base de datos llamada Usuarios y una tabla llamada Datos con las siguientes características: ID Entero Autoincrementable Nombre Carácter No nulo Edad Entero No nulo Hobbies Carácter No nulo Y serán todos los elementos, nos enfocaremos al uso de la tecnologia ADO.Net en un ejemplo fácil pero entendible. VB + SQL Server Primero necesitamos crear un nuevo proyecto, y que sea una aplicación de escritorio, al parecer este modo será mas fácil, ya que SQL Server es el gestor de BD por defecto en la plataforma .Net. Sino estas muy bien familiarizado con bases de datos, puedes utilizar Microsoft SQL Server Management Studio en su versión express. Lo primordial será diseñar nuestro formulario: Bibliografía http://www.google.com.mx/#q=INTERFACES+A+BASES+DE+DATOS+utilizando+java&hl=es-419&rlz=1R2ADSA_esMX472&prmd=imvns&ei=W6brT-u5MKas2wX4rPy_AQ&start=60&sa=N&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=872da61f88ac79ee&biw=1229&bih=817 http://www.tutorialesfacil.com.ar/php/BasedeDatos.htm http://mundogeek.net/archivos/2008/06/25/bases-de-datos-en-python/ http://www.g3ekarmy.com/crea-tu-aplicacion-vb-net-bd-oracle-sql-server-mysql/