22 de marzo de 2020

Programando un "Guitar Hero" con p5js y ToneJS


Hace poco he ayudado a montar el CoderDojo de Carabanchel, que es un club de programación donde niños y niñas de entre 7 y 17 años aprenden a programar ayudados por mentores. Hasta antes de la cuarentena, nos reunimos los sábados por la tarde, y yo intentaba ir siempre que podía con mis dos hijas. Además, a veces preparaba talleres.

Al principio preparé un taller de p5js, que es una librería de JavaScript para crear arte interactivo en el navegador que gustó bastante.

Luego preparé un taller de iniciación a ToneJS, una librería JavaScript para programar música en el navegador.

Luego también preparé un taller de iniciación a ToneJS, una librería JavaScript para programar música en el navegador.

Luego preparé un taller en donde mezclaba tanto p5js como ToneJS.

Y por último, aunque todavía no lo he impartido en el CoderDojo, he preparado un taller en donde se programa un "Guitar Hero" con p5js, y ToneJS.

Si tenéis chicos y/o chicas, puede ser un bonito taller para realizar en casa durante esta cuarentena.

Tenéis todo el código y las librerías que necesitáis en un repositorio de mi GitHub.

En el taller he preparado varios ejercicios de dificultad creciente que podéis ver resultado en los siguientes enlaces:

Y a continuación os inserto el último ejemplo en un iframe para que lo disfrutéis desde mi blog :-)


Comparte:    Facebook Twitter
Leer más

2 de marzo de 2020

Taller de p5js y de ToneJS

Hace poco he ayudado a montar el CoderDojo de Carabanchel, que es un club de programación donde niños y niñas de entre 7 y 17 años aprenden a programar ayudados por mentores. Nos reunimos los sábados por la tarde, y yo intento ir siempre que puedo con mis dos hijas. Además, a veces preparo talleres.

Al principio preparé un taller de p5js, que es una librería de JavaScript para crear arte interactivo en el navegador que gustó bastante.

Luego preparé un taller de iniciación a ToneJS, una librería JavaScript para programar música en el navegador. Este último taller está muy relacionado con un artículo que escribí hace justo un año en dónde explicaba cómo programar la música de Star Wars con Gibber. Esto lo digo porque en ese taller voy explicando en ejercicios de cada vez más dificultad, como ir programando notas, y al final terminamos tomando el 'Cumpleaños Feliz', y la música de 'Star Wars'.

Y por último he preparado un taller en donde mezclo p5js, y tonejs.

Tenéis todo el código y las librerías que necesitáis en un repositorio de mi GitHub.

En el taller he preparado varios ejercicios de dificultad creciente que podéis ver resultado en los siguientes enlaces:

Y a continuación os inserto el último ejemplo en un iframe para que lo disfrutéis desde mi blog :-)


Comparte:    Facebook Twitter
Leer más

5 de febrero de 2020

Charlas técnicas que más me han gustado II


Hace unos meses publiqué una entrada con las últimas charlas técnicas que había visto y que más me habían gustado. Parece que gustó bastante, así que ahora he hecho una recopilación de las charlas que más me han gustado desde ese último post. Como la última vez, he puesto un * en las charlas que más me han gustado de todas.

Blockchain

Blockchain - EthicHub, Blockchain financiando agricultores desbancarizados (Raúl Martínez) *
Blockchain - Creación de una criptomoneda como técnica de gamificación en la empresa (Angel Miguel Martinez Pulido) *
Blockchain - SOLID - Internet sin espías - Pilar Barbero y Laura Fernando)

Inteligencia Artificial

