13 de junio de 2019

Hackathones 101: Tips para montar un buen hackathon

De la mano de HackathonLovers, he organizado ya más de 20 hackathones y he ayudado con la organización y difusión de otros tantos.

Cada poco tiempo me contacta gente pidiéndome consejos de cómo montar un hackathon, así que los he aglutinado todos aquí para su uso y disfrute :-)

Indice

  • ¿Qué es un hackathon?
  • ¿Cómo sería el hackathon ideal?
  • Principios básicos
  • Preguntas importantes
  • Antes del hackathon
  • Durante el hackathon
  • Después del hackathon
  • No puede faltar en el hackathon

¿Qué es un hackathon?

Un hackathon puede definirse como un encuentro de personas relacionadas con el mundo de la tecnología (desarrolladores de software, diseñadores, etc) que se juntan con la finalidad de crear un producto tecnológico en un plazo de tiempo limitado.

El producto tecnológico se suele crear con fines educativos o sociales, aunque el objetivo final es que sea utilizable, simplemente. La palabra surge de la unión de los términos maratón y hacker, porque es habitual plantear el evento en forma de concurso o competición, y porque en él participan personas que quieren encontrar la solución a un problema utilizando la creatividad y la tecnología. Es decir, personas que podríamos calificar como hackers.

¿Cómo sería el hackathon ideal?

En HackathonLovers hicimos una encuesta de cómo sería el hackathon ideal y los resultados fueron los siguientes:

  • A los encuestados les gusta los hackathones porque fundamentalmente aprende, conoce gente y se divierte. Además de forma secundaria porque resuelve retos y porque hay premios.
  • Aunque el premio no es lo que más motiva a los encuestados a participar en un hackathon, si que parece que es un gran aliciente.
  • Los encuestados prefieren los premios físicos antes que los premios en metálico.
  • Los encuestados opinan que al menos los 3 primeros equipos deberían llevarse algún premio.
  • Los encuestados piensan que con un premio de 100€ o 200€ por participante no está mal.
  • Los encuestados creen que lo más importante a la hora de elegir al ganador de un hackathon debe ser es la originalidad de la idea, aunque también es importante la viabilidad del proyecto, la dificultad técnica, el grado de finalización, y el diseño y la usabilidad de la aplicación.
  • Los encuestados prefieren claramente hackathones con equipos multidisciplinares.
  • A los encuestados les gusta que haya charlas solo si son cortas y son al principio del hackathon.
  • Los encuestados prefieren comer catering variado en un hacakthon.
  • Los encuestados opinan que la duración ideal de un hackathon está comprendida entre uno y dos días.
  • Los encuestados prefieren que los hackathones se organicen en fin de semana.
  • Los encuestados estarían dispuestos a pagar al menos 10€ por participar en un hackathon.

Principios básicos

HackathonLovers tiene unos principios básicos que todos los hackathones deberían cumplir:

  • Los desarrolladores/as tienen que tener la libertad y el derecho de elegir con qué licencia de uso liberan lo que crean.
  • Un hackathon no puede ser considerado una vía de obtener un software a medida por parte de patrocinadores o terceras personas.
  • Así mismo, aunque un hackathon es un evento en donde se puede hacer networking, y este puede finalizar con algún acuerdo entre varias partes, no debería ser usado única y exclusivamente con fines de recruiting.

Preguntas importantes

