summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkballou <kballou@devnulllabs.io>2016-03-19 01:24:29 -0600
committerkballou <kballou@devnulllabs.io>2016-03-19 01:40:04 -0600
commite48f0a9ea5e9cff2b655aebefe642489f619d316 (patch)
tree6b3c4d21e377e59c1e16f866ba913275361e7514
parent83f89e9228ba97f3121344dbd72f4870c3112e8a (diff)
downloadfunc-w-elixir-e48f0a9ea5e9cff2b655aebefe642489f619d316.tar.gz
func-w-elixir-e48f0a9ea5e9cff2b655aebefe642489f619d316.tar.xz
Add EchoServer example
-rw-r--r--src/code/2/echo_server/.gitignore5
-rw-r--r--src/code/2/echo_server/README.md3
-rw-r--r--src/code/2/echo_server/config/config.exs1
-rw-r--r--src/code/2/echo_server/lib/echo_server.ex8
-rw-r--r--src/code/2/echo_server/lib/echo_server/echo.ex36
-rw-r--r--src/code/2/echo_server/lib/echo_server/supervisor.ex18
-rw-r--r--src/code/2/echo_server/mix.exs21
-rw-r--r--src/code/2/echo_server/test/echo_server_test.exs8
-rw-r--r--src/code/2/echo_server/test/test_helper.exs1
-rw-r--r--src/code/2/echo_server_iex.out6
-rw-r--r--src/code/2/echo_server_nc.out5
-rw-r--r--src/func-w-elixir.tex79
12 files changed, 191 insertions, 0 deletions
diff --git a/src/code/2/echo_server/.gitignore b/src/code/2/echo_server/.gitignore
new file mode 100644
index 0000000..755b605
--- /dev/null
+++ b/src/code/2/echo_server/.gitignore
@@ -0,0 +1,5 @@
+/_build
+/cover
+/deps
+erl_crash.dump
+*.ez
diff --git a/src/code/2/echo_server/README.md b/src/code/2/echo_server/README.md
new file mode 100644
index 0000000..dee7a73
--- /dev/null
+++ b/src/code/2/echo_server/README.md
@@ -0,0 +1,3 @@
+# EchoServer #
+
+Demo Echo Server
diff --git a/src/code/2/echo_server/config/config.exs b/src/code/2/echo_server/config/config.exs
new file mode 100644
index 0000000..d2d855e
--- /dev/null
+++ b/src/code/2/echo_server/config/config.exs
@@ -0,0 +1 @@
+use Mix.Config
diff --git a/src/code/2/echo_server/lib/echo_server.ex b/src/code/2/echo_server/lib/echo_server.ex
new file mode 100644
index 0000000..7716aec
--- /dev/null
+++ b/src/code/2/echo_server/lib/echo_server.ex
@@ -0,0 +1,8 @@
+defmodule EchoServer do
+ use Application
+
+ def start(_, _) do
+ EchoServer.Supervisor.start_link
+ end
+
+end
diff --git a/src/code/2/echo_server/lib/echo_server/echo.ex b/src/code/2/echo_server/lib/echo_server/echo.ex
new file mode 100644
index 0000000..3a96f29
--- /dev/null
+++ b/src/code/2/echo_server/lib/echo_server/echo.ex
@@ -0,0 +1,36 @@
+defmodule EchoServer.Echo do
+
+ def accept(port) do
+ {:ok, socket} = :gen_tcp.listen(
+ port,
+ [:binary, packet: :line, active: false, reuseaddr: true])
+ loop_acceptor(socket)
+ end
+
+ defp loop_acceptor(socket) do
+ {:ok, client} = :gen_tcp.accept(socket)
+ {:ok, pid} = Task.Supervisor.start_child(
+ EchoServer.TaskSupervisor, fn -> serve(client) end)
+ :ok = :gen_tcp.controlling_process(client, pid)
+ loop_acceptor(socket)
+ end
+
+ defp serve(socket) do
+ socket
+ |> read_line
+ |> (fn(x) -> "> " <> x end).()
+ |> write_line(socket)
+
+ serve(socket)
+ end
+
+ defp read_line(socket) do
+ {:ok, data} = :gen_tcp.recv(socket, 0)
+ data
+ end
+
+ defp write_line(line, socket) do
+ :gen_tcp.send(socket, line)
+ end
+
+end
diff --git a/src/code/2/echo_server/lib/echo_server/supervisor.ex b/src/code/2/echo_server/lib/echo_server/supervisor.ex
new file mode 100644
index 0000000..e770a3a
--- /dev/null
+++ b/src/code/2/echo_server/lib/echo_server/supervisor.ex
@@ -0,0 +1,18 @@
+defmodule EchoServer.Supervisor do
+ use Supervisor
+
+ def start_link do
+ Supervisor.start_link(__MODULE__, [], name: __MODULE__)
+ end
+
+ def init(_) do
+ children = [
+ supervisor(Task.Supervisor, [[name: EchoServer.TaskSupervisor]]),
+ worker(Task, [EchoServer.Echo, :accept, [1337]])
+ ]
+
+ opts = [strategy: :one_for_one]
+ supervise(children, opts)
+ end
+
+end
diff --git a/src/code/2/echo_server/mix.exs b/src/code/2/echo_server/mix.exs
new file mode 100644
index 0000000..d9c2724
--- /dev/null
+++ b/src/code/2/echo_server/mix.exs
@@ -0,0 +1,21 @@
+defmodule EchoServer.Mixfile do
+ use Mix.Project
+
+ def project do
+ [app: :echo_server,
+ version: "0.0.1",
+ elixir: "~> 1.2",
+ build_embedded: Mix.env == :prod,
+ start_permanent: Mix.env == :prod,
+ deps: deps]
+ end
+
+ def application do
+ [mod: {EchoServer, []},
+ applications: [:logger]]
+ end
+
+ defp deps do
+ []
+ end
+end
diff --git a/src/code/2/echo_server/test/echo_server_test.exs b/src/code/2/echo_server/test/echo_server_test.exs
new file mode 100644
index 0000000..9743bf9
--- /dev/null
+++ b/src/code/2/echo_server/test/echo_server_test.exs
@@ -0,0 +1,8 @@
+defmodule EchoServerTest do
+ use ExUnit.Case
+ doctest EchoServer
+
+ test "the truth" do
+ assert 1 + 1 == 2
+ end
+end
diff --git a/src/code/2/echo_server/test/test_helper.exs b/src/code/2/echo_server/test/test_helper.exs
new file mode 100644
index 0000000..869559e
--- /dev/null
+++ b/src/code/2/echo_server/test/test_helper.exs
@@ -0,0 +1 @@
+ExUnit.start()
diff --git a/src/code/2/echo_server_iex.out b/src/code/2/echo_server_iex.out
new file mode 100644
index 0000000..3b9e1d7
--- /dev/null
+++ b/src/code/2/echo_server_iex.out
@@ -0,0 +1,6 @@
+% iex -S mix
+...
+iex(1)> hd Application.started_applications
+{:echo_server,
+ 'echo_server',
+ '0.0.1'}
diff --git a/src/code/2/echo_server_nc.out b/src/code/2/echo_server_nc.out
new file mode 100644
index 0000000..0e9acb9
--- /dev/null
+++ b/src/code/2/echo_server_nc.out
@@ -0,0 +1,5 @@
+% nc localhost 1337
+this is a test
+> this is a test
+I'm testing the echo-ability
+> I'm testing the echo-ability
diff --git a/src/func-w-elixir.tex b/src/func-w-elixir.tex
index eb7b971..8fcb41a 100644
--- a/src/func-w-elixir.tex
+++ b/src/func-w-elixir.tex
@@ -437,6 +437,85 @@ F_1 &= 1
\lstinputlisting{code/2/pmap.out}
\end{frame}
+\subsubsection{Echo Server}
+\begin{frame}
+\frametitle{Echo Server}
+\begin{itemize}
+\item<2->{Handle connections from clients (\texttt{netcat})}
+\item<3->{Echo back contents of clients messages}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{mix}: Ladle of Elixir\texttt{|>}}
+\begin{itemize}
+\item<1->{Creates Skeleton Projects}
+\item<2->{Compiles Code}
+\item<3->{Runs Test Suites}
+\item<4->{Creates Release}
+\item<5->{Anything you want}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{mix} Output}
+\lstinputlisting{code/2/mix_echo.out}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Elixir\texttt{|>} Applications}
+\lstinputlisting[%
+ numbers=left,
+ title=mix.exs,
+ firstline=13,
+ lastline=16]{code/2/echo_server/mix.exs}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Elixir\texttt{|>} Applications}
+\lstinputlisting[%
+ numbers=left,
+ title=lib/echo\_server.ex]{code/2/echo_server/lib/echo_server.ex}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Elixir\texttt{|>} Supervisors}
+\lstinputlisting[%
+ numbers=left,
+ title=lib/echo\_server/supervisor.ex]
+ {code/2/echo_server/lib/echo_server/supervisor.ex}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Echo Server: Echo}
+\lstinputlisting[%
+ numbers=left,
+ title=lib/echo\_server/echo.ex,
+ firstline=3,
+ lastline=16]
+ {code/2/echo_server/lib/echo_server/echo.ex}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Echo Server: Echo}
+\lstinputlisting[%
+ numbers=left,
+ title=lib/echo\_server/echo.ex,
+ firstline=18,
+ lastline=34]
+ {code/2/echo_server/lib/echo_server/echo.ex}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Echo Server}
+\begin{columns}[c]
+\column{0.5\textwidth{}}
+\lstinputlisting{code/2/echo_server_iex.out}
+\column{0.5\textwidth{}}
+\lstinputlisting[stringstyle=\footnotesize\ttfamily]{code/2/echo_server_nc.out}
+\end{columns}
+\end{frame}
+
\section*{Going Forward}
\subsection*{Resources}
\begin{frame}