Designing for Scalability with Erlang/OTPを読みました。Erlang/OTPを軸とした、スケーラブルなシステムを構築するための設計に必要な知見がたまってそうだったのと、半額程度で購入できたのでありがたく読みました。 内容として、半分はErlang/OTPのエコシステム周り、設計思想とかの話でした。ただ、残す半分はErlangに限ったことではない、広く使えそうな基礎がまとまっていました。個人的には、Elixir in Actionと合わせて読むとこの系統の書籍は十分そうな感覚です。 ちなみに、所どころ使われている例題や、それを個人的にElixirに書き直したものを以下に置いています。(所どころ壊れているものもありますが。) https://github.com/KazuCocoa/erlang-scalable-design 前半部分 Erlang/OTPの全体的な話が書かれています。背景とか。message passingの概要とか。諸々。Erlangの文法も学びながら、gen_serverだったり、gen_fsmだったりといくつかのOTPの話に発展する感じでErlangを学ぶことができます。 debugのための、sysやdbgモジュールも記載されていました。以前読んだQiitaのReconTrace で Erlang VM のトレース機能に親しむでかかれていたrecon_traceなんかのことも言及されています。 proc_libという特別なプロセスの話も。この特別なプロセスは、 システムメッセージや、イベント、シャットダウンとが可能 動的モジュールのリストを得ることができる debug flagを使ってトレースメッセージを利用することができる といった特徴があります。 後半部分(Chapter13以降くらい) Chapter 13のDistributed Architectureは、SOAやP2Pといった大局な設計やinterfaceから、その配布方法などの話まで色々ありました。これはErlangに特出したツールの話以外は、普通にErlang以外でも役立ちそうな情報だと思います。 リリース関係の話の中で、riakというdecentralized datastoreなツールの話もあって、面白かったです。Gossip protocolを使ってClusteringしているとか、そういう話も載っていたので。HashiCorpのSurfなんかでも結構知られていますね。Gossip protocol。 Riakのそこらへんのドキュメントはこちら http://docs.basho.com/riak/latest/theory/concepts/Clusters/#Gossiping http://docs.basho.com/ これのErlang client https://github.com/basho/riak-erlang-client Elixir client https://github.com/drewkerrigan/riak-elixir-client Scalableなシステムを組むためのtipsとして、以下の項目がまとめられていました。 分割する Distributed architectural pattern(cluster, SOAなど ) Network protocol node間のinterfaceや状態も持ちようやデータモデル node間のretry strategy node間のsharing data…More
Tag Archives: development
[Elixir][Erlang]RecordとElixirのStructの違い
最近、Erlangのある書籍を読み始めました。そこでは始めの方にErlangの基本的な事柄が書かれていたので、そこを軽く追いながらErlangを軽く学んでいます。(と言っても、Elixirやってきたので文法以上は特に目新しいものはないのですが) そこで、ElixirのStructとElixir/ErlangのRecordの違いが気になったので、まとめておきます。 結局は、RecordとMapの違いになってきて、Erlangコミュニティで話されるその違いと同じような感じになっていました。(すごいE本のP. 567とか。やっぱりこの本、すごい。)ただ、ElixirのStruct自体はElixir独自のものなので、ちゃんと残しておきます。 Erlang x Record Erlangでは、Recordはtupleの糖衣構文。例えば、以下の通り を実行すると以下の結果になります。 なるほど。 Elixir x Record なるほど。でも、こう見るとこれはstructに似ている。と思いますよね。普通にElixirのget startを学んだだけだとRecordがでてこないので、考える順としてはこんな感じだと思われます。 ElixirのRecord ElixirのRecordのドキュメントを見ると to work with short, internal data to interface with Erlang records と、Recordの使うポイントが書かれています。ふと、ここでよく見るとstructとの使いわけが気になります。 まぁ、そう思うよね、と思ったらGoogle Groupsにやっぱり。 https://groups.google.com/forum/#!topic/elixir-lang-talk/6kn7J2XnFg8 https://gist.github.com/josevalim/b30c881df36801611d13 結論だけここに残しておくと、たいていの場合はStructを使って、限られたときだけRecordを使いましょう、というもの。StructはMapで __struct__ 定義されます。 To clarify: when we said that Records in Elixir were deprecated, it was Elixir implementation of records which is…More
TensorFlowに関するメモ
[Elixir]Release http_proxy support record/play request
I released http_proxy 0.3.0 which support play/record http request. Now, the library support multiple port proxy and each proxies support play/record request. Hex: https://hex.pm/packages/http_proxy Docs: http://hexdocs.pm/http_proxy/0.3.0/extra-api-reference.html GitHub: https://github.com/KazuCocoa/http_proxyMore
koboldをRubyで実行、結果を整える簡単なラッパーkoboldyを書いた
koboldというYahoo!がOSS化した画像比較ツール(https://github.com/yahoo/kobold)をRubyを介して実行、結果をJSON形式で保存するライブラリを作成しました。 https://github.com/KazuCocoa/koboldy https://rubygems.org/gems/koboldy やっていることは以下。 koboldの設定ファイル(の一部)をファイルへ出力する 今後、ちまちまoptionを増やすかも konoldコマンドを実行する koboldがインストールされていることが必要 koboldの結果を解析して、JSON形式で整えてファイルに出力する JSでやったほうが楽だったかなーと思いつつも、Rubyのほうが楽だったので。。。More
[Elixir]パターンマッチを使って条件分岐を関数で分ける
Elixirは関数定義の引数に対してパターンマッチを利用できます。 ちょっと、ちゃんとElixirっぽくしようということで使ってみました。 対象は以下。 https://github.com/KazuCocoa/simple_app_reporter_ex/blob/master/lib/reporter.ex get_body_json という関数は、HTTPoisonのレスポンスを引数として、そのレスポンスに適した処理を行うというものです。 修正前 caseを使って、得られたHTTPoisonのレスポンス毎に処理を分けています。 1つの関数内で条件が分岐するので、関数内の処理が必然的に多くなります。 修正後 関数定義の引数でパターンマッチを利用しています。上記の case における条件がそのまま関数定義になります。 この結果、 get_body_json() という関数に値を与えると、引数のHTTPoisonの状態によってElixirが勝手に処理を分けます。 1つの関数が過度に肥大化しなくなり、関数が最低限の責務を持つようにプログラムできるのが良いですね 🙂 締め Elixirは、条件分岐を処理する方法として 関数定義 case if cond がありますが、個人的には上記の順で考える頭を作っていきたいなと思ってます。 テストシナリオを書くときも結構条件分岐は出てくるのですが、こういう感じで責務を分けることができると処理を集中できて良いなーとふと。More
アプリのレビューを新着順で取得するライブラリをElixirで実装してみた
過去、 GooglePlay/AppStoreのレビューを取得するスクリプトを少し整えた のようにRubyでAppStoreやGooglePlayで新着レビューを取得する実装を書きました。 それを題材にElixirを使って同様のライブラリを書いてみました。Elixir歴は、Getting Startedを1巡したくらい。 GitHub https://github.com/KazuCocoa/simple_app_reporter_ex Hex https://hex.pm/packages/reporter Doc http://hexdocs.pm/reporter/0.1.1/ HTTPoison、Poison、Quinn、Flokiを使って、HTTP通信やJSON、XML、HTMLスクレイピングを満遍なく触った気がします。 テストデータ用意してのDocTestや、ExUnitなどもザーッと触りましたが、Elixirというか、Erlangの良さであるprocessを使った並行実行は実装していません。 もう少し気が向けば触っていこうかなと思っている次第。More
Learning META-PROGRAMMING IN ELIXIR
Macroに関して学んだ。 quote で与えた文字列を Abstract Syntax Tree (AST) としてタプルで得ることができる。 unquote は、quoteで囲まれた中で使うことでquoteの中でunquoteした要素をinjectすることができる。 quoteやunquoteなどはこちらで確認可能。 他にもこちらとか。 defmoduleの中で @before_compile TestCase のように記述することで、コンパイル時にTestCase.__before_compile__/1を実施することができます。このようなModuleに対する定義は以下を参照すると良いとか。 http://elixir-lang.org/docs/stable/elixir/#!Module.html Getting Startedをすべて終えた… Macroなんかはまだ馴染まないとなーという感じですが、単純なコードは読み書きできてきた感じ。 ちょっとやりたいことがあるので、Phoenixのtutorialを読んでいこうかな。More
GimeiのElixir版を練習がてら書いてたらちゃんとしたものが公開された
まだElixirのチュートリアルをちゃんとやり始めて1週間くらいなのですが、ここ最近、Elixirを学んでみています。チュートリアルも終わり何か書きたいな、と思った時、Gimeiが他言語でポートされているブーム?みたくなっているぽいことを知りました。 ひとまず練習がてら同じようなものを実装しながら学ぼうと思い、以下のような練習リポジトリを作り、少しづつ手を動かし始めました。Hexで公開してからリポジトリを公開しようかなと思ってたのですが、作っている途中にちゃんと経験されている方が書いたgimeiのElixir版が出ていたのを昨日見つけたので、まだ全然途中で中途半端な感じなのですがprivateからpublicにしていいかなーというくらいのノリでリポジトリをpublicにしました。 もしElixirに興味のある方は、後者のgimei_exを使いましょう。 私のやつ https://github.com/KazuCocoa/elixir-gimei ちゃんとしている方 https://github.com/ma2gedev/gimei_ex 私のリポジトリは機能的にもまだ未完全です。また、DocTestを使ってみたりと違ったこともしています。これからも多分色々TODO増減しながら試していきそうです。Hexにあげるまではしてみたいな。 Erlangのライブラリ探して使ったり、関数型のような記述をしたり。まだ手続き型の考えのほうが強いですが、caseやrecursiveな書き方は、Elixirは好きな感じです。Elixir学んでいるとErlangも学ぶこともできるという特典付き。 ともあれ、こういう新しいものを学んで世界を広げるって、良いですね。More
MIX AND OTP vol 2
Mix and OTPの後半。 ETS ここは、GenServer、Supervisor付近の説明から。 リンク http://elixir-lang.org/docs/stable/elixir/#!GenServer.html http://elixir-lang.org/docs/stable/elixir/#!Supervisor.html ソースコードは以下 https://github.com/elixir-lang/elixir/blob/v1.0.4/lib/elixir/lib/supervisor.ex processによる状態の保持と、etsによる保持はいくつか違うところがあります。 processに状態を保持する場合、そのprocessが死んだらそれに保存されるデータも無くなります。一方、etsは複数のprocessに共有されるキャッシュのように扱うことができます。 共有キャッシュのように扱うことができるので、etsに対しては書き込み制限をしたりします。また、callbackに関しても同期的に行う必要がるなどの制約がでてきます。 ここら辺の説明がされますが、etsを生成したprocessが死んだ場合、etsも合わせて自動的に閉じられます。これは、etsはそれを起動したprocessにリンクされているから。 ということは、supervisorで起動させて、publicにするとprocessに依存して、それが死ぬとetsが閉じられるという事態も回避できそうです。 このページの最後の箇所の、 :ets.foldl() のfnへの引数で、 {name, pid} が与えられているのですがこれがどこから来たのかよくわからなかった… のですが、 の所を見て納得。 :ets(table) に保存していた値がfnの引数として与えられ、それに対して関数が適用されて出力が得られるというものなのですね。説明にもさらりと描かれているのですが、initの中に突然nameとpidが出てきたので???になりました。 このfoldlのErlangによるspecは以下。 pipelineでメソッドチェインぽく描くとき、 () はsつけるべきなのですね。そのほうが意図が伝わるコードになりますし。引数の数が違う同名の関数もあるので、これはすごく納得。 なるほどなるほど。 Task and gen-tcp Taskは、非同期に処理を行うprocess。 processなので、そのprocessを監視するためにsupervisorへの登録が大事になってくるのですが、そこの詳しくはTask.Supervisorをみると良さそう。 こうざっと読んでみると、Supervisorが非常に重要な位置をしめて、そのsupervisorが監視する子プロセスへの再起動strategyも大事。これらがErlangというかElixirの安定性を支えているのですね。 結構、Unit testでロジックをしっかりかかないと、ここはdebugとかスキル必要そうだ。。。 Docs, tests and pipelines ExUnit.DocTest、半端ない。ドキュメントがそのままiexのコマンドベースでのテストコードに置き換わるのですね。 http://elixir-lang.org/docs/stable/ex_unit/#!ExUnit.DocTest.html 例えば、以下の@docで囲んだドキュメントになる範囲の iex> とその次の行がコマンドと期待結果になって、テストが実施される。APIとして目に見えるインタフェースでは、このテストかなり役立つのでは。autodocみたいなものですね。 ここは、最後はどのようなテストコードを作っていくか、というのも含め、戦略はチームで形作っていく必要あるよね、ってもので終わってました。 Distributed tasks and configuration 最後は、異なるノード間での通信が話題です。ネットワーク越しに異なるノード間で通信をやりとりし、一方から送った処理をもう一方のノードで実行するということが可能です。 Node.spawn_link/2 を使うのですが、普通に使うとsupervisorの管理下に置くことができないので、以下の3通りが紹介されています。…More