Entradas

Mostrando entradas de junio, 2014

Elixir. TCP server sencillo

Imagen
Para ser  telnet friendly  recibiremos y enviaremos texto separado por retornos de carro. El programa se limitará a responder lo mismo que reciba. Para trocear los mensajes en líneas separadas por retorno de carro, leeremos byte a byte y los meteremos en un buffer. Sí, hay otra forma de hacerlo más sencillo, pero hacerlo a mano es más didáctico. Al final también indicaremos la forma  erlangish ¿Es mejor que el buffer sea un  binary  o una  lista ? iex> {microsecs, :ok} = :timer.tc fn -> (1..1000 |> Enum.each fn _ -> (1..1000 |> (Enum.reduce [], &( [rem(&1, 10)+48|&2])) |> Enum.reverse |> to_string) end) end; IO.puts microsecs/1000000.0 3.493395 iex> {microsecs, :ok} = :timer.tc fn->(1..1000 |> Enum.each fn _ -> (1..1000 |> Enum.reduce "", &(&2 <> (<<rem(&1, 10)+48>>))) end) end; IO.puts microsecs/1000000.0 7.098454 La respuesta es una lista. Crearemos un  socket t

Ejemplo Elixir. Gestión de login + OTP

Imagen
En este ejemplo veremos un gestor de login parcialmente desarrollado. Es un problema sencillo de gestión de estado… El interfaz del actor estará compuesto por dos métodos  rq_key  y  rq_login Solución manual defmodule LoginManager do def start , do : ... def ( rq_key door ), do : ... def ( rq_login door , user_name , codded_pass ), do : ... end En Elixir podemos modelarlo… defmodule LoginManager do def start do from_pid = self spawn ( fn -> loging_manager_loop : w_rq_key , from_pid end ) end defp loging_manager_loop : w_rq_key , from_pid do ... end defp loging_manager_loop : w_rq_login , key , from_pid do ... end end La implementación del estado  :w_rq_login … defp loging_manager_loop : w_rq_login , key , from_pid do receive do { : rq_login , user_name , codded_pass } ->