IA - AI to hack the Universe (Clara Luis Mingueza & Nerea Luis)
IA - Aprendizaje por refuerzo con OpenAI Gym (Ana Laura Diedrichs)
IA - Arte e Inteligencia Artificial - todas GANamos (Nerea Luis) *
IA - Big Data e IA para el bien social (Nuria Oliver)
IA - Caja negra, caja blanca y el futuro inmediato de la Inteligencia Artificial (Nerea Luis) *
IA - Cómo crear equipos de Data Science (Antonio Molins) *
IA - Conferencia Inaugural Evento central de Semana Europea de la Robótica #erw2018 (Nerea Luis)
IA - Del Software 1.0 al Software 2.0 (Andrés Torrubia) *
IA - La IA más allá de la minería de datos (Nerea Luis)
IA - #MiEmpleoMiFuturo - un documental sobre robots, economía, clase media... y el fin del mundo (COTEC)
IA - #MiEmpleoMiFuturo 2 - un documental sobre robots, economía, clase media... y el fin del mundo (COTEC)
IA & Educación - StarCraft Education - Aprendiendo a programar jugando con IA (Moisés Martínez y Nerea Luis)

Inspiracional

Inspiracional - Hackeando el futuro para mejorar el presente (Esther Estévez)
Inspiracional - Keynote AdaloversConf (Nerea Luis) *
Inspiracional - Cómo crear una aplicación adictiva y por qué no deberíamos hacerlo (Rubén García)
Inspiracional - Papá, llévame a clases de tecnología, ¡me lo prometiste! (Alai Miranda Blanco)
Inspiracional - Principios cognitivos aplicados al desarrollo de videojuegos (Rocío Tomé)
Inspiracional - Preventing the Collapse of Civilization (Jonathan Blow)*
Inspiracional - Próxima parada... ¡la que quieras! (Irene M. Morgado)*

Desarrollo

Desarrollo - Asistentes de voz, una charla para dominarlos a todos (Joaquín Engelmo, Jordi Martí y Diego Zapico)
Desarrollo - Cómo gestionar 20 millones de peticiones en 24 horas y no morir en el intento (Chema Roldán)
Desarrollo - Cómo mejorar como desarrollador, no te fíes, es justo al revés (Jorge Franco y Angélica Sanz)
Desarrollo - Descubriendo Quarkus, Java sub-atómico en acción (Aurea Muñoz y Katia Aresti)
Desarrollo - Git avanzado (Jesús Amieiro Becerra)
Desarrollo - Historia de una gran bola de lodo escrita en JavaScript (Alfredo Artiles)
Desarrollo - Micronaut y GraalVM, La combinación perfecta (Iván López)
Desarrollo - Refactorizar rima con Simplificar, o por qué el miedo conduce a código inmantenible (Javier Abadía) *
Desarrollo - Rust & WebAssembly para JavaScripters (Pablo Magaz)
Desarrollo - ¿Qué ocurre cuando escribo una URL en mi navegador (Javier Gamarra, Victor Galán Grande)

Managment

Managment - Cómo convertir un fracaso en un éxito (Rita Madariaga)
Managment - Del caos al equilibrio (Félix López)
Managment - De su padre y de su madre (Isabel Aguilar)
Managment - Jardineros, artesanos o ingenieros pero no juglares (Modesto San Juan) *
Managment - La crisis de los 40 (Javi Santana)
Managment - Mis retrospectivas se han roto. Antipatrones de equipo (María Berenguer)
Managment - Motivating teams (Josefina Pérez) *
Managment - Tu Scrum Master te engaña y lo sabes! (Benjamín Garrido)
Managment - Unbiasing teams (Félix López) *

Psicología

Psicología - 25 sesgos cognitivos (Euge Oller)
Psicología - 7 Sesgos cognitivos que debes conocer y evitar para tomar mejores decisiones.
Psicología - Sesgos cognitivos y adaptación al medio (Helena Matute)
Psicología - Heurísticas: los atajos de tu mente (Martin Schleicher) *

Seguridad

Seguridad - Hackeando que es gerundio (Pablo Espada Bueno)
Seguridad - Nodejs 4 Hackers (Ulises Gascon) *
Seguridad - OSINT, la exposición a Internet y los peligros de las Redes Sociales (Ruth González y Miguel Hernández)
Seguridad - Social Engineering (@JR_kneda)
Seguridad & IA - Machine Learning aplicado a la Ciberseguridad (José Manuel Ortega) *
Seguridad & IA - Machine Learning aplicado a la Ciberseguridad (Claudio Caracciolo y Enrique Blanco)

Varios

