やっちのわいわい日記

電通大に編入した元高専生の日記。日記を書きつつ編入のこととか勉強のこととか書こうと思っています。編入とかで質問があるかたは@amhflcl0514にDMくださいお

Elixir勉強日記 1

はじめに

Elixirを勉強していきます

ロゴの感じだと紫のイメージなんですね

f:id:nishikino3:20190611145254j:plain

以前Haskellをちょっとやって挫折したので今回は頑張りたいです

きっかけは各所バックエンドの技術でアツいらしく、どの辺が実際にアツくてどんな感じで書くのか勉強していきたいです

あとrubyの影響を大きく受けているらしいですが、関数型でrubyの影響ってどういうこっちゃ??????っていう気持ちもあって気になったのもあります

基本的にはElixirの公式ガイドに沿っていくので単純に勉強したいだけならそっち読んだ方が早いかもしれません

ブログにしてるのはなにかしらアウトプットしておきたかったからです

あと日本語のテキスト少ないからですね

Qiitaと悩んだのですが日記っぽくしたかったのでブログにしました

Elixirを書いている人のことをアルケミストって呼ぶらしくめちゃくちゃ格好いいな〜〜〜ってなってます

1回目は言語の特徴を書いていこうかなと思います

ではアルケミスト目指してはじめていきます〜〜

そもそもElixirって?

そもそもElixirってFFにエリクサーっていうHPとMPが全回復するアイテムがあったけど実際なんだろうどうゆう意味なんだろうと思って調べてみたところ、

錬金薬 万能薬

(weblioより)

みたいな意味らしいです

要するになんかすごい薬って意味なんでしょうね。

そんな錬金薬をコネコネするたちなのでElixirプログラマアルケミストalchemist:錬金術)ってことなんですかね。 かっこいい

ちなみにGoogle検索でElixirって検索すると化粧品が出てくるあたりまだまだメジャーな言語じゃない感じなんですね

Elixirの特徴

ではElixirの基本的な特徴を調べていきます!

Elixirの公式ページ(?)です

elixir-lang.jp

冒頭より抜粋

Elixirは拡張性と保守性の高いアプリケーションを構築するためにデザインされた、動的で関数型のプログラミング言語です。

Elixirは、低レイテンシで分散型のフォールトトレラントシステムや、Webや組み込みシステムの領域で成功を収めている、Erlang VMを利用します。

要するにElixirErlang VMを利用した動的な関数型言語でWebや組み込みで機能的にも書き方的にもいい感じに書けるプログラミング言語ってことなんでしょうかね。

関数型言語と言ったらLispHaskellschemeとかを触ってきましたがどれもしっくり来なくて挫折した気がします。 どの言語もこの先たくさん書いて何かを作るっていうイメージが湧かなかったのでElixirがしっくりくるといいな〜〜〜って思ってます。(Haskellあたりは圏論の勉強を少しやったのでもう少し頑張ってみたさはある)

拡張性

全てのElixirのコードは、隔離された軽量の実行スレッド(プロセスと呼ばれる)の中で動作し、メッセージを通して情報をやり取りします。

はやそう(小並感)

その軽量性により、同一のマシン内で数千のプロセスが 同時に 起動することも珍しくありません。プロセスの隔離により、各プロセスが個別にガベージコレクションされることを許容し、システムの広範に及ぶポーズを減らし、全てのマシンリソースを可能な限り効率的に使うことが出来ます。(垂直拡張)

プロセスは、同一のネットワーク内に存在する、他のマシン上で動作しているプロセスとも通信することが出来ます。これは分散型システムの基盤となり、複数のノードにまたがったシステムの構築を可能にします。(水平拡張)

え〜〜要するに

  • 垂直拡張:複数プロセスを動かす際のリソース割り当てとかの効率がすごい(小並)
  • 水平拡張:他のマシン上のプロセスとの通信ができるから並列でいろいろできる

っていう認識でいいんでしょうかね

フォールトトレランス

本番環境で動作するソフトウェアに対する避けられない真実は いつかは壊れる ということです。ネットワークやファイルシステムサードパーティのリソースを考慮するとその確度はさらに高まります。

障害に対処するために、Elixirはスーパーバイザを提供します。スーパーバイザは何かが失敗した時にシステムの構成要素をどのようにリスタートするかや、動作が保証された既知の初期状態に戻す方法を表します。

