Share
Embed
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
Transcript
104 slides
-
Laura M. Castro Cata de Elixir teoría y práctica para
un cambio de paradigma -
¿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 -
¿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) -
Let it crash Características Everything is a function Asynchronous message
passing Share nothing -
Let it crash Características Everything is a function Asynchronous message
passing Share nothing -
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 -
Let it crash Características Everything is a process Asynchronous message
passing Share nothing -
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) -
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) -
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 -
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) -
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) -
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) -
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) -
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) -
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) -
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 -
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 -
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 -
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" -
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 -
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) -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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" -
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 -
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 -
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() -
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) -
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 -
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 -
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) -
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) -
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 -
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) -
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 -
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 -
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() -
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() -
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() -
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() -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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) -
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) -
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) -
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) -
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 -
Elixir distribuido Objetivo: Desplegar procesos Elixir en diferentes instancias de
BEAM y comunicarlas de manera que se puedan realizar interacciones en entorno distribuido -
Phoenix? Objetivo: Facilitar acceso a una aplicación Elixir desde una
interfaz web Requisitos: Un proyecto Elixir Instrucciones: ¡Otra sesión! -
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) -
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 -
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 -
Slidesgo Flaticon Freepik CREDITS: This presentation template was created by
Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik ¡Gracias! [email protected]