domingo, 24 de noviembre de 2019

Evaluador de Portales de Datos Abiertos - Parte V

                                 Imagen obtenida de: https://5stardata.info/es/

Hoy vamos a hablar de la puntuación de los diferentes formatos. Esta puntuación se estableció por Tim Berners Lee hace unos años. Si lo resumimos rápidamente sería así:
  1. Cualquier formato con licencia abierta: 1 estrella. Es decir, cualquier conjunto de datos que contenga al menos un fichero y esté alojado en un portal de Datos Abiertos, tendrá al menos esta puntuación. Ejemplo: un PDF.
  2. Cualquier formato reutilizable: 2 estrellas. Si puedes descargar un fichero del Portal de Datos Abierto y puedes modificarlo, su conjunto de datos tendrá al menos 2 estrellas. Ejemplo: un fichero Excel.
  3. Formato abierto: 3 estrellas. Si ademas de editarlo, lo puedes hacer sin software propietario, este conjunto de datos tendrá 3 estrellas. Un fichero CSV.
  4. Utilización de URIs: 4 estrellas. Si en el formato se están utilizando URIs (semánticos). Ejemplo: RDF, JSON-LD, Turtle,...
  5. Utilización de Linked Data: 5 estrellas. Ademas de utilizar URIs, utilizar URIs externas a tu fuente para generar Linked Data.
Y ahora vamos a puntuar todos los formatos que aparecen en datos.gob.es, de esta forma podremos dar un paso más en el evaluador.

Los voy a escribir clasificándolos por el número de estrellas que he asignado:

Formatos con 1 estrella:


PDF
PNG
JPG

Formatos con 2 estrellas:


Atom
DBF
DGN
DjVu
DOC
DOCX
DWG
DXF
ECW
ELP
ePub
HTML
MDB
OCTET-TREAM
SHP
SOAP
TIFF
WFS
WMS
WMS-XML
XHTML
XLS
XLSX

Formatos con 3 estrellas:

ASCII
Calendar
CSV
CSW
GDB
GeoJSON
GeoRSS
GML
GPX
JSON
KML
KMZ
LAS
MARC
ODS
ODT
PC-Axis
plain
RSS
RTF
SCORM
TBX
TMX
TSV
vCard-XML
WCS
XBRL
XML

Formatos con 4 estrellas:

JSON-LD
N3
TURTLE
RDF-N3
RDF-Turtle
RDF-XML

Formatos con 5 estrellas:

De momento no voy a tratar con la quinta estrella, tendría que cargar la información y verificar que se usa Linked Data.

Formatos sin estrellas: 

Los he clasificado así, porque no son formatos como tales, la mayoría son clasificaciones inexactas, y otros como API o SOLR, son servicios que complementan el Portal de Datos Abiertos.

API
GZIP
Solr
SPARQL
SPARQL-JSON
SPARQL-XML
XML-APP

Y después de esta clasificación, solo nos falta añadir la programación y generar los informes. Pero esto lo haremos en el próximo artículo.

¿Estáis de acuerdo con esta clasificación?

domingo, 17 de noviembre de 2019

Evaluador de Portales de Datos Abiertos - Parte IV



Y seguimos con la serie del evaluador, lo primero que quiero es dar las gracias a tod@s los que han contactado conmigo por este proyecto. Vamos a seguir poco para poder generar un evaluador gracias los datos que se publican en datos.gob.es

Esta semana he generado el primer informe (aunque todavía no es el definitivo), he generado una tabla con cada organismo publicador, el número de conjuntos de datos que contiene y todos los formatos que utiliza.

El informe está en formato Markdown (como ya os comenté Github lo interpreta automáticamente) y en formato CSV, así podemos trastear con el fácilmente.

Aquí tenéis sus URLs:
Toda la lógica de generación del informe está en la clase "InformeOrganismoFormatos.java", todo sigue en el repositorio que he estado utilizando en las últimas entradas (aquí).

Lo único que hago es iterar por la estructura de datos que definimos la semana pasada e ir construyendo la salida, para al final escribirla.

Los resultados son bastante curiosos, es increíble pero hay portales que solo tienen PDFs...

En el próximo artículo, puntuaremos los diferentes formatos para poder evaluar todos los portales.

domingo, 10 de noviembre de 2019

Evaluador de Portales de Datos Abiertos - Parte III



En esta tercera entrega ya hemos empezado con la programación, el objetivo de hoy es conseguir cargar toda la información del fichero de datos.gob.es para poder evaluarla.

