もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Elixir

Elixir 入門 ~ META-PROGRAMMING IN ELIXIR ~ その2 - Macro

Macros Foreword Macroは通常のElixirのコードよりもわかりづらい。開発者は責任を持ってクリーンなコードを書くように心がける。 Elixirはすでに簡潔でわかりやすい仕組みを提供している。Macroを使うのは最後の手段であると理解すべきだろう。 Our first m…

Elixir 入門 ~ META-PROGRAMMING IN ELIXIR ~ その1 - Quote and unquote

Quoting Elixir のプログラムはtupleを伴った3つの要素に置き換えることができる。例えばsum(1, 2, 3)があった場合は以下のように書き換えることができる。 以下、自分の環境だとsumなんかおらん!と言われるのでremとか適当なビルトイン関数に置き換えて試…

Elixir 入門 ~ MIX AND OTP ~ その9 - Distributed tasks and configuration

最後にroutingの機能をKVアプリケーションに追加する。routing table はこのようになる。 [{?a..?m, :"foo@computer-name"}, {?n..?z, :"bar@computer-name"}] Our first distributed code VMに名前をつけて開始する。iex --sname fooでREPLを起動する。 す…

Elixir 入門 ~ MIX AND OTP ~ 実際にOTPを使ってプロセス管理をする

ElixirのGetting StartもMix/OTPが終わり、次に進むのですが、復習がてら前にElixirで書いたコードをMix and OTPの章でやったことを使って改善してみます。 元ネタはQiitaの自分の投稿 ElixirでSlackのbotを作ってHerokuで動かしてみる - Qiita いまいちQiit…

Elixir 入門 ~ MIX AND OTP ~ その8 - Docs, tests and pipelines

TCP経由で受け取ったメッセージをパースしてKVアプリケーションに送る処理を実装する。 Doctests doctestを使ってパースする関数を実装する。これはドキュメントからテストを作成することができ、ドキュメント内の正確なサンプルコードの提供を助けてくれる…

Elixir 入門 ~ MIX AND OTP ~ その7 - Task and gen-tcp

Erlangの:gen_tcp モジュールについて学ぶ。 Echo server まずはEcho Serverを作成することから始める。TCP Serverは以下のStepを実行する 利用可能なPortを開いてListenする そのPortでクライアントからの接続を待ち、受け入れる クライアントからの要求を…

Elixir 入門 ~ MIX AND OTP ~ その6 - Dependencies and umbrella projects

KVアプリケーションは完成したので次にそれを実装するTCPサーバーを作成する。その前にMixのDependencyについて理解する。 External dependencies 外部依存はビジネスドメインに縛られない。例えば今のKVアプリケーションのためにHTTP APIが必要であれば外部…

Elixir 入門 ~ MIX AND OTP ~ その5 - ETS