A continuación una serie de preguntas que hay que responder antes de ni siguiera planificar el hackathon:

  • ¿Objetivo del hackathon?
  • ¿Nombre del hackathon? (Buscar nombre con gancho que no tenga #hashtag en twitter)
  • ¿Retos del hackathon?
  • ¿Duración del hackathon? ¿Sábado, Viernes-Sábado, Viernes-Sábado-Domingo? (Los viernes empezar por la tarde, y los domingos terminar antes de comer)
  • ¿Agenda del hackathon?
  • ¿Fecha del hackathon? (minimo con 2 meses de antelación)
  • ¿Se solapa la fecha con otros hackathones y/o eventos tecnológicos?
  • ¿Lugar del hackathon? (mesas sillas, regletas, wifi, videoproyector y audio)
  • ¿Charlas y/o workshops antes del hackathon?
  • ¿Número de participantes del hackathon?
  • ¿Número de equipos del hackathon?
  • ¿Número de personas por equipos del hackathon?
  • ¿Restricciones en los equipos del hackathon?
  • ¿Web del hackathon?
  • ¿Inscripciones del hackathon?
  • ¿Precio entradas del hackathon? (Mejor cobrar algo, aunque sea simbólico, para asegurarse la asistencia)
  • ¿Catering del hackathon? (Pensar en los veganos/celíacos)
  • ¿Premios del hackathon? (Mínimo un premio para el primer equipo ganador, ideal 3 premios para los mejores equipos)
  • ¿Camisetas y o regalos del hackathon?
  • ¿Fotos, vídeos del hackathon?
  • ¿Publicidad del hackathon? (Hay que empezar un mes antes, y HackathonLovers siempre da publicidad gratis con la condición de que cumpla los principios básicos)

Antes del hackathon

A continuación una serie de tips a chequear antes del hackathon:

  • Cerrar todas las preguntas anteriores.
  • Si el hakathon cumple con los principios básicos podéis pedir a HackathonLovers que os deje poner su logo en su web como señal de que los cumple.
  • En la web poner:
    • ¿Qué? ¿Por qué? ¿Cómo? ¿Cuando? ¿Dónde? ¿Quien?
    • Retos. Premios. Inscripción. Bases. Agenda. Mapa. Jurado. Patrocinadores.
    • Bien claro lo más importante de las bases (y un enlace a las bases)
      • Lo más importante de las bases es:
        • que el derecho de lo desarrollado pertenece a los hackers
        • indicar cómo se van a evaluar los proyectos.
    • Web de ejemplo: http://hackathonlovers.com/psd2hackathon/
  • Plantilla bases legales.
  • Hacer una escaleta entre el grupo organizador y tener claro quien hace qué y quien habla en cada momento.
  • Tener un grupo de Telegram para el grupo organizador. 
  • Crear una plantilla de puntos donde se indique que se van a tener en cuenta a la hora de puntuar.
  • Opcional:
    • "Banda sonora del #hackathon" = crear una lista colaborativa de spotify y que la gente suba la música que le gusta
    • Grupo de Telegram para los participantes.

Durante el hackathon

A continuación una serie de tips a tener en cuenta durante el hackathon:

  • Fotos de todo.
  • Compartir en las redes sociales con el hashtag del evento.
  • Video de todo.
  • Timelapse de todo.
  • Apertura dando las gracias a patrocinadores y a los asistentes.
  • Charla motivacional tipo “Hackaeando Hackathones” o “¿Qué es un hackathon y por qué deberías asistir?
  • Charla técnica explicando los retos.
  • Dinámicas de grupo.
  • Tormenta de ideas.
  • Hacer entrevistas en vídeo a los participantes y al jurado antes de las demos.
  • Pasar a los grupos una plantilla de presentación como base:
    • Problema que resuelve
    • Solución adoptada
    • Implementación técnica
    • Miembros del equipo
  • Pasar la plantilla de puntos donde se indique que se van a tener en cuenta a la hora de puntuar a los grupos y a los miembros del jurado.
  • Con las fotos/videos del día hacer un minivideo antes de las demos.
  • Una hora antes de las demos pasar un formulario para la inscripción de equipos en donde pondrán nombre del equipo, descripción y URL a un repositorio público con el código, el vídeo de la aplicación funcionando y la presentación en PDF.
  • Subir todo en un mismo ordenador para no tener que andar cambiando de ordenador.
  • Dejar claro a los asistentes que las demos duran 5 minutos + 5 de preguntas y que habrá crono para que no se pasen del tiempo.
  • Después de las demos y antes del fallo del jurado:
    • Hacer una foto conjunta.
    • Pasar un formulario con una encuesta de satisfacción.
    • Pasar un formulario con una entrevista escrita.
  • Entrega de premios.
  • Cierre dando las gracias a patrocinadores y a los asistentes.
  • Entrevista en vídeo a los equipos ganadores.
  • Fin de fiesta.

Después del hackathon

A continuación una serie de tips a chequear después del hackathon:

No puede faltar en el hackathon

A continuación una serie de elementos que no pueden faltar en un hackathon:

  • Mesas con sillas para al menos 5 personas.
  • Regletas, al menos una por cada mesa con al menos 5 conexiones.
  • WiFi para al menos el doble de participantes (la gente conecta el móvil y el ordenador).
  • Vídeo proyector y pantalla y al ser posible sistema de audio.
  • Agua, zumos y refrescos.
  • Bollería y fruta.
  • Máquina de café.
  • Comida/cena variada (incluir para veganos/celíacos)
  • Premios para los ganadores.
  • Cosas menos importantes:
    • Grupo de Telegram donde los que se registren puedan ponerse en contacto con anterioridad al hackathon, para poder compartir coche, hablar de ideas, etc.
    • Preguntar si el participante es vegano/celíaco en el registro.
    • Post-its y pegatinas para los equipos.
    • Camisetas y regalos para todos si hay presupuesto.
Comparte:    Facebook Twitter
Leer más

30 de mayo de 2019

Convertir un fichero Asciidoctor a Markdown


He hecho un pequeño script para convertir un fichero Asciidoctor a Markdown:

echo "convert $1.adoc to $1.xml as docbook"
asciidoctor -b docbook $1.adoc

echo "convert $1.xml as docbook to $1.md"
pandoc -f docbook -t markdown --wrap=preserve --atx-headers $1.xml -o $1.md

echo "replace some characters in $1.md"
sed -i "s/ {#.*}//g" $1.md
sed -i "s/\~\\\~\~/\~\~\~/g" $1.md
sed -i "s/\]\(view-source\:/\]\(/g" $1.md
Y para usarlo es así:

./asciidoctor-to-markdown.sh fichero-asciidoctor-sin-extension
Nota: tendrás que tener instalado asciidoctor y pandoc :-)
Comparte:    Facebook Twitter
Leer más

