T.A.P.

Técnicas Actuales de Programación

Curso: 2017/18

Calendario

Septiembre
LMMJV
     1
 45678
[1]1112131415
[2]1819202122
[3]2526272829
Octubre
LMMJV
[4]23456
[5]910111213
[6]1617181920*
[7]23242526**27*
[8]3031   
Noviembre
LMMJV
[8]  12**3
[9]678lab910
[10]13lab14151617
[11]202122lab2324
[12]272829lab30 
Diciembre
LMMJV
[12]    1
[13]45678
[14]111213lab1415
[15]1819202122
 2526272829
 N  no lectivo,  N  fiesta,  N  estudio,  N  exámenes, N N clase, N clase anulada

Clases: {aula: 0.20S} {horario: jueves 10:40-11:30, viernes 9:40-11:30 ( *8:40-10:00 y 10:20-11:30;     ** 8:40-9:30 y 10:40-11:30) }
Laboratorios: {aula: 0.22} {horario: 15:00-17:30}
Tutorias: {con las excepciones que se indiquen en GAUR, generalmente, J 8:00-10:00, V 8:00-9:00, JV 12:00-13:30}
Fecha de examen con ordenador (fecha oficial de facultad):
Fecha límite de entrega de proyectos: 5/2/2018 08:00 (9 días después del último examen de 1er cuatrimestre).

Programa

El programa de la asignatura se corresponde casi en su totalidad con un curso de Java, puesto que es posiblemente el lenguaje que mejor soporta las técnicas actuales de programación. A lo largo del desarrollo del curso se irán destacando las técnicas que Java incluye o facilita.

Según las previsiones de desarrollo de Oracle, a la fecha de comienzo del curso, debería ser ya oficial la versión 9 estable de Java, pero recientemente comunicaron un retraso y por tanto se utilizará la versión 8.

La versión 9 introducirá una característica importante en cuanto a la estructuración de los desarrollos de software, como es la posibilidad (obligación) de organizar todo en módulos. Podemos aprender de ello en un vídeo, si bien hay que conocer previamente cuando menos los elementos básicos del desarrollo en Java. El vídeo (en inglés, duración: 1 hora): [en Youtube] [copia local]. Trataremos el tema cuando lleguemos al punto 4.4 del temario.

La versión 8 introdujo, entre otras características, la "programación funcional". No se estudirá esto en el curso (sí se comentará en qué consiste y se pondrá en contexto) porque en la práctica supone introducir una visión muy distinta de la programación más extendida (la "imperativa") y no se dipone de tiempo (que además no sería poco... puede ser un curso aparte).

Temario

Documentación de utilidad:
* La referencia definitiva del lenguaje Java {suficiente: versión 7} {actual: versión 9}
* La documentación de la plataforma SE{suficiente: versión 7} {actual: versión 9}
* Los "tutoriales" de Java

Evaluación

Convocatoria ordinaria

Acceso al estado de evaluación personalizado

Nota: antes de entregar cualquier ejercicio hay que, por lo menos, "adecentar" el código. Lo correcto sería incluso escribir la documentación, pero por lo menos hay que dejarlo "listo para revista": eliminar ficheros abandonados, lineas de código de prueba, etc...

Convocatoria extraordinaria

Desarrollo

SEPTIEMBRE

Jueves 14 de septiembre de 2017
Viernes 15 de septiembre de 2017

TEMA 1 - INTRODUCCIÓN

Jueves 21 de septiembre de 2017
Viernes 22 de septiembre de 2017

TEMA 2 - USO DEL ENTORNO DE DESARROLLO

Jueves 28 de septiembre de 2017
Viernes 29 de septiembre de 2017

Adelanto de los puntos 1 y 2 del
TEMA 6 - INTERFACES GRÁFICOS

OCTUBRE

Jueves 5 de octubre de 2017

Volvemos al
TEMA 2 - USO DEL ENTORNO DE DESARROLLO

Jueves 19 de octubre de 2017
  • Como van apareciendo versiones de la calculadora...
    • Recomendaciones de qué hacer y qué no...
      • múltiples main(.), MVC y el JFrame en nuestra aplicación.
      • identificadores a todos los niveles (convenio de nombrado, idoneidad, ...)
      • refactoring, búsquedas, ...
    • Hablaremos de espacios de nombres ... más mañana
Viernes 20 de octubre de 2017
  • Continuamos con comentarios a raiz de las calculadoras...
    • espacios de nombres... (ejemplos aquí)
    • sobre el uso de FreeDesign (GroupLayout).
    • ya generamos ejecutables: qué es un "jar"
