Herramientas del Profesor. Google Forms


En muchas ocasiones tenemos que realizar un pequeño test, una encuesta o simplemente lanzar un formulario para tener los datos o las respuestas de un número de personas:
  • Si eres educador, y quieres realizar un pequeño test de control para conocer el nivel de tus alumnos.
  • Si eres alumno y quieres incorporar estadísticas de las respuestas de un grupo de personas.
  • Si en ciclos formativos quieres conocer o realizar una encuesta entre las empresas con las que tienes contacto.
  • Si dentro del departamento símplemente quieres recoger las valoraciones de los compañeros.
En estos y otras muchas mas aplicaciones, la herramienta de Google Forms es perfecta para realizar estas encuestas y tests. Por ese motivo vamos a ver y realizar tanto un pequeño test como conocer como enviarlo, así como recoger las respuestas y analizarlas

Primer paso. Crear un Test o Formulario

Nos ponemos manos a la obra y el primer paso será generar un nuevo test. Para ello necesitaremos una cuenta gratuita en Gmail, y mi recomendación es la utilización del Navegador Chrome. Una de las ventajas que no hemos comentado en la introducción es que la herramienta se utiliza y almacena en la "nube". Esto es fantástico ya que podremos acceder, visualizar, utilizar y modificar nuestros formularios desde cualquier ordenador.


Segundo paso. Recoger respuestas

Una vez que tenemos realizado un primer test o encuesta tenemos que enviarlo a nuestros alumnos y/o clientes. En el vídeo aprenderéis dos formas de poder realizar esta acción:
  • Correo: Google Forms permite la opción de poder enviar el formulario/test a los usuarios que les indiquemos via correo.
  • Enlace: Otro mecanismo es copiar el link del formulario y publicarlo en nuestro blog, en moodle, en nuestra web o incluso enviar un correo electrónico con dicho link.
A partir de este envío, comenzaremos a recibir respuestas que podremos analizar directamente a través de nuestro formulario o bien a través de un excel que generemos.

Java. Creación de una interfaz para el Registro y Login de usuario

En prácticamente todas las aplicaciones que pensemos realizar interacción con base de datos vamos a necesitar dos interfaces iniciales para arrancar nuestra aplicación.
  • Login A través de esta ventana recogemos el usuario y su contraseña para poder acceder a nuestra aplicación con un determinado usuario recogido desde la BBDD
  • Registo A través de esta interfaz realizamos la inserción en la base de datos de un nuevo usuario para poder acceder a la aplicación
El siguiente ejemplo es un poco más largo que las anteriores aportaciones sin embargo nos permitirá ver paso a paso y con mucho detalle cómo poder crear dichas dos ventanas.


Plantilla
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
PLANTILLA
Paso 1. Creando el esqueleto
Siguiendo la metodología MVC , crearemos el esqueleto dentro de nuestro ejemplo/aplicación que nos permita separar nuestro código en Modelo, Vistas y la parte de Controlador. De esta forma será mucho más sencillo posteriormente poder mantener nuestro código y realizar ampliaciones futuras.



Paso 2. Creando las interfaces
Tal y como hemos visto en anteriores lecciones, el uso de los Managers (Managers básicos o Managers más avanzados), nos permite estructurar de una forma ordenada todos los elementos de nuestras interfaces, hacienddo que se redistribuyan de acuerdo a unas dimensiones dependientes del dispositivo donde se visualiza la aplicación. En nuestro caso utilizaremos principalmente el GridBagLayout.



Paso 3. Contraseña
En el momento que trabajamos con usuarios y contraseñas, entramos en un mundo bastante delicado donde es muy muy importante utilizar adecuadamente los sistemas de seguridad para mantener a salvo contraseñas. Uno de esos elementos es el JPasswordField, que aunque resulta muy parecido en apariencia con el JTextField, internamente utiliza métodos más seguros pero por otro lado un poco más complejos de utilizar.




Paso 4. Formulario de Registro
En la ventana de registro es importante realizar una comprobación de todos los campos, en primer lugar para que no estén vacíos, en segundo lugar en su corrección de forma y contenido. En este segundo caso no realizaremos un análisis exhaustivo de cómo realizarlo, sin embargo dejaremos perfectamente descrito el proceso general y en particular el más crítico como es el de las contraseñas.