6 de mayo de 2019

Plugins de Visual Studio @Code para desarrollar con #Angular y #SpringBoot


Java Extension Pack: Es un pack con una serie de plugins para desarrollar con Java en Visual Studio Code.

Spring Boot Extension Pack: Es un pack con una serie de plugins para desarrollar con Spring Boot en Visual Studio Code.

Checkstyle for Java: Es un plugin que muestra ciertos errores en nuestros archivos Java.

Java Code Generators: Es un plugin para generación boilerplate de Java.

Debugger for Firefox: Es un plugin que nos permite debuguear TypeScript en Firefox.

TSLint: Es un plugin que muestra ciertos errores en nuestros archivos TypeScript.

Angular Language Service: Es un plugin que ayuda con el autocompletado en los templates de Angular en nuestros HTML.

HTMLHint: Es un plugin que muestra ciertos errores en nuestros archivos HTML.

GitLens: Es un plugin de Git que me gusta bastante.

Bracket Pair Colorizer 2: Es un plugin que colorea los (), los [] y los {}.

Auto Rename Tag: Es un plugin que renombra automaticamente los tags de HTML.
Comparte:    Facebook Twitter
Leer más

5 de mayo de 2019

Instalar Oracle Java 11 en Ubuntu 18.04


En los repositorios de Ubuntu tienes OpenJDK, pero a veces es necesario instalar el JDK de Oracle. A continuación vamos a ver como instalar Oracle Java 11 en Ubuntu 18.04.