La materia que comenzamos aquí, temas 3, 4 y 5, es objeto del primer examen.

TEMA 3 - ELEMENTOS BÁSICOS DEL LENGUAJE

Jueves 26 de octubre de 2017
Obtención del número Pi mediante aproximación por serie.

Se trata de calcular el número π con precisión de cuatro decimales mediante la serie:

La especificación de cuatro decimales hace referencia al criterio de parada en la suma de términos de la serie, no a la presentación de la solución, que se hará normalmente mediante System.out.println(.) y que nos mostrará un número de decimales que no podemos controlar por ahora.

Una solución:
Obtención de números Perfectos

Escriba una RUTINA que determine si un número dado es perfecto o no.

static boolean isPerfect(long n) {
                    boolean esPerfecto=false;
                    //TODO hacer lo necesario para que "isPerfect" refleje si n es perfecto o no.
                    return esPerfecto;
                }

Un número perfecto es un entero positivo igual a la suma de sus divisores propios. Los divisores propios de un entero positivo son todos sus divisores a excepción de sí mismo. (Ejemplo de número perfecto: el 6, porque sus divisores propios son 1, 2 y 3 y 6=1+2+3.)

Utilizando dicha rutina debera obtener una lista de números perfectos entre el 1 y el 100.000

Resultado de la ejecución:
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064

Listado de Números Perfectos [pdf]

TEMA 4 - ELEMENTOS RELACIONADOS CON LA ORIENTACIÓN A OBJETOS

Viernes 27 de octubre de 2017
  • corrección de errores: "extends" en definición de clase, y rangos de enteros.

Adelanto del punto 3 del
TEMA 6 - INTERFACES GRÁFICOS

Volvemos al
TEMA 4 - ELEMENTOS RELACIONADOS CON LA ORIENTACIÓN A OBJETOS

NOVIEMBRE

Jueves 2 de noviembre de 2017
  • Sobre los ejercicios propuestos...
  • Algo no encaja del todo en la Orientación a Objetos: las clases "maleta"
Viernes 3 de noviembre de 2017
  • Revisamos un ejercicio para el calculo de Pi en la pizarra para establecer algunas ideas...:
    - Aunque funcione, hay que revisarlo por si es mejorable.
    - Si cambiamos algo, probar siempre si continua funcionando (hay que hablar de clases de test más adelante)
    - No hay que olvidar que los comentarios son importantes y también hay que revisarlos para dejarlos bien
    - En resumen, hay que terminar con una pieza de código impecable: eficaz, confiable y robusta además de clara para el mantenimiento.
  • Vemos que en el ejercicio de Perfectos ya hay soluciones...
Miercoles 8 de noviembre de 2017 [LABO 0.22, 15:00-17:30]
Jueves 9 de noviembre de 2017
Viernes 10 de noviembre de 2017
  • Hablar de Proyectos...

TEMA 5 - MECANISMO DE TRATAMIENTO DE EXCEPCIONES Y ERRORES

Lunes 13 de noviembre de 2017 [LABO 0.22, 15:00-17:30]
Completar (a discreción) la práctica y añadir la posibilidad de que las matrices sean "Inmutables".

Nada qe añadir :-)

Jueves 16 de noviembre de 2017
  • Encuesta de opinión del alumnado
Viernes 17 de noviembre de 2017
  • Primera hora: examen de test.
  • He localizado una respuesta a porqué Java no tiene sobrecarga de operdores: fue una opción personal de James Gosling (de la que se arrepiente). Puede leerse en esta entrevista cuando responde a la sexta pregunta.
Miercoles 22 de noviembre de 2017 [LABO 0.22, 15:00-17:30]

Finalizamos con el punto 3 el
TEMA 6 - INTERFACES GRÁFICOS

Usamos esta práctica para ver lo referente a gráficos en GUIs

Variante de JPanel "especial"

Fabricar otra subclase de JPanel con un método que pueda recibir un array dobles y representarlos como histograma.
Cuidar un poco la presentación para que no resulte "desagradable".

Como idea "extra": el mismo panel podría incluir un slider (llevarlo ya integrado) de modo que al desplazarlo permitiría variar el ancho y la separación de las baras del histograma.

Más ideas "extras": pueden hacerse paneles similares para "diagramas de tarta", otros tipos de gráficas; también para otros "gadgets"... velocímetros, relojes,...

