LoginSignup
13
1

More than 1 year has passed since last update.

Nerves Livebook(世俗派関数型言語Elixir)で始める関数型プログラミング 〜ラズパイで楽しめるよ、ラズパイ持っていない人はPCで楽しめるよ(あ、Nervesはとれますけどね)〜

Last updated at Posted at 2022-01-20

志士ハ溝壑ニ在ルヲ忘レズ、勇士ハソノ元ヲ喪フヲワスレズ

Advent Calendar 2022 21日目1の記事です。
I'm ready for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I can't wait for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


Hey!
名乗るほどのものではありません。

elixir azure 愛で検索🔍してください。

はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

この記事は、LT資料です。
本日2022-01-21(金)に開催される「第二回関数型プログラミング(仮)の会」でLTをさせていただく予定です。

Nerves Livebookで、関数型プログラミングをはじめてみましょう :rocket::rocket::rocket: という内容の記事です。

What are these?

とりあえず、今日のところは、そこんところは、
Elixirという世俗派関数型言語はIoTを楽しめて、はじめてやるならNerves Livebookがオススメ
とご理解くださいませ :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:
ヨロシク

私の感じ方、ざっくりとした説明
Elixir 世俗派関数型言語2。なんとなく知らない間にゆるふわで「アタシ、関数型言語でプログラミングしちゃってました」 てな具合にプログラミングを楽しめます。
Phoenix Webアプリケーションの開発を楽しめます
LiveView 高性能なバックエンド開発もリッチなフロントエンド開発もElixir一本で楽しめます!
Livebook Jupyterに相当するもの。LiveViewを利用したアプリケーションの代表例ともいうべき金字塔。LiveViewを利用したアプリケーションのお手本であり、最高峰。
Nerves ElixirでIoTを楽しめるフレームワークです。ナウでヤングでcoolなすごいやつです。(誤解を恐れずにいえば)Nervesは、Elixir専用OSです!!! sshで中に入ったらiex>しかできませんだけができて一生Elixirだけを楽しめます:rocket::rocket::rocket: 
Nerves Livebook Livebookは、Nervesの上でイゴきます3

Nervesにsshした時の様子

スクリーンショット 2022-01-21 8.37.33.png

sshで中に入ったらiex>しかできませんElixirのプログラミングだけができて一生Elixirだけを楽しめます:rocket::rocket::rocket:

環境構築 ーー インストール〜使い方

環境構築と使い方を説明します。
簡単です。Very easyです。

Nerves Livebook

  1. ファームウェアをダウンロード(.zipのほう)
  2. Raspberry Pi Imagerをインストール
  3. microSDカードにファームウェアを焼き込む
  4. microSDカードをRaspberry Piに挿し込んで、LANケーブルも接続して電源ON
  5. Passwordは、nerves
  6. あとは、New notebookでもユー押しちゃいないよ(楽しむだけです)

動画 :movie_camera: にしたためております。

参考にしてください。

Raspberry Piは持っていないよ〜

  1. Dockerをインストールしてください
  2. https://github.com/livebook-dev/livebook の案内に従ってください

えっ!?、Dockerをインストールしたくない?、イメージのpullが面倒くさい?
そんな奥様に、
$\huge{朗報}$です。
私が全世界に公開しているものがあります。

https://livebook.autoracex.dev/

パスワードはenjoyelixirwearethealchemistsです。
どうぞご自由にお使いください。

デモ

ここからはNerves Livebookのデモをします。
以下のプログラムをコピペして実行します。
うまくイゴきます3ように :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:
今朝はイゴいていました。本当です!!!

スクリーンショット 2022-01-21 9.40.34.png

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)

温度湿度

温度湿度を測定してみます。

IMG_20220121_173759.jpg

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"]))

  • Qiita APIを使わせていただいて、Elixirタグがついた最新の記事を20件取得しています
  • |>パイプ演算子と呼ばれるものです
    • 前の計算結果を次の関数の第一引数にいれて計算をしてくれます

もし、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 :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:
Elixirの誕生日は、2012年5月24日です。
今年は2022年ですので、10周年を迎えます:tada::tada::tada:

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です:rocket::rocket::rocket:


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のことを知りたい方へオススメの書籍 :books:

ドキュメント

英語のドキュメントを読むのがオススメです。
Elixir本体、周辺ライブラリすべて同じ形式で統一されています。
後発の強みだとおもいます。
実行例が豊富でほとんど英語は読まくても理解できます。

スクリーンショット 2022-01-21 9.23.57.png

佐久間象山のつもりで読んでみましょう。
おのずとその意はわかるでしょう。

コミュニティ

FCOvBkAUYAE6mL8.jpeg

(@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)

Elixirコミュニティに初めて接する方は下記がオススメです

Elixirコミュニティ の歩き方 -国内オンライン編-

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

image.png

直近開催予定のイベント

その他、まだ開催案内はありませんが予定されているとおもわれるイベントです。


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の歴史にその名を刻み込んだことがあります。

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

  2. @kikuyuta 先生の「世俗派関数型言語 Elixir を関数型言語風に使ってみたらやっぱり関数型言語みたいだった」より。Elixirはコワくないですよ〜。

  3. 「動きます」の意。おそらく西日本の方言、たぶん。NervesJPではおなじみ。少し古いオートレースの映像ですが、実況アナウンサーが「針4イゴきます」とはっきり言っています。https://autorace.jp/netstadium/SearchMovie/Movie/iizuka?date=2017-01-04&p=5&race_number=11&pg= 2

  4. 大時計の針のこと。針がイゴいてある地点まで到達すると選手はスタートを切って良い発走の合図。針がイゴきはじめると(おそらく)選手は緊張するし、スタートはその後のレース展開に大きく影響するので、車券を握りしめている観客たちがもっとも緊張する瞬間であるため、先の尖った鋭いものを連想させる針は緊張の暗喩としても言い得て妙。

13
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
1