Primero tienes que añadir el repositorio de linuxuprising:

sudo add-apt-repository ppa:linuxuprising/java
Luego actualizamos:

sudo apt update
Y luego instalamos el paquete oracle-java11-installer:

sudo apt install oracle-java11-installer
Para que Oracle Java 11 se ejecute por defecto tenemos que instalar el paquete oracle-java11-set-default:

sudo apt install oracle-java11-set-default
Si queremos tener Oracle Java 11 instalado pero que no se ejecute por defecto tenemos que eliminar el paquete oracle-java11-set-default:

sudo apt remove oracle-java11-set-default
Para comprobar la versión de Java que se ejecuta por defecto lo hacemos con el comando java -version:

java -version
Comparte:    Facebook Twitter
Leer más

4 de febrero de 2019

Programando la música de Star Wars con Gibber


Como comenté en un mi última entrada, estoy aprendiendo con mis hijas a programar música, dibujos 2D y escenas 3D con Gibber. Para practicar un poco hemos buscado las notas del tema principal de Star Wars, y las hemos programado.

A continuación el código de la música de la Star Wars con Gibber:

Notation.on()
a = SoundFont('piano')
a.note.seq([
  "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",
  "F2", "F2", "F2", "F2", "F2"
], [
  4/8, 4/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/24, 2/24, 2/24,
  4/8, 4/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 1/8, 1/8,
  3/8, 1/8, 1/8, 1/8, 1/8, 1/8,
  2/24, 2/24, 2/24, 1/8, 1/8, 2/8, 1/8, 1/8,
  3/8, 1/8, 1/8, 1/8, 1/8, 1/8,
  1/8, 1/8, 4/8, 1/8, 1/8,
  3/8, 1/8, 1/8, 1/8, 1/8, 1/8,
  2/24, 2/24, 2/24, 1/8, 1/8, 2/8, 1/8, 1/8,
  4/8, 4/8,
  6/8, 2/24, 2/24, 2/24,
  4/8, 4/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/24, 2/24, 2/24,
  4/8, 4/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/8,
  2/24, 2/24, 2/24, 4/8, 2/24, 2/24, 2/24,
  2/8, 2/24, 2/24, 2/24, 2/8
])
Y aquí os dejo un pequeño vídeo con el código ejecutándose:


Comparte:    Facebook Twitter
Leer más

25 de enero de 2019

Programando música, dibujos 2D y escenas 3D con Gibber


Tengo 2 hijas pequeñas y como propósito de inicio de año me propuse para más tiempo de calidad con ellas. Y que mejor para ello que encontrar algo que nos guste a ambos. Están los socorridos juegos de mesa y de cartas, pero a mi me gusta mucho programar, y a mis hijas a una le gusta mucho la música y a otra mucho las artes gráficas.

Buscando información sobre como juntar esos mundos, descubrí que existían las algorave, que es la abreviatura de "algorithmic rave" y que consiste en una rave (evento en donde la gente baila música electrónica) con la particularidad de que la música es generada a partir de algoritmos, a menudo utilizando técnicas de "live coding" o programación en directo.

Estuve probando distintos entornos y el que más me convenció fue Gibber, porque no hace falta instalar nada, se ejecuta desde el propio navegador y permite generar tanto música como dibujos 2D y escenas 3D.

A continuación un pequeño código de ejemplo:

a = Drums('x*ox*xo-')
  .pitch.seq( [.5,1,2,4], 1/8 )
  .pan.seq( [-1,0,1], 1/8 )
  .shuffle.seq( null, 1 )

a = Cube()
  .rotation.seq( [.5,1,2,4], 1/8 )
  .position.x.seq( [-50,0,50], 1/8 )
  .scale.seq( [.5,1,2,4], 1/8 )
Y aquí os dejo un pequeño vídeo con el código ejecutándose:



