Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Crystalで暗号通貨プロダクトの開発
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
fukaoi
June 21, 2018
Programming
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Crystalで暗号通貨プロダクトの開発
東京 Crystal 勉強会 #6 in 渋谷
https://crystal.connpass.com/event/90745/
登壇資料です。
fukaoi
June 21, 2018
Other Decks in Programming
See All in Programming
SREの越境 / SRE Collaboration
y0hgi
1
210
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
410
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
190
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
7.2k
速習iPhone Duo対応
yuukiw00w
1
510
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
710
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
120
Building an Out-of-Order CPU
latte72
1
780
Java 27新機能 / Java 27 new features
kishida
2
140
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
280
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
450
Prompt Engineering for Job Search
mfonobong
0
450
Test your architecture with Archunit
thirion
2
2.4k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
990
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
Leo the Paperboy
mayatellez
10
2.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
390
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
240
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
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 ご清聴ありがとうございました。