Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Crystalで暗号通貨プロダクトの開発
Search
fukaoi
June 21, 2018
Programming
0
320
Crystalで暗号通貨プロダクトの開発
東京 Crystal 勉強会 #6 in 渋谷
https://crystal.connpass.com/event/90745/
登壇資料です。
fukaoi
June 21, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
ふつうの技術スタックでアート作品を作ってみる
akira888
0
460
Goで作る、開発・CI環境
sin392
0
220
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
1
8.5k
ペアプロ × 生成AI 現場での実践と課題について / generative-ai-in-pair-programming
codmoninc
1
15k
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
2
150
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
5
1.1k
WindowInsetsだってテストしたい
ryunen344
1
240
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
640
ISUCON研修おかわり会 講義スライド
arfes0e2b3c
1
420
Team topologies and the microservice architecture: a synergistic relationship
cer
PRO
0
1.2k
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
500
Select API from Kotlin Coroutine
jmatsu
1
230
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
4 Signs Your Business is Dying
shpigford
184
22k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Writing Fast Ruby
sferik
628
62k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
950
Typedesign – Prime Four
hannesfritz
42
2.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
960
Visualization
eitanlees
146
16k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Building an army of robots
kneath
306
45k
Transcript
© DMM.com LLC Crystalで暗号通貨プロ ダクトを開発 合同会社DMM.com 2018/06/21 東京 Crystal 勉強会
#6 in 渋谷 高地明
© DMM.com LLC 高地明 自己紹介 合同会社DMM.com CTO室所属 R&Dや他事業部の支援活動(SpRT)などをしてい ます。 @fukaoi
© DMM.com LLC 本日の発表内容 3
© DMM.com LLC 本日の発表内容 • 大人の事情により、暗号通貨プロダクトの内容、用途については、発表で きません、ごめんなさい。 • プロダクトの内容以外で、共有できる技術的内容を中心に発表したいと 思います。
• 絶賛開発中です • ※crystal ver 0.24.2の挙動をもとに記述しています。0.25.0からは挙動 が異なっている点があります 4
© DMM.com LLC Programming Editor 5
© DMM.com LLC Programming Editor • 高地のEditor環境 6 Editor VS
Code Extension vscode-crystal-lang Static analyze Scry (auto complete, syntax check, function jump)
© DMM.com LLC Programming Editor part.1 • 角本さんのEditor環境 7 Editor
vim Extension vim-crystal(syntax highlight, crystal cmdの実行) Static analyze なし
© DMM.com LLC Scry 8
© DMM.com LLC Scry • Scryの前に、Language Server Protocol(LSP)について • LSPは任意のEditor、IDEに対して、プログラミングする上での、コード保
管、Syntax check、定義箇所へのジャンプなど、開発便利機能をクライ アントとサーバーでやりとりすることを決めたプロトコル • サーバー側で開発便利機能を提供することで、異なるEditor、IDE間でも 同等機能が提供できる • LSPのイメージ図(qiita: language server protocolについて) 9
© DMM.com LLC Scry part.2 • ScryはLSPの仕様にもとづいて実装された、「開発便利にしてくれる」 サーバーのCrystal用です。 • 対応Editor、IDE
• VSCode • Atom • Vim(NoeVim) • Sublime Text • Intellij IDEA 10
© DMM.com LLC Scry part.3 • Scryはv0.7.1なので、不安定だったりする箇所があるが、リアルタイム でSyntax checkをしてくれるので便利 •
LSPはマイクロソフトが中心になり、RedHat、Codenvy、Sourcegraph なども賛同しているので、今後もっと普及するかも? 11
© DMM.com LLC Build tool 12
© DMM.com LLC Build tool • shards test みたいにshardsを拡張して、build toolとして使いたかっ
た。 • 拡張できないか調べてみたが、公式ページにはshardsは依存管理ツー ルと書かれているし、無りっぽい • 結果、Makeでbuild toolを作成することに • make install、 clean、build、testを中心に作成 13
© DMM.com LLC Shards 14
© DMM.com LLC Shards • よく使うshards command • install(update)・・・依存ライブラリーのインストール •
check・・・shard.ymlからローカルのllib/に不足しているライブラリがな いかcheck • prune・・・shard.ymlからローカルのlib/に残っているゴミライブラリを削 除 15
© DMM.com LLC Shards part.2 • shardsのcommandを組み合わせてmake installを効率化 a. shards
check b. (不足ライブラリを発見! ※不足がなければmake installは終了) c. shards install d. shards prune • このちょっとしたことが、CI実行時などの処理時間に影響してくる 16
© DMM.com LLC Shards part.3 • 複数のアプリケーションで使用する、共通ライブラリは、毎回git cloneし たくない •
shard.yml内で、github: ではなく path: を使う • 相対パスでライブラリを指定するとsymbolic linkを張ってくれる。 • shards installの際にダウンロードが発生しない分、時間の短縮になる 17
© DMM.com LLC CRYSTAL_ENV (まだ使わないほうがいい? 2018/6/21 時点) 18
© DMM.com LLC CRYSTAL_ENV • test、developement、staging、productionと動作環境を想定。環境に 応じてアプリケーションの振る舞いを変えたい • そこで、公式のorganizationにある、crystal-envを使用。(※requireがお かしい)
19 • デフォルトは developmentに設定 • specを動かすときは、test に切り替わる
© 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つが一般的かもしれませんが、アプリケーションによっては、これ以 外のケースを使うことがあります。
© DMM.com LLC CRYSTAL_ENV part.3 21 • staging環境を指定できるようるにするために、crystal-envのmoduleに 対してモンキーパッチで対応した 21
© DMM.com LLC REPL 22
© DMM.com LLC REPL • ちょっとした文法チェックに、REPLを使いたいけど、Crystal本体には REPLは実装されていない。(ver 0.24.2) • issueには、crystal-community/icr
を使ってとかかれていたので、今のと ころicrを使うのがデファクト? • enterキーがおされるたびに、新しいcrystalプログラムファイルを裏側で 生成しているので、若干レスポンスが遅いが、便利なので。 23
© DMM.com LLC JSON Mapper 24
© DMM.com LLC JSON::Mapper • APIサーバーとのJSONインプット、アウトプットとやりとりする際に、 JSONデータ構造をあつかうのは避けて通れない • JSON::Parserだと、JSON::Any型になってしまい、Static typedの良さが
半減してしまう。 • だけど、JSON::Mapper class(struct)を定義するのが面倒 • json-to-crytalを使おう! 25
© DMM.com LLC JSON::Mapper part.2 26 • json-to-crystalのwebサービス 版が公開されていたが、現在は Not
found • json-to-crystalのローカル版 (Node.js)は動く • (※注意)公式に書かれている Usageはそのままでは動かな い
© DMM.com LLC JSON::Mapper part.3 27 • 左のMappingクラスは実際に 自動生成されたclassそのもの •
Performanceを気にする場合 は、class構造からstruct構造に しても問題ない
© DMM.com LLC methodの型定義 28
© DMM.com LLC methodの型定義 29 • 気をつけている点として、methodの型は、開発者が定義することで、想定 された動作を確実に保証する • 極力methodの振る舞いのためのコメントを書きたくないので、引数型、レ
スポンス型を定義して、仕様代わり。
© DMM.com LLC 単相性(Monomorphism)と 多相性(Polymorphism) 30
© DMM.com LLC 単相性と多相性 31 • 単相性・・・(ここでは)メソッド、クラスなどプログラミング言語の各要素が単 数の型に属するという性質 • 多相性・・・(ここでは)↑各要素が、複数の型に属することを許すという性質
• Crystalでは単相性と多相性のコードが簡単に作れる • 実際に両方のコードを比較してみよう!(gist) • 単相性コード • 多相性コード
© DMM.com LLC 多相性と単相性 part.2 32 • デザパタの教科書とかだと、単相性の記述が多い • 暗号通貨の種類は1000を超えていると言われており、多くの通貨を扱うプ
ロダクトだと、多相性で実装したほうが、楽だった • 多相性、単相性ともに設計方針に基づいて使い分けるのがベター
© DMM.com LLC 静的解析 33
© DMM.com LLC 静的解析 • コンパイラが担当しない、コード構造の品質をあげるために静的解析ツー ルを導入 • 静的解析ツールameba (Crystal版Rubocop)
• ameba.ymlで拡張可能、only/exceptオプションで解析対象範囲を指定 できる • CIでcrystal tool formatなどと一緒にチェックさせている 34
© 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
© DMM.com LLC 通貨単位 36
© DMM.com LLC 通貨単位 • 暗号通貨の単位は細かい • ビットコインを例に • 一番大きい単位:
BTC • 一番小さな単位: satoshi • 1satoshi = 0.00000001BTC • オーバーフローを発生させないために、通貨単位は、 Float64BigDecimal型で定義 37
© DMM.com LLC Knowledgeのキャッチアップ 38
© DMM.com LLC Knowledgeのキャッチアップ • 社内のSlackにCrystal関係の 情報を流すChannelを作成 • Crystalの話題、ディスカッショ ンなどを行う場を用意
• 社内のCrystal人口を増やすた めに 39
© DMM.com LLC まとめ 40
© DMM.com LLC まとめ • ミッションクリティカルな暗号通貨プロダクトにもCrystalは適していると思 う • Null安全、型安全 •
コンパイラが優秀 • Rust、Swiftと同じコンパイラ基盤(LLVM)を利用しているので、同性能 を享受 • Rubyと比較してruntime上でコードを生成することを許可していないの で安全 • 困ったらgitterでコミュニティに質問(コミュニティが活発) 41
© DMM.com LLC 求人募集PR • DMMのCTO室では、以下のエンジニアを募集しています!!! • サーバーサイド • フロントエンド
• セキュリティ • Android、IOS • 詳しくはこちら 42
© DMM.com LLC ご清聴ありがとうございました。