Bibliografía:
- Manual de Gibber.
- Referencia de Gibber.
Comparte:    Facebook Twitter
Leer más

13 de enero de 2019

Listado de los vídeos de las charlas de Codemotion mediante web scraping con Puppeteer

Vídeo de la charla en el Codemotion sobre cómo desarrollar aplicaciones descentralizadas en la Blockchain de Etheruem

El año pasado dí una charla en el Codemotion sobre cómo desarrollar aplicaciones descentralizadas en la Blockchain de Etheruem. El caso es que hace poco han subido los vídeos de las charlas del evento a la web de Codemotion. El problema es que no me gusta como han organizado la información.

Primero tienes que acceder a la página de ponentes del Codemotion:

Página de ponentes del Codemotion

Y luego tienes que acceder a la página de un ponente del Codemotion:

Página de un ponente del Codemotion

Y luego tienes que hacer scroll para ver el título, el resumen y el vídeo de la charla que ha dado el ponente:

Página de un ponente abajo donde se ve el vídeo y las slides

Pero además, si no estás logueado, no te aparece la charla:

Página de un ponente abajo donde se ve un mensaje que te pide que te loguees si no lo estás

Así que me he entretenido haciendo un script para juntar toda la información relevante de las charlas de Codemotion con un enlace a los vídeos en un solo fichero. He utilizado Puppeteer, que es una librería de NodeJS que proporciona una API de alto nivel para controlar Chrome y con la cual podemos hacer web scraping.

Para ejecutar el script tienes que, primero clonar mi repositorio codemotion-talks:

git clone git@github.com:asanzdiego/codemotion-talks.git
Luego instalar NodeJS, y luego Puppeteer con el siguiente comando:

npm install puppeteer
Y por último ejecutar el siguiente comando poniendo el mail y la contraseña de vuestro usuario de la página de Codemotion:

node codemotion-talks.js YOUR_EMAIL YOUR_CODEMOTION_PASSWORD
El proceso tarda un ratito y os saldrá algo así:

Ejecución del proceso

Y al final del proceso obtendréis un bonito fichero codemotion-talks.html con toda la información relevante (nombre del ponente, nombre de la charla, resumen de la charla, idioma de la charla, nivel de la charla, y un enlace al vídeo de la misma):

Listado de los vídeos de las charlas de Codemotion mediante web scraping con Puppeteer

Sois libres de forkear y modificar este proyecto a vuestro gusto :-)
Comparte:    Facebook Twitter
Leer más

27 de diciembre de 2018

Mis propósitos para el 2019



Como otros años, y después de hacer mi retrospectiva del 2018, toca ahora plasmar mis propósitos para este 2019, que son muy parecidos a los que me propuse hace un año, con algún que otro cambio:

1. Primero, quiero pasar más tiempo con mi familia y mis amigos, sobre todo quiero pasar más tiempo de calidad con mi mujer y mis hijas. Tengo que seguir con la progresión del año pasado.

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

  1. Reducir el consumo de azúcares, grasas y alcohol.
  2. Aumentar el consumo de frutas, verduras y agua.
  3. Dormir al menos 7 horas diarias.
  4. Andar al menos 5 kilómetros diarios.
  5. Hacer deporte (correr/gimnasio) al menos 2 veces por semana.
  6. Bajar mi peso al menos 2 kilos y no volverlos a coger.
Este año daré como superado el propósito si al menos cumplo 4 de los 6 propósitos secundarios.

3. Tercero, quiero mejorar mi nivel de inglés. Este propósito tiene otros propósitos secundarios:

  1. Añadir sitios de habla inglesa a mi RSS.
  2. Seguir a personalidades de habla inglesa en mi Twitter.
  3. Hacer al menos tres lecciones de Duolingo a la semana.
  4. Ver al menos dos horas de series y/o películas en inglés a la semana.
  5. Ver al menos una charla técnica en inglés cada dos semanas.
  6. Traducir al menos un artículo del inglés al español al mes.
  7. Escribir al menos un post en inglés cada dos meses.
