2021/12/08の回です。
前日は、@NobuHandMakerさんによる「teensy4.1完全に理解した」でした。
teensy4.1を完全に理解されていてスゴイです
はじめに
- Elixirを楽しんでいますか
- Phoenixを楽しんでいますか
- Phoenix LiveViewを楽しんでいますか
- この記事は、2021/11/25(木)に開催された「LiveView JP#1:コミュニティ発足記念LT会、そしてLiveViewモブプログラミング開始」での発表資料として使いました
- LiveViewを完全に理解しました1
- あなたもこの道程(みちのり)を歩むことで完全理解したときっと言えるようになるでしょう
What's LiveView?
LiveViewとは何かを説明します。
その前に、ElixirとPhoenixの説明をします。
Elixir
Elixirというプログラミング言語があります。
関数型言語に分類されます。
以下、Qiita APIで記事を取得するElixirでのプログラム例です。
|>はパイプ演算子と呼ばれるもので、Elixirのプログラムではよく使われます。
前の関数の結果を次の関数の第一引数に入れてくれます。
Mix.install([{:jason, "~> 1.2"}, {:httpoison, "~> 1.8"}])
"https://qiita.com/api/v2/items?query=elixir"
|> HTTPoison.get!([], [timeout: 50_000, recv_timeout: 50_000])
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.take(&1, ["title", "url"]))
|> IO.inspect()
上のプログラム断片でも使っておりますEnumモジュールの理解は、Elixirをはじめたときにいの一番でやるともっとも効率よく学べます。
@cooldaemon さんの「私が愛する Elixir/Erlang の楽しさと辛さ」スライドにその理由が詳しく書いてあります。
Phoenix
ElixirでWebアプリケーション開発を楽しむフレームワークが、Phoenixです。
LiveView
Phoenix LiveView enables rich, real-time user experiences with server-rendered HTML.
The most fun you'll ever have building interactive web applications. We guarantee it.
Elixirを一つ覚えるだけで、高性能なバックエンドもリッチなフロントエンドも楽しくつくれちゃうんです。
LiveViewの始め方
Phoenixのインストール手順と同じです。
もしも詰まってしまうことがあったら後述するコミュニティを訪ねてみてください。
LiveViewの学び方
私のオススメは、
The Pragmatic StudioのPhoenix LiveView Courseです。
有料のコースです。
英語です。
最初のいくつかは無料で観ることができます。
11/30まで40%オフのクーポンがあります。
2021SALE
(この情報は、アドベントカレンダーで公開時には無効になっちゃいますね )
「英語だから……」と気後れする必要はありません。
洋楽を聞き流している感じでよいです。
私は英語を全然聞き取れていません。何の自慢にもなりませんが。
各講義のコードはGit管理されたものを入手できて、before(start)とafter(end)のブランチが用意されています。
前とあとのdiffをとって、写経しているうちに雰囲気でわかるようになるとおもいます!!!
Livebook
Livebook is a web application for writing interactive and collaborative code notebooks for Elixir, built with Phoenix LiveView.
Pythonで言うところのJupyter Notebookのようなものです。
Dockerで動かす
$ docker run -p 8080:8080 --pull always livebook/livebook
...
[Livebook] Application running at http://localhost:8080/?token=ougo4kkrjoscpj4iwwh6st5dpoj3wo7l
Visit: http://localhost:8080/?token=ougo4kkrjoscpj4iwwh6st5dpoj3wo7l
token
は適宜読み替えてください。
以下、New Notebookを押して、以下のプログラムを打ち込んでみてください。
メモリ使用量のグラフを描くことができます。
Mix.install([
{:kino, "~> 0.3.0"},
{:vega_lite, "~> 0.1.0"}
])
alias VegaLite, as: Vl
memory = [
total: :red,
processes: :yellow,
atom: :green,
binary: :pink,
code: :orange,
ets: :blue
]
layers =
for {layer, color} <- memory do
Vl.new()
|> Vl.mark(:line)
|> Vl.encode_field(:x, "iteration", type: :quantitative)
|> Vl.encode_field(:y, Atom.to_string(layer), type: :quantitative, title: "Memory usage (MB)")
|> Vl.encode(:color, value: color, datum: Atom.to_string(layer))
end
widget = Vl.new(width: 500, height: 200)
|> Vl.layers(layers)
|> Kino.VegaLite.new()
Kino.VegaLite.periodically(widget, 200, 0, fn i ->
point =
:erlang.memory()
|> Enum.map(fn {type, bytes} -> {type, bytes / 1_000_000} end)
|> Map.new()
|> Map.put(:iteration, i)
Kino.VegaLite.push(widget, point, window: 1000)
{:cont, i + 1}
end)
for i <- 1..1_000_000 do
:"atom#{i}"
end
私が全世界に公開しているLivebookを使う
Dockerインストールするのも面倒くさいという方は私がイゴかしている2ものをご自由にお使いください。
Passwordは
enjoyelixirwearethealchemists
です。
Nerves Livebook
Nervesは、ElixirでIoTを楽しめる、ナウでヤングでcoolなすごいヤツです。
NervesでLivebookをイゴかせます2。
ほこりを被ってしまっているRaspberry Piはないですか〜。
ぜひNerves Livebookをイゴかしましょう。
Nervesを本格的に始めるにはいろいろ準備が必要なのですが、Nerves Livebookをイゴかすには以下の手順でOKです。
- Raspberry Pi Imagerをインストールする
- https://github.com/livebook-dev/nerves_livebook/releases からご自身がお持ちのハードウェアに合致するファームウェアをダウンロードする(.zipをダウンロードしてください)
- Raspberry Pi ImagerのCHOOSE OSにてダウンロードしたファームウェア(.zip)を選んでmicroSDカードに焼き込む
- こんがり焼き上がったmicroSDをハードウェア(Raspberry Pi等)に挿して、LANケーブルでネットワークに接続して電源ON
- PCのブラウザで http://nerves.local にアクセス
- パスワードは
nerves
です - Nerves Livebookを楽しむ
Lチカ
defmodule Example do
use GenServer
def init(state) do
{:ok, gpio} = Circuits.GPIO.open(25, :output)
set_interval()
{:ok, {gpio, state}}
end
defp set_interval() do
Process.send_after(self(), :tick, 1000)
end
def handle_info(:tick, {gpio, state}) do
Circuits.GPIO.write(gpio, state)
set_interval()
{:noreply, {gpio, flip(state)}}
end
defp flip(1), do: 0
defp flip(0), do: 1
end
GenServer.start_link(Example, 0)
デモ
私がPhoenix LiveViewを使ってつくった、オートレースの過去動画を再生するWebアプリをデモします。
https://github.com/TORIFUKUKaiou/autorace_phoenix
- mainにマージしたら、CircleCI経由でGigalixirにデプロイします
- 自分でやったはずなのにあんまり覚えていないです
- Phoenix 1.6で
mix phx.new
をしたときに、assets
配下の様子が1.5までと違っていて、node_modules
を追加したいときはどうするんだ? となりまして、以下にたどり着いて解決しました- https://github.com/phoenixframework/esbuild#third-party-js-packages
- Thanks!
- このへんはいろいろと試行錯誤がありまして、この記事の中に埋もれさせてしまうのはもったい無い気がするので記事をわけて別で書きます
- 書きました
- Third-party JS packages on Phoenix 1.6 (2021/12/12)
https://elixirforum.com/t/webpack-config-and-package-json-missing-from-new-liveview-project-mix-phx-new-app-live/43378-
https://cloudless.studio/wrapping-your-head-around-assets-in-phoenix-1-6ざっくり言うと、Hexのesbuildは消してしまって、assets/package.json
をつくってそのなかにJSのesbuildを追加しておいて、さらに他のnode_modules
が必要な場合はassets
フォルダ配下でnpm install --save somelib
しようねって感じですesbuild + NPM comboと表現されていますGigalixirへのデプロイはこのやり方をとることであっけなく成功しましたもしassets/package.json
が無いプロジェクトの場合は、 https://gigalixir.readthedocs.io/en/latest/getting-started-guide.html#specify-versions に従って作っておく必要があります
Wrapping up
おまけ
Elixirを始めてみよう! とおもった、あなたに参考情報(クリスマス🎄プレゼント)を贈ります。
思い立ったが吉日です!!!
オススメの書籍
- プログラミングElixir(第2版) -- オーム社
- Elixir実践ガイド -- インプレス
- アルケミスト 夢を旅した少年 -- 角川文庫
Webアプリケーションを楽しむなら
IoTを楽しむなら
AIを楽しむなら
コミュニティ
-
elixir.jp Slack workspaceに参加してみてください
- マヂ、やさしい人ばっかりのコミュニティ
- あなたの困ったをきっと解決してくれるでしょう
- NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します
- たくさんのコミュニティがあります
- @kn339264 さん作の素敵な資料をご紹介します
- Elixirコミュニティ の歩き方〜国内オンライン編〜
@piacerex さん作
明日は、@kikochan さんによる「なんか書き書き」です
楽しみにしています
-
「動かす」の意。西日本の方言、おそらく。NervesJPではおなじみの表現。少し古いオートレースの映像ですが、実況アナウンサーが「針イゴきます」とはっきり言っています。https://autorace.jp/netstadium/SearchMovie/Movie/iizuka?date=2017-01-04&p=5&race_number=11&pg= ↩ ↩2