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
チームの境界をブチ抜いていけ
tokai235
0
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
460
Claude Agent SDK を使ってみよう
hyshu
0
1.2k
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
1
310
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
340
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
5
2.5k
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
560
Swift Concurrency - 状態監視の罠
objectiveaudio
2
550
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
1k
オープンソースソフトウェアへの解像度🔬
utam0k
16
3k
Foundation Modelsを実装日本語学習アプリを作ってみた!
hypebeans
0
120
スキーマ駆動で、Zod OpenAPI Honoによる、API開発するために、Hono Takibiというライブラリを作っている
nakita628
0
180
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
Writing Fast Ruby
sferik
629
62k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
The Language of Interfaces
destraynor
162
25k
The World Runs on Bad Software
bkeepers
PRO
72
11k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
35
6.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
The Pragmatic Product Professional
lauravandoore
36
6.9k
The Power of CSS Pseudo Elements
geoffreycrofte
79
6k
Code Reviewing Like a Champion
maltzj
526
40k
Gamification - CAS2011
davidbonilla
81
5.5k
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 ご清聴ありがとうございました。