Varios - Accesibilidad - ¿Quieres que use tu app? (Sandra Timón Mayo, Ane Iturzaeta)
Varios - AR/VR - Building the Decentralized Metaverse (Alberto Elias)
Varios - Tips para mejorar la gestión de tu tiempo (Adolfo Sanz de Diego)
Varios - SoftwareLibre - #OpenSource para un mundo #OpenData - data por el pueblo, para el pueblo (Jorge Aguilera)

UX/UI

UX/UI - Historia de la UX, para entendernos mejor (Meri Fernández)
UX/UI - UX de guerrilla, manual de supervivencia para devs (Meri Fernández) *
UX/UI - Visualización de Datos Interactiva en aplicaciones con Vue.js y React (Javier Abadía)
UX/UI - Problemas de UX ocultados detrás de bonita UI (James Heda Weng)
Comparte:    Facebook Twitter
Leer más

3 de febrero de 2020

Taller de iniciación a ToneJS, una librería JavaScript para programar música en el navegador


Hace poco he ayudado a montar el CoderDojo de Carabanchel, que es un club de programación donde niños y niñas de entre 7 y 17 años aprenden a programar ayudados por mentores. Nos reunimos los sábados por la tarde, y yo intento ir siempre que puedo con mis dos hijas. Además, a veces preparo talleres. Al principio preparé un taller de p5js, que es una librería de JavaScript para crear arte interactivo en el navegador que gustó bastante, y ahora he preparado un taller de ToneJS una librería JavaScript para crear música interactiva en el navegador. Este último taller está muy relacionado con un artículo que escribí hace justo un año en dónde explicaba cómo programar la música de Star Wars con Gibber.

Tenéis todo el código y las librerías que necesitáis en un repositorio de mi GitHub.

Este es el código más básico para crear un botón que al pulsarlo haga sonar una nota, en este caso un DO, en el navegador:

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 01 una nota</title>
    <script src="../lib/Tone.js"></script>
  </head>

  <body>
    <button id="do">UNA NOTA</button>
  </body>

  <script type="text/javascript">
    const synth = new Tone.Synth().toMaster();
    Tone.Transport.start();

    document.querySelector("#do")
      .addEventListener("click", async () => {
        synth.triggerAttackRelease("C4", "4n");
    });
  </script>
</html>
El resultado es el siguiente (pulsa el botón para probar):

En este punto hay que remarcar que las notas se ponen en el estilo anglosajón:
  • DO=C
  • RE=D
  • MI=E
  • FA=F
  • SOL=G
  • LA=A
  • SI=B
El número que sigue a la nota hace referencia a la octava (ya sea esta más grave o más aguda).

A continuación, parte del código para hacer una especie de piano con botones:

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 02 varias notas</title>
    <script src="../lib/Tone.js"></script>
  </head>

  <body>
    <button id="do">DO</button>
    <button id="re">RE</button>
    ...
  </body>

  <script type="text/javascript">
    const synth = new Tone.Synth().toMaster();
    Tone.Transport.start();

    document.querySelector("#do")
      .addEventListener("click", async () => {
        synth.triggerAttackRelease("C4", "4n");
    });

    document.querySelector("#re")
      .addEventListener("click", async () => {
        synth.triggerAttackRelease("D4", "4n");
    });

    ...
  </script>
</html>
El resultado es el siguiente (pulsa los botones para probar):

A continuación mostramos el código para que suene una escala:

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 03 escala</title>
    <script src="../lib/Tone.js"></script>
  </head>

  <body>
    <button id="escala">ESCALA</button>
  </body>

  <script type="text/javascript">
    const synth = new Tone.Synth().toMaster();
    Tone.Transport.start();

    document.querySelector("#escala")
      .addEventListener("click", async () => {
        synth.triggerAttackRelease("C4", "8n", 1);
        synth.triggerAttackRelease("D4", "8n", 2);
        synth.triggerAttackRelease("E4", "8n", 3);
        synth.triggerAttackRelease("F4", "8n", 4);
        synth.triggerAttackRelease("G4", "8n", 5);
        synth.triggerAttackRelease("A4", "8n", 6);
        synth.triggerAttackRelease("B4", "8n", 7);
        synth.triggerAttackRelease("C5", "8n", 8);
    });
  </script>