Jueves 23 de noviembre de 2017
  • Aquí está una "solución" a la práctica de ayer: proyecto Netbeans PaintOnJPanel.
    OJO!: Como el JFrame lleva un componente que el editor gráfico de Netbeans desconoce (nuestro JPanel "especial"), al abrir el fichero del JFrame sale un mensaje "protestando" y dando una serie de opciones. Lo único que necesitamos para evitar esto es que el editor encuentre la clase ya compilada de nuestro componente, por lo que basta con hacer un "clean and build" antes de nada (menú sobre el icono del proyecto).

TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES


Los primeros apartados de este tema consisten en el estudio de diversas clases imprescindibles por diversos motivos.
Usaremos la versión 7 de la documentación, porque la 8 se complica en exceso en determinados puntos (principalmente Colecciones) y se sale de lo que podemos hacer en un curso con el tiempo disponible y en que no vemos programación funcional.
(ni qué decir de la versión 9, que no nos resulta operativa aún, aunque en este caso no complica en exceso la API frente a la versión 8)
Un acceso "agradable" a la documentación de la versión 9 se encuentra aquí
Viernes 24 de noviembre de 2017

La práctica siguiente nos obliga a adelantar el
TEMA 8 - Entrada y salida de datos

Miercoles 29 de noviembre de 2017 [LABO 0.22, 15:00-17:30]

Aunque sea en el laboratorio, necesitamos ver todo lo siguiente...lo haremos muy rápidamente

Aunque sea en el laboratorio, necesitamos ver todo lo siguiente...lo haremos muy rápidamente
TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES

Y ahora la práctica:

Alterar lo hecho en el laboratorio para ejecutar la "Tarea 2" sin que sea necesario descargar el fichero de datos

...es decir el programa deberá acceder a la URL "http://gtts.ehu.es/German/Docencia/1718/TAP/labo/udhr.zip" directamente y, teniendo en cuenta que no recibimos texto sino un "zip", trabajar con su contenido (estudiar el paquete java.util.zip)

ADVERTENCIA: la solución no es dificil, pero puede ser muy "retorcida" si no se plantea bien (este ejercicio va a tener más peso que otros :-).

Jueves 30 de noviembre de 2017
    Ayer en el laboratorio surgió otro "resto" del tema de I/O
  • El "try" con recursos... cierre de streams.

TEMA 9 - Hilos

DICIEMBRE

Viernes 1 de diciembre de 2017
  • Continuamos con Hilos [pdf].

TEMA 10 - Cliente/servidor

  • Tiempo para hablar de los proyectos:
    • expresiones regulares "arañando" esta web
      Aquí [zip] un proyecto Netbeans con una sencilla clase para hacer "scraping" y otra con una prueba concreta.
      Sin complicarlo casi nada he "añadido" algunas cosas que pueden ser interesantes: la clase se ajusta al patrón "Iterator", se usa un "logger" para registrar mensajes de advertencia,...
      Mirad el código para ver cómo funciona. Para entender su comportamiento la documentación en HTML es más clara.
Miercoles 13 de diciembre de 2017 [LABO 0.22, 15:00-17:30]
  • Uso del debugger
Jueves 14 de diciembre de 2017

