Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Александр Хохлов
@nots_io
Phoenix and beyond:
Things we do with Elixir
Founder at Nots.io
http://nots.io
Why this talk?
In the beginning…
Phoenix:
Web Sockets, HAML, SASS
Guardian, Arc, ex_aws, Swoosh,
ueberauth/ueberauth_github
RethinkDB
rethinkdb_changefeed
postgrex
https://github.com/h4cc/
awesome-elixir
http://obolinx.com/resources/?p=1837
Erlang/Elixir port to Java process
with JInterface
https://www.safaribooksonline.com/library/view/erlang-programming/9780596803940/ch16s05.html
def init(_params) do 

cd = “#{:code.priv_dir(:your_app)}" 

cmd = "java -jar package.jar" 

port = Port.open({:spawn,cmd}...
Postgrex.Notifications +
GenServer
PLPGSQL:
PERFORM pg_notify(‘invitations_changes’, payload)
Elixir:
{:ok, pid} = Postgrex.Notifications.start_link(config)
...
API:
HTTP API with
Poison & HTTPoison
HTTPoison.put(url, Poison.encode!(data)) 

HTTPoison.get(url) 

HTTPoison.post(url, Poison.encode!(data))) 

case resp do ...
API:
Socket API with gen_tcp
# receive tcp packet as message 

{:ok, socket} = :gen_tcp.connect('localhost', port,
[:binary, active: true]) 

def handl...
Concurrent tasks
results = notes 

|> Task.async_stream(__MODULE__, :update,
[some, params], max_concurrency: 20) 

|> Enum.to_list 

|> Ke...
point@nots.io
http://nots.io
http://blog.nots.io
@nots_io
facebook.com/nots.io
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Upcoming SlideShare
Loading in …5
×

Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov

Elixir Club 10
March 17, 2018
Kyiv

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

  • Be the first to like this

Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov

  1. 1. Александр Хохлов @nots_io Phoenix and beyond: Things we do with Elixir
  2. 2. Founder at Nots.io http://nots.io
  3. 3. Why this talk?
  4. 4. In the beginning…
  5. 5. Phoenix: Web Sockets, HAML, SASS
  6. 6. Guardian, Arc, ex_aws, Swoosh, ueberauth/ueberauth_github
  7. 7. RethinkDB rethinkdb_changefeed postgrex
  8. 8. https://github.com/h4cc/ awesome-elixir
  9. 9. http://obolinx.com/resources/?p=1837
  10. 10. Erlang/Elixir port to Java process with JInterface
  11. 11. https://www.safaribooksonline.com/library/view/erlang-programming/9780596803940/ch16s05.html
  12. 12. def init(_params) do 
 cd = “#{:code.priv_dir(:your_app)}" 
 cmd = "java -jar package.jar" 
 port = Port.open({:spawn,cmd}, [:binary, :use_stdio, packet: 4, cd: cd]) 
 true = Port.connect(port, self()) 
 {:ok,port} 
 end Port.command(port, :erlang.term_to_binary(data)) def handle_info({port,{:data,b}}, port) do 
 data = :erlang.binary_to_term(b) 
 end
  13. 13. Postgrex.Notifications + GenServer
  14. 14. PLPGSQL: PERFORM pg_notify(‘invitations_changes’, payload) Elixir: {:ok, pid} = Postgrex.Notifications.start_link(config) Postgrex.Notifications.listen(pid, "invitations_changes") 
 
 def handle_info({:notification, _pid, _ref, "invitations_changes", payload}, state) do … end
  15. 15. API: HTTP API with Poison & HTTPoison
  16. 16. HTTPoison.put(url, Poison.encode!(data)) 
 HTTPoison.get(url) 
 HTTPoison.post(url, Poison.encode!(data))) 
 case resp do 
 {:ok, %HTTPoison.Response{status_code: 200, body: body}}-> {:ok, body |> Poison.decode!} 
 {:ok, %HTTPoison.Response{status_code: 404}} -> {:error, :not_found} 
 {:ok, %HTTPoison.Response{body: body}} -> {:error, body |> Poison.decode!} 
 {:error, %HTTPoison.Error{reason: reason}} -> {:error, reason} 
 end 

  17. 17. API: Socket API with gen_tcp
  18. 18. # receive tcp packet as message 
 {:ok, socket} = :gen_tcp.connect('localhost', port, [:binary, active: true]) 
 def handle_info({:tcp, _socket, msg}, state) do ... end 
 
 # receive tcp packet with recv 
 :inet.setopts(socket, active: false) 
 :ok = :gen_tcp.send(socket, data) 
 {:ok, <<_msg_len :: binary - size(16), msg :: binary>>} = :gen_tcp.recv(socket, 0, 2000) 

  19. 19. Concurrent tasks
  20. 20. results = notes 
 |> Task.async_stream(__MODULE__, :update, [some, params], max_concurrency: 20) 
 |> Enum.to_list 
 |> Keyword.get(:ok) 
 
 def update(note, some, params) do ... end 

  21. 21. point@nots.io http://nots.io http://blog.nots.io @nots_io facebook.com/nots.io

×