キャッシュ機構であるErlang Term Storageについて学ぶ。 ETS as a cache ETSは etsモジュールを経由してメモリ上のETSテーブルにデータを保存できる仕組み iex(1)> table = :ets.new(:buckets_registry, [:set, :protected]) 8211 iex(2)> :ets.insert(tabl…

Elixir 入門 ~ MIX AND OTP ~ その4 - Supervisor and Application

この章ではElixirのポリシーである“fail fast” と “let it crash”を実現しているsupervisorについて学ぶ。 Our first supervisor Supervisor behaviour を使ってsupervisorを実装したモジュール lib/kv/supervisor.ex を作成する。 defmodule KV.Supervisor …

Elixir 入門 ~ MIX AND OTP ~ その4 - GenEvent

複数のhandlerにイベントをpublishできるGenEventについて学ぶ。 Event managers iex -S mix でセッションを新しく初め、GenEvent API を触ってみる。 iex> {:ok, manager} = GenEvent.start_link {:ok, #PID<0.83.0>} iex> GenEvent.sync_notify(manager, :…

Elixir 入門 ~ MIX AND OTP ~ その3 - GenServer

Bucketのプロセスを監視するプロセスをGenServerを使って作成する GenServerはElixirとOTPでサーバー機能を実装するための抽象化された仕組みである。 Our first GenServer GenServerは Client API と Server Callback の2つの部品が実装される。 ClientとSe…

Elixir 入門 ~ MIX AND OTP ~ その2 - Agent

この章では KV.Bucket というモジュールを作成する。このモジュールはkey-value形式でデータを保存でき、複数のプロセスからの読み書きをできるように実装する。 The trouble with state Elixirはshared nothingでimmutableな言語である。もし状態を持つ何か…

Elixir 入門 ~ MIX AND OTP ~ その1 - Introduction to Mix

実際にMixとOTPを使ったアプリケーションを作成していく。 ↓のようにKey-Valueなデータを扱うアプリを作る CREATE shopping OK PUT shopping milk 1 OK PUT shopping eggs 3 OK GET shopping milk 1 OK DELETE shopping eggs OK アプリケーションを作るため…

Elixir 入門 その19 - Typespecs and behaviours

Types and specs ElixirはTypespecを使い以下の目的に用いる カスタムデータ型を定義するとき 関数のシグネチャ(仕様)を定義するとき Typespecは開発者のためだけのものではない。例えばErlangの静的解析ツールの dialyzer は typespecディレクティブを参…

Elixir 入門 その18 - try, catch and rescue

Elixirは errors throws exits の3つのErrorに関する仕組みを持つ ただ、Erlangでは基本的に「クラッシュさせるならさせておけ」というポリシーがあるのでどのような場合にErrorをハンドリングするかは考えるべき Errors ErrorあるいはExceptionはコードの中…

Elixir 入門 その17 - Sigils

~ で始まるテキストをSigilといい、文字列を扱うための仕組みを提供する。 delimiter sigil delimiter modifier の形式。r/hogehoge/i みたいな形。 Regular expressions ~rはよく使われるSigilで正規表現を作成するために使う 正規表現は Perl-compatible r…

Elixir 入門 その16 - Comprehensions

Elixirではあるリストをfilterしてmapにかけて別のリストを作るということをしたい場合、Enumモジュールを使うことが一般的だが、リスト内包表記を使って書くこともできる。forを使うとEnumやStreamを使って書くより簡単な記述にできることがある。 (確か)…

Elixir 入門 その15 - Protocols

Protocol ProtocolはElixirでポリモーフィズムを実現するための仕組み。プロトコルを使うことでどのようなデータでもやり取りできるようになる たとえば Elixirではnilとfalseだけがfalseとして扱われ、それ以外のすべてはtrueと評価されるが、アプリケーシ…

Elixir 入門 その14 - Structs

Mapの拡張してStructがある。 Structは初期値の設定とコンパイル時のチェックを行ってくれる Defining structs defstruct でStructを定義できる defmodule User do # フィールド名と初期値を定義する defstruct name: "John", age: 27 end # mapに似てるけど…

Elixir 入門 その13 - Module attributes

ElixirのModuleのattributeは次の3つの目的をかなえる ユーザーやVMによって使用されるためのモジュールの説明をつける 定数として動く コンパイルの間に使われるためテンポラリ領域として動く As annotations ElixirはErlangからモジュール属性の概念を取り…

Elixir 入門 その12 - alias, require and import

リソースの再利用を容易にするための仕組みとして alias, require ,importがある arias モジュールにaliasをつけることができる defmodule Math do # Math.Listはモジュール内であればListで呼ぶことができるようになる。 # 本来のListは ` Elixir.List ` で…

Elixir 入門 その11 - IO and the file system

The IO module # 標準出力 iex> IO.puts "hello world" hello world :ok # 標準入力 iex> IO.gets "yes or no? " yes or no? yes "yes\n" # :stderrをarg1に与えると出力先が標準エラーになる iex> IO.puts :stderr, "hello world" hello world :ok The File…

Elixir 入門 その10 - Processes

Process Elixirではすべてのコードはプロセス上で動作している。プロセスはお互いに分離していて、メッセージパッシングでやりとりする ElixirのプロセスはOSのプロセスと混同されるべきではない。Elixirのプロセスは多くの他のプログラミング言語のスレッド…

Elixir 入門 その9 - Enumerables and Streams

Enumerables ElixirはEnumerablesなデータを処理するのにEnumモジュールを提供している EnumはListやMapなど異なるデータ型を扱うように設計されている なのでデータによって特有の操作、例えばListの特定の位置に要素を追加したいというような場合はListモ…

Elixir 入門 その8 - Recursion

Loops through recursion Elixirでは他の関数型言語と同じように繰り返し処理を行うためのForやWhileが無い。 再帰を使って表現する。パターンマッチを効果的に使うことで可読性の高い再帰を表現できる。 defmodule Recursion do # ガードによって n が 1 以…

Elixir 入門 その7 - Modules

Compilation defmodule マクロでモジュールを定義できる defmodule内のdefでメソッドを定義できる defmodule Math do def sum(a, b) do a + b end end elixircコマンドでコンパイルできる > elixirc math.ex コンパイルすると Elixir.Math.beam という名前の…

Elixir 入門 その6 - Keyword lists, Maps

Elixir では連想配列を表現する手段として keyword list と mapの2つがある。 Keyword list 特定の条件のtupleのリストはkeyword list として扱われる tupleの要素数が2 1つ目の要素が atom listの拡張みたいな存在なので、listの特徴をそのまま受け継いでい…

Elixir 入門 その5 - Binaries, strings and char lists

UTF-8 and Unicode stringはUTF-8エンコードされたbinary byte-sizeとcode pointについて iex> string = "hełło" "hełło" # byte sizeは7。ł以外のコードポイントは0 ~ 255以内 = 1byteだけど ł は322で表現するためには2byte分必要だから iex> byte_size st…

Elixir 入門 その4 - case, cond and if

case パターンマッチを使った条件式を書くことができる。 例えばHTTPのレスポンスのパターンマッチは以下のように書くことができる。 1行目にマッチすると評価値のbodyの値(この場合はHello World !!)がcase内のbodyに束縛される。 最後の _ は何もマッチ…

Elixir 入門 その3 - パターンマッチの基本

パターンマッチの基本 The match operator Elixirにおける = はmatch operator 代入ではなくパターンマッチにおける束縛を意味する # これは一見代入しているように見える iex> x = 1 1 # xに1が束縛された状態で逆にしても通る iex> 1 = x 1 # これは通らな…