Si miráis el repositorio del Evaluador (https://github.com/tecnificados/evaluador) hay unas cuantas clases nuevas:
  1. OrganoPublicador: es un bean que contiene el nombre del organismo y la lista de conjuntos de datos.
  2. ConjuntoDatos: también un bean que contiene su título y la lista de formatos que tienen sus recursos.
  3. Evaluador: en esta clase está toda la lógica que traduce el contenido del fichero a los dos beans anteriores.
La función "evaluaLinea" me ha llevado más tiempo del que yo pensaba, debido a que hay celdas que son de tipo texto y tienen comas dentro. Como hago un "split" por comas, tengo que volver a juntar las celdas que tienen este comportamiento.

Estos son todos los formatos que me he encontrado, que son bastantes más de los que yo pensaba:
  • API 
  • ASCII 
  • Atom 
  • Calendar 
  • CSV 
  • CSW 
  • DBF 
  • DGN 
  • DjVu 
  • DOC 
  • DOCX 
  • DWG 
  • DXF 
  • ECW 
  • ELP 
  • ePub 
  • GDB 
  • GeoJSON 
  • GeoRSS 
  • GML 
  • GPX 
  • GZIP 
  • HTML 
  • JPG 
  • JSON 
  • JSON-LD 
  • KML 
  • KMZ 
  • LAS
  • MARC 
  • MDB 
  • N3 
  • OCTET-STREAM 
  • ODS 
  • ODT 
  • PC-Axis 
  • PDF 
  • plain 
  • PNG 
  • RDF-N3 
  • RDF-Turtle 
  • RDF-XML 
  • RSS 
  • RTF 
  • SCORM 
  • SHP 
  • SOAP 
  • Solr 
  • SPARQL 
  • SPARQL-JSON 
  • SPARQL-XML 
  • TBX 
  • TIFF 
  • TMX 
  • TSV 
  • TURTLE 
  • vCard-XML 
  • WCS 
  • WFS 
  • WMS 
  • WMS-XML 
  • XBRL 
  • XHTML 
  • XLS 
  • XLSX 
  • XML 
  • XML-APP 
  • ZIP 
En el próximo artículo empezaremos a generar informes interesantes, evaluando los distintos conjuntos de datos.

domingo, 3 de noviembre de 2019

Evaluador de Portales de Datos Abiertos - Parte II


Hoy vamos a continuar con el análisis para nuestro evaluador de Portales de Datos Abiertos.

Lo primero que necesitamos conocer son las direcciones de los distintos portales. Para esto nos vamos a ir a la URL de nuestro Portal Nacional de Datos Abiertos: https://datos.gob.es/es/catalogo, allí vamos a localizar el icono para descargar en formato CSV todos los recursos de todos los portales. Os lo señalo en rojo en la siguiente imagen:
Ahora debemos descargarlo en nuestro PC. Ahora mismo ocupa casi 58 megas, y contiene 24.951 líneas.

Para abrirlo y trastear con el fichero, os recomiendo utilizar OpenOffice, su programa de hojas de cálculo (OpenOffice Calc) es la mejor opción para trabajar con ficheros CSVs enormes.

El fichero está compuesto por diferentes columnas, para conseguir hacer nuestro evaluador, necesitamos las siguientes:

  • TÍTULO: nombre del conjunto de datos, soporta multidioma. Ejemplo: 
    [ca]Port de Barcelona - Arees Geogràfiques[en]Port of Barcelona -Geograhic Regions[es]Puerto de Barcelona - Areas Geográficas
  • ÓRGANO PUBLICADOR: el nombre del órgano al que pertenece el portal. Ejemplo: Ayuntamiento de Alcobendas
  • DISTRIBUCIONES: contiene todos los recursos que tiene el conjunto de datos. Tiene una estructura de datos que debemos tratar, ya que contiene todas las URLs de cada recurso, y también soporta multidioma. Ejemplo: [TITLE_eu]Partzelen eta eraikin unitateen datuak[TITLE_es]Datos de parcelas y unidades constructivas[ACCESS_URL]http://api.gipuzkoairekia.eus/dataset/recurso/435e47ac-8f08-40f3-9935-e3aa09783779/descargar[MEDIA_TYPE]CSV[BYTE_SIZE]76360//[TITLE_eu]Lokalen datuak[TITLE_es]Datos de los locales[ACCESS_URL]http://api.gipuzkoairekia.eus/dataset/recurso/1ddf5167-6159-4f7a-b43f-c6e7e92225ba/descargar[MEDIA_TYPE]CSV[BYTE_SIZE]3428844

La idea final es consumir las URLs de cada recurso para verificar que está disponible, si lo está, leeremos el formato del recurso y dependiendo de cada uno de ellos puntuaremos (o profundizaremos más).

Pero en lugar de ir directamente hacia esa dirección, me voy a decantar por realizar un producto mínimo viable, evaluaré los conjuntos de datos sin consumir la URL, confiando en que estén funcionando. Debido a esto, inicialmente solo podré puntuar de 1 a 4 estrellas, ya que para puntuar con 5 debería tener acceso al contenido de la información, procesarla y verificar que se están utilizando URIs externas (linked data).

Nuestro siguiente paso es generar un programa de consola que lea este fichero línea a línea, para evaluar todos los recursos y asignar la puntuación a su respectivo portal.

Para hacer esto voy a copiar el repositorio "lector" que creamos hace unas semanas (https://github.com/tecnificados/lector), y en un nuevo repositorio "evaluador",  voy a renombrarlo y a lanzarlo contra el fichero que he descargado de datos.gob.es para ver si cuenta correctamente el número de líneas y las procesa correctamente. Este es el primer commit del repositorio "evaluador" (https://github.com/tecnificados/evaluador).

Y por hoy lo dejo aquí, en el próximo artículo empezaremos la programación.

Continuará...

lunes, 14 de octubre de 2019

Evaluador de Portales de Datos Abiertos - Parte I

Durante los últimos artículos, he ido sentando la bases para llegar a la creación de una pequeña aplicación de consola que nos sirva para evaluar los distintos portales de Datos Abiertos que están censados en nuestro Portal Nacional de Datos Abiertos: https://datos.gob.es/es/catalogo

Mi idea es leer todas los recursos (ficheros y URLs) que existen todos los portales de Datos Abiertos, agrupándolos por cada por cada conjunto de datos.  Después evaluaremos las siguientes características:
  1. ¿Los recursos están accesibles?
  2. ¿Qué tipo de ficheros contiene (CSV, PDF, HTML,...)?
  3. ¿Utiliza algún formato basado en URIs (RDF, TTL, N3, JSONLD,...)?
  4. ¿Las URIs enlazan con URIs externas a su portal (Linked Data)?
Dependiendo de estas preguntas podremos puntuar cada conjunto de datos basándonos en el siguiente gráfico:




Y para terminar generaremos un informe en formato Markdown con todos los portales de datos y su puntuación.

Todo esto lo haremos en una aplicación de consola con JAVA y la base de nuestra aplicación será la la que desarrollamos la semana pasada (https://github.com/tecnificados/lector).

Y lo iremos desarrollando paso a paso a partir de la semana que viene.

Continuara...

domingo, 6 de octubre de 2019

Procesando ficheros en JAVA



Con los últimos artículos que estoy escribiendo estoy sentando las bases de dos proyectos en JAVA.

El primero es más pequeño y se basa en una aplicación de consola, y de eso vamos a hablar hoy.

Voy a ir creando una pequeña aplicación de consola que lee todas las líneas de un fichero de texto.

Es bastante simple, pero lo que quiero hacer es crear un proyecto con todas las necesidades que puede tener una aplicación de consola:
  • Librerías externas
  • Sistema de log
  • Fichero externo de configuración
  • Multidioma
  • Generación de un ejecutable (jar) para su posterior uso
Todo el código y los pasos están en el siguiente repositorio: https://github.com/tecnificados/lector

El entorno de trabajo con el que estoy trabajando es el siguiente:
  • Sistema operativo: Windows 10
  • Openjdk version "12.0.2" 2019-07-16
  • IDE: Eclipse 2019-06 (4.12.0)
El primer paso es crear con Maven un proyecto "quickstart" dentro de Eclipse (File -> New -> Maven Project) :



Con esto ya tendremos nuestra estructura lista. Y éste va ser el segundo commit del proyecto: c04808759483432e185fae554a215e682b981af8

Por defecto Maven nos deja el compilador de JAVA con la versión 5.



Ya que estamos utilizando el Openjdk 12, vamos a subirla a esta versión añadiendo estas líneas en el fichero pom.xml:


<maven.compiler.target>1.12</maven.compiler.target>
<maven.compiler.source>1.12</maven.compiler.source>

Podéis ver el detalle del cambio en este commit: 6c483c4abc3f46c0aea1b5679605ac3db27d251a

Si hacemos un "Maven Update", nos debe aparecer la versión correcta en el proyecto.

Ahora vamos a buscar una librería que nos ayude a leer ficheros. Mi favorita es "commons-io" del proyecto Apache. La incluimos en el fichero pom.xml para que sus objetos estén disponibles. Otro commit: 5fa357852024488ab5a43080ee51c446ea7a3c1c

Ahora vamos a hacer una pequeña prueba, vamos crear un pequeño archivo "fichero.txt" que va a tener 10 líneas. Y vamos a escribir unas líneas de código para contar las líneas del fichero utilizando el objeto FileUtils de "commons-io".

El código que escribimos es el siguiente:


List<String> readedLines = new ArrayList<String>();
try {
     readedLines = FileUtils.readLines(new File("fichero.txt"),"utf-8");
     System.out.println("Lineas: "+readedLines.size());
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

Tenemos que meter un try/catch por si el método "readLines" lanza una excepción.

Si ejecutamos este código, nos debería aparecer esta salida:

Lineas: 10


Hago un commit con todos estos cambios: 1287bbeaaf2c21021ce5432b4fd094ea0426554d

Hasta ahora no hemos hecho nada con el contenido del fichero, pero tenemos una lista en la variable readedLines donde está el contenido de cada línea.

Vamos a añadir más información al fichero de prueba, y vamos hacer que el programa nos escriba en pantalla cada una de ellas.

Sé que es muy simple, pero me sirve para demostrar que estamos leyendo el fichero.

Añadiendo estas líneas podremos ver el contenido de cada línea leída:


for (String actual:readedLines)
{
     System.out.println("\t"+actual);
}

Las podéis ver en el commit: d65b491461ba90ed8a1cdef121a1b043985fc733

El funcionamiento básico ya no va a evolucionar más.

Ahora vamos a mejorar el programa para que tenga unas características más profesionales.

Sistema de log

Voy a añadir la librería "logback", antes era más de log4j, pero como muchos sabéis ha quedado sin mantenimiento.

Añadimos la librería al fichero "pom.xml", y en la aplicación nos creamos una variable estática con esta línea:


private static final Logger log = LoggerFactory.getLogger(App.class);

Ya tenemos el log a nuestra disposición.

A partir de ahora todo lo que sale por pantalla, en lugar de usar "system.out" lo hago con el sistema de log que acabamos de añadir.

En la excepción en lugar de usar "log.info" utilizo "log.error".

Todos los cambios del sistema de log están disponibles en este commit: 94d2d8ee44347ede47e67cef3a92ccedd48e9583

Fichero de configuración externo

Ahora mismo se está leyendo el fichero "fichero.txt" y el nombre del fichero está a nivel de código, una práctica que no es muy recomendable.

Vamos a crear un fichero "conf.properties" donde se va a configurar este parámetro.

A continuación voy a crear un método "configuration()" que será el que realice la lógica de leer el fichero de configuración y asignar su valor.

En este commit están todos estos cambios: e33d60eea78b23eca3e07229e856a5fd5d09a6c7

Multidioma

En aplicaciones de consola, es raro que nos soliciten multidioma, pero todo es posible.

Aquí eclipse nos echa un cable, con su asistente en botón derecho -> source -> externalize strings.

Este asistente nos crea una clase "Message" para realizar la sustitución dinámica de las cadenas que seleccionemos.

Antes de lanzar el asistente he generado unas cuantas constantes, para evitar problemas.

He creado tres ficheros con traducciones:
  • messages.properties: es la configuración por defecto (inglés)
  • messages_en_EN.properties: inglés de Inglaterra
  • messages_es_ES.properties: español de España

Voy a dejar fijado este último con la siguiente línea:


Locale.setDefault(new Locale("es_ES"));


Si fijáramos otro como "fr_FR", al no existir, cargaría el contenido del messages.properties.

El un con todos los cambios que acabamos de generar es: a6033bf9c31cbacae035ae69432b85919714c88b

Antes de continuar voy a refactorizar un poco, no me gusta mucho la estructura que me ha generado el asistente.

Voy a generar una clase Constant con todas las constantes, y un paquete Util con las clases y los ficheros nuevos.



Todos los cambios los tenemos en este commit: 80aa109d65ddfadda75e20228e84ce585afb2ed6

Ejecutable Jar Completo

Y para terminar vamos a decirle a Maven que cuando genere un empaquetado lo haga con todas las librerías que utiliza, y especificarle cuál es la clase principal.

Todo esto lo conseguimos gracias al plugin Shade de Maven, sólo hay que retocar unas cuantas líneas en el pom.xml, y añadir un par de plugins. Podéis ver en detalle estos cambios aquí: 86369ce3d028b405eed691a556a5e7fcf90148ef

Después de esto si lanzamos un mvn package tendremos un jar con todas las librerías que necesita, y está listo para ser invocado con el comando: "java -jar lector.jar"

Espero que os sea de utilidad, ha sido una entrada muy larga, pero he conseguido hacer todo lo que quería en sólo 11 commits.

domingo, 29 de septiembre de 2019

Máquina Virtual con LAMP en Virtual Box

Llevo un par de semanas pensando en un proyecto para ir realizando poco a poco en tecnificados.com, y uno de los componentes que necesito para empezar es  una base de datos relacional.

Lo más cómodo es utilizar MySQL, y para administrarla utilizar PHPMyAdmin, el "problema" es que son muchos componentes a desplegar, y no me gusta instalar muchos servicios en el sistema operativo nativo de mi portátil (Windows).

Dándole una vuelta, he decidido montarlo en una máquina virtual con Ubuntu Server 18.

Y nada, me he puesto con ello y lo he hecho con la última versión de Virtual Box.

Lo que he instalado se llama LAMP, que son las siglas de:
  • Linux
  • Apache
  • MySQL
  • PHP para PHPMyAdmin
He tardado más de lo que pensaba, en otras versiones de Ubuntu Server se instalaba con un solo comando, aquí he tenido que instalar los componentes uno por uno, hacer que se hablen,... y para acabar, he solucionado un bug en el código de PHPMyAdmin (https://stackoverflow.com/questions/48001569/phpmyadmin-count-parameter-must-be-an-array-or-an-object-that-implements-co).

Cuando he terminado he pensado, que si exporto la máquina y la subo a Mega, la puedo compartir y así cualquiera puede descargarse la máquina y evitar volver a hacer lo mismo. Al terminar lo he exportado en formato "OpenVirtualizationFormat 1.0" para que se pueda abrir con cualquier software de virtualización.

Así que os cuento brevemente las características de la máquina:

- RAM: 2 Gigas
- Disco: 40 Gigas (reservado dinámicamente)
- Procesadores: 1

Más cosillas a tener en cuenta:

- Nombre de la máquina: ironman
- Usuario ubuntu: tecno
- Password ubuntu: tecnificados
- Usuario mysql: root
- Password mysql: tecnificados
- SSHServer instalado.


He creado dos "snapshots":



Si no os interesa LAMP y queréis sólo el sistema operativo, podéis eliminar el segundo.

El firewall esta desactivado, y el MySQL soporta conexiones remotas desde cualquier host. A nivel de seguridad deja bastante que desear, pero es un entorno de pruebas.

Para que todo funcione bien, recordar tener abiertos los siguientes puertos:

- 22: acceso ssh
- 80 y 443: puertos para acceder vía web a PHPMyAdmin
- 3306: el puerto por defecto de MySql

Os podéis descargar la máquina a través del siguiente enlace: https://mega.nz/#F!6lMylKLR!nuW8D9A-zRMWcsRiaFAiVA

El tamaño de la imagen es de 1 Giga, espero que os sea de utilidad, y que os haya ahorrado algo de tiempo.

domingo, 22 de septiembre de 2019

Software de recuperación en Windows


Hace unas semanas os comenté que siempre llevo un pendrive conmigo (soy el informático de la familia, de la comunidad de vecinos,...) con algunos programas para limpiar/recuperar un PC con Windows.

Ayer un amigo me pidió por WhatsApp el pen para el lunes, y pensé que era mejor colgar todo el software en MEGA y pasarle el enlace. Luego se me ocurrió escribirlo y compartirlo por aquí.

Ésta es la URL donde os podéis descargar los programas que me han salvado la vida muchas veces, y con los que he devuelto a la vida a muchos Windows:


Dentro hay cuatro instaladores:
  • adwcleaner_7.4.1.exe (AdwCleaner): herramienta de Malwarebytes especializada en el adware. Ideal para limpiar navegadores.
  • avast_free_antivirus_setup_offline (Avast Antivirus): dentro del mundo de los antivirus, Avast es el que más confianza me da para realizar una limpieza total, aunque si se mantiene residente es un poco pesado.
  • DriverEasy_Setup.exe (Driver Easy): con esta utilidad consigo encontrar todos los drivers que un PC necesita, tanto si están sin instalar como si están obsoletos.
  • gu5setup.exe (Glary Utilities): os hablé de esta genial utilidad hace algunas semanas, el sustituto del CCleaner.
Espero que os sea de utilidad.

domingo, 15 de septiembre de 2019

Markdown - Guía rápida



Hoy os quiero hablar de Markdown, un lenguaje de marcado que nos permite formatear nuestros textos de manera rápida y simple, generando una salida similar al HTML.

Para que lo veáis mejor, os pongo unos ejemplos de HTML vs. Markdown
  • Encabezado 1  
    • HTML:     <h1>Título</h1>  
    • Markdown: # Título
  • Encabezado 2
    • HTML:     <h2>Subtítulo</h2>
    • Markdown: ## Subtítulo
  • Cursiva
    • HTML:      <i>Texto</i>
    • Markdown:  *Texto*
  • Negrita
    • HTML:     <b>Texto</b>
    • Markdown:  **Texto**
  • Enlace
    • HTML:     <a href="https://www.tecnificados.com">enlace</a>
    • Markdown:  enlace(https://www.tecnificados.com)
¿Dónde puedo utilizar Markdown?

En la web existen muchos editores que traducen Markdown a HTML ya procesado. Por ejemplo: https://stackedit.io o https://dillinger.io

Pero a mí lo que me gusta es que este formato es soportado en los repositorios de código más importantes como Github, Bitbucket,...

Por eso en la mayoría de los proyectos de estos repositorios, siempre hay un "readme.md" que contiene la documentación inicial.

Guía rápida de Markdown

Cursiva
Texto entre un asterisco * o un guión bajo _ . Ejemplo:

*Texto en cursiva*

Negrita
Texto entre dos asteriscos ** o dos guiones bajos __ . Ejemplo:


**Texto en negrita**

Saltos de línea:
Para generar un párrafo deja una linea en blanco (pulsa "enter" dos veces)
Para generar un salto de linea dentro del mismo párrafo deja dos espacios en blanco al final de la linea

Encabezados:
Con almohadilla(#), se concatenan tantos como niveles necesites. Ejemplo:

# Encabezado H1
## Encabezado H2
### Encabezado H3
#### Encabezado H4
##### Encabezado H5
###### Encabezado H6

Listas
Para crear simples listados se utilizan *, - o +. Utiliza el que más te guste, o combínalos. Ejemplo:
- Ironman
- Hulk
+ Viuda Negra
* Capitana Marvel
* Dr. Strange
+ Spiderman

Listas anidadas
Para crear listas anidadas utiliza cuatro espacios:

- Fase 1
- Iron Man (2008)
- The Incredible Hulk (2008)
- Iron Man 2 (2010)
- Thor (2011)
- Capitán América: el primer vengador (2011)
- The Avengers (2012)
- Fase 2
- Iron Man 3 (2013)
- Thor: The Dark World (2013)
- Captain America: The Winter Soldier (2014)
- Guardianes de la Galaxia (2014)
- Avengers: Age of Ultron (2015)
- Ant-Man (2015)
- Fase 3
- Capitán América: Civil War (2016)
- Doctor Strange (2016)
- Guardianes de la Galaxia Vol. 2 (2017)
- Spider-Man: Homecoming (2017)
- Thor: Ragnarok (2017)
- Black Panther (2018)
- Avengers: Infinity War (2018)
- Ant-Man and the Wasp (2018)
- Capitana Marvel (2019)
- Avengers: Endgame (2019)
- Spider-Man: Lejos de casa (2019)
         
Listas ordenadas
Tenemos que escribir el número seguido de un punto. También se pueden anidar con los cuatro espacios.

1. Fase 1
1. Iron Man (2008)
2. The Incredible Hulk (2008)
3. Iron Man 2 (2010)
4. Thor (2011)
5. Capitán América: el primer vengador (2011)
6. The Avengers (2012)
2. Fase 2
1. Iron Man 3 (2013)
2. Thor: The Dark World (2013)
3. Captain America: The Winter Soldier (2014)
4. Guardianes de la Galaxia (2014)
5. Avengers: Age of Ultron (2015)
6. Ant-Man (2015)
3. Fase 3
1. Capitán América: Civil War (2016)
2. Doctor Strange (2016)
3. Guardianes de la Galaxia Vol. 2 (2017)
4. Spider-Man: Homecoming (2017)
5. Thor: Ragnarok (2017)
6. Black Panther (2018)
7. Avengers: Infinity War (2018)
8. Ant-Man and the Wasp (2018)
9. Capitana Marvel (2019)
10. Avengers: Endgame (2019)
11. Spider-Man: Lejos de casa (2019)

Linea horizontal
Escribiendo *** o --- o ___

Enlaces en línea
Se escriben enmarcando el texto a enlazar entre corchetes [] y el link a seguir entre paréntesis. Ejemplo:

Pulsa [aquí](https://www.tecnificados.com) para ir a mi blog.

Enlaces automáticos
Se escriben introduciendo una URL entre los símbolos <>. Ejemplo:

<https://www.tecnificados.com>

Código
Si necesitas añadir código (html, sql, ...) lo puedes hacer con el acento `

El texto debe estar entre dos acentos. Ejemplo:

`Select name, year from films where year > 1980`

También lo puedes utilizar con varias líneas, pero en este caso deben ser tres acentos ```. Ejemplo:

```
Select name, year
from films 
where year > 1980
```

Imágenes
Insertar una imagen se parece mucho a insertar un enlace. Sólo hay que poner una exclamación ! al principio, y así se visualizará la imagen. Ejemplo:

![Imagen de Ironman](https://terrigen-cdn-dev.marvel.com/content/prod/1x/002irm_ons_cut_dsk_01_1.jpg)

El texto entre corchetes es el texto que se visualizará si la imagen no se carga.

Si además quieres añadir texto alternativo lo puedes hacer añadiendo al final el texto entre comillas. Ejemplo:

![Imagen de Ironman](https://terrigen-cdn-dev.marvel.com/content/prod/1x/002irm_ons_cut_dsk_01_1.jpg "Ironman de pie mirandote fijamente")

Tablas
Las tablas en Markdown son muchísimo más fáciles de escribir que en HTML.

Sólo tenemos que decir cuáles son los elementos de la cabecera, separar los campos con la barra horizontal y separar cada columna con la barra vertical | Ejemplo:

Nombre| Películas
-- | --
Fase I | 6
Fase II | 6
Fase III | 11

Podemos alinear las columnas utilizando dos puntos : junto a las líneas horizontales de la línea de separación. Con dos puntos a la izquierda de la línea, la columna estará alineada a la izquierda. Si los ponemos a la derecha de la línea, se alinearán a la derecha. Si los ponemos a ambos lados, su alineación será centrada. Lo mejor es verlo con un ejemplo:

Saga|Nombre | Películas
:-- |:--: | --:
Gemas del Infinito | Fase I | 6
Gemas del Infinito | Fase II | 6
Gemas del Infinito | Fase III | 11

Caracteres que Markdown interpreta 
A veces necesitamos utilizar caracteres como * o -

Para eso está la barra invertida \

Si la utilizamos justo antes del carácter que no interese, no será interpretada. Ejemplo:

Esto es un asterisco \*

Y con esto acabamos la guía rápida de Markdown.

He creado un repositorio en Github (https://github.com/tecnificados/markdown), donde están todos los ejemplos de la guía rápida. Se encuentran en el fichero "readme.md", que por defecto interpreta. Si queréis acceder al modo texto, para ver la sintaxis de Markdown, hacerlo a través de este enlace:

https://raw.githubusercontent.com/tecnificados/markdown/master/README.md

Espero que os sea de utilidad.

domingo, 8 de septiembre de 2019

OpenJDK - Sin restricciones en producción


Como muchos sabéis la licencia de Oracle JAVA ha cambiado desde que ha llegado JAVA 11 (y ya estamos por la 12, y la 13 a punto de salir...)

A nivel de escritorio y uso "no profesional" no nos afecta. 

Pero si necesitamos utilizarlo en un servidor (con Tomcat por ejemplo), tenemos un pequeño problema, hay que pasar por caja.

La alternativa es usar OpenJDK en lugar del JDK que siempre hemos descargado de la web de Oracle.

Se puede descargar desde su web oficial: https://openjdk.java.net/

Si trabajamos en sistemas Linux no hay ningún problema, ya que por defecto al realizar la instalación de JAVA por defecto ya está utilizando el OPENJDK.

Para sistemas Windows es un pelín más complicado, pero nada que no podamos hacer en menos de cinco minutos.

Lo primero que tenemos que hacer es descargar el OpenJDK:


El de Windows está en esta ruta: 

https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_windows-x64_bin.zip



Unos minutos después...

Lo descomprimimos en la carpeta que más nos interese. Por ejemplo: "C:\Java\openjdk-12.0.2"

Esto nos dejará los ejecutables en la carpeta: "C:\Java\openjdk-12.0.2\bin"

Y después de esto, sólo tenemos que ir a las variables del sistema operativo:

Y añadir la ruta anterior a la variable PATH.



Con esto, si ejecutamos en una consola ("cmd") de Windows el comando: "java -version" nos debería aparecer una respuesta como ésta:



Y después de esto ya tenemos nuestro sistema listo para utilizar OpenJDK.

domingo, 1 de septiembre de 2019

¿Necesitas una VPN? Te recomiendo ProtonVPN


Hace unas semanas estaba programando en la playa (me encanta programar) cuando de repente no podía descargar las dependencias que necesitaba a través de Maven. Después de mirar logs vi que mi problema era que mi IP había sido baneada de https://mvnrepository.com, estaba conectado a través del teléfono móvil, y no tenía mucho margen de maniobra.

Después de darle unas vueltas, pensé que la forma más rápida era buscar una VPN y probarlo.

Googleando un poco encontré el proyecto ProtonVPN (https://protonvpn.com/), de los creadores de ProtonMail (https://protonmail.com/).

Ambos proyectos surgen de un grupo de científicos del CERN, querían conseguir privacidad (real) en sus cuentas de correo electrónico, y amparándose en las leyes suizas han conseguido un servicio de email totalmente seguro y privado. El problema era que la privacidad de la red utilizada para conectarse a ese servicio podía ser baja o nula, así que ahora han sacado su propia VPN para conseguir privacidad absoluta.

Tiene varias características que me convencieron desde el principio:

  • Simple y fácil de instalar: instalador de tipo "next, next, next", sin adware de ningún tipo.
  • Modelo freemium: tiene varias modalidades, y una de ellas tiene coste cero
  • Muy ligera: mi sistema operativo no se ha resentido en absoluto. Tras varios años trabajando con muchas VPNs, ésta es sin duda la más limpia que he probado.
  • Registro rápido y eficiente: en menos de un minuto te has registrado en su web.
  • Alta velocidad de descarga: más de un mega por segundo, para lo que yo necesito...
Para utilizarlo, una vez instalado, sólo tenemos que hacer login en la aplicación:


A continuación se nos desplegará la aplicación en pantalla completa con un mapa del mundo para elegir a dónde queremos conectarnos. Para no perdernos en la configuración, lo mejor es buscar el botón "Quick Connect" a la izquierda:


Lo pulsamos y en menos de 20 segundos ya estamos conectados.

La interfaz cambia, y ahora en el mapa nos aparece desde dónde estamos conectados:


Si ahora nos conectamos a cualquier servidor para saber cuál es nuestra IP nos aparece esta información:



Y como podéis ver la velocidad de descarga roza los dos megas por segundo:



En definitiva, si necesitáis una VPN tanto para uso ocasional como para temas más serios os recomiendo ProtonVPN. 

Está disponible para teléfonos móviles, varios sistemas operativos... Vamos que no tenéis excusas.

domingo, 25 de agosto de 2019

Experto vs. No iniciado

Hoy os quiero mostrar un vídeo con el que suelo comenzar todas mis presentaciones y cursos de formación.


Es un pequeño sketch de programa Splunge (RTVE) que tiene ya unos añitos.

Me gusta porque refleja muy bien la situación de falta de comunicación con un experto en un tema determinado (bricolaje en este caso).

Siempre comento a los asistentes que mi objetivo es conseguir no reproducir esta situación.

Ayer di una charla a un grupo de mayores (no tecnólogos) sobre teléfonos móviles (copias de seguridad, mantenimiento del terminal,...), gracias al vídeo se soltaron bastante y conseguimos entre todos liberar varios gigas de sus teléfonos, más de un@ se ahorró cambiar de terminal.

lunes, 19 de agosto de 2019

La máquina autoreplicable de Von Neumann

A Von Neumann todos los informátic@s le conocemos por "la arquitectura de Von Neumann", para que os hagáis una idea, todos los ordenadores, teléfonos móviles, tablets, consolas,... funcionan siguiendo esta arquitectura (virtualmente hablando).

Pero de entre todas las cosas que hizo (https://es.wikipedia.org/wiki/John_von_Neumann), siempre ha habido una de sus teorías que me ha llamado la atención: "La máquina de Von Neumann".

Este concepto se basa en la autoreplicación, que es lo que hacen los virus cuando se infiltran en nuestro organismo. Si pensamos en los virus informáticos, son máquinas de Von Neumann al 100%.

La teoría de estas máquinas surge de la idea de realizar tareas muy pesadas en entornos hostiles, a los que el hombre no puede acceder, por ejemplo: extracción de mineral en otros planetas.

Voy a demostraros la potencia de estas máquinas a través de este problema:

Supongamos que en el planeta X se ha encontrado una veta de mineral, con el que se obtiene hierro después de procesarlo. Estimamos que en la veta hay 20.000 toneladas de ese mineral. Tenemos una máquina que extrae una tonelada del mineral en una semana, y después tarda tres días en procesarlo y obtener hierro. ¿Cómo hacemos para extraer todo ese mineral? Hay que tener en cuenta que ningún ser humano puede pisar en ese planeta.

a) Primera idea: mandamos un cohete con un robot, el robot extrae el material, lo procesa, lo mete en el cohete y éste hace viajes de ida y vuelta con el material.


Éste es nuestro amigo, que sólo conoce 2 órdenes: Extrae y Procesa

Tiempo de extracción y procesado: 10 x 20.000 = 200.000 días ->  548 años (redondeando)

Se nos va un pelín de tiempo.

b) Con la máquina de Von Neumann: mandamos un cohete con un robot igual que el anterior, pero además puede autoreplicarse en 30 días consumiendo una tonelada de material en el proceso.

Nuestro amigo, que ahora conoce 3 órdenes: Extrae, Procesa
 y Replica

Supongamos cinco iteraciones en el proceso de replicación:

1) Robot original:
     - Extrae material y lo procesa: 10 días
     - Se replica: 30 días
     - Resultado: un robot adicional (primera generación)
2) Tenemos dos robots
     - Extraen material y lo procesan: 10 días
     - Se replican: 30 días
     - Resultado: dos robots adicionales (segunda generación)
3) Tenemos cuatro robots:
     - Extraen material y lo procesan: 10 días
     - Se replican: 30 días
     - Resultado: cuatro robots adicionales (tercera generación)
4) Tenemos ocho robots:
     - Extraen material y lo procesan: 10 días
     - Se replican: 30 días
     - Resultado: ocho robots adicionales (cuarta generación)
5) Tenemos 16 robots:
     - Extraen material y lo procesan: 10 días
     - Se replican: 30 días
     - Resultado: 16 robots adicionales (quinta generación)

Se acaba la fase de autoreplicación, si todo ha ido bien en total tenemos a 32 robots funcionales, y hemos perdido:

 - 31 toneladas de material (en las replicaciones), nos quedan 19.969 toneladas por extraer
 - 200 días (5 iteraciones de 40 días)

Veremos si han merecido la pena estas pérdidas, teniendo en cuenta que nos quedan 19.969 toneladas por extraer.

Empezamos la fase de extracción:

19.969 x 10 = 199.690 días 

199.690 días / 32 robots = 6.240 días -> 17 años (redondeando de nuevo)

Hemos perdido algo de material, pero el tiempo se ha reducido considerablemente: 531 años.

Si aumentáramos el número de iteraciones de la replicación, podríamos seguir bajando el tiempo.

Un genio este Von Neumann.

Imagen de Johnny 5 por cortesía de Wikimedia: https://es.wikipedia.org/wiki/Johnny_5