</html>
El resultado es el siguiente (pulsa el botón para probar):

Ahora hacemos algo un poco más elaborado utilizamos 2 arrays: uno para las notas y otro para las duraciones de las notas.

Aquí hay que remarcar que para los tiempos hay que tener en cuenta que:
  • 1n hace referencia a una redonda (4 tiempos)
  • 2n hace referencia a una blanca (2 tiempos)
  • 4n hace referencia a una negra (1 tiempo)
  • 8n hace referencia a una corchea (0,5 tiempos)
  • 16n hace referencia a una semicorchea (0,25 tiempos)
Teniendo en cuenta esto, a continuación el código para hacer una escala con diferentes tiempos:

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 04 notas</title>
    <script src="../lib/Tone.js"></script>
    <script src="../lib/Rhythm.js"></script>
  </head>

  <body>
    <button id="notas">NOTAS</button>
  </body>

  <script type="text/javascript">
    var synth = new Tone.Synth().toMaster();

    document.querySelector("#notas").addEventListener("click", async () => {

      var notas = [
        "C4","D4","E4","F4","G4","A4","B4","C5"];
      var duraciones = [
        "2n","4n","8n","16n","16n","8n","4n","2n"];

      var cancion = Rhythm.mergeDurationsAndPitch(duraciones, notas);

      var part = new Tone.Part(function(time, value){
        console.log(value.note + " " + value.duration);
        synth.triggerAttackRelease(value.note, value.duration, time);
      }, cancion );
      
      part.start(0);
      Tone.Transport.start();
    });
  </script>
</html>
El resultado es el siguiente (pulsa el botón para probar):

Ahora vamos a coger una partitura sencilla, la del cumpleaños feliz:

Y la codificamos con ToneJS:

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 05 cumpleaños feliz</title>
    <script src="../lib/Tone.js"></script>
    <script src="../lib/Rhythm.js"></script>
  </head>

  <body>
    <button id="notas">CUMPLEAÑOS FELIZ</button>
  </body>

  <script type="text/javascript">
    var synth = new Tone.Synth().toMaster();

    document.querySelector("#notas").addEventListener("click", async () => {

      var notas = [
        "C4", "C4", 
        "D4", "C4", "F4", 
        "E4", "C4", "C4", 
        "D4", "C4", "G4",
        "F4", "C4", "C4",
        "C5", "A4", "F4",
        "E4", "D4", "Bb4", "Bb4",
        "A4", "F4", "G4",
        "F4"];
      var duraciones = [
        "8n", "8n", 
        "4n", "4n", "4n",
        "2n", "8n", "8n",
        "4n", "4n", "4n",
        "2n", "8n", "8n", 
        "4n", "4n", "4n", 
        "4n", "4n", "8n", "8n",
        "4n", "4n", "4n",
        "2n"];

      var cancion = Rhythm.mergeDurationsAndPitch(duraciones, notas);

      var part = new Tone.Part(function(time, value){
        console.log(time + " " + value.note + " " + value.duration);
        synth.triggerAttackRelease(value.note, value.duration, time);
      }, cancion );
      
      part.start(0);
      Tone.Transport.start();
    });
  </script>
</html>
El resultado es el siguiente (pulsa el botón para probar):

Y para terminar, hacemos lo mismo con la partitura de Star Wars:

Aquí hay que tener en cuenta que los trisillos se codifican con una t, en vez de con una n (ejemplo 8t). Y para los puntillos hay que disminuuir su número (ejemplo 3n).

