MIX AND OTP vol 1

ElixirのGetting startedも、Mix and OTPの話に入りました。 http://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html でつくられる各ファイルの説明などから始まり、実際にExUnitでテストを書くまでの説明が載っています。 Agent Elixirはimmutable languageなので、状態を保持するにはProcessesかETS(Erlang Term Storage)を使う必要があります。ここは、Getting StartのところのProcessやTaskのところで説明があった、TaskとかAgentの話ですね。 ExUnit setup が用意されているのだけれど、このsetupのcallbackが後の test へ渡されるらしい。なので、setupで最後に渡す引数を渡して、それを test で受け取らないといけないのですね。 setupやsetup_allがあれば、teardownに該当するものもあるのかな?と思ってみると、 on_exit があるのですね。 ExUnit.Callbacksの中に、以下のような定義がありました。 これは ExUnit.OnExitHandler をcaseで呼んで使っている模様。 また、このon_exit自体はaddされるだけなので、ExUnit.OnExitHandlerのもとがどこにあるかコードで追ってみると、最終的には ExUnit.Runner の run の中にある loop に行き着いた。この処理開始のときに、 ExUnit.OnExitHandler も登録されて処理が進み、 on_exit でOnExithandlerにfnを登録、テストケースが終わった時点で実行する、と。なるほど。 もう少し、ExUnitを遡ると、ExUnit のモジュールでstart/1が定義されていて、その中の System.at_exit にテストケースが登録されていることが一番の始まりみたい。 ちなみに、この at_exit の説明は以下。 Registers a program exit handler function. Registers a function that will…More

Get start Elixir vol 3

Sigils Elixirでは、正規表現を書くときに ~r/neko/ と書きます。その ~r の書き方箇所のバリエーションや、 ~w 、 ~W などのword list、カスタムsigilsの作り方が書いていました。Rubyでも%wといったものをよく使うので、こちらも使いそうですね。 try, catch and rescueの使い方 In Elixir, we avoid using try/rescue because we don’t use errors for control flow. We take errors literally: they are reserved to unexpected and/or exceptional situations. In case you actually need flow control constructs, throws should be used. That’s what…More

Get start Elixir vol 2

processのところから、protocolのところまで。 processの話の中で、以下の文言がありました。 Process and links play an important role when building fault-tolerant systems. In Elixir applications, we often link our processes to supervisors which will detect when a process dies and start a new process in its place. This is only possible because processes are isolated and don’t share anything by default. And if processes…More

再帰的な書き方に頭が馴染んできた: Elixir

exercismでElixirの問題を解いていた時、いろいろなるほどなーと面白かったのでメモ。 仕様は、入力(sentence)に対して単語区切りごとに、sentence全体の文字をキーに含まれる文字をカウントする、というもの。 例えば、 “abc de fge” を入力とすると、abc、de、fgeがそれぞれ1つづつ存在するとカウントする。 “abc de abc” を入力とすると、abcが2つ、deが1つ存在するとカウントする、というもの。 Elixirだと、繰り返しは再帰的に書く。数列的な書き方になるので、少し頭になじませる時間が必要でしたが、再帰的な書き方に考えが馴染むと数学のようにかけて、個人的には書きやすかったです。プログラムだと手続き型に慣れていたけれど、関数的にかけると数学的な考え方をそのまま残せるのが良いですね。 これを、さらにreduceを使って書いてみます。 Elixir1.0.4におけるreduceの説明は以下。 Elixir、なるほどね。More

Get start Elixir vol 1

Elixir自体に慣れようと、Get startedをなめてみました。Elixir 1.0.4がリリースされた頃のものです。以下はメモがてら、です。 http://elixir-lang.org/getting-started/introduction.html すごくDocumentが整備されている感がありました。 特に繰り返しでは再起を使うというRecursionの説明があったあと、それを容易にするための Enum を提供しててその機能に関する説明、 Stream の話もという形で頭にストーリーを植え付けながら内容を理解できる感じです。 以下、ちょっとメモです。 Modules http://elixir-lang.org/getting-started/modules.html でコンパルしたとき、 を実行したディレクトリと同じディレクトリにコンパイルしたものがあれば、自動的に読み込まれてりようできるもよう。 はスクリプトとして実行される。 defpは、同一モジュール内からのみ呼ぶことが可能なprivateなモジュール。なるほど。継承とかどうなのかな。(まだそこらへんは読んでない。 defoverridable で提供されているらしい?めも) Recursion http://elixir-lang.org/getting-started/recursion.html 再起でforを実現するのは関数型っぽくて頭になじまないと厳しそう。ただ、ここら辺は大学とか含めて数学的な素養を学んだ人からすると、慣れるまでに時間もかからなさそう。数列の世界の話みたいなものですしね。 Enum のライブラリにいくつかあらかじめライブラリが用意されているので、それは便利。ちょうど次の章で説明されていた。 http://elixir-lang.org/getting-started/enumerables-and-streams.html EnumとStreamを比較しながら話が進んでいて、StreamはLazyというところが違うと書いていた。 Enumは常にEnumの実際の値を返すけれど、Streamは必要なときに実際の値を返すがそれまではStreamとして保持している、と。 Pipeoperatorの対比を見ればおおー、なるほどという感じだった。 Pipeoperatorのときは基本Stream使っていって、lazinessが必要な大きなデータを扱うようなときとかコレクションを使ったりするときはEnumを使っておけば良い、という感じかな。 チュートリアルでの最後の締めは以下。 The amount of functions and functionality in Enum and Stream modules can be daunting at first but you will get familiar with them case by…More

Phoenix Frameworkを触ってみる

何かやるなら、簡単なWebアプリとかかなと思ったのと、Elixirのフレームワークを何か触ってみようかなと思い以下のPhoenixを試してみました。 私が試したのはv0.13.0です。 http://www.phoenixframework.org/v0.13.0 雛形のinstallからsetupまでは以下を見ると特に問題なくできるのでリンクだけ。 http://www.phoenixframework.org/v0.13.0/docs/up-and-running 試しに、以下の記事を参考にテストを書くまで使ってみました。 http://postd.cc/testing-a-phoenix-elixir-json-api/ 作成したリポジトリは以下。 https://github.com/KazuCocoa/hello_phoenix 実行する前にpostgresqlを以下のように用意しておく必要があります。 確認 ユーザ作成 ざっとディレクトリ構成やmigrationを試してみると、Ruby on Railsがまんま持ってこられている印象をうけました。なるほど。 まだ1日くらいしか触ってないのですが、ちょっとexersism.ioで幾つか問題解きながら頭に文法をなじませようかな。More

Elixirを触ってみた

ErlangのVM上で動作する、文法はRubyのようなものですね。 WebPage http://elixir-lang.org/ GitHub https://github.com/elixir-lang/elixir Erlangの資産を使えます。ErlangはConcurrencyな処理では以前より使われていると聞くので、Rubyをそのような方面でも使えるようにといったコンセプトでは面白いですね。 exercismでは、Elixir向けの問題も提供しているので、少しやってみました。 以下のような感じでコードがかけます。 Gistはこちら: https://gist.github.com/KazuCocoa/b2c3d910d33c16210fc1 Rubyを少し書いたことがあると、大きくつまづくことはなさそう。 なるほどね。More