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
330
Crystalで暗号通貨プロダクトの開発
東京 Crystal 勉強会 #6 in 渋谷
https://crystal.connpass.com/event/90745/
登壇資料です。
fukaoi
June 21, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
210
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2.1k
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
470
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
110
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
180
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.6k
2年のAppleウォレットパス開発の振り返り
muno92
PRO
0
180
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
190
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
6
2k
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
6
1.9k
GoLab2025 Recap
kuro_kurorrr
0
2.7k
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
160
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
79
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
140
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
0
410
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.5k
sira's awesome portfolio website redesign presentation
elsirapls
0
110
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Un-Boring Meetings
codingconduct
0
170
How to Think Like a Performance Engineer
csswizardry
28
2.4k
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 ご清聴ありがとうございました。