例外がちゃんとキャッチして次の動作ができるってことですかね(rubyでいうところのraiseみたいな?)

children = [
  TCP.Pool,
  {TCP.Acceptor, port: 4040}
]

Supervisor.start_link(children, strategy: :one_for_one)

関数型言語

関数型プログラミングは、保守性が高く、高速に動作し、また少ない記述量でコードを書く、というコーディングスタイルを促進します。例えば、パターンマッチングはデータを容易に分解し、その内容にアクセスすることができます。

知らなかったですねぇ...

ガードとパターンマッチングをの組み合わせは、あるコードを実行するための特定の条件を、エレガントに match, assert することを可能にします。

def drive(%User{age: age}) when age >= 16 do
  # Code that drives a car
end

drive(User.get("John Doe"))
#=> Fails if the user is under 16

ガードパターンマッチングを使うと条件分岐がエレガントに書けるらしいです

予期される様々な制約の下で、ソフトウェアが動作することを確実にするために、Elixirはこれらの特徴に強く依存します。そしてもし動作しなかったとしても心配無用です。その場合はスーパーバイザがサポートします。

スーパーバイザがいい感じにやってくれるんですね〜

拡張性とDSL(言語的な)

Elixirは拡張可能なようにデザインされています。開発者は生産性を高めるために、特定のドメイン用に言語を自然に拡張することができます。

例として、 ExUnitと呼ばれるElixirのテストフレームワーク を使った簡単なテストケースを書いてみましょう。

async: true オプションは、可能な限り多くのCPUコアを使うことで、各 test を並列に実行することを可能にします。assert はコードを内観でき、テスト失敗時に素晴らしいレポートを提供してくれます。これらの機能はElixirのマクロを利用して実現されており、あたかもそれが言語の一部であるかのように、新しい構文を追加することが可能です。

defmodule MathTest do
  use ExUnit.Case, async: true

  test "can add two numbers" do
    assert 1 + 1 == 2
  end
end

つまりテストコードを例に、コードの拡張が書きやすくて並列処理できるってこと?????

ツール

Mix

そろそろ行こうぜ三連MIX!!タイガーファイヤーサイバー(ry

Elixirは開発を容易にするための素晴らしいツールを提供します。 ビルドツールであるMix は、プロジェクトの作成、タスクの管理、テストの実行などを容易にする手段を提供します。

rubyで言うところのgemとbundlerとrakeを併せたところらしいです

IEx

IEx (Elixirの対話型シェル) のようなツールは、言語とプラットフォームの多くの側面を利用して、オートコンプリート、デバッグツール、コードの再読込、よく整形されたドキュメントを提供することができます。

この辺もrubypythonでよく使う対話型のやつですね〜〜

デバッグとか動作確認とかでよく使うのでありがたいです!!

Erlang との互換性

Erlang VM 上で動作するElixirは、HerokuやWhatsApp、Klarnaといった会社が分散型でフォールトトレラントなアプリケーションを構築するために使っている、Erlangエコシステムへの完全なアクセスを開発者に提供します。Elixirプログラマーは実行時の追加コスト無しにすべてのErlang関数を実行することができます。

まってErlangってなに

What is Erlang?

www.erlang.org

Erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability. Some of its uses are in telecoms, banking, e-commerce, computer telephony and instant messaging. Erlang's runtime system has built-in support for concurrency, distribution and fault tolerance.

---- 以下google翻訳 ----

Erlangは、高可用性が要求される、大規模にスケーラブルなソフトリアルタイムシステムを構築するために使用されるプログラミング言語です。 その用途のいくつかは、電気通信、銀行取引、電子商取引、コンピュータテレフォニー、およびインスタントメッセージングにあります。 Erlangのランタイムシステムは、並行性、分散、およびフォールトトレランスをサポートしています。

おう....??

要するにプログラミング言語なんやな

つまりrubyCで書かれてるのと同じ感覚なんですかね...?

そのノリでErlangの機能もElixirで使えるんすね〜すごい

第1回まとめ

  • Elixirという言語の概要まとめたよ
  • 並列で複数プロセスを動かすのに最適な言語だよ。つまり大規模なアクセスが想定されアプリケーションとの相性がよさそう
  • 関数型言語だけどrubyの影響を受けてるよ
  • ライブラリの管理や対話型などツール周りもrubyに近いよ

ということで次回から実際のコードを勉強していきたいと思います