<!DOCTYPE html>
<html>
  <head>
    <title>ToneJS - 06 Star Wars</title>
    <script src="../lib/Tone.js"></script>
    <script src="../lib/Rhythm.js"></script>
  </head>

  <body>
    <button id="notas">Star Wars</button>
  </body>

  <script type="text/javascript">
    var synth = new Tone.Synth().toMaster();

    document.querySelector("#notas").addEventListener("click", async () => {

var notas = [
        "F3", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "Bb3", "G3", "C3", "C3", "C3",
        "F3", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "Bb3", "G3", "C3", "C3",
        "D3", "D3", "Bb3", "A3", "G3", "F3",
        "F3", "G3", "A3", "G3", "D3", "E3", "C3", "C3",
        "D3", "D3", "Bb3", "A3", "G3", "F3",
        "C4", "G3", "G3", "C3", "C3",
        "D3", "D3", "Bb3", "A3", "G3", "F3",
        "F3", "G3", "A3", "G3", "D3", "E3", "C4", "C4",
        "F4", "F3",
        "C4", "C3", "C3", "C3",
        "F3", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "Bb3", "G3", "C3", "C3", "C3",
        "F3", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "G3", "F4", "C4",
        "Bb3", "A3", "Bb3", "G3", "C3", "C3", "C3",
        "F4", "F4", "F4", "F4", "F4"];
      var duraciones = [
        "2n", "2n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "8t", "8t", "8t",
        "2n", "2n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "8n", "8n",
        "3n", "8n", "8n", "8n", "8n", "8n",
        "8t", "8t", "8t", "8n", "8n", "4n", "8n", "8n",
        "3n", "8n", "8n", "8n", "8n", "8n",
        "8n", "8n", "2n", "8n", "8n",
        "3n", "8n", "8n", "8n", "8n", "8n",
        "8t", "8t", "8t", "8n", "8n", "4n", "8n", "8n",
        "2n", "2n",
        "1n", "8t", "8t", "8t",
        "2n", "2n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "8t", "8t", "8t",
        "2n", "2n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "4n",
        "8t", "8t", "8t", "2n", "8t", "8t", "8t",
        "4n", "8t", "8t", "8t", "4n"];

      var cancion = Rhythm.mergeDurationsAndPitch(duraciones, notas);

      var part = new Tone.Part(function(time, value){
        console.log(time + " " + value.note + " " + value.duration);
        synth.triggerAttackRelease(value.note, value.duration, time);
      }, cancion );
      
      part.start(0);
      Tone.Transport.start();
    });
  </script>
</html>
El resultado es el siguiente (pulsa el botón para probar):

Espero os haya gustado ;-)
Comparte:    Facebook Twitter
Leer más

4 de enero de 2020

Quitar el fondo verde (Chroma Key) a un vídeo en Ubuntu Linux con Kdenlive


Hoy quiero explicar para mi yo del futuro (y para quien lo necesite) como quitar el fondo verde (Chroma Key) a un vídeo en Ubuntu Linux con Kdenlive.

Lo primero que tenemos que hacer es grabar un video con fondo verde, también llamado croma. Yo, para el ejemplo he grabado este vídeo corto:


Si no tenemos instalado el editor de vídeo Kdenlive lo hacemos con el siguiente comando:

$ sudo apt install kdenlive
Una vez instalado, lo abrimos:

Entonces añadimos el vídeo que hemos grabado seleccionando el menú "Proyecto > Agregar clip". Luego lo añadimos a la línea de tiempo pinchando y arrastrando el vídeo:

Luego, en la línea de tiempo, pinchamos en el vídeo con el botón derecho y seleccionamos el menú: "Agregar efecto > Manipulación del canal alfa > Inserción croma":

Por defecto el color seleccionado es uno azul. Entonces tenemos que primero pinchar en la gota que hay al lado del color azul y luego pinchamos el color verde en la previsualización del vídeo:

Automáticamente, todo lo que está en ese tono se vuelve transparente. Podemos ajustar la varianza un poco. En mi caso la he bajado un poco hasta 120:

Ahora vamos a poner un vídeo de fondo. También podíamos haber puesto una imagen, pero en mi caso he puesto este pequeño vídeo de la subida en ascensor a la Torre Eiffel:


Como hemos hecho antes, añadimos el nuevo vídeo seleccionando el menú "Proyecto > Agregar clip". Y luego lo añadimos a la línea de tiempo pinchando y arrastrando el vídeo, pero en este caso lo ponemos en la línea de abajo:

Para terminar pinchamos en el botón "Procesar", seleccionamos las opciones de exportación que queramos (en mi caso MP4), le ponemos un nombre al archivo que vamos a exportar y le pinchamos en "Procesar a un archivo":

