Read “Property-Based Testing with PropEr, Erlang, and Elixir”

I finished reading “Property-Based Testing with PropEr, Erlang, and Elixir” a couple of days ago. Do you know or know of the testing? Property-based testing is very interesting to learn. Through this book Through this book, we can learn what is property-based testing, how to consider property driven and practice in a real-world product. If…More

[Elixir]property based testing with stream_data

Elixir will bundle property-based testing in the core. http://elixir-lang.github.io/blog/2017/10/31/stream-data-property-based-testing-and-data-generation-for-elixir/ We can see the prototype for the library from https://github.com/whatyouhide/stream_data . The following lines are the example I applied the library before. https://github.com/KazuCocoa/http_proxy/pull/47/commits/11bf6ff5a763c97c3ec6c7bc4a1811de53a6d0c2 We can see more details from https://hexdocs.pm/stream_data/StreamData.html and you can see how flexible the methods. link [Erlang][Software Test]Property-based testing/QuickCheck Testing https://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/quick.pdfMore

[Elixir]read “Craft GraphQL APIs in Elixir with Absinthe”

Craft GraphQL APIs in Elixir with Absintheを読んだ。Amazonからはこちらから購入可能になる予定らしい。 Beta配信されて購入できるようになったので、GraphQLを学ぶことも含めて購入、読み進めてみた。GraphQLは、ざっと情報を巷のBlogなどで見ているが、実際にサンプルアプリ以外でコードを書いてWebアプリを開発したことはない状態。 はじめにGraphQLの簡単な話があったのち、ElixirのAbsintheを題材にしてGraphQLを実際に作り、実装してみるという流れ。これにより、GraphQLのクエリの形や仕様を学びながら、実際のツールの使い方を学ぶことができる。この書籍を書いているBruce Williams氏とBen Wilson氏は実際にGraphQLを使いプロダクションの開発を行なっているらしく、その知見も少し味わうことができる。 デフォルトではAnsintheはこのブラウザツールが有効になっている状態で開発を行うことができる。一方、プロダクション向けには interface :simple という形式を router.ex などに指定すると良い。なお、本書ではAnsintheはPhoenixフレームワークを題材として、提供されるサンプルコードもそれを使っているがAnsinthe自体はPlugなど含めて別にPhoenixに限ったフレームワークではない。 GraphQL関係の他には、以下のようにパターンマッチを使うことができると知らず、本書でできるとしったことがよかった。新たな知見 🙂 ともあれ、ざっとGraphQLの概要を知りたいとかだけだとこの書籍は不要そう。実際にElixirを使いながら学ぶという形には良い。実際のサンプルコードもあり、そのコードはドキュメントなども豊富なので、コードリーディングの良い題材にもなると思う。More

read “Learn Functional Programming with Elixir”

少し気になっていたLearn Functional Programming with Elixirがβ公開されたので、気になって読んでみた。 内容自体はすでになんらかのElixir本を学んでいると特に目新しいものにはでくわさないと思う内容だった。ただ、7、8章の Design Your Elixir Applications, Handle Impure Functions はまだ公開されていないが、この箇所は少し雰囲気がElixirの説明から実際のアプリケーションに話が寄っている感じがしている。 内容として、高級関数の他に、末尾最適化の話も触れていたし、そこは実際のプロセスモニタリングしながらmemory消費の優位性を明記していたところが良かった。 あとはeager/lazy関数のことも言及していて、以下のような無名関数を使い、lazyな関数宣言を適切にモジュール内で使っていたリファクタリングの話なんかは、少し新鮮で面白かった。 あと、 :ok, :error で結果を出し分ける言語文化(from Erlang)の話も触れていたり、コラムもほどほどに詳しいところに踏み込んでいて良かった。 最初の一冊よりは、少しチュートリアルをやった後にElixirらしい記述をするためのとっかかりとして学ぶとか、そういう書籍っぽい。More

Read “Functional Programming: A PragPub Anthology”

