志士ハ溝壑ニ在ルヲ忘レズ、勇士ハソノ元ヲ喪フヲワスレズ
Advent Calendar 2022 21日目1の記事です。
I'm ready for 12/25,2022
I'm looking forward to 12/25,2022
I can't wait for 12/25,2022
私のAdvent Calendar 2022 一覧。
Hey!
名乗るほどのものではありません。
elixir azure 愛で検索🔍してください。
はじめに
Elixirを楽しんでいますか
この記事は、LT資料です。
本日2022-01-21(金)に開催される「第二回関数型プログラミング(仮)の会」でLTをさせていただく予定です。
Nerves Livebookで、関数型プログラミングをはじめてみましょう という内容の記事です。
What are these?
とりあえず、今日のところは、そこんところは、
Elixirという世俗派関数型言語はIoTを楽しめて、はじめてやるならNerves Livebookがオススメ
とご理解くださいませ
ヨロシク
私の感じ方、ざっくりとした説明 | |
---|---|
Elixir | 世俗派関数型言語2。なんとなく知らない間にゆるふわで「アタシ、関数型言語でプログラミングしちゃってました」 てな具合にプログラミングを楽しめます。 |
Phoenix | Webアプリケーションの開発を楽しめます |
LiveView | 高性能なバックエンド開発もリッチなフロントエンド開発もElixir一本で楽しめます! |
Livebook | Jupyterに相当するもの。LiveViewを利用したアプリケーションの代表例ともいうべき金字塔。LiveViewを利用したアプリケーションのお手本であり、最高峰。 |
Nerves |
ElixirでIoTを楽しめるフレームワークです。ナウでヤングでcoolなすごいやつです。(誤解を恐れずにいえば)Nervesは、Elixir専用OSです!!! sshで中に入ったらiex> |
Nerves Livebook | Livebookは、Nervesの上でイゴきます3 |
Nervesにsshした時の様子
sshで中に入ったらiex>
しかできませんでElixirのプログラミングだけができて一生Elixirだけを楽しめます
環境構築 ーー インストール〜使い方
環境構築と使い方を説明します。
簡単です。Very easyです。
Nerves Livebook
- ファームウェアをダウンロード(.zipのほう)
- Raspberry Pi Imagerをインストール
- microSDカードにファームウェアを焼き込む
- microSDカードをRaspberry Piに挿し込んで、LANケーブルも接続して電源ON
- Passwordは、
nerves
- あとは、New notebookでもユー押しちゃいないよ(楽しむだけです)
動画 にしたためております。
参考にしてください。
Raspberry Piは持っていないよ〜
- Dockerをインストールしてください
- https://github.com/livebook-dev/livebook の案内に従ってください
えっ!?、Dockerをインストールしたくない?、イメージのpullが面倒くさい?
そんな奥様に、
$\huge{朗報}$です。
私が全世界に公開しているものがあります。
https://livebook.autoracex.dev/
パスワードはenjoyelixirwearethealchemists
です。
どうぞご自由にお使いください。
デモ
ここからはNerves Livebookのデモをします。
以下のプログラムをコピペして実行します。
うまくイゴきます3ように
今朝はイゴいていました。本当です!!!
Lチカ
IoTのHello, Worldを楽しんでみます。
ON
{:ok, gpio} = Circuits.GPIO.open(18, :output)
Circuits.GPIO.write(gpio, 1)
OFF
{:ok, gpio} = Circuits.GPIO.open(18, :output)
Circuits.GPIO.write(gpio, 0)
温度湿度
温度湿度を測定してみます。
- Grove AHT20 I2C温度および湿度センサー 工業用グレード - Grove AHT20 I2C Industrial Grade Temperature and Humidity Sensor
- Raspberry Pi用Grove Base Hat
Seeedさんの製品を使いまして、手先が「不器用ですから」な私でもはめ込み式で電子工作を楽しめます。
defmodule Aht20.Reader do
alias Circuits.I2C
@i2c_bus "i2c-1"
@i2c_addr 0x38
@initialization_command <<0xBE, 0x08, 0x00>>
@trigger_measurement_command <<0xAC, 0x33, 0x00>>
@two_pow_20 :math.pow(2, 20)
def read do
{:ok, ref} = I2C.open(@i2c_bus)
I2C.write(ref, @i2c_addr, @initialization_command)
Process.sleep(10)
I2C.write(ref, @i2c_addr, @trigger_measurement_command)
Process.sleep(80)
ret = I2C.read(ref, @i2c_addr, 7)
I2C.close(ref)
value(ret)
end
defp value({:ok, val}), do: {:ok, convert(val)}
defp value(_), do: :error
# ポイントはここです。温度・湿度の計算の元になる値はそれぞれ20bit取り出す必要があります
# シフト演算なぞ必要ありません。必要なビット列をパターンマッチで取り出せます。
defp convert(<<_state::8, raw_humi::20, raw_temp::20, _crc::8>>) do
humi = Float.round(raw_humi * 100 / @two_pow_20, 1)
temp = Float.round(raw_temp * 200 / @two_pow_20 - 50.0, 1)
{temp, humi}
end
end
Aht20.Reader.read()
パイプ演算子
上記は、Nerves Livebookとちょっとしたハードウェアが必要でした。
次はそういったものがなくても楽しめるプログラム例です。
"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))
もし、Elixirにパイプ演算子がなく、途中で変数を使わずにワンライナー(来いよ…ライナー)的に書くと以下のようになります。
Enum.map(
Map.get(
Req.get!(URI.encode("https://qiita.com/api/v2/items?query=tag:Elixir"),
finch_options: [pool_timeout: 50000, receive_timeout: 50000]),
:body),
& Map.take(&1, ["title", "url"])
)
どちらがお好みですか?
ところでElixirってRubyっぽい?
Rubyに似ているとおもった方いらっしゃいませんか?
Yesです。
作者のJosé Valimさんは、次のようにおっしゃっています。
The main, the top three influences are Erlang, Ruby, and Clojure.
(https://cognitect.com/cognicast/120)
ちなみに、José ValimさんはRailsのご経験がある方ならみなさんご存知のDeviseの最初のコミッターです。
Wrapping up
Enjoy Elixir
Elixirの誕生日は、2012年5月24日です。
今年は2022年ですので、10周年を迎えます
iex> Date.diff(~D[2022-05-24], ~D[2022-01-21])
123
ひ・ふ・み
$\huge{Enjoy\ Elixir🚀}$
ご自宅にタンスの肥やしになっちゃったり、ホコリをかぶったままのラズベリーパイはございませんか?
Raspberry Pi OS(旧Raspbian)では物足りない方はいらっしゃいませんか?
Nerves Livebookを焼き込んで、エキサイティングな体験をぜひお手におとりください!!!
エキサイティングレジャー(山陽オート)です!!!
Very easyにはじめられます。
connpassにて求められていた「特に開発現場での関数型プログラミング的なテクニックの話を中心に募集します」について強引にまとめます。
-
Elixirはパターンマッチが強力です
- 特にIoTでよく使われるであろうビット列の取り出しをパターンマッチで行えるのは楽です
-
Elixirをはじめてみようとおもった方に、Nerves Livebookをオススメします
- ラズパイをお持ちでない方は、Livebookでお楽しみください
-
Nerves Livebookは、本当のプログラミング初心者にもオススメできるとおもっています
- 本当の初心者が詰まるポイントはたくさんあります
- インストール
- エディタのインストール・使い方
- ターミナルの起動方法・使い方
- Nerves Livebookなら目移りもせずElixirに没頭できます!
- 本当の初心者が詰まるポイントはたくさんあります
2022年に流行る技術予想 ーー それは、Nerves Livebookです
Elixir
最後の最後に、Elixirについて紹介します。
- |>でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
- さっそくプログラムの例を示します
-
Qiita APIを使わせていただいて、
Elixir
タグがついた最新の記事を20件取得しています - ここでは雰囲気をつかんでいただければ大丈夫です
Mix.install [{:req, "~> 0.2.1"}]
"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))
Webアプリケーションを楽しむなら
IoTを楽しむなら
AIを楽しむなら
もっとElixirのことを知りたい方へオススメの書籍
- プログラミングElixir(第2版) -- オーム社
- Elixir実践ガイド -- インプレス
- アルケミスト − 夢を旅した少年 -- KADOKAWA
ドキュメント
英語のドキュメントを読むのがオススメです。
Elixir本体、周辺ライブラリすべて同じ形式で統一されています。
後発の強みだとおもいます。
実行例が豊富でほとんど英語は読まくても理解できます。
佐久間象山のつもりで読んでみましょう。
おのずとその意はわかるでしょう。
コミュニティ
-
elixir.jp Slack workspaceに参加してみてください
- マヂ、やさしい人ばっかりのコミュニティ
- あなたの困ったをきっと解決してくれるでしょう
- NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します
- たくさんのコミュニティがあります
- @nako_sleep_9h さん作の素敵な資料をご紹介します
- Elixirコミュニティ の歩き方〜国内オンライン編〜
(@piacerex さん作 )
Elixirコミュニティに初めて接する方は下記がオススメです
Elixirコミュニティ の歩き方 -国内オンライン編-
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
直近開催予定のイベント
その他、まだ開催案内はありませんが予定されているとおもわれるイベントです。
- 2022/01/26 08:30〜 kokura.ex ラジオ
- 2022/02/18 19:30〜 NervesJP 2月吉日の回
I organize autoracex.
And I belong to NervesJP, fukuoka.ex, EDI.
I hope someday you'll join us.
We Are The Alchemists, my friends!
Elixir = 不老不死の霊薬
Alchemist = 錬金術師のこと。Elixirというプログラミング言語の使い手はAlchemistと尊称されます。
俺たちひょうきん族錬金族 !!!
$\huge{Enjoy\ Elixir🚀}$
名乗るほどのものでもない名前をElixirの歴史にその名を刻み込んだことがあります。
-
@kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。 ↩
-
@kikuyuta 先生の「世俗派関数型言語 Elixir を関数型言語風に使ってみたらやっぱり関数型言語みたいだった」より。Elixirはコワくないですよ〜。 ↩
-
「動きます」の意。おそらく西日本の方言、たぶん。NervesJPではおなじみ。少し古いオートレースの映像ですが、実況アナウンサーが「針4イゴきます」とはっきり言っています。https://autorace.jp/netstadium/SearchMovie/Movie/iizuka?date=2017-01-04&p=5&race_number=11&pg= ↩ ↩2
-
大時計の針のこと。針がイゴいてある地点まで到達すると選手はスタートを切って良い発走の合図。針がイゴきはじめると(おそらく)選手は緊張するし、スタートはその後のレース展開に大きく影響するので、車券を握りしめている観客たちがもっとも緊張する瞬間であるため、先の尖った鋭いものを連想させる針は緊張の暗喩としても言い得て妙。 ↩