Paso 5. Inserción de nuevo usuario
El siguiente paso es comenzar a interactuar entre las dos ventanas de creadas y la base de datos. Para ello introduciremos lo aprendido sobre inserción en base de datos, recuperar información o actualizar la base de datos, sin perder de vista incluir el patrón SingleTon para manejar las conexiones de contra la base de datos.




Más complicado será generar el hash en MD5 para poder almacenar nuestra contraseña en la base de datos, ya que no podemos almacenarla como un texto plano, sería un problema de seguridad. Sin entrar en detalles utilizaríamos la clase MessageDigest, que nos permite realizar dicha operación:
// Cargamos en ejecución
      m = MessageDigest.getInstance("MD5");
      m.reset();
      byte[] digest = m.digest(toBytes(pass));

Paso 6. Finalizando y comprobando usuario
Por último sólo nos queda por comprobar el usuario y su login a través de la pantalla de logado. Para poder realizarlo reutilizaremos el código inicial añadiendo tanto una consulta a la base de datos con la que comprobamos el usuario y la librería MD5 para la contraseña introducida.


Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
CÓDIGO EN GITHUB

Java. Actualizando la base de datos



Siguiendo con la dinámica de trabajo con la base de datos de Java, después de haber visto la sentencia SELECT e INSERT, le llega el turno a la de UPDATE.
Una actualización necesita de dos informaciones para que resulte efectiva:
  • Los datos que se necesitan para poder actualizar la información.
  • La fila y el identificador necesario para poder actualizar dicho registro

Plantilla
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
PLANTILLA
PreparedStatement

La clase PreparedStatement la podemos revisar en los documentos de Oracle con fantásticos ejemplos para poder utilizar directamente sobre nuestro código. Debido a que la acción de actualizar los datos de un registro es un poco más complejo que una búsqueda o inserción, podemos utilizar clases que permiten separar la parte de definición de la consulta de los datos mismos, haciendo mucho más flexible la construcción y ejecución de la misma.


Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
CÓDIGO EN GITHUB

Orgulloso de ser de Ciclos Formativos


Que quien es este personaje que aparece en la foto, pues Ricardo Boluda, un alumno que he tenido en DAW (Desarrollo de aplicaciones Web) en Florida Universitaria. Hablar de Ricardo es una excusa para hablar del orgullo y la satisfacción que me produce ser educador en ciclos formativos y en concreto en desarrollo tanto en Web, como en multiplataforma, como en móviles.

Como Ricardo tengo muchos muchos alumnos. De hecho hablando hace poco con compañeros de profesión, les hablaba de la suerte que tengo ya que los alumnos vienen motivados ya de casa, vienen con verdaderas ansias por aprender, y en estas etapas educativas "el alumno raro" es el que no viene con esas ganas de saber mucho más allá de lo que el temario nos marca.

No es raro, tener a alumnos como Ricardo, donde decide que para mejorar su formación, prefiere abandonar un puesto de trabajo o aplazar sus prácticas obligatorias para realizar de forma super intensiva una formación como la de IronHack. Y hace poco me envió el blog en el que está contando su experiencia, codigoaloloco.wordpress.com (como se nota que el diseño se te da muy bien). Que envidia tan insana tengo de no poder estar donde tu estas.

Orgulloso de ser de ciclos

Como marca el título de esta entrada, como profesor/educador de esta etapa, estoy muy orgulloso de lo que se ofrece, del esfuerzo que dedicamos los educadores, del esfuerzo del alumnado, del esfuerzo de los centros. Y de todo esta experiencia el único reproche es para la sociedad española, tan atrasada en este y otros aspectos, y en muchos orientadores de centros, ya que se sigue considerando a los ciclos formativos como el hermano pequeño de los estudios, "si no vales para estudiar, vales para un ciclo"

Pues he de reivindicar que casos como el de Ricardo son cada vez más habituales, alumnos con mucho criterio, con incluso otras titulaciones que deciden y eligen por los ciclos (que para quien no lo sepa son ESTUDIOS SUPERIORES como los grados universitarios, al menos las versiones de ciclos superiores). Y que tienen un éxito muy grande ya que actualmente en ell centro donde trabajo tenemos problemas para encontrar suficientes alumnos para tanta demanda de trabajo que existe.

Y dicho esto, voy a intentar recopilar las experiencias que me puedan transmitir ellos, ya que son ellos, mis alumnos los verdaderos responsables de este orgullo (os pongo un vídeo sobre una actividad realizada con makey makey)