Daré como superado el propósito si al menos cumplo 4 de los 7 propósitos secundarios.

4. Cuarto, quiero 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.

5. Quinto, quiero seguir ayudado a mi gran amigo Fernando con Pronoide. Tengo la impresión que este 2019 va a ser un año todavía mejor que el 2018 para Pronoide.

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

7. Séptimo, me encantaría 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.

8. Octavo, quiero mejorar mi política de compartir. Quiero escribir al menos 12 entradas en mi Blog, crear al menos 2 repositorios en mi GitHub y subir al menos 2 presentaciones en mi SlideShare.

9. Noveno, quiero estar pendiente de posibles oportunidades profesionales. Estoy muy a gusto donde estoy, y estoy muy a gusto con lo que hago, pero creo que estoy un poco estancado. Estoy en la mitad de mi vida profesional, y creo que me quedan todavía saltos que dar.

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

Espero seguir con la tendencia del año pasado y conseguir, si no son todos, la mayor parte de mis propósitos.
Comparte:    Facebook Twitter
Leer más

25 de diciembre de 2018

Retrospectiva del 2018



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, tener una vida más saludable. Este propósito tenía varios objetivos 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/nadar) al menos 2 veces por semana. A medias.
  6. Bajar mi peso al menos 2 kilos y no volverlos a coger. Conseguido.
A medias. Aunque he hecho avances y estoy en la buena senda tengo que seguir mejorando este aspecto de mi vida.

2. Segundo, seguir dando lo mejor de mi como Asesor Técnico Docente en el servicio TIC de la Dirección Genaral de Infrastucturas y Servicios de la Consejería de Educación e Innovació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.

3. Tercero, entregar en tiempo y forma mi Proyecto Fin de Máster del Máster Universitario en Ingeniería del Software para la Web en el que me matriculé en la Universidad de Alcalá. El proyecto ha consistido en el desarrollo de una aplicación descentralizada de gestión de expedientes académicos en la blockchain de Ethereum.

Conseguido. Saqué un 10, y admitieron mi paper en el Congreso ATICA y lo adjuntaron en el libro de actas.

4. Cuarto, 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 2019 va a ser un buen año para Pronoide.

5. Quinto, 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.

6. Sexto, 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 sido ponente en el t3chfest, en el Codemotion y en el CommitConf, en este último con un taller y una charla:
7. Séptimo, buscar un nuevo líder que me sustituya en Hackathon Lovers.

Conseguido. Desde abril tenemos a Karina como nueva lideresa en Hackathon Lovers y lo está haciendo muy bien.

8. Octavo, mejorar mi política de compartir.

Conseguido. He escrito 15 entradas en mi Blog, he compartido varios repositorios nuevos en mi GitHub y subido varias presentaciones en mi SlideShare.

9. Noveno, quiero no empeorar mi nivel de inglés.

A medias. Si que he visto alguna serie en inglés, alguna película en inglés y alguna charla en inglés, pero creo que debería ser más constante.

10. Y por último, pero no por eso menos importante, pasar todavía más tiempo con mi familia y mis amigos, sobre todo quiero pasar más tiempo con 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 2019 esto mejora aún más.

RESUMEN:

Conseguido: 7 (70%) A medias: 3 (30%) No conseguido: 0 (0%)

Bueno, desde que hago retrospectivas, creo que este ha sido uno de mis mejores años. ʘ‿ʘ
Comparte:    Facebook Twitter
Leer más

11 de diciembre de 2018

La notación O grande con ejemplos en JavaScript

Después de mi anterior post sobre complejidad computacional, hoy voy a hablar de la notación O grande, que es una notación matemática que nos ayuda a describir el comportamiento de un algoritmo "al límite" en función de sus elementos de entrada N.