Después de procesar el archivo nos queda el vídeo montado:


Comparte:    Facebook Twitter
Leer más

1 de enero de 2020

Mis propósitos para el 2020


Después de hacer mi retrospectiva del 2019, y como vengo haciendo desde el 2013 inspirado por David Bonilla, ahora toca plasmar mis propósitos para este 2020.

Pero este año los voy a redactar de manera diferente. Voy a intentar que los propósitos de este año sean desafiantes y motivadores, pero sobre todo realizables. De nada vale ponerse unos bonitos propósitos si sabes de ante mano que no vas a poder realizarlos. También quiero que, en la medida de lo posible, sean medibles para poder evaluar su consecución. De esta forma podré comprobar de forma fehaciente su ejecución. Así mismo voy a intentar que dependan fundamentalmente de mi. Creo que tus propósitos no pueden depender de terceras personas. Y para terminar quiero cubrir todas las áreas importantes de mi vida: la salud, el dinero y el amor.

 Salud:
  • Andar al menos 8 kilómetros al día.
  • Correr al menos 8 kilómetros a la semana.
  • Practicar, además de correr, al menos 1 hora de ejercicio a la semana.
  • Beber como mucho 3 cervezas a la semana.
  • Comer fruta y verduras todos los días.
  • Dormir al menos 8 horas al día.
  • Estabilizar mi peso actual.

Dinero:
  • Dar lo mejor de mi en la Consejería de Educación, Juventud y Deporte de la Comunidad de Madrid.
  • Ayudar a mi gran amigo Fernando Redondo con la Transformación Digital de Pronoide.
  • Colaborar con la Universidad de Alcalá como profesor de algún Máster.
  • Dedicar al menos 10 horas al mes en proyectos de Software Libre.
  • Dedicar al menos 5 horas a la semana en formación.
  • Escribir al menos 24 entradas en mi blog este año.
  • Dar un salto en mi vida profesional.

Amor:
  • Dedicar al menos 1 día a la semana a hacer algo en familia con mi mujer y mis hijas.
  • Dedicar al menos 10 horas a la semana a tareas de la casa y/o familiares.
  • Dedicar al menos 1 día a la semana a hacer algo solo con mis hijas.
  • Realizar al menos 2 viajes al año con mi mujer y mis hijas.
  • Dedicar al menos 2 días al mes a hacer algo con amigos.
  • Dedicar al menos 2 días al mes a hacer algo con familiares.
  • Buscar un/a nuevo/a líder/sa que me sustituya en Hackathon Lovers.

¿Y tú?

¿Has escrito tus propósitos en una entrada de tu blog similar a esta? ¿O acaso los has escrito en un hilo de twitter? En cualquier caso, me gustaría enlazar los propósitos que me vayáis enviando tanto por twitter como en los comentarios de esta entrada. Si no tenéis ni blog ni twitter, sentiros libres de escribir vuestros propios propósitos en los comentarios bajo este texto.
Comparte:    Facebook Twitter
Leer más

31 de diciembre de 2019

Retrospectiva del 2019


Como otros años, me gusta hacer una retrospectiva chequeando los propósitos que me marqué a principio de año y ver cuales de ellos he conseguido:

1. Primero, pasar más tiempo con mi familia y mis amigos, sobre todo pasar más tiempo de calidad con mi mujer y mis hijas.

A medias. Creo que he mejorado con respecto al año anterior, pero como todos los años creo que debería pasar aún más tiempo con mis familiares y amigos, y sobre todo con mis hijas. A ver si en el 2020 esto mejora aún más.

2. Segundo, seguir intentando tener una vida más saludable. Este propósito tenía otros propósitos secundarios:

  1. Reducir el consumo de azúcares, grasas y alcohol. A medias.
  2. Aumentar el consumo de frutas, verduras y agua. A medias.
  3. Dormir al menos 7 horas diarias. Conseguido.
  4. Andar al menos 5 kilómetros diarios. Conseguido.
  5. Hacer deporte (correr/gimnasio) al menos 2 veces por semana. Conseguido.
  6. Bajar mi peso al menos 2 kilos y no volverlos a coger.A medias.