Functional Programming: A PragPub Anthology を読んだ。まだβだったけれど、内容はだいぶまとまっててあとは微調整して発売という感じを受けた。 The Functional Paradigmから入り、Scala、Clojure、Elixir、Haskell、Swiftと関数型というテーマに絡めたそれぞれの言語の特性に触れながら話は進む。それらがひととおおり終わり、考え方を経験した後、Going Deeperということでそれらを再び題材に、より言語毎の特性、テスト(コード)の話、タイプシステム、The DCI architecture、そしてLuaと理解を深めていく。 この書籍をまるっと読むと、いくつかの言語から関数型言語、関数型な考え方に触れ、それらを学ぶことができる。さらには軽くそれらに触れることで、いわゆる写経もやりながら理解を深めることができるので、とっかかりとしても有用な内容だった。特に前半は、その言語に触れたことがある人からすると読み物的な内容に見えるので、考え方を整理するという形で触れることができると思う。 個人的にはElixirやSwift、Testing周りが関係が強いので、そこら辺は特に楽しむことができた。 例えば、ElixirやSwiftのProtocolの話。SwiftではProtocolはGlobalスコープに対して定義される一方で、Elixirでは特定の型に対して定義することができる。そのため、影響範囲を限定することができるのでより安全に利用することができるという話も。 テストの話としては、Elixir、Haskellが題材になっていてよかった。Elixirの話では、TrueStoryを題材にして、可読性の高い(テストしたいシナリオ・ストーリーを理解しやすい)テストコードの書き方に対しても言及している。その中で、パイプ演算子を使った関数型としての書き方に触れながら話を進めている。 Haskellでは、型システムのほか、C言語で書かれたコードをHaskellでラップしてテストコードを書いていく方法を載せている。ほかの言語をテストするためにHaskellを使う形は興味深かった。 やー。思いの外、Elixirに関する話が多かったのとHaskellを使った説明も多く、個人的にはそれだけで満足度が高かった。Haskellはがっつり触れたことはなく、考え方を学ぶために触れている側面が強いけれど、触れる機会が増えてきたらまたこの書籍でさっとHaskellは頭の中を整理したい気分。More

[Elixir]What’s new in Ecto2.0

Elixirの開発元であるPlatformatecからEcto2.0に関するフリーペーパーが正式に公開された。 Click to access whats-new-in-ecto-2-0-1.pdf いくつかEctoの特性(Ecto is not your ORMといったこととか)が書かれていて、解決したい問題とその対策として2.0や2.1で入ったことを書いている。 1つ、気になったところをメモとして残しておく。 Ecto2.1からdynamicを使って簡易に動的にwhere句を制御することができるようになった。コードは以下。 https://github.com/elixir-ecto/ecto/blob/v2.1.1/lib/ecto/query.ex#L381 例えば、以下の場合は dynamic で指定した箇所をその引数の状態によって動的に切り替えることができる。 (http://blog.plataformatec.com.br/wp-content/uploads/2016/12/whats-new-in-ecto-2-0-1.pdf より) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode…More

[Elixir]timestamp in Ecto2.1

Ecto2.1が着々とrcとして改修されていますね。 この中で、Calendar typeの導入が書かれています。 defaultでは、従来は timestamp() などの Ecto.Scheme に設定する値には Ecto.DateTime が格納されていたのですが、ここがデフォルトで NaiveDateTime になるよう。これにより、このSchemeを使っているところは基本的に NativeDateTime でEctoから今まで Ecto.DateTime で受け取っていた時間を扱う必要がありますね。 Ecto.DateTime とかはEcto2.2で完全に削除されるそうな。 https://github.com/elixir-ecto/ecto/blob/e3077b99c24086d5b93580228b1daa6bb0ee0b5a/CHANGELOG.md#integration-with-elixir-13-calendar-types Schemeの設定としては以下になるそうですね。(ここの @timestamps_opts より。) ちなみに、これが導入PR https://github.com/elixir-ecto/ecto/commit/12d67912ddddb39ff79cb53d3098569cb427b521 ~N[] のsigilとか使われてて、個人的には Map だけで表現されるより読みやすくなった。More

[Elixir]handle_infoとreply

GenServerなんかにある handle_info/2 の使い方をど忘れしてしまったので、メモ。 自身のブログを検索すると、 [Elixir in Action]OTP/GenServerを学んで非同期/並行処理を学ぶ にすでにメモってたのですが。 以下のような簡単なコールバックを実装し、スクリプトを実行してみます。 まずはGrnServerを持つプロセスを生成します。そのあと、 call や cast で定義されていないメッセージを send してあげると、ここでは handle_info/2 に拾われて処理を行います。 少し話がそれて、非同期通信の時に何らかの処理を終えた時に通知を受け取りたい場合、そういえば以下のように reply/2 を使って処理を非同期にプロセスに投げることできるのでしたね。上に貼ったリンク先を読み直してて思い出した… handle_infoも使うと、以下の通りにも書くことができる、と。 ここの、GenServerのドキュメントにも載っているやり方です。More

[Elixir]Registerを覗く

key-value processとしてElixir1.4に入れる予定の Register というものが公開されました。 https://github.com/elixir-lang/registry 付属のベンチマークによると、以下のように高い性能が出ていることがわかります。 the result of https://github.com/elixir-lang/registry/blob/master/bench/ MacBook Pro (Retina, 15-inch, Late 2013) OS: Mac OS 10.11.6 processor: 2.6 GHz Intel Core i7 memory: 16 GB 1600 MHz DDR3 Erlang/OTP 18 $ TASKS=8 MIX_ENV=bench mix run bench/erlang.exs {835251, :ok} $ TASKS=8 MIX_ENV=bench mix run bench/gproc.exs {732408, :ok} $ TASKS=8 MIX_ENV=bench mix run…More