[Elixir]macroのテストを書いてみる

macroのテストを書く macroのテストでは、通常は コンパイルされたモジュールの振る舞い コンパイルされた結果(AST)自体 の2つの側面をテスト対象と見てテストコードを書いていくことになります。 振る舞いに関しては、以下のような感じでExUnitを使います。こちらは、普通にmacroによって定義された関数を使って、期待するinput/outputを確認する、というものです。 コンパイル自体に対しては、以下のようにAST自体が正しくできているか?を確認することになります。他は↑とさほど変わりません。inputがASTの文字列、outputがassertionになります。 例えば、以下のような内容になります。 少し話が逸れますが、Agentなどのテストにおいて、Processにsendされた値を確認したい時があります。つまり、mailboxの中身を確認したい。そんな時は以下のように __mailbox__ を使うことができます。 いつMacroを使うか? より簡潔にコードを記述できる場合 コード生成が必要な場合 例えば、Phoenixのルーティングではコード生成によってGET/POST/PUT/PATCH/DELETEなどの match を定義しています。 このような、少量のコードを書くことで、大量の汎用的なコードを生成する、というような場合、それら全てを手で書くよりも正しく、効率的に実行コードを生成できます ただし、複雑になると理解が難しくなるので、metaprogramingで大事なことは、simpleであることです。 mix-inするとき、 import を使えるなら use は使わない use を使うと、 __using__ を読み込みます。そのため、mix-inとしてimportのように使うことができます。ただ、macroをmix-inのためだけに使うのは止めましょう。単に複雑さを増すので。 macroを使ったmix-in: NO importを使ったmix-in: OK 他、いろいろありましたが大事なところはここら辺かな。 ここまでの内容は、『Metaprogramming Elixir』を読んだ内容が主でした。 __using__ の使い所とか、テストフレームワークとか作るのに必要なメタプログラミングの知見を得られたかな、という感じで、良い学びでした。ついでに、ちょくちょくElixir関連のOSSに貢献できたので、それも良かったかな 🙂 関連 [Elixir]macroを書くときの影響範囲 [Elixir]Macroで簡単なテストフレームワークを作ってみるMore

『Programming Elixir』を読んで、写経とかした

読む順番、何か間違えているような気もしますが… Programming Elixirを読みました。 以下、メモです。 読んでて、まだ知らなかったとか、なるほどなーと感じたところだけ… nestしたstructにアクセスする便利な機能 ちなみに、update_in を使うと、 のように関数を与えることもできる。 さらに、他にもmacroなど用意されてたり、更新する値を [:a, :b, :c] のような記述でkeyを指定できたりと、思いの外奥が深い… Stream関連 IO.streamの中身(Elixir 1.0.5時点) __build__ が何かなーと思うと… なるほどー。何か大層なことしていると思ったのですが、構造体に突っ込んでいるだけなのですね。 StreamはLazy Enumerablesなので、その処理対象が必要になった時に値を処理したい、という時に有効なのですね。 Comprehensions 以下のようにElixirでは記述することができるのですが、この for 、いわゆるループのforだと認識していたのですが、 ふと考えてみると ~ for you とかの、~に対してという感じのforとして使っているのですね。元々そうなのかな。。。そう見えると、この記述、なるほどなーという感じ。 Char lists [a | b] はリストの結合。なので、以下は ‘cat’ というchar_listに対して、 ‘dog’ という別のリストを結合する、という処理になるので、以下のような形になるのかな。 例えば、以下のような感じ。ここで a のリストがそのまま ‘cat’ に該当するという。 escript 以下のように escript を指定することで、mix実行時にコマンドを実行することができる。 Cuoncurrent programingの話 processの生成とその経過時間 プロセスに処理を渡すspawnは、 Kernel、Nodeとあって、それぞれがspawn、spawn_link、spawn_monitorなど、種類とその引数のバリエーションがあってパッとこれだ!と思い浮かばない……More

『Elixir in Action』を読んで写経とかも合わせてやった