makey makey from Florida Universitaria on Vimeo.

Java. Patrón SingleTon


Tal y como indico en el primer vídeo, la definición y documentación que aparece en la Wikipedia sobre el patrón SingleTon, me parece excelente. Por ese motivo me remito a su definición:
“En ingeniería de software, el patrón singleton (instancia única en inglés) es un patrón de diseño diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto. Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.”
Por lo tanto que nos va a permitir esta metodología o patrón, en primer lugar poder acceder desde cualquier parte de nuestro proyecto y/o aplicación a dicho objeto sin necesidad de ir "pasando" el objeto por el constructor o por un método. En segundo lugar asegurarnos de que el objeto es único.

Plantilla
Si eres educador o profesor utiliza la siguiente plantilla para tus alumnos
PLANTILLA
Utilizándolo con BBDD

Uno de los usos más directos y útiles es cuando utilizamos el patrón junto con nuestras clases de BBDD, y en concreto con la clase que se encarga de la conexión a la base de datos. Una vez que nos hemos conectado a la base de datos, nos interesa mantener abierta dicha conexión, y sobre todo que SEA ÚNICA, ya que esto si que sería un problema importante y una fuga de memoria


Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
CÓDIGO EN GITHUB

Android. Leyendo JSON desde un servicio web


Desde Android y en general desde tecnología de desarrollo para móviles, el uso de interfaces o librerías para atacar a bases de datos es totalmente imposible por varias razones:
  • La principal es para evitar problemas de seguridad. Un usuario que está más o menos registrado realizaría accesos a la base de datos, al final, lo más importante de las aplicaciones de una forma directa y no controlada
  • Escalabilidad y mantenimmiento. Tener el desarrollo preparado para realizar todo el proceso contra una tecnología de base de datos no proporciona la escalabilidad para poder realizar cambios o mejoras
Por este motivo es necesario poder realizar consultas a servicios en la nube que nos permita devolver contenido e incorporar a nuestra aplicación. Y actualmente el protocolo más legible, rápido y fácil de incorporar es el uso de JSON

Conexión al servicio
El primer e importante paso es conectarnos al servicio web o API que nos proporcione los datos necesarios, es decir el JSON para comenzar a tratar los datos.
Para ello utilizaremos los datos que nos proporciona el ayuntamiento de Valencia en el Portal de datos abiertos, y en concreto utilizaremos los datos referentes a las cámaras de tráfico y seguridad de Valencia.
Y ¿cómo hacemos esto? Pues tan sencillo o complicado como utilizando la clase AsynTask y HttpURLConnection de Android. El código en concreto sería el siguiente acompañado por supuesto de la explicación en vídeo:
// Setup the connection with the DB
        //Esta clase realizará la conexión devolviendo el JSON
        @Override
        protected JsonReader doInBackground(String... args) {
            String temp = "";
            try {
                URL url = new URL(urlCamaras);
                urlConnection = (HttpURLConnection) url.openConnection();
                temp = urlConnection.getResponseMessage();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
                CameraJSONReader cJSONReader=new CameraJSONReader();
                try {
                    camaras = cJSONReader.readJSONMsg(reader);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) urlConnection.disconnect();
                return reader;
            }
        }


Parseando el JSON
El segundo paso es parsear los datos de acuerdo a nuestras necesidades y la estructura del JSON, para este procedimiento no existe un único método ni mecanismo de realizar el proceso ya que el objetivo, la aplicación y el documento JSON serán diferentes
En nuestro caso planteamos un ejemplo haciendo uso de la clase JSONReader, que permite avanzar y parsear el Buffer recogido de la conexión
Un trozo de ejemplo sería el siguiente, aunque para entender correctamente su funcionamiento es mejor visualizar el vídeo:
// Setup the connection with the DB
        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            Log.i("MENSAJE","LLEGO A JSON");
            if (name.equals("features")) {
                //Estamos en el array de camaras
                Log.i("MENSAJE","ENTRO EN FEATURES");
                reader.beginArray();
                while (reader.hasNext()) {
                    camaras.add(readCamara(reader));
                    Log.i("MENSAJE","CAMARA AÑADIDA");
                }
                reader.endArray();
            }else {
                reader.skipValue();
            }
        }


Descárgate o visualiza el código utilizado en el vídeo través de mi cuenta en GitHub
CÓDIGO EN GITHUB