Algunos de los órdenes más utilizados en análisis de algoritmos, en orden creciente, están resumidos en la siguiente tabla:

notación nombre
O(1) constante
O(log n) logarítmico
O(n) lineal
O(n log n) lineal logarítmico
O(n^2) cuadrático
O(2^n) exponencial
O(n!) factorial
A continuación tenéis un vídeo en inglés en dónde se explica la notación O grande y como saber el orden de un algorítmo estudiando su código con reglas sencillas. Luego yo después muestro varios ejemplos de algoritmos de distintos tipos de orden.



Ejemplo de un algoritmo de orden O(1)

Imaginemos un programa que dado un número N, saca dicho número por pantalla. Para simular que el programa hace "algo", antes de sacar dicho número por pantalla, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    retraso();
    console.log(n);
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(miliseconds + " miliseconds");
}

ejecutar(10);
ejecutar(1000);
ejecutar(100000);
ejecutar(10000000);
El programa lo ejecutamos para N=10, N=1.000, N=100.000 y N=10.000.000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

10
11 miliseconds
1000
5 miliseconds
100000
6 miliseconds
10000000
5 miliseconds
Como vemos, este algoritmo es de orden O(1), constante, pues da igual el número de entrada, siempre va a tardar más o menos lo mismo en ejecutarse.

Ejemplo de un algoritmo de orden O(log N)

Imaginemos el mismo programa de antes, solo que ahora guarda en un array la división de N por 2, y luego la división del resultado obtenido por 2, y así sucesivamente hasta que el resultado sea menor que 1. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = [];
    let resultado = n;
    while (resultado > 1) {
        retraso();
        resultado = resultado / 2;
        array.push(resultado);
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(10);
ejecutar(1000);
ejecutar(100000);
ejecutar(10000000);
El programa lo ejecutamos para N=10, N=1.000, N=100.000 y N=10.000.000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

10
22 miliseconds
1000
47 miliseconds
100000
84 miliseconds
10000000
127 miliseconds
Como vemos, este algoritmo es de orden O(log N), logarítmico, pues el tiempo de ejecución depende logarítmicamente del número de entrada (si multiplicamos N por 100 el tiempo de ejecución aproximadamente solo se duplica).

Ejemplo de un algoritmo de orden O(N)

Imaginemos el mismo programa de antes, solo que ahora guarda un array con los N primeros números naturales. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = new Array(n);
    for (let index = 0; index < n; index++) {
        retraso();
        array[index] = index;
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(1);
ejecutar(10);
ejecutar(100);
ejecutar(1000);
El programa lo ejecutamos para N=1, N=10, N=100 y N=1.0000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

1
7 miliseconds
10
49 miliseconds
100
584 miliseconds
1000
6076 miliseconds
Como vemos, este algoritmo es de orden O(N), lineal, pues el tiempo de ejecución depende directamente del número de entrada (si multiplicamos N por 10 el tiempo de ejecución también se multiplica aproximadamente por 10).

Ejemplo de un algoritmo de orden O(N^2)

Imaginemos el mismo programa de antes, solo que ahora guarda un array con todas las combinaciones de multiplicar todos los números naturales igual o menor que N. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = new Array(n*n);
    for (let i = 0; i <= n; i++) {
        for (let j = 0; j <= n; j++) {
            retraso();
            array.push(i*j);
        }
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(2);
ejecutar(4);
ejecutar(8);
ejecutar(16);
El programa lo ejecutamos para N=2, N=4, N=8 y N=16, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

2
46 miliseconds
4
125 miliseconds
8
487 miliseconds
16
1702 miliseconds
Como vemos, este algoritmo es de orden O(N^2), cuadrático, pues el tiempo de ejecución depende cuadráticamente del número de entrada (si multiplicamos N por 2 el tiempo de ejecución se multiplica aproximadamente por casi 4).
Comparte:    Facebook Twitter
Leer más