Crystalで暗号通貨プロダクトの開発

70c909df38100772c82c969e81bc045e?s=47 fukaoi
June 21, 2018

 Crystalで暗号通貨プロダクトの開発

東京 Crystal 勉強会 #6 in 渋谷
https://crystal.connpass.com/event/90745/

登壇資料です。

70c909df38100772c82c969e81bc045e?s=128

fukaoi

June 21, 2018
Tweet

Transcript

  1. © DMM.com LLC Crystalで暗号通貨プロ ダクトを開発 合同会社DMM.com 2018/06/21 東京 Crystal 勉強会

    #6 in 渋谷 高地明
  2. © DMM.com LLC 高地明 自己紹介 合同会社DMM.com CTO室所属 R&Dや他事業部の支援活動(SpRT)などをしてい ます。 @fukaoi

  3. © DMM.com LLC 本日の発表内容 3

  4. © DMM.com LLC 本日の発表内容 • 大人の事情により、暗号通貨プロダクトの内容、用途については、発表で きません、ごめんなさい。 • プロダクトの内容以外で、共有できる技術的内容を中心に発表したいと 思います。

    • 絶賛開発中です • ※crystal ver 0.24.2の挙動をもとに記述しています。0.25.0からは挙動 が異なっている点があります 4
  5. © DMM.com LLC Programming Editor 5

  6. © DMM.com LLC Programming Editor • 高地のEditor環境 6 Editor VS

    Code Extension vscode-crystal-lang Static analyze Scry (auto complete, syntax check, function jump)
  7. © DMM.com LLC Programming Editor part.1 • 角本さんのEditor環境 7 Editor

    vim Extension vim-crystal(syntax highlight, crystal cmdの実行) Static analyze なし
  8. © DMM.com LLC Scry 8

  9. © DMM.com LLC Scry • Scryの前に、Language Server Protocol(LSP)について • LSPは任意のEditor、IDEに対して、プログラミングする上での、コード保

    管、Syntax check、定義箇所へのジャンプなど、開発便利機能をクライ アントとサーバーでやりとりすることを決めたプロトコル • サーバー側で開発便利機能を提供することで、異なるEditor、IDE間でも 同等機能が提供できる • LSPのイメージ図(qiita: language server protocolについて) 9
  10. © DMM.com LLC Scry part.2 • ScryはLSPの仕様にもとづいて実装された、「開発便利にしてくれる」 サーバーのCrystal用です。 • 対応Editor、IDE

    • VSCode • Atom • Vim(NoeVim) • Sublime Text • Intellij IDEA 10
  11. © DMM.com LLC Scry part.3 • Scryはv0.7.1なので、不安定だったりする箇所があるが、リアルタイム でSyntax checkをしてくれるので便利 •

    LSPはマイクロソフトが中心になり、RedHat、Codenvy、Sourcegraph なども賛同しているので、今後もっと普及するかも? 11
  12. © DMM.com LLC Build tool 12

  13. © DMM.com LLC Build tool • shards test みたいにshardsを拡張して、build toolとして使いたかっ

    た。 • 拡張できないか調べてみたが、公式ページにはshardsは依存管理ツー ルと書かれているし、無りっぽい • 結果、Makeでbuild toolを作成することに • make install、 clean、build、testを中心に作成 13
  14. © DMM.com LLC Shards 14

  15. © DMM.com LLC Shards • よく使うshards command • install(update)・・・依存ライブラリーのインストール •

    check・・・shard.ymlからローカルのllib/に不足しているライブラリがな いかcheck • prune・・・shard.ymlからローカルのlib/に残っているゴミライブラリを削 除 15
  16. © DMM.com LLC Shards part.2 • shardsのcommandを組み合わせてmake installを効率化 a. shards

    check b. (不足ライブラリを発見! ※不足がなければmake installは終了) c. shards install d. shards prune • このちょっとしたことが、CI実行時などの処理時間に影響してくる 16
  17. © DMM.com LLC Shards part.3 • 複数のアプリケーションで使用する、共通ライブラリは、毎回git cloneし たくない •

    shard.yml内で、github: ではなく path: を使う • 相対パスでライブラリを指定するとsymbolic linkを張ってくれる。 • shards installの際にダウンロードが発生しない分、時間の短縮になる 17
  18. © DMM.com LLC CRYSTAL_ENV (まだ使わないほうがいい? 2018/6/21 時点) 18

  19. © DMM.com LLC CRYSTAL_ENV • test、developement、staging、productionと動作環境を想定。環境に 応じてアプリケーションの振る舞いを変えたい • そこで、公式のorganizationにある、crystal-envを使用。(※requireがお かしい)

    19 • デフォルトは developmentに設定 • specを動かすときは、test に切り替わる
  20. © DMM.com LLC CRYSTAL_ENV part.2 • (想定環境) test、developement、staging、production • (crytal-envの対応環境)

    test、developement、staging、production • stagingが無い!、issueを漁ってみるとみてみると、、、同じ思いの人 が! • test、developement、production、3つの環境しか指定できないことが分 かった。 20 なぜ、test、development、production以外の設定をinvalidにしてしまうんです か?この3つが一般的かもしれませんが、アプリケーションによっては、これ以 外のケースを使うことがあります。
  21. © DMM.com LLC CRYSTAL_ENV part.3 21 • staging環境を指定できるようるにするために、crystal-envのmoduleに 対してモンキーパッチで対応した 21

  22. © DMM.com LLC REPL 22

  23. © DMM.com LLC REPL • ちょっとした文法チェックに、REPLを使いたいけど、Crystal本体には REPLは実装されていない。(ver 0.24.2) • issueには、crystal-community/icr

    を使ってとかかれていたので、今のと ころicrを使うのがデファクト? • enterキーがおされるたびに、新しいcrystalプログラムファイルを裏側で 生成しているので、若干レスポンスが遅いが、便利なので。 23
  24. © DMM.com LLC JSON Mapper 24

  25. © DMM.com LLC JSON::Mapper • APIサーバーとのJSONインプット、アウトプットとやりとりする際に、 JSONデータ構造をあつかうのは避けて通れない • JSON::Parserだと、JSON::Any型になってしまい、Static typedの良さが

    半減してしまう。 • だけど、JSON::Mapper class(struct)を定義するのが面倒 • json-to-crytalを使おう! 25
  26. © DMM.com LLC JSON::Mapper part.2 26 • json-to-crystalのwebサービス 版が公開されていたが、現在は Not

    found • json-to-crystalのローカル版 (Node.js)は動く • (※注意)公式に書かれている Usageはそのままでは動かな い
  27. © DMM.com LLC JSON::Mapper part.3 27 • 左のMappingクラスは実際に 自動生成されたclassそのもの •

    Performanceを気にする場合 は、class構造からstruct構造に しても問題ない
  28. © DMM.com LLC methodの型定義 28

  29. © DMM.com LLC methodの型定義 29 • 気をつけている点として、methodの型は、開発者が定義することで、想定 された動作を確実に保証する • 極力methodの振る舞いのためのコメントを書きたくないので、引数型、レ

    スポンス型を定義して、仕様代わり。
  30. © DMM.com LLC 単相性(Monomorphism)と 多相性(Polymorphism) 30

  31. © DMM.com LLC 単相性と多相性 31 • 単相性・・・(ここでは)メソッド、クラスなどプログラミング言語の各要素が単 数の型に属するという性質 • 多相性・・・(ここでは)↑各要素が、複数の型に属することを許すという性質

    • Crystalでは単相性と多相性のコードが簡単に作れる • 実際に両方のコードを比較してみよう!(gist) • 単相性コード • 多相性コード
  32. © DMM.com LLC 多相性と単相性 part.2 32 • デザパタの教科書とかだと、単相性の記述が多い • 暗号通貨の種類は1000を超えていると言われており、多くの通貨を扱うプ

    ロダクトだと、多相性で実装したほうが、楽だった • 多相性、単相性ともに設計方針に基づいて使い分けるのがベター
  33. © DMM.com LLC 静的解析 33

  34. © DMM.com LLC 静的解析 • コンパイラが担当しない、コード構造の品質をあげるために静的解析ツー ルを導入 • 静的解析ツールameba (Crystal版Rubocop)

    • ameba.ymlで拡張可能、only/exceptオプションで解析対象範囲を指定 できる • CIでcrystal tool formatなどと一緒にチェックさせている 34
  35. © DMM.com LLC 静的解析 part.2 spec/hoge_spec.cr:9:68 LargeNumbers: Large numbers should

    be written with underscores: 0.000_1 spec/hoge_spec.cr:14:14 LargeNumbers: Large numbers should be written with underscores: 9_999_999_999_999_999 src/hoge.cr:12:7 UselessAssign: Useless assignment to variable `str` 35
  36. © DMM.com LLC 通貨単位 36

  37. © DMM.com LLC 通貨単位 • 暗号通貨の単位は細かい • ビットコインを例に • 一番大きい単位:

    BTC • 一番小さな単位: satoshi • 1satoshi = 0.00000001BTC • オーバーフローを発生させないために、通貨単位は、 Float64BigDecimal型で定義 37
  38. © DMM.com LLC Knowledgeのキャッチアップ 38

  39. © DMM.com LLC Knowledgeのキャッチアップ • 社内のSlackにCrystal関係の 情報を流すChannelを作成 • Crystalの話題、ディスカッショ ンなどを行う場を用意

    • 社内のCrystal人口を増やすた めに 39
  40. © DMM.com LLC まとめ 40

  41. © DMM.com LLC まとめ • ミッションクリティカルな暗号通貨プロダクトにもCrystalは適していると思 う • Null安全、型安全 •

    コンパイラが優秀 • Rust、Swiftと同じコンパイラ基盤(LLVM)を利用しているので、同性能 を享受 • Rubyと比較してruntime上でコードを生成することを許可していないの で安全 • 困ったらgitterでコミュニティに質問(コミュニティが活発) 41
  42. © DMM.com LLC 求人募集PR • DMMのCTO室では、以下のエンジニアを募集しています!!! • サーバーサイド • フロントエンド

    • セキュリティ • Android、IOS • 詳しくはこちら 42
  43. © DMM.com LLC ご清聴ありがとうございました。