A medias. Aunque he hecho avances y estoy en la buena senda tengo que seguir mejorando este aspecto de mi vida.

3. Tercero, mejorar mi nivel de inglés. Este propósito tennía otros propósitos secundarios:

  1. Añadir sitios de habla inglesa a mi RSS. A medias.
  2. Seguir a personalidades de habla inglesa en mi Twitter. A medias.
  3. Hacer al menos tres lecciones de Duolingo a la semana. A medias.
  4. Ver al menos dos horas de series y/o películas en inglés a la semana. A medias.
  5. Ver al menos una charla técnica en inglés cada dos semanas. A medias.
  6. Traducir al menos un artículo del inglés al español al mes. No conseguido.
  7. Escribir al menos un post en inglés cada dos meses. No conseguido.
A medias. Empecé bastante fuerte con el inglés a principio de año, pero poco a poco fui decayendo hasta a penas tocarlo ahora a final de año. Para el año que viene tengo que reconsiderar este propósito.

4. Cuarto, seguir dando lo mejor de mi como Asesor Técnico Docente en el servicio TIC de la Dirección General de Infrastucturas y Servicios de la Consejería de Educación e Investigación de la Comunidad de Madrid.

Conseguido. Creo que he cumplido de sobra mis cometidos. Aquí querría dar las gracias a todos mis compañeros y sobre todo a mi jefe José Quirino.

5. Quinto, seguir ayudado a mi gran amigo Fernando con Pronoide.

Conseguido. Creo que, como años anteriores, he sido un buen consejero para Fernado. La verdad es que mi implicación en Pronoide este año ha aumentado para bien con respecto al año pasado. Creo que el 2020 va a ser un buen año para Pronoide.

6. Sexto, seguir colaborando con la Universidad de Alcalá como profesor de algún Máster.

Conseguido. Desde aquí querría dar las gracias a Miguel Ángel Sicilia y a Jorge Vallet por darme la oportunidad de colaborar como profesor en varios Másters.

7. Séptimo, seguir siendo ponente, como otros años, ya sea en algún meetup, en el t3chfest, en el OpenExpo, en el Codemotion, en el CommitConf, o dando algún curso como formador técnico.

Conseguido. He dado una charla en el Codemotion, un taller en el CommitConf y he impartido un par de cursos:

8. Octavo, mejorar mi política de compartir.
Conseguido. He escrito 38 entradas en mi Blog, he compartido varios repositorios nuevos en mi GitHub y subido varias presentaciones en mi SlideShare.

9. Noveno, estar pendiente de posibles oportunidades profesionales.

A medias. Creo que en el 2019 he sembrado las semillas y que en el 2020 van a dar sus frutos.

10. Y por último, escribir al menos un post cada cuatro meses con el seguimiento de mis propósitos.

No conseguido. No he escrito ninguno.

RESUMEN:

Conseguido: 5 (50%)
A medias: 4 (40%)
No conseguido: 1 (10%)

Bueno, aunque mejorable, yo creo que ha estado bastante bien. ʘ‿ʘ

Si has leído hasta aquí, puedes ver mis propósitos del 2020.
Comparte:    Facebook Twitter
Leer más

15 de diciembre de 2019

Resetear la contraseña de Root de MySQL en Ubuntu


Hace poco tuve que resetear la password de MySQL en Ubuntu y para que no se pierda en el olvido, pongo aquí los pasos que seguí para resetearla:

1. Parar MySQL:
sudo service mysql stop
2. Crear el directorio /var/run/mysqld:
sudo mkdir /var/run/mysqld
3. Dar permisos al usuario mysql al directorio anterior:
sudo chown mysql: /var/run/mysqld
4. Arrancar MySQL manualmente sin permisos ni red:
sudo mysqld_safe --skip-grant-tables --skip-networking &
5. Entrar en MySQL sin password:
sudo mysql -u root mysql
6. Dentro de MySQL actualizar las tablas directamente:
UPDATE mysql.user SET
authentication_string=PASSWORD('YOURNEWPASSWORD'), 
plugin='mysql_native_password'
WHERE User='root' AND Host='%';
EXIT;
7. Parar MySQL manualmente:
sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown
8. Arrancar el servicio de MySQL normalmente:
sudo service mysql start
9. Testear que puedas entrar como root con la nueva contraseñ:
sudo mysql -u root -p
Comparte:    Facebook Twitter
Leer más