Elixir in Actionは http://www.manning.com/juric/ http://www.amazon.co.jp/Elixir-Action-Sasa-Juric/dp/161729201X ここら辺で買えるやつです。 motivation 大学院の頃、Byzantine problemを題材に扱ってました。その主な対象が、現実問題だと分散システムやその信頼性だったこともあって、比較的、分散環境に対するシステム的な話に、技術的な興味を持っています。 今のWeb/Mobileなど含んだ様々な端末から構成されるサービスだったり、例えば、 The Wisdom of Crowds という、いっときかなり有名だった「集合知」に関する話題なんか。そういったものも分散システムですね。 ここ数年の間、Erlangは興味あったけれど、学ぶほどまでモチベーションがわかなかった…(多少、あることをきっかけにかじった程度) そんな折、Elixirを知って、Getting Statedをざーっと通して面白みを感じたので学んでみました。そして、興味の対象の理解に支障が無いくらいの書き物を身につけて、Elixir in Actionに手を出してみました。 成果 ざっと、書きながら、読みながら、有した時間は2週間程度でしょうか。だいたい、きりがよい段階でBlogに簡単なメモ残して、トントン、と。 読む前の能力としては、以下をざーとやったあと、のものです。 Getting Startedを一通りやった Hex.comに数個ライブラリをあげてみた Phoenixを使った、簡単なWebアプリを開発してみた EctoやPhoenixに本当にちょっとしたPRを送ってみた 以下、Blogを列挙。 [Elixir in Action]No technology is a silver bullet. [Elixir in Action]Read building blocks [Elixir in Action]Erlang/Elixirの再帰計算におけるnon-tail recursionとtail recursion [Elixir in Action]Guard clauseの優先度 [Elixir in Action]polymorphismで拡張していく [Elixir…More

『Katachi』を読んだ

代官山の蔦屋書店にて、ふと見つけてついつい購入。『Katachi』を読みました。 この本は、紙、木、竹、織、土、鉄、石といったテーマ別に写真を介してKatachiを表現したものでした。最後の付録として、各写真に関して簡単な解説も加えられています。 また、この書籍の面白いところは英語の解説も付いているところ。最後のページ付近に、英語でClassic Japanese Designとして写真、Katachiなどを説明、紹介しています。 花札の写真に「任天堂」という漢字を見つけて、任天堂が花札からはじまったのだなーと気づかされたり、叔父らが使っていた道具とか載ってて面白かったです。More

『多数決を疑う――社会的選択理論とは何か』を読んだ~ 分散システムにおける多数決 ~