Hemos resuelto la práctica de ayer, y la hemos utilizado para ver un poco el "profiler". Este es el proyecto (con algún retoque mínimo como poner correctamente el hilo del panel como un daemon, o compactar el paint con uso del operador ?: (comentario sobre "Elvis"→groovy -eliminando ceremonia-... ver más abajo argumentos variables en Java con Formatter"))

Viernes 15 de diciembre de 2017
  • Comentario sobre el Scraper y la solución al último labo enlazada desde el día de ayer.
  • Tiempo para hablar de los proyectos:
    • Uso de HTML en Swing (p.ej.) (cursito de HTML extremadamente antiguo y simple -pero esa es su virtud-)
    • Bases de datos (tablas)
  • Esta pendiente... comprobar la ejecución de las soluciones a Perfectos

Pasamos demasiado rápidos sobre el
TEMA 7 - EL CONTENIDO DE LA BIBLIOTECA DE CLASES

  • Sobre java.util pasamos muy rápido... hay cosas interesantes por ver como Arrays (Ojo a System.ArrayCopy(.)), Date, Calendar, Locale (usado en el scraper), interfaz Comparator (aparece en la prácica Babel), Timer y TimerTask (usados en la última práctica), Formatter...
Jueves 21 de diciembre de 2017
  • Colecciones... Interfaces y clases concretas.
  • Ejemplo de acceso a base de datos con MySQL
    • (instalador de MySQL).
    • Los ficheros de texto a procesar son los del alineamiento fonético de voz y actas de las sesiones del Parlamento Vasco de los días: 1, 11, 14, 15 de diciembre de 2017. No es preciso "bajarlos", accederemos a ellos directamente desde el programa.
    • Es necesario el driver JDBC para MySQL
    • La base de datos se ha construido con:
      create database actaspv;
      use actaspv;
      CREATE TABLE estadisticas (
        `id` VARCHAR(8) NOT NULL,
        `numPalabras` INT NOT NULL,
        `validas` INT NOT NULL,
        `media` DOUBLE NOT NULL,
        `desviacionTipica` DOUBLE NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE INDEX `id_UNIQUE` (`id` ASC));
                                
    • Una solución como proyecto Netbeans, y su javadoc.
Viernes 22 de diciembre de 2017
  • Ejemplo sencillo de generación de hilos: el proyecto

Extras

Directamente relacionados con el curso
Cusiosidades sobre lenguajes e ingeniería del software
No son pocos los alumnos con inquietudes relacionadas con el desarrollo de video juegos

Java Magazine

2011: premiere, nov.-dic.
2012: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct., nov.-dic.
2013: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct., nov.-dic.
2014: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct., nov.-dic.
2015: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct., nov.-dic.
2016: ene.-feb., mar.-abr., may.-jun., jul.-aug., sep.-oct., nov.-dic.
2017: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct., nov.-dec.
2018: ene.-feb., mar.-abr., may.-jun., jul.-ago., sep.-oct. nov.-dic.
2019: jan.-feb. no publicado, mar.-abr. may.-jun.
Ya no es descargable como pdf. Pueden localizarse online

"Not So Frequently Asked Questions"

En ocasiones alguna pregunta nada habitual puede ser de interés general....

He diseñado mi propio tipo de letra. ¿Cómo puedo incluirlo en mi aplicación?

El mundo del diseño de "Fonts" (cosa de las Bellas Artes) y su uso en computadoras no es trivial. Todo lo necesario para el uso con Java se encuentra en el correspondiente tutorial de Oracle. Como respuesta concreta a cómo contar con un tipo de letra propio, se puede entresacar del mismo este sencillo código:

try { GraphicsEnvironment. getLocalGraphicsEnvironment(). registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")); } catch (IOException|FontFormatException e) { /*Handle exception*/ }

donde se añade al entorno gráfico una nueva "font" que, en concreto, es de tipo "trueType" y se lee de un fichero (puede ser de otro tipo y en general leerse de cualquier "Stream" -véase documentación de Font.createFont-)

Quiero hacer un GUI de calculadora que pueda cambiar entre estándar y científica. ¿Cómo lo hago?

La manera más razonable puede ser agrupar en un par de paneles los botones que deben aparecer y desaparecer en cada caso para proceder a quitar y poner dichos paneles cuando se seleccione un modo u otro.

La siguiente imagen muestra una estructura sencilla de ejemplo: el "frame" lleva un "menuBar" donde se encuentran las dos opciones de paso de un modo a otro. Además hay un panel ("contenedorComun") para los botones que no varian entre ambos modos (componentes no visibles en la imagen) y un contenedor para intercambiar botoneras ("contenedorParaIntercambios"). Inicialmente este contenedor lleva dentro el panel de la calculadora estandar, pero se podrá intercambiar con el contenedor de la botonera cientifica que está "aparcado" en la sección "Other Components".

El modo de hacer el intercambio es extremadamente sencillo: basta con asociar a cada opción de menú su acción correspondiente como se ve en la siguiente imagen. No es otra cosa que sacar todo lo que haya en el panel (la botonera actual) y meter la botonera seleccionada. Una vez hecho esto terminamos con un "pack()" que le dice al "layoutManager" que haga su labor (que "empaquete" convenientemente el contenido)

(nota.- en sentido estricto el panel "contenedorParaIntercambios" es innecesario, pero se ha puesto por clarificar el ejemplo.)

Estoy dibujando histogramas en un JPanel... ¿Cómo puedo centrar el texto de una etiqueta?

Para esto hay que manejar la "métrica" de la fuente de texto que se usa en cada momento. La métrica de una fuente tiene que ver con una serie de conceptos medibles. En el método paint(Graphics g) se puede acceder a la fuente a través g.getFont() / g.setFont(), y la métrica se obtiene mediante g.getFontMetrix().

Es sencillo conocer la anchura de una String con la metrica activa en un momento dado: simplemente basta con usar g.getFontMetrics.stringWidth("Texto a dibujar"), que nos da el número de pixels que ocupará. El siguiente ejemplo muestra una String centrada en un punto (200,100) -con la coordenada Y en su línea base- y unas líneas cruzadas en dicho punto para comprobar que "funciona" correctamente.

x