10 de diciembre de 2019

Las 16 entradas más populares de mi blog

Comparte:    Facebook Twitter
Leer más

9 de diciembre de 2019

Crear un mapa con círculos de diferente diámetro con QGIS


En mi post anterior explico cómo instalar de QGIS en Ubuntu 18.04, y en este os voy a explicar como añadir círculos de diferente diámetro en el mapa.

Una vez abierto el QGIS Desktop, lo primero que tenemos que hacer es crear un nuevo proyecto y en el "Navegador", dentro de "XYZ Tiles", pinchamos con el botón derecho en "OpenStreetMap" y luego pulsamos en "Añadir capa al proyecto" y así cargamos un mapa por defecto.


Después tenemos que ver en que sistema de coordenadas tenemos nuestro mapa. Es algo que todavía tengo que estudiar, pero los datos que queremos meter en nuestro mapa tienen que estar en el mismo sistema de coordenadas. Tendré que investigar como cambiar de un sistema de coordenadas a otros.

Bueno, el caso es que pinchando con el botón derecho encima de la capa "OpenStreetMap" y luego seleccionado "Propiedades", en la pestaña "Información", averiguamos que el sistema de coordenadas es: EPSG:3857 - WGS 84 / Pseudo-Mercator - Proyectado.


Así que ahora hay que cargar los datos de los círculos, con sus coordenadas y sus valores. Por comodidad yo me he creado un pequeño fichero CSV con 2 coordenadas y 2 valores.

   x    ;    y    ;  v
-412443 ; 4925188 ; 100
-418698 ; 4912904 ;  10
Ahora pinchamos en el menú "Capa > Añadir capa > Añadir capa de texto delimitado". Y nos aparece una ventana en donde arriba cargamos nuestro fichero CSV y luego hay distintas opciones.


En "Formato de archivo" podemos elegir "Delimitadores personalizados" e indicar por que caracteres están separados nuestros campos". Y en "Definición de geometría" seleccionamos los "Campos X e Y" que se corresponden con nuestro fichero CSV. Y para terminar pulsamos en el botón "Añadir", y entonces deberíamos ver los 2 puntos cargados en el mapa.


Después, pinchamos con el botón derecho en la capa recién creada y seleccionamos la opción "Propiedades":


En esta última ventana, tenemos que ir a la pestaña "Simbología". Luego, en la parte de arriba seleccionamos como tipo de simbología "Graduado". Como "Value" seleccionamos el campo de nuestro fichero CSV con el valor que va a marcar el diámetro de los círculos. En "Símbolo" podemos cambiar el color de los círculos. Luego hay que seleccionar el "Tamaño desde hasta" y si quieres que sea proporcional al mapa tendrás que seleccionar "Unidades del mapa". También podemos seleccionar el número de clases que vamos a querer representar y el modo en el que se van a crear esas clases. Entonces pulsamos en "Clasificar" y se crearan las clases que se van a ver en el mapa. Para finalizar pulsamos en "Aceptar" y ya podremos ver los círculos de distinto tamaño en nuestro mapa.


Luego lo que vamos a querer es poner una etiqueta en cada uno de los puntos del mapa. Para ello pinchamos de nuevo con el botón derecho en la última capa que hemos creado y seleccionamos la opción "Propiedades":


Luego nos tenemos ir a la pestaña "Etiquetas". En la parte de arriba seleccionamos "Etiquetas sencillas". En "Value" seleccionamos el campo de nuestro fichero CSV con el valor de las etiquetas. Y para dejar la etiqueta justo en el centro del círculo, en la sección de "Ubicación" seleccionamos "Desplazamiento desde el punto" y dentro del cuadrante pinchamos justo el cuadrante del medio. Para finalizar pulsamos en "Aceptar" y ya podremos ver los círculos de distinto tamaño con etiquetas en nuestro mapa.

Comparte:    Facebook Twitter
Leer más