多数決を疑う――社会的選択理論とは何かを読みました。 読んだ背景としては、教授が私の修士時代の修論の題材に関係していると教えてくれたから、でした。時期でいうと、4、5年前くらいの話ですね。 私が修士の時代、研究として分散コンピューティング環境化において、多数決がどれほど有効なのかの数学的な証明を行っていました。 想定した環境としては、ビザンチン障害。わかる人にはかなり有名な障害条件ですね。 ざっくりというと、分散コンピューティングを構成する計算機の集合において、自身以外が正しく動作しているか保証がない状態において、それらの集合全体として正しい計算結果を出すにはどのような条件が必要なのか?という問いです。 私は障害(正しく動作しない状態)が確率的に発生すると仮定し、その中で”正しく動作する”計算機が一定数以上あった場合、それらの集合は正しく動作することができるという命題を証明していました。その”一定数”とはどういう条件なのか?というものを。 人の経験則的に、多数決が1つの重要な要素として考えられていましたが、その多数決を基本としてどのくらい”正しく動作する”計算機が存在すれば、この命題を満足できるか?を証明していました。(証明したのですが、それは修論の発表以上いってないのですよね…5年たった今でも、出すべきというお声をかけていただきますが…) その内容が、数学的な厳密な定義ではないにせよ書かれていたのがこの書籍です。ただ、この書籍が私の過去の論文に少しアドバイスを与えてくれました。少し修正してまた出そうかな… 多数決ではどのような条件の基に”多数と判断するか”という集約ルールが重要な要素です。そのルールを、コンドルセ・ヤングの最尤法、ボルダルール、(単純な)多数決、決選投票付き多数決と歴史的に研究されてきた幾つかの例を基に説明し、何が投票者の多数の意見を反映しているか?を反例を交えながら説明していました。 人は3択以上ある選択肢を多数決でちゃんと答えを出すことができないことは政治/経済界隈では有名な話です。主にはその話ですね。 いくつか述べたあと、確率的な仮定を交えて 64%多数決ルール を説明しています。これは、選挙を例に多数決で可決/否決を決めるとき、確率的な要素を踏まえた上で全体の63.2%を超えるだけ集めた意見が勝つ、という多数決のルールです。 私の修論ベースでいうと、分散システムのうち、63.2%を超える計算機が正しく動作するのであれば、残るシステムは正しく動作しなくてもシステム全体として正しく動作することができることを意味します。(すべて確率的に失敗する、という前提のもとです。実際は色々制約もあると思いますが。) ※私の証明がこの通りというわけではないです。仮定もことなるので、色々ことなる点もあります。 この書籍自体は何かの解を求めているのではなく、『多数決を疑うこと』に焦点を当てて論述を展開しているので、伝えたいことも『多数決を疑え』ということでした。 多数決と多様性は社会システムとして重要な、研究が進んでいる分野ですが、これはコンピュータの構成する分散システム環境において同様のモデリングが可能です。ここらへんの理論がここ最近、論理だけではなく実践/計測まで進んでいるので、もう少し経てば 確率的な失敗を前提とした、それでも正しく動作するような分散システム ができるかもしれませんね。それは人工知能でも十分に使えそうな理論な気がします。More

『エクストリームプログラミング』を読んだ

『エクストリームプログラミング』を読みました。 電子書籍で購入したでのすが、結果的には紙の書籍でも買って残しておきたい、と感じました。 XPにおける開発にあたり必要となる価値観や原則、プラクティスがまとまっている本になります。XPというよりは、この価値観、原則、プラクティスを通じてより良い(ハッピーな)開発をするにあたり頭に入れておくべき規範な位置付け、と感じます。 価値観や原則はもとより、プラクティスの一部を実際に取り組んだりしていますが、このように目指すべき理想が言語化されているところはすごく価値あるものだと思います。 個人的に、第25章の結論に書かれている、 XPの鍵は誠実性(integrity)だ。 というところが印象に残っています。 ソフトウェア開発は、様々な過去の論文からも人に依存するところが強いです。そのため、信頼関係を築くことは大事で、それらを多様な中で維持するには、integrityが必要だと思っていました。それが裏付けされた、という意味においても、非常に印象的でした。 でも、実際に誠実であるって容易ではないですよね。でも、楽しそう。More

『今日もていねいに。』を読んだ

最近、『今日もていねいに。』という本の雰囲気に惹かれて購入しました。 文庫のジャケ買いですね。 著者をみてみるとびっくり、松浦さんでした。 今度、お話聞いてみたい。 内容は松浦さんの仕事観とか含めた考え方、がまとめられたものでした。 結構、私個人が持っている考え方とにているところも多かったです。 話の中で印象的だった箇所。 毎日を楽しく大事に過ごしていきたいですね。More

『誰のためのデザイン? 増補・改訂版』を読んだ

誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論を読みました。 健康診断の待ち時間で、3分の2以上読み終えてさっくり読めた感じ。 この書籍は、多くの事例を交えながら、デザインに関して考察を行っていました。参考文献を見ていると、すでに読んだことのあるものもちらほら。それも相まってか、事例以外のロジック的な話は多くは聞いたことがあるものでした。 教訓は簡単である。我々は人間のためにデザインを行うのだから、人とテクノロジーの両方を理解しなければならない、ということである。 アフォーダンスやシグニファイアという捉え方。デザインに対する見方など、中々に情報が整理された気がします。人間中心デザインは知ってましたが、活動中心デザインはあまり聞いたことがありませんでした。 2種類のエラーの話、スイスチーズモデルの話など、ソフトウェアテストに関わる話も散見されました。ソフトウェアテストでは、古くはISO 9126、認知工学ではISO 9241、新しくはISO 25000でこの領域に関して議論されてきました。それらの話も知っていると、いろいろ学ぶ、感じるところがでてきそうです。 ちなみに、ISO 9126の頃にあった 魅力性 、 魅力的品質 ということば、そろそろやめたいですね。そこからさらに細かく分解されていますし。 自分がより良くできない限り、批判しないこと 時間見つけてHCDの書籍を締めとして読もうかな。More

『目の見えない人は世界をどう見ているのか』を読んだ

『目の見えない人は世界をどう見ているのか』を読みました。SmartNewsの読書コーナーでふと目に入り、興味がわいたので買って読んでみることにした本です。Kindleでも売られていたこと、書籍買ったあとに気づいた… 目に見えない人の見ている世界を、「空間」「感覚」「運動」「言葉」「ユーモア」と章を分けて説明しています。 通常、視覚から得られる情報は8~9割と言われます。その情報を取得できない場合、どのように周囲の情報を手に入れるのか。 視覚から得た情報を処理する脳の箇所が、触覚により活性化する事例の紹介では、人、身体の感覚器としての役割に驚かされます。 芸術鑑賞におけるソーシャルビューイングなど、初めて聞いた話も交えらてました。 多くの場合、(私の勤めているところもそうですが)、費用対効果とか、そういう観点から健常者のみしか正常に使えないようなサービスの開発を主としています。一方で、様々な能力を健常者と同等に持っていない人たちも存在します。そんな人たちも楽しめるような、そんな身近なサービスを開発できるまで世界を進めたいですね。そうすれば、もっと楽しい世界になりそう。 その手段として、広くは「アクセシビリティ」と呼ばれる機能があります。スマホ、Web共に提供される、音声読み上げや色を変化させるような機能です。 例えば、WebだとWAI-ARIA(Web Accessibility Initiative-Accessible Rich Internet Applications)が有名どころでしょうか。スマホアプリの開発でも、accessibilityLabel(iOS)とか、contentDescription(Android)が提供されたりします。 私含む多くの人は、きっとこういう障害も”当事者”となるレベルで経験しないと必要性がわからないでしょう。なのですが、こういう違いも、こういった書籍を通して何か得て、何か違いがあって、その上で同じように楽しさを感じられるような世界に近づけるといいなー、とふと思いました。More

『未来へつなぐ食のバトン: 映画『100年ごはん』が伝える農業のいま』を読んだ

『未来へつなぐ食のバトン: 映画『100年ごはん』が伝える農業のいま』を読みました。 タイトルにつられて、ジャケ買いみたく購入した書籍です。ちょっとした読書。 この本は、「100年ごはん」の舞台となった大分県臼杵市の、「ほんまもん農産物」への取り組みについて書かれているものです。 10年、20年、100年先までを見据えて、何代も続く子供たちにしっかりと食を楽しんでほしいという思いで行われ始めた取り組みに関して書かれています。そして、映画化された100年ごはんに繋がる話としてまとめられています。 農作物を作るにあたり、 土 を大事にするところへの言及など、本当にしっかりとした取り組みだと感じました。私は実家が農家、兼業農家ですので、土地が痩せることや、作物を作ることができるような肥えるということもそれなりに体験として知っています。そういう人からみても、しっかりとした思いと取り組みと理解できるような内容が書かれていました。 土をしっかりする、土台を作る。 同じ釜の飯を食べるということ 同じ方向性を持って、前に進むにあたり必要なこと。それが同じ釜の飯を食べるということ。そのようなコミュニケーションに関しても書かれてました。 食って、なんだかんだで生活に身近なものですし、作物自体を楽しんだり、その先の料理を楽しんだり。そういうところで楽しみを感じたら、楽しい毎日を送れそうですね。More