Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cata de Elixir

Cata de Elixir

En esta sesión conoceremos el lenguaje de programación Elixir, uno de los exponentes más relevantes de la programación funcional actual, específicamente en el contexto de los sistemas altamente concurrentes y escalables.

Comenzaremos con una breve introducción histórica a este lenguaje, heredeiro de Erlang, e a su naturaleza declarativa, para posteriormente adentrarnos en su potencia a la hora de manejar tareas concurrentes, distribuidas y tolerantes a fallos, en forma de procesos ligeros, de manera sencilla y empleando ejemplos prácticos.

El objetivo final es que las personas que utilicen este material puedan evaluar el potencial de Elixir como tecnología candidata en proyectos futuros.

Laura M Castro

October 25, 2024
Tweet

More Decks by Laura M Castro

Other Decks in Programming

Transcript

  1. ¿Quién soy? Ingeniera: Informática Doctorado: Computación Docente: Arquitectura del Software,

    Validación y Verificación de Software Investigadora: Aplicaciones industriales de la programación funcional, automatización de pruebas empleando modelos y propiedades Divulgadora: Software libre, perspectiva de género en la tecnología
  2. ¿Elixir? Paradigma: Funcional Tipado: Fuerte, dinámico Gestión de memoria: Garbage

    collection automático Ejecución: Compilado a bytecode, sobre máquina virtual BEAM (multiplataforma) Primera release: 2012 Última versión estable: 1.17 (septiembre 2024)
  3. Let it crash Características Everything is a function Asynchronous message

    passing Share nothing No hay efectos secundarios (transparencia referencial): no se alteran los parámetros, se devuelve el último cómputo
  4. Let it crash Características Everything is a process Asynchronous message

    passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  5. Let it crash Características Everything is a process Asynchronous message

    passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  6. Let it crash Características Everything is a process Asynchronous message

    passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina) La lógica de un proceso se organiza en funciones; para la comunicación entre procesos se mandan mensajes
  7. Los mensajes llegan al buzón de un proceso y salen

    de él cuando el proceso los saca expresamente (asincronía) Let it crash Características Everything is a process Asynchronous message passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  8. La comunicación entre procesos es transparente a la ubicación para

    quien programa (¡incluso entre nodos!) Let it crash Características Everything is a process Asynchronous message passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  9. La comunicación entre procesos es transparente a la ubicación para

    quien programa (¡incluso entre nodos!) Let it crash Características Everything is a process Asynchronous message passing Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  10. La comunicación entre procesos es transparente a la ubicación para

    quien programa (¡incluso entre nodos!) Let it crash Características Everything is a process Asynchronous message passing El estado de un proceso es completamente privado y no se comparte, la información se copia y se envía (paso por valor) Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  11. La comunicación entre procesos es transparente a la ubicación para

    quien programa (¡incluso entre nodos!) Let it crash Características Everything is a process Asynchronous message passing El estado de un proceso es completamente privado y no se comparte, la información se copia y se envía (paso por valor) Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  12. La comunicación entre procesos es transparente a la ubicación para

    quien programa (¡incluso entre nodos!) Let it crash Características Everything is a process Asynchronous message passing El estado de un proceso es completamente privado y no se comparte, la información se copia y se envía (paso por valor) Separación de la lógica de negocio (centrada en el happy path) y la lógica de monitorización (árboles de supervisión) Share nothing Los procesos en la BEAM son muy ligeros (podemos levantar cientos de miles en la misma máquina)
  13. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual Lo ve

    todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo
  14. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual a.k.a. "mi

    villano favorito" Lo ve todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo
  15. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual Cada minion

    tiene info (datos) Cada minion sabe realizar tareas (métodos) Alguien debe orquestar El Plan, fallar no es una opción Lo ve todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo
  16. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual Cada minion

    tiene info (datos) Cada minion sabe realizar tareas (métodos) Alguien debe orquestar El Plan, fallar no es una opción Lo ve todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo a.k.a. "the fellowship of the BEAM"
  17. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual Cada minion

    tiene info (datos) Cada minion sabe realizar tareas (métodos) Alguien debe orquestar El Plan, fallar no es una opción Cada quien tiene su objetivo Algunos se corrompen, otros desaparecen... pero La Misión continúa y completa eventualmente No one rules them all Lo ve todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo
  18. Cómo nos influyen los paradigmas Elixir/BEAM Imperativo Objetual Cada minion

    tiene info (datos) Cada minion sabe realizar tareas (métodos) Alguien debe orquestar El Plan, fallar no es una opción Cada quien tiene su objetivo Algunos se corrompen, otros desaparecen... pero La Misión continúa y completa eventualmente No one rules them all Lo ve todo (datos) Lo sabe todo (algoritmo) Materializa Su Voluntad Si el mundo falla, empieza de nuevo "It was never about the language: Paradigm Impact on Software Design Decisions". Castro, L (2020)
  19. Creación de un proyecto Objetivo: Crear la estructura de ficheros

    y directorios estándar en proyectos Elixir Requisitos: Una instalación local de Elixir Instrucciones: 1. En una terminal, usar la orden mix new $ mix new elixir_cata
  20. Creación de un proyecto Objetivo: Crear la estructura de ficheros

    y directorios estándar en proyectos Elixir Requisitos: Una instalación local de Elixir Instrucciones: 1. En una terminal, usar la orden mix new: $ mix new elixir_cata
  21. Creación de un proyecto Objetivo: Crear la estructura de ficheros

    y directorios estándar en proyectos Elixir Requisitos: Una instalación local de Elixir Instrucciones: 1. En una terminal, usar la orden mix new: $ mix new elixir_cata
  22. Examen de un módulo Objetivo: Explorar la sintaxis básica de

    los módulos de código en Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero lib/elixir_cata.ex
  23. Examen de un módulo Objetivo: Explorar la sintaxis básica de

    los módulos de código en Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero lib/elixir_cata.ex
  24. Examen de un módulo Objetivo: Explorar la sintaxis básica de

    los módulos de código en Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero lib/elixir_cata.ex 2. En nuestro IDE de preferencia, abrir el fichero test/elixir_cata_test.exs
  25. Examen de un módulo Objetivo: Explorar la sintaxis básica de

    los módulos de código en Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero lib/elixir_cata.ex 2. En nuestro IDE de preferencia, abrir el fichero test/elixir_cata_test.exs
  26. Compilación y pruebas Objetivo: Explorar los comandos básicos de gestión

    de proyectos Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar las órdenes $ mix compile $ mix test
  27. Compilación y pruebas Objetivo: Explorar los comandos básicos de gestión

    de proyectos Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar las órdenes $ mix compile $ mix test
  28. Compilación y pruebas Objetivo: Explorar los comandos básicos de gestión

    de proyectos Elixir Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar las órdenes $ mix compile $ mix test
  29. Ejecución interactiva Objetivo: Explorar la terminal interactiva de Elixir (BEAM)

    Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar la orden $ iex –S mix
  30. Ejecución interactiva Objetivo: Explorar la terminal interactiva de Elixir (BEAM)

    Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar la orden $ iex –S mix
  31. Ejecución interactiva Objetivo: Explorar la terminal interactiva de Elixir (BEAM)

    Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar la orden $ iex –S mix
  32. Ejecución interactiva Objetivo: Explorar la terminal interactiva de Elixir (BEAM)

    Requisitos: Un proyecto Elixir recién creado Instrucciones: 1. En una terminal, ejecutar la orden $ iex –S mix ProTip: activar historial $ iex --erl "-kernel shell_history enabled" -S mix $ export ERL_AFLAGS="-kernel shell_history enabled"
  33. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex
  34. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex
  35. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden iex> Greeter.hello()
  36. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden iex> Process.exit(pid("0.164.0"), :kill)
  37. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden 3. En nuestro IDE de preferencia, refinar la implementación de lib/greeter.ex
  38. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden 3. En nuestro IDE de preferencia, refinar la implementación de lib/greeter.ex
  39. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden 3. En nuestro IDE de preferencia, refinar la implementación de lib/greeter.ex 4. En la terminal BEAM, ejecutar las órdenes iex> recompile iex> g = Greeter.hello() iex> Greeter.goodbye(g)
  40. Creación de un proceso Objetivo: Definir la lógica de un

    proceso simple en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/greeter.ex 2. En la terminal BEAM, ejecutar la orden 3. En nuestro IDE de preferencia, refinar la implementación de lib/greeter.ex 4. En la terminal BEAM, ejecutar las órdenes iex> recompile iex> g = Greeter.hello() iex> Greeter.goodbye(g) GeekTest: ¡miles de procesos! $ gs = 1..100_000 |> Enum.map(fn _ -> Greeter.hello() end) $ gs |> Enum.map(fn g -> Greeter.goodbye(g) end)
  41. Ciclo de vida de un proceso GenServer Alternativas "zero-code" para

    necesidades simples (solo ejecución de código, solo gestión de datos) Task, Agent Evita repetición de código, abre la puerta a la supervisión
  42. Creación de un GenServer Objetivo: Definir la lógica de un

    GenServer en Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, crear el fichero lib/gen_greeter.ex 2. Añadir interacciones síncronas y asíncronas: saluted/1 y change_salute/2 3. En la terminal BEAM, ejecutar las órdenes iex> g = Greeter.hello() iex> Greeter.saluted(g) iex> Greeter.change_salute(g, "Un mensaje diferente") iex> Greeter.goodbye(g)
  43. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex
  44. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex
  45. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En la terminal BEAM, ejecutar las órdenes iex> Supervisor.start_link([%{ id: GenGreeter, start: {GenGreeter, :hello, []}}], strategy: :one_for_one) iex> :observer.start()
  46. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En la terminal BEAM, ejecutar las órdenes iex> Supervisor.start_link([%{ id: GenGreeter, start: {GenGreeter, :hello, []}}], strategy: :one_for_one) iex> :observer.start()
  47. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En la terminal BEAM, ejecutar las órdenes iex> Supervisor.start_link([%{ id: GenGreeter, start: {GenGreeter, :hello, []}}], strategy: :one_for_one) iex> :observer.start()
  48. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En la terminal BEAM, ejecutar las órdenes iex> Supervisor.start_link([%{ id: GenGreeter, start: {GenGreeter, :hello, []}}], strategy: :one_for_one) iex> :observer.start()
  49. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En una terminal, ejecutar las órdenes 3. En nuestro IDE de preferencia, crear el fichero lib/gen_greeter_sup.ex
  50. Supervisión de un GenServer Objetivo: Incluir lógica de supervisión para

    un GenServer en Elixir Requisitos: Un proyecto Elixir que incluya un GenServer Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/gen_greeter.ex 2. En una terminal, ejecutar las órdenes 3. En nuestro IDE de preferencia, crear el fichero lib/gen_greeter_sup.ex
  51. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/application.ex
  52. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex
  53. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex
  54. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex 2. En nuestro IDE de preferencia, editar el fichero mix.exs
  55. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex 2. En nuestro IDE de preferencia, editar el fichero mix.exs
  56. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex 2. En nuestro IDE de preferencia, editar el fichero mix.exs 3. En una terminal, ejecutar la orden $ iex –S mix
  57. Creación de una Aplication Objetivo: Convertir el sistema en una

    aplicación independiente Requisitos: Un proyecto Elixir con árbol de supervisión Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero lib/greeter_app.ex 2. En nuestro IDE de preferencia, editar el fichero mix.exs 3. En una terminal, ejecutar la orden $ mix run --no-halt
  58. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En una terminal, ejecutar la orden $ mix format
  59. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En una terminal, ejecutar la orden $ mix format Da formato a los módulos de un proyecto
  60. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:credo, "~> 1.7", only: [:dev, :test], runtime: false} $ mix deps.get $ mix credo
  61. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:credo, "~> 1.7", only: [:dev, :test], runtime: false} $ mix deps.get $ mix credo Analizador estático de código que recomienda buenas prácticas
  62. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:ex_doc, "~> 0.34", only: :dev, runtime: false} $ mix deps.get $ mix docs
  63. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:ex_doc, "~> 0.34", only: :dev, runtime: false} $ mix deps.get $ mix docs Genera documentación del proyecto en formato HTML y ePub
  64. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:ex_doc, "~> 0.34", only: :dev, runtime: false} $ mix deps.get $ mix docs
  65. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:doctor, "~> 0.21.0", only: [:dev, :test]} $ mix deps.get $ mix doctor
  66. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:doctor, "~> 0.21.0", only: [:dev, :test]} $ mix deps.get $ mix doctor Analizador estático que comprueba la calidad de la documentación
  67. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} $ mix deps.get $ mix dialyzer
  68. Bonus: herramientas útiles Objetivo: Conocer comandos y herramientas útiles para

    el desarrollo con Elixir Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, editar el fichero mix.exs 2. En una terminal, ejecutar las órdenes {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} $ mix deps.get $ mix dialyzer Analizador estático que comprueba errores de tipado
  69. Bonus: pruebas de I/O Objetivo: Realizar pruebas que verifican la

    aparición de contenido en salida estándar Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero test/greeter_test.exs
  70. Bonus: pruebas de I/O Objetivo: Realizar pruebas que verifican la

    aparición de contenido en salida estándar Requisitos: Un proyecto Elixir Instrucciones: 1. En nuestro IDE de preferencia, abrir el fichero test/greeter_test.exs
  71. Bonus: uso de Task Objetivo: Usar el módulo estándar Task

    en lugar de definir un proceso propio Requisitos: Un proyecto Elixir y la necesidad de un proceso para realizar una única computación asíncrona (con o sin devolución de resultado) Instrucciones: 1. En la terminal BEAM, ejecutar la orden iex> Task.async(fn -> Process.sleep(3_000) IO.puts("Job finished!") end)
  72. Bonus: uso de Task Objetivo: Usar el módulo estándar Task

    en lugar de definir un proceso propio Requisitos: Un proyecto Elixir y la necesidad de un proceso para realizar una única computación asíncrona (con o sin devolución de resultado) Instrucciones: 1. En la terminal BEAM, ejecutar las órdenes iex> t = Task.async(fn -> Process.sleep(1_000) IO.puts("Job finished!") 2+2 end)
  73. Bonus: uso de Task Objetivo: Usar el módulo estándar Task

    en lugar de definir un proceso propio Requisitos: Un proyecto Elixir y la necesidad de un proceso para realizar una única computación asíncrona (con o sin devolución de resultado) Instrucciones: 1. En la terminal BEAM, ejecutar las órdenes iex> Task.await(t)
  74. Bonus: uso de Agent Objetivo: Usar el módulo estándar Agent

    en lugar de definir un proceso propio Requisitos: Un proyecto Elixir y la necesidad de un proceso para almacenar información de manera aislada (con o sin actualización) Instrucciones: 1. En la terminal BEAM, ejecutar las órdenes iex> {:ok, a} = Agent.start(fn -> 2 end) iex> Agent.get(a, fn state -> state * 2 end)
  75. Bonus: uso de Agent Objetivo: Usar el módulo estándar Agent

    en lugar de definir un proceso propio Requisitos: Un proyecto Elixir y la necesidad de un proceso para almacenar información de manera aislada (con o sin actualización) Instrucciones: 1. En la terminal BEAM, ejecutar las órdenes iex> {:ok, a} = Agent.start(fn -> 2 end) iex> Agent.update(a, fn state -> state * 2 end) :ok
  76. Elixir distribuido Objetivo: Desplegar procesos Elixir en diferentes instancias de

    BEAM y comunicarlas de manera que se puedan realizar interacciones en entorno distribuido
  77. Phoenix? Objetivo: Facilitar acceso a una aplicación Elixir desde una

    interfaz web Requisitos: Un proyecto Elixir Instrucciones: ¡Otra sesión!
  78. Elixir Tecnología estratégica Concurrencia, distribución, tolerancia a fallos... made easy

    Cambio de paradigma Más que un nuevo lenguaje, es una nueva perspectiva Excelente comunidad Come for the cookies, stayed for the fun! (pun intended)
  79. Elixir Tecnología estratégica Concurrencia, distribución, tolerancia a fallos... made easy

    Cambio de paradigma Más que un nuevo lenguaje, es una nueva perspectiva Excelente comunidad Come for the cookies, stayed for the fun! (pun intended) elixirforum.com alchemist.camp elixir-lang.org
  80. Elixir Tecnología estratégica Concurrencia, distribución, tolerancia a fallos... made easy

    Cambio de paradigma Más que un nuevo lenguaje, es una nueva perspectiva Excelente comunidad Come for the cookies, stayed for the fun! (pun intended) elixirforum.com alchemist.camp elixir-lang.org DIYTip: presentación y código de los ejemplos https://speakerdeck.com/lmcastro/cata-elixir https://gitlab.com/lauramcastro/elixir-cata
  81. Slidesgo Flaticon Freepik CREDITS: This presentation template was created by

    Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik ¡Gracias! [email protected]