layerx.go #4 — Transcript
Full transcript
- 0:50あ、あ、
- 0:52こんにちは。
- 0:5619時になったので、えっと、レx.
- 0:58GOの、え、第4
- 0:59回を始めていきたいと思います。よろしくお願いします。ありがとうございます。はい。えっと、ちょっとそうですね、今回自分が、えっと、主催しているので自己紹介させてください。えっと、自分の名前は、えっと、北太郎と言います。えっと、レア
- 1:16X
- 1:16の楽落申請視生産といったところで、えっと、エンジニアをしております。で、なの準ライブラリーは、え、
- 1:22IOです。で、あと最近、え、丸の地点を
- 1:25歩いて1周しました。
- 1:27はい。で、ちょっと会社の紹介だけ軽くさ
- 1:30せてください。はい。えっと、レアXでは
- 1:32、えっと、全ての経済活動をデジタル化
- 1:34するOミッションに、えっと、AIサース
- 1:37事業と、え、AIDX事業を展開しており
- 1:39ます。ま、えっと、3つの、え、事業合計
- 1:42展開しているような形になっています。
- 1:44はい。で、えっと、レア、lay.5に
- 1:47ついてですね。で、えっと、なぜ
- 1:49layerX.5を始めたのかっていうと
- 1:51、えっと、レayXのこうの地見、え、
- 1:54結構合がいるんですけど、え、その後の
- 1:56地見を、えっと、実践的なこう活用事例を
- 1:58共有するだけではなくて、ま、社外の方
- 2:00からの地見もこう積極的に取りればにし
- 2:02たいなという風に考えています。また、
- 2:05えっと、レアXの行動資信には得という
- 2:07ものがあるんですけど、こちらの特の観点
- 2:09からイベントを継続的に開催することで、
- 2:12え、後の、え、合言語のを広げていきたい
- 2:14という風に考えております。
- 2:17はい。で、えっと、今回の、え、Xの
- 2:19ハッシュタグは、え、SharレayX
- 2:21GOなので、是非、え、どんどんポストし
- 2:24てください。はい。え、今回のタイム
- 2:27テーブルはこのような形になっています。
- 2:29え、すごいたくさん発表していただけて、
- 2:32え、どれも、えっと、非常に面白い内容に
- 2:33なってるかなという風に思うので、ご期待
- 2:35ください。はい、では、えっと、レゴ、え
- 2:38、第4回始まります。よろしくお願いし
- 2:40ます。
- 2:44では、1番最初はレロさんからの発表と
- 2:46なります。
- 3:05はい。え、よろしくお願いします。
- 3:07初めまして。え、レロレロと言います。
- 3:11今日はゴルチンリークプロファイラーに
- 3:12ついてお話ししたいです。
- 3:16え、IDレレレロと言います。レアX入社
- 3:18したのは去年の9月でまだ半年ぐらいなん
- 3:21ですけども、北太郎さんと同じ、え、申請
- 3:23K生産で開発エンジニアになっております
- 3:26。で、今回51.26で入ったゴルーチン
- 3:30リークプロファイラーについて、え、ま、
- 3:33ゴルーチンリークて言うとあれですね、
- 3:36ゴルーチンが使われなくなったゴルーチン
- 3:38が、ま、メモリとかを食いつぶしてこう
- 3:40どんどん増えてくと大変なことにな
- 3:42るっていうようななんですけども、例えば
- 3:44Ubberの例では、あの、1つのイン
- 3:47スタンスで、あの、利ク修正前に
- 3:4943.5GBもこのゴルチンリクによって
- 3:52、え、使われてると利クを修正すると
- 3:553GBなんで92%も削現とこれの厄介な
- 3:59ところは、ま、あの、Webブサービス
- 4:00なんかですとデプロイの度にこうリセット
- 4:02されて気づきにくいんで、知らないうちに
- 4:04このゴルウチンリークによってコストが
- 4:06どんどん重んでいくみたいなリスクがある
- 4:09かなと思います。で、この厄介なゴルチン
- 4:11リークですが、従来の手法だと、例えば
- 4:15ゴルチンの数とかそのある時点での
- 4:18ゴルチンのスナップショットを見て、ま、
- 4:20なんか前後を比較してヒュリスティックに
- 4:22判定するみたいな方法か、ま、あるいは
- 4:24テスト時にこの5リークっていう
- 4:26ライブラリー使うと、ま、ツール使うと
- 4:28テストでは、ま、リークは検出できるん
- 4:30ですけども、その本番で実際に起きてる
- 4:33リークを確実に検出するっていう方法が、
- 4:35ま、なかったんですが、今回のこの
- 4:385.11、1.26のゴルチンリク
- 4:40プロファイラーでは、ま、本番環境で実際
- 4:43に起きている陸を確実に検出できると。で
- 4:47、え、ま、さらにこのフォルスポジティブ
- 4:49がない。実際に検出されたものはその本当
- 4:53のリークであると、ま、検出されない
- 4:55ケースもあるんですけども、検出された
- 4:56ものは確実にリークであるから安全にこう
- 4:59対処できるていうのと、ま、どこでリーク
- 5:01がてるかっていうのも分かりますと。これ
- 5:03素晴らしいなと思うんですけども、実際
- 5:06これどうやってそういう仕組みを、え、
- 5:08実装してるかというと、そのガベージ
- 5:10コレクションの仕組みに乗っかっている
- 5:12ですね。で、通常のガベージコレクショ
- 5:14ンっていうのはその使りないオブジェクト
- 5:15を見つけるために、あの、全てのルーチン
- 5:18のスタックからこう使っているポイン
- 5:20ターってのマークして巡っていって、え、
- 5:23残っているその使オブジェクトを、ま、
- 5:26片付けるみたいな感じなんですけども、
- 5:28ゴルチンリックプロファイラーも同じよう
- 5:30に、あの、実行されている、ま、ゴルチン
- 5:34から、えっと、ま、マーキングしていて、
- 5:39で、使われていない同期プリミテ、ま、
- 5:41チャンネルです。チャンネルとかを見つけ
- 5:43て、その使われていないチャンネルを、え
- 5:45、受信待ちとか送信待ちしている、
- 5:48ブロックしているゴルチンをリークと
- 5:50見なして、え、いるという感じです。で、
- 5:54これで確実に、え、ゴルチン力を
- 5:57見つけ出してるという仕組になってます。
- 5:59実際に、ま、コードでしますと、ここに
- 6:02簡単なそのゴルシンリークを再現する
- 6:04コードがあるんですけど、ま、ローカルで
- 6:06作ったチャンネルに対して、え、ゴルチン
- 6:09、新しいゴルチンの中でそれに送信すると
- 6:1242点を送信して、ま、これ受信する
- 6:15ところがないんで当然ブロックされて、え
- 6:18、しまいますと。で、ま、ここではその
- 6:21新しく潰ちンがブロックして
- 6:23ウェイティングの状態になっていて、この
- 6:25構図リークが抜けてしまうと、ま、上の
- 6:29このチャンネルはもうなくなっちゃうんで
- 6:30、もう使われなくなったチャンネルを
- 6:33ずっと待って、待ってるゴルチンっていう
- 6:35風に判断されて、これはゴルチンリクと
- 6:37ディテクトされます。はい。
- 6:42で、カベジコレクションなので、ま、その
- 6:46実行するコストというかもほぼガレージ
- 6:48コレクションと同じになると。で、5の
- 6:51ガレージコレクション非常に軽量に
- 6:53デザインされてまして、しかもその何もし
- 6:55てなくても2分に1回強制的に走るような
- 6:57ものなので、ま、利クの件数であれば別に
- 7:0010分とか1時間とか1回動かすのでも
- 7:03十分検数できるので、あの、本番環境でも
- 7:06安全に動かせるのかなと思います。
- 7:10で、実際あの自分たちの開発でもちょっと
- 7:13使ってみようと思いまして、え、ま、まず
- 7:16使、使い方からですね、あの、ま、
- 7:191.26の時点ではエクスペリメント
- 7:21フラグでビルドが必要なんですけども、
- 7:23イリースノートにはもう
- 7:24インプレメンテーションにその
- 7:25プロダクションレジット示されてるので、
- 7:27ま、本番でも使えますよと一応立ってい
- 7:30ます。で、1.2ではデフォルトで有効に
- 7:32なると。デビルドしたら、え、ゴルーチン
- 7:36リークのプロフでライト2を実行すると
- 7:39さっきのGCと同じようなフローが走って
- 7:42プロバイリングで減ってます。
- 7:46で、え、実際にそのマスキルを使ってる
- 7:50サーバーアプリケーションがあるんです
- 7:51けども、この開発環境に入れてやってみる
- 7:55となんと早速検数できたんですね。よく
- 7:59見るとそのデータベースすらSQL
- 8:02コネクションオープナーみたいなところで
- 8:05リクが起きてますよっていう風に言われて
- 8:07、ま、自分の行動じゃないんでなんかよく
- 8:09わからんなってなって色々調べたんですが
- 8:11、ま、先に結果だけ言いますと、その起動
- 8:15時に、え、スキーママイグレーションあっ
- 8:17てるんですね。そのファイル、スキーマ
- 8:19マイグレーションファイル読んでスキーマ
- 8:21変更あったら適用するみたいな。で、そこ
- 8:23のデビー接続のクローズを忘れて
- 8:26るっていう問題が、あ、これを引き起こし
- 8:28ているようだと。で、え、実際にその、ま
- 8:33、これ再現させるための最小コード書って
- 8:36みて試しなんですけども、よくあるその、
- 8:40え、データベースを使うようなウェブ
- 8:43サービスの例ですと、ま、メイン関数の中
- 8:46で1番最初にシグナルを受け取ります。
- 8:49シグナルの、え、コンテストを作って、で
- 8:53、なんかデータベース接続する。ここの
- 8:56デビ接続作りマイグレーション実行って
- 8:59ことですね。デビインスタンスを作って
- 9:01なんかマイグレーションしてで終わったら
- 9:04えっとサーバーをリスンするような、ま、
- 9:07ここdomeanンって書いてますけどな
- 9:09、なんか1番メインなところをやるとで、
- 9:12え、コンテキストでシグナルを受け取っ
- 9:14たら終了しますみたいな感じになりますね
- 9:17。で、ここで、ま、さっき言った通りこの
- 9:20デビっていう変数があるんですけど、
- 9:23こいつクローズし忘れてるんですね。
- 9:26ま、なんでこれ最後にデビクローズやれば
- 9:28、え、実際もう1回リクスすると検出し
- 9:32なくなったと。で、めでたし、メでたしか
- 9:35なと思ったんですけど、ま、こ色々触っ
- 9:37てると別にこれクローズしなくても検出し
- 9:41なくなるんですね。ま、そもそもこの
- 9:44ゴルチンリクプロファイルを動かせるのっ
- 9:46てこの弾を待つ1個上のメインの中でやっ
- 9:50てるんですね。だから、ま、この段の後に
- 9:53何かすることによって検出がしたりしなく
- 9:57なったりするのはこれなんでだろうなと
- 9:58思って、ま、もうちょっと調べてみること
- 10:00しました。
- 10:02で、実際にその利益検水する箇所っていう
- 10:04のがこのSQLライブラリーの中の
- 10:07OpenDBの中で、ま、チャンネルを
- 10:09内部で作って新しいゴルチンを起動して
- 10:12そこで、え、チャンネル待ってると。で、
- 10:16え、ま、なんかデビ書いてきたデビに
- 10:19クエリを投げるとこのゴルチャンネル系で
- 10:22ゴルチンが何か処理をするみたいな動作を
- 10:25しているようですと。
- 10:28で、ま、色々調べてくとこのビブネス
- 10:30アナリシスというものに行きついてこれが
- 10:33どうも関係してるだということが分かり
- 10:35ました。で、これが何かと言うと、
- 10:37コンパイラン的化で、ま、ある特定の場所
- 10:39でコレクターにそのどのオブジェクトが
- 10:42有効かっていうのを、え、マップみたいな
- 10:45ものをコンパイルに作ってると。で、これ
- 10:48がそのセーフポイントで利用されないと
- 10:50コンパイラーが判断したら、えっと、
- 10:53ガベージコレクターはその情報を持って、
- 10:55もう最初から到達負荷、スキャンしないで
- 10:57到達負荷と見なすみたいな仕組みがある
- 11:00みたいですね。で、こ、セーフポイントっ
- 11:02てのはそのガベージコレクターが、ま、
- 11:03メモリの位置を特定するポイントなんです
- 11:05けども、ま、え、その関数を呼び出す前と
- 11:09か後とか、ま、1.最近の1.14以降は
- 11:13その、もう結構どこでも割り込みが入れる
- 11:15んで、え、大体の場所がこの製なんです
- 11:19けども、これをなんかビルドフラグ、
- 11:22GCフラグスライブつけるとセーフ
- 11:25ポイントの情報が表示できるらしいという
- 11:27ことで早速試してみました。そうすると
- 11:31なんかこんな感じの出力になってでこれは
- 11:34何かと言うとソースコードの場所とまそこ
- 11:38でやってることとで最後の方にそのセーフ
- 11:42ポイントの位置で生きているシンボルって
- 11:45のが出るんですね。で、ここになんかデビ
- 11:48って書いてありますけどこれデのシンボル
- 11:51がこのセーフポイントの位置ではまだ生き
- 11:53てますよっていう風な情報が、え、
- 11:56コンパイル時に生成されてると。で、早速
- 11:58さっきのあのですね、このこのプリント
- 12:03LNDBをける後、けた後とける前で、え
- 12:08、試してみて比較してみるとプリントLの
- 12:12DAYBってのはDBはまだ参照してるん
- 12:14で、このまだ生きてますよっていう風に
- 12:18表示されるんですけど、ここコメント
- 12:20アウトするとデビがもうライブでなくなっ
- 12:23てると、
- 12:25ま、この結果からどうも、ま、デビー
- 12:29クローズとか、ま、もしくはデビ参照が
- 12:31ないとリーク判定されるっていうのがこの
- 12:34リーブネスアナリシスによるものだなって
- 12:35いうことが分かりました。ま、なのであの
- 12:40参照がないともうその時点でパパイラが
- 12:43もう使われてませんよってなってこの
- 12:45チャンネルも見ようとみなされてSQL
- 12:48ライブラリーの方でもう使われてないやつ
- 12:50を待っていると判断されたと。ま、実際
- 12:53今回の場合だとこのこれ実際のリークだっ
- 12:56たんで、ま、ただそのリブネスアナリシス
- 12:59によってそのリーク検出しないケースって
- 13:01のもあるんだなっていうことが、え、学び
- 13:04でした。はい。ということで、ま、最後、
- 13:08え、まとめですけども、ま、そういう流検
- 13:10されないケースがあるとはいえ、ま、それ
- 13:13でも検出されたリークての本当に100%
- 13:15今んところ本当のリークとなっているので
- 13:17、これ本番環境で安全にリークを検出
- 13:20できるし、え、どんどん使っていきたいな
- 13:23という風に思いました。ま、あとデイビ
- 13:25クロズは皆さん忘れないように気をつけ
- 13:27ましょう。はい、以上です。ありがとう
- 13:30ございました。
- 13:39はい、レロさん、ありがとうございました
- 13:40。えっと、自分も結構ゴリ、あの、
- 13:43Ubberのゴリクとか使ってたりしたん
- 13:44ですけど、こうテスト書かないといけなく
- 13:45て、ま、大変だったりとかなったんです
- 13:47けど、ま、今回標準でこうそうですね、
- 13:49簡単に使えるようになったってのは大きい
- 13:50のかなという風に思いました。はい。あと
- 13:53リブネス、え、アナリシスもすごい
- 13:55面白かったなという風に思いました。
- 13:57ありがとうございます。はい、では次の
- 13:59登壇者の、え、シ川プロさんお願いします
- 14:01。
- 14:31じゃあ始めていきますね。はい。え、では
- 14:355の型安全で実現する複数プロダクトの
- 14:38権限管理というタイトルで発表させて
- 14:40いただきます。よろしくお願いします。
- 14:46え、まず自己紹介です。え、石川明と申し
- 14:48ます。ハンドルネームは石川プロです。え
- 14:51、去年の10月に入社しまして、えっと、
- 14:54現在アカウント基盤開発部というところに
- 14:57所属しています。え、やってることとして
- 14:59は、え、爆落の共通管理と言われている、
- 15:03えっと、テナントの、その爆落のテナント
- 15:06の、えっと、設定とかアカウントとかを
- 15:09テラント内のアカウントとかを管理する
- 15:10ような、えっと、プロダクトが共通管理と
- 15:13いう名前であるんですけど、え、そこの
- 15:15共通管理の開発を運用したりとか、あと
- 15:18認証認とかの、ま、マイクロサービスとか
- 15:20の、え、管理とかをしていたりしています
- 15:23。今日はその爆落の、えっと、権限管理の
- 15:27、えっと、裏側のについてちょっと紹介し
- 15:29たいなと思ってます。で、ちょっと簡単に
- 15:32最初前提の説明なんですけど、ま、爆落で
- 15:35はすごいいっぱい、えっと、プロダクトを
- 15:37、えっと、提供していて、で、各お客様
- 15:40ごとに、えっと、契約してるプロダクトが
- 15:43違っていて、で、そのプロダクトごとに、
- 15:46えっと、有効な、あの、ロールの設定を
- 15:50することが可能になってます。この表の
- 15:53ように、えっと、例えば申請経費生産では
- 15:56、ま、一般権限とかで、えっと、近代でも
- 16:00、あ、で、ビジネスカードはこの人は利用
- 16:02できませんみたいなのを、ま、一単位で
- 16:05かつそのプロダクトごとに設定できるよう
- 16:07な、えっと、仕組みになってます。で、
- 16:11さらに裏側では、えっと、そのロールに
- 16:14応じて、えっと、細かくアクセス制御
- 16:16できるような、えっと、実装になってます
- 16:19。なので、えっと、爆落内では、えっと、
- 16:22複数のプロダクトごとに、えっと、ロール
- 16:25を設定できて、そのロールに紐づく、えっ
- 16:28と、詳細なその権限みたいなのを、えと、
- 16:32管理する必要がありますと。で、えっと、
- 16:34爆落ではすごい新規プロダクトとかも
- 16:36いっぱい開発しているので、えっと、ま、
- 16:39どんどんその管理しないといけないロール
- 16:41とか権限ってのが、ま、いっぱい増えてい
- 16:44くっていうのが、えっと、ま、現状であり
- 16:46ますと。で、それをいかにその、えっと、
- 16:50安全に管理していってるのかっていう
- 16:52ところを今日は説明したいなと思ってい
- 16:54ます。で、えっと、権限管理の、ま、実装
- 16:58として、ま、簡単なこう実装の例として
- 17:01思いつくのはこういう感じで、えっと、
- 17:04文字列で、ま、管理するような、ま、やり
- 17:07方がちょっと思いつくかなと思うんです
- 17:08けど、ま、こういう感じの実装をして
- 17:11しまうと、まずその人間が対捕しても実行
- 17:14時まで、ま、気づけないってのが1個問題
- 17:16があると思います。で、あとは最近は、ま
- 17:19、AIをAIに行動を欠かせることが多い
- 17:22と思うんですけど、ま、AIはよく嘘を
- 17:24つくので、ま、存在しないような権限を、
- 17:27えっと、こう書いてできましたって言って
- 17:29、そのまま人間が気づかずに、ま、
- 17:33リリースしちゃっても、ま、気づけないっ
- 17:35ていうような問題があると思います。また
- 17:37そのプロダクトがどんどん増えていくと、
- 17:39ま、こういう、えっと、分岐とかが
- 17:41いっぱい増えてくると、ま、なかなか管理
- 17:43しきれないので大変大変だというところも
- 17:45課題としてあると思います。で、そこで
- 17:48どうやって、えっと、権限管理の仕組みを
- 17:51実装してるかって言うと、えっと、5の
- 17:53ディファインドタイプっていうのを活用し
- 17:55て、えっと、実装してます。ま、ちょっと
- 17:58皆さんご存知だと思うんですけど、念の
- 18:00ため、えっと、簡単に説明しておくと、ま
- 18:02、こういう感じで、えっと、タイプで、
- 18:05えっと、既存の方から新しい、ま、方を
- 18:08作る、作る機能が、え、ディファインド
- 18:10タイプという機能です。ま、この例で言う
- 18:14と、えっと、パーミッションっていう方を
- 18:1632の、えっと、方から作ってるのと、
- 18:19あとプロダクトロールっていうのも同じ
- 18:22ように、えっと、イ32の方から作ってい
- 18:25ます。で、これらは同じ、えっと、元の方
- 18:28としては同じなんですけど、え、
- 18:30パーミッションと、ま、プロドクトロール
- 18:32それぞれは、えっと、別の方として、ま、
- 18:35使ってくれるようになりますっていうのが
- 18:37ディファイドタイプになります。で、これ
- 18:40の何がいいかって言うと、ま、えっと、
- 18:42もしそのパーミッションとロールの値を、
- 18:46えっと、間違えて比較するようなコードを
- 18:48書いた時に、ま、それぞれ違う方なので、
- 18:51えっと、比較できませんよっていうのを
- 18:53コンパイラーが、ま、えっと、指摘して
- 18:55くれたりとか、ま、あとその
- 18:57ハズパーミッションみたいな関数を作って
- 19:00引数に、え、パーミッションの値を受ける
- 19:03ような関数を作った時に、ま、それ以外の
- 19:06、えっと、例えば、ま、生のイント32の
- 19:08値とかを、えっと、引数に渡そうとした時
- 19:11にそれを違うんで渡せませんよみたいな
- 19:14ところを、ま、コンパイラーが指摘し指摘
- 19:16してくれるので、ま、あの、非常に権な
- 19:19実装をすることができるのがこの
- 19:20デファイドタイプのいいところかなと思っ
- 19:22てます。
- 19:24で、それを、ま、具体的にどういう風に
- 19:26使ってるかって言うと、えっと、爆落では
- 19:29、えっと、GRPC5間の、えっと、あ、
- 19:33コネクトRPCっていうそのなんだろうな
- 19:36、GRPC互間のRPCフレームワークを
- 19:39使って、ま、通信してるんですけど、その
- 19:42、えっと、なのでプロトコルバッファーで
- 19:44この、え、権限の定義を宣言してます。で
- 19:48、イナムで、え、パーミッションっていう
- 19:50、え、イナムとプロダクトロールっていう
- 19:53イナムを宣言してて、え、パーミッショ
- 19:55ンってのが結構詳細な具体的に何ができる
- 19:59かみたいなところを、えっと、宣言する、
- 20:02あの、最も細かい流度の、え、権限が
- 20:05パーミッションで、プロダクトロールって
- 20:07のが、えっと、実際にそのアカウントとか
- 20:11に紐づける、えっと、権限になります。な
- 20:14ので、え、例えばアカウントアドミン
- 20:16みたいな、え、権限とか、えっと、
- 20:19アカウントユーザーみたいな権限とか、ま
- 20:21、人に紐づくような、え、権限をここで
- 20:23イナムで宣言してます。で、え、その宣言
- 20:26した、えっと、プロトを、ま、
- 20:29プロドックジェン5で、え、生成す、え、
- 20:315のコードとして生成すると、ま、こう
- 20:34いう感じの、えっと、ディファインド
- 20:36タイプを作ってくれるのと、そのイナムで
- 20:38宣言した値を、ま、列教型みたいな感じの
- 20:42、えっと、値を生成して、自動生成して
- 20:44くれます。なので、えっと、
- 20:48え、プロトファイルに、え、1日権限を
- 20:50追加するだけで、ま、コードが自動生成さ
- 20:53れるような感じになっていますと。
- 20:56で、じゃあロールと権限の対応、紐付けを
- 20:59どうやって管理してるかって言うと、え、
- 21:01ここもプロトファイルに宣言してます。
- 21:04これはその先ほど説明した、えっと、
- 21:07イナムのところイナムにイナムvalリー
- 21:09オプションズで、えっと、値を拡張して、
- 21:12え、宣言できるようにして、その
- 21:15プロダクトロールの中、このプロダクト
- 21:18ロールは何のパーミッションを持ってま
- 21:20すってのを、えっと、プロト内に宣言
- 21:22できるような感じで、え、作ってます。
- 21:26で、ここも、え、その宣言イラムを活用し
- 21:29てコードを自動生成してて、ここはその、
- 21:33えっと、標準のプロトクが生成するコード
- 21:36ではなくて、えっと、自社で開発してる
- 21:39そのカスタムプラグインを使って、え、ま
- 21:42、マッピング表みたいなのを、ま、作って
- 21:44ます。で、このマップは何を使やってる
- 21:47かって言うと、えっと、キーに
- 21:49パーミッションを持ってて、えっと、値に
- 21:53プロダクトロールを、え、持っていて、ま
- 21:56、えっとですかね、プロダクト、この
- 22:00パーミッションを持っているプロダクト
- 22:02ロールの一覧を引けるマッピング表みたい
- 22:05なのを作っています。
- 22:08最後、えっと、RPCの定義でも、えっと
- 22:12、ちょっとか、手を入れていて、えっと、
- 22:15このRPCの定義のところで、このRPC
- 22:19を叩くのに、ま、何のパーミッションが
- 22:21必要かっていうのも、えっと、この定義内
- 22:24で宣言してます。これはメソッド
- 22:26オプションズで、えっと、独自の
- 22:28メタデータをけれる、ま、追加できる
- 22:30仕組みを活用して、えっと、こういう感じ
- 22:33でこのRPCごとにパーミッションの、
- 22:36えっと、設定を行っています。
- 22:40で、ここまでが、えっと、その実際に自動
- 22:42生成とかRPCでの定義の仕組みの説明
- 22:45だったんですけど、実際さ、どうや、どこ
- 22:47でどうやって、え、権限のチェックをし
- 22:50てるかっていうところをちょっと紹介
- 22:51しようかなと思います。えっと、まず
- 22:53クライアントから、えっと、リクエストが
- 22:55来た時に、えっと、認証トークンを元に、
- 22:58えっと、内部通信用の、え、トークンを
- 23:02生成して、ま、例えばサービス間通信とか
- 23:05全部で引き回してるんですけど、えっと、
- 23:08そのトークン、内部通信用のトークンの中
- 23:10にこの人は何の権限を持っているっていう
- 23:14そのプロダクトロールの一覧をそのトーク
- 23:17の中に埋め込んでます。で、えっと、通信
- 23:20、えっと、コネクトRPCの
- 23:23インターセプターを使って、えっと、この
- 23:25RPCの手前で、えっと、全ての、えっと
- 23:30、全てのRPCの中で、えっと、この権限
- 23:34チェックをインターセプターでやってい
- 23:36ます。で、えっと、先ほど説明した、え、
- 23:39マッピング表とか、ま、自動生したコード
- 23:41をに、え、自動生したコードとその内部
- 23:46通信用のトークンから、え、レコードして
- 23:50取れるその人が何のロールを持っている
- 23:53かっていう情報をもに、えっと、この人は
- 23:56RPCを、このRPCを叩けるかっていう
- 23:58のを判定して、ま、権、権限がなければ、
- 24:01ま、403で弾いてオッケーだったらその
- 24:04まま処理を継続するような感じの、え、
- 24:07仕組みになってます。で、ちょっと中身の
- 24:10コードもちょっと簡単に説明したいんです
- 24:12けど、ま、こういう感じのハズパミッショ
- 24:14ンっていう関数を定移してて、え、引数に
- 24:18パーミッション型を受けて、えっと、
- 24:20レシーバーで、えっと、そのトーク内でに
- 24:24入ってる、えっと、プロダクトロールを、
- 24:28え、レシーバーでの値で持ってます。で、
- 24:31えっと、1行目のこのロール、
- 24:34ロールズバイパーミッションってのが自動
- 24:36生成しているあのマッピング表で、えっと
- 24:40、キーにこの引数で受けたパーミッション
- 24:42を渡すと、えっと、そのパーミッションを
- 24:46持っているロール、え、が、アロード
- 24:49ロールとして取れるので、え、この
- 24:52アロードロールと、えっと、えっと、その
- 24:55人が持ってる権限を分で回して比較して、
- 24:59えっと、実際にその許可してるロールをも
- 25:02その人が持ってるかっていうのを、ま、
- 25:04ここの方分という部分で判断してます。で
- 25:06、権限があればトルーを返して、権限が
- 25:09なければフルスを返すっていうような感じ
- 25:11になってます。で、ま、ここでもここで
- 25:14そのディファインドタイプを活用してるの
- 25:15で、ま、5らしく、ま、綺麗なコードで
- 25:18綺麗か、ま、いいあの安全な、ま、実装が
- 25:22できてます。で、そのインターセプター内
- 25:25以外でも、ま、ビジネスロジック内で結構
- 25:28権限の確認とかチェックみたいなところを
- 25:30、ま、することもあったりするんですけど
- 25:32、ま、そういうところも、あの、同じよう
- 25:35に、え、コードを書くことができるので、
- 25:38ま、ここでもその
- 25:40、ま、えっと、対することもないし、AI
- 25:43が嘘ついたら、え、コンパイルエラーに
- 25:46なってくれるので、えっと、ま、
- 25:48ハルシネーションとかAIの嘘にも、え、
- 25:50強い権露な実装ができているという感じに
- 25:52なっています。え、最後まとめになります
- 25:55。えっと、ま、ディファインドタイプを
- 25:57活用することで、えっと、ま、コンパイル
- 26:00時に、えっと、ミスを検知できるような、
- 26:03ま、権ロな仕組みを、え、実装してます。
- 26:06で、最後は、えっと、プロトコル
- 26:08バッファーと、ま、プロトジェンゴの
- 26:10コード生成で、ま、スケーラブルな、ま、
- 26:13プロダクト数が増えてっても、え、
- 26:15スケール可能な、え、権限管理の仕組みっ
- 26:17てのを実現しています。え、ま、この、ま
- 26:20、プロ、プロトでの自動生成とか
- 26:23ディバインドタイプを活用した、え、
- 26:25仕組みのは他のことでも結構報用できると
- 26:28思うので、よかったら、え、参考にしてみ
- 26:30てください。ご成聴ありがとうございまし
- 26:31た。
- 26:40はい。え、石川プロさん、ありがとう
- 26:41ございました。と自分も結構そうですね、
- 26:44このプロダクトを活してるんで、この
- 26:45仕組みを使うことが多いんですけど、ま、
- 26:47プロト書くだけで、えっと、裏側の条件的
- 26:50な、条件的なコードが、えっと、自動で
- 26:52生成されるっていうのはすごい便利でいつ
- 26:54も助かってます。はい、ありがとうござい
- 26:55ます。では次は、えっと、たくさんの、え
- 26:58、発表です。よろしくお願いします。
- 27:49はい、こんばんは。えっとこれから5の
- 27:52DBアクセスにおける型安全と柔軟性の
- 27:54両率ポブという選択肢というという
- 27:57タイトルで発表します。よろしくお願いし
- 27:59ます。
- 28:04はい。えっと、高橋拓也でと言います。で
- 28:08、ま、車内ではタと呼ばれてます。で、ま
- 28:10、レックスの、え、爆落事業部で、えっと
- 28:12、2023年の12月から働いてて、
- 28:14えっと、2025年の新卒のエンジニアと
- 28:16しても働いています。で、ま、インターン
- 28:191年ぐらいちょっとしてたという、ま、
- 28:21意外とちょっと、ま、古だったりしてい
- 28:24ます。で、えっと、ま、週末に確定申告し
- 28:26ないとなと、えっと、焦っています。
- 28:30はい。で、ま、本題なんですけど、皆さん
- 28:335でDBSとかどうしてますか?
- 28:37ま、えっと、よく、ま、Oワ、ま、普通の
- 28:40ORマップ私よく使われるのが、ま、
- 28:42ゴルムだったり、えっと、ま、SQL
- 28:44ファーストで、えっと、自動で生成して、
- 28:47えっと、ま、DBにアクセスするSQLC
- 28:49だったり、ま、本当にスイラップとして
- 28:51SQLXがあったりとか、あと、ま、DB
- 28:54のスキーマ、ま、DBメイとかから、えっ
- 28:57と、ま、あらかじめ、え、インサートして
- 29:00おい、え、クリクリエトしておいて、えっ
- 29:01と、ま、それを元に型を作ったりするXO
- 29:03とかSQLボイラー、ま、あとコード
- 29:05ファーストのエントだったりがあ、あると
- 29:07思います。
- 29:09で、えっと、ま、こん中でも、ま、今日は
- 29:11DBスキーマ生成系をベースに、ま、見て
- 29:14みようと思ってます。で、えっと、ま、
- 29:17ボブにたどり着く入り口というのでSKL
- 29:19ボイラーがあって、えっと、ま、5Oの
- 29:21スキーマファーストで、ま、かなり有名
- 29:23だったコード生成ツールだと思うんです
- 29:24けど、えっと、ま、で、ま、これはDB
- 29:26スキルや、ま、クラット、ま、基本的な
- 29:29メストだったり、えっと、ま、関数だっ
- 29:31たり生成してくれる、ま、便利なツールで
- 29:33はあったんですけど、そのSQボイラーが
- 29:35、えっと、ま、1年、1、2年前ぐらいに
- 29:38メンテナンスモールに突然入って、ま、
- 29:41ざわざわちょっと一部していたところが
- 29:43こうあるかなと思います。で、ま、そこの
- 29:46メンテナンスモールの下の方に行くと
- 29:47オルタナティブスのところで、えっと、ま
- 29:49、ボブとか、え、こ、ボブとSKLCが
- 29:52並んでて、まあボブ
- 29:55なんかボブさんですかみたいな、ま、
- 29:57ちょっとよくわからないこう名前のものな
- 29:59んですけど、ま、なんかこれを見てみると
- 30:01、ま、SQLボイラーVの、ま、実験とし
- 30:04てなんか作ってたけど、あまりにも違、
- 30:07違いすぎて別プロジェクトになったという
- 30:09胸が書いてあります。
- 30:12で、ま、ちょっと、ま、その部分は一旦
- 30:14置いておいて、ま、ゴルムとかの良い点
- 30:16だったり、辛い点だったりをちょっとさっ
- 30:18ていくと、え、ゴルムは、ま、エコ
- 30:21システムが結構成熟してて、ま、ギタブの
- 30:23スターズもなんだかんだ3万9000とか
- 30:25あったり、えっと、ま、うちの会社で言う
- 30:28と、ま、結構、ま、ほとんどのサービスで
- 30:31結構使われていたりとかで、ま、ど、同的
- 30:33クエリーを、ま、いい感じに作ったりする
- 30:35のは、ま、なんだかんだやりやすいところ
- 30:37はあったりしつつも、ま、やっぱ
- 30:39インターフェイス型、ま、今だってエ型が
- 30:41対応されてて片チェックが引きにくかっ
- 30:43たり、ま、最近ジェネリクスが入ったとか
- 30:45あったりしますけど、ま、ちょっとこう
- 30:47工絶するゼロチトラップとか、ま、あって
- 30:49、ま、AIが高く時代にちょっと怖いなっ
- 30:51ていうところもあったりすると思います。
- 30:55で、ま、SQLCと、ま、こ、えっと、
- 30:57SQLファーストで、ま、型安全に一応
- 30:59作れたりとか、えっと、ま、レビューのし
- 31:01やすさとかあったりするんですけど、ま、
- 31:03なんか、えっと、一覧のフィルターページ
- 31:05とか、ま、同的クエがかなり大変だったり
- 31:08とか、えっと、ま、バルクリンサートとか
- 31:10もなんかこ公式にバルクリンサートは
- 31:13サポートさせてなかったりして、ま、
- 31:15頑張ってプラグインを書いたりとかする
- 31:16必要があったりで、ま、大変だったりする
- 31:18面があります。
- 31:21で、えっと、ま、あとX、X4とか、
- 31:23SQLボイラーとかだと、ま、DBスキで
- 31:26モデル生成して、ま、自由度が高かったり
- 31:28するんですけど、えっと、ま、
- 31:32SKLボイルメンテナンスボールだったり
- 31:33、ま、Xは結構自分でテンプレートをかけ
- 31:35ば頑張れるものの、ま、なんか運用コスト
- 31:37が結構乗ったりするかなと思います。で、
- 31:41ま、ボブは、ま、型安全で、ま、柔軟でS
- 31:43、えっと、ま、データベースSQL
- 31:45ネイティブで、ま、なんかSQLCみたい
- 31:47なこともできるし、ま、もちろんさっきの
- 31:49SQLボイラー的な性質も持ち合わせて
- 31:52いるんですけど、ま、あと、ま、名前が
- 31:53検索しやすかったりとか、ま、こう、
- 31:56こまらまこれからのプロジェクトだなと
- 31:57いう感じもあります。で、ま、ボブの
- 32:00ちょっと具体の話をざっとしていくと、ま
- 32:02、ボブは、ま、SQLボイラーみたいに、
- 32:04ま、ボブのやると、ま、クエリと、あと
- 32:06DBのスキーマも元に、ま、モデルだっ
- 32:08たりセッターだったり、イナムとか、ま、
- 32:10いろんな関数を作って、ま、クラットだっ
- 32:12たり色々そう操作できます。で、ま、
- 32:17こんな感じのこみたいな感じで、えっと、
- 32:20ヤムロを書いて、ま、どのプラグインを
- 32:22使うとかを定義したりとか、ま、DSN
- 32:24書いたりとか、ま、あとクリエイテッドと
- 32:27アップデッアを削除するみたいなことも
- 32:29できたりします。
- 32:32で、ま、ま、具体で実際に生成すると、ま
- 32:34、例えばこんな感じの方が生成されて、ま
- 32:37、コスぐれのUIは、ま、UIに
- 32:39マッピングされたりとか、ま、塗るとか、
- 32:41ま、こう、イナムも自動生成したりできる
- 32:44ので、
- 32:45ま、こんな感じで結構、ま、ちゃんとD、
- 32:48DBに忠実な方を作ることができます。で
- 32:53、あとセッター、これた、えっと、これ
- 32:55普通の、ま、えっと、ま、セレクトとかし
- 32:59て帰ってくる、ま、方なんですけど、
- 33:01セッターが分離していて、ま、えっとで、
- 33:03しかもこの、ま、工絶するんですけど、
- 33:05オミットとかオミットルとかというとかを
- 33:08使うと、えっと、ま、プットとパッチ、ま
- 33:12、全部一気に更新する、ま、これだけ更新
- 33:15するとかがもうセッターを使うだけで簡単
- 33:17に表現できて、ま、なんかポイントだけで
- 33:19頑張るみたいなことが不要になったりして
- 33:21便利な面があります。
- 33:24ま、具体では、ま、こんな感じで、えっと
- 33:26、ま、オミットとオミットぬる、塗るとの
- 33:28というのがあって、ま、値をセットしたり
- 33:30、ぬるをセットしたり、未セットしたり、
- 33:33ま、ま、セットしなかったりか、セットし
- 33:35なかったりができたりします。
- 33:38で、ま、えっと、ゴルムだとちょっと、ま
- 33:40、こう、車内でもちょっと怖いなみたいな
- 33:43話があったんですけど、ま、こう
- 33:47構造体のこう、あの、ゼロ値例えば
- 33:49ストリング型だと、ま、こうゼロ値は
- 33:51空文字だったりするので、ま、なんか気軽
- 33:54にこう
- 33:56なんかこれだけアップデートしたくて、
- 33:58えっと、ま、で構造体をアップデートに
- 34:00投げると、ま、なんかこう空文字に更新し
- 34:03たいんじゃなくて、そのまま置いとき
- 34:04たかったのに空文字に更新されてしまう
- 34:07みたいなことがあるんですけど、えっと、
- 34:10おミッドを使えば、えっと、ま、そういう
- 34:12のは、ま、こうそもそもセットしてなけれ
- 34:14ばSKに含まれないので、安全に更新とか
- 34:17ができます。
- 34:19で、ま、あとちょっと、ま、こ、個人的に
- 34:22バグにはまってコンビュートした話もあっ
- 34:24て、インサルトの話をちらっとするんです
- 34:26けど、えっと、ま、ポストグレーとかだと
- 34:28、ま、リタイニング区で、ま、インサート
- 34:30した後に値を取ったりできて、ま、こうで
- 34:33も1、こう1ていうメソッドを使うと、ま
- 34:35、値をそのままこう、えっと、インサート
- 34:38した上で値を持たせるんですけど、ま、
- 34:41マイスクールのドライバーだと、えっと、
- 34:44ま、そもそもリターニングがないので、
- 34:46えっと、ま、セレクトも1度実行しててま
- 34:49、そこで、えっと、ま、一応こブでは、
- 34:53えっと、クリエイテッドとか
- 34:54アプレーテッドをミットするみたいなこと
- 34:55もできるんですけど、こうそれが無視して
- 34:57全部アスタリスクで取得してて、こう
- 35:00マッティングのエラーになってたので、
- 35:01こうバグを修正するみたいなことをやっ
- 35:03たりしてコンビュートできて嬉しいなって
- 35:05こともありました。
- 35:08で、ま、そうですね、アップデートは
- 35:09さっき言った通りで、えっと、ま、同的
- 35:11クエとかも、ま、セレクトウェアとか
- 35:13クエリモつとか使って、ま、結構型安全に
- 35:15ちゃんと作れで、ま、柔軟な、えっと、
- 35:19クエリ構築ができます。で、ま、
- 35:22あとワツワ、えっと、こ、ワンツワの、
- 35:25えっと、関係はこうレフトジョインで1回
- 35:28こう取って、で、ま、ワンツメニューの
- 35:31やつは、えっと、別クエリーで、えっと、
- 35:34もう取ってくるみたいな、えっと、柔軟な
- 35:37クエリも発行できます。まあ、こう、Rと
- 35:40かの、えっと、Rというフィールドに、
- 35:43えっと、ま、プロジェクトメンバータスク
- 35:44コメンツみたいな、えっと、方も、ま、
- 35:47あらかじめ自動で生成されてるので、ま、
- 35:49欲しいデータは宣言しておくと取ってくる
- 35:51ことができます。あとSQLCみたいな
- 35:53こともできたり、ま、いろんな嬉しいこと
- 35:55があります。で、ま、データベースSQL
- 35:59を、ま、スクラップしてそのまま使えるの
- 36:01で結構だったりもします。
- 36:05で、ま、あとAXでは、ま、こ、ま、
- 36:08えっと、テナント、えっと、ま、こう
- 36:12マルチェナントの構成なんで、ま、
- 36:13テラントアイデを絶対入れないといけない
- 36:15みたいなことがあって、ま、以前こうよし
- 36:18さんがこう、えっと、ゴルムの、えっと、
- 36:22ま、ゴジ郎レテナントIDのフックを
- 36:24入れるみたいな、えっと、ご知り上げてた
- 36:26こともあるんですけど、ま、そ、こうそれ
- 36:28を、ま、えっと、え、え、ボブでも、ま、
- 36:32フックを簡単に入れることができるので、
- 36:35ま、テランと、ま、えっと、うちの、えっ
- 36:37と、
- 36:39マルチナントサスれもいい感じにこう運用
- 36:42できていい感じになってます。
- 36:46ま、こんな感じで、ま、良いところもあり
- 36:48つつ、ま、まだちょっとこれから検証の何
- 36:50回、ま、大規模テーブルのパフォーマンス
- 36:51だったり、ま、テンプレート周りとかが、
- 36:54ま、ありつつ、ま、重要なのは、ま、安全
- 36:56に価値を最速で届けることだなと思ってる
- 36:58ので、まあ、なんか撤退とかも、ま、こう
- 37:00、こう全然、えっと、ま、バグとかが
- 37:03多かったら、ま、もし多かったら撤退とか
- 37:05そういう選択肢もあるかなとは思いつつ、
- 37:07今頑張ってご検証しつつ導入進めてます。
- 37:10はい。そんな感じで、ま、5のDB
- 37:13アクセスでは、ま、型安全とか柔軟性の
- 37:14どちらか諦めだったりしたんですけど、ま
- 37:16、こう、ま、こうモデルとセッターの分
- 37:18だったり、ま、クエリモドだったり、
- 37:20SQL直書きこうできたり、ま、こう、
- 37:22あの、色々便利に使えて、ま、
- 37:24データベースSQLネイティブでで、まあ
- 37:26、今まさに導入中で、ま、ま、今んとこ
- 37:29結構便利だなと思ってるんで、ま、これ
- 37:31からもなんかいいことがあったら発表でき
- 37:33たらなと思ってます。一応なんか
- 37:36ボブコボブを使ったサンプルアプリみたい
- 37:38なの作ってみたんで、ま、なんかドックス
- 37:39とかも一応入れてみたんで、よかったら
- 37:41参考にしてください。はい、以上です。
- 37:44ありがとうございました。
- 37:54はい、たくさんありがとうございました。
- 37:56えっと、そうですね、結構ゴルムを使って
- 37:58て大変だなと思ってたところとかがこう
- 38:00うまく解決されてるっての結構自分も興味
- 38:02が出ました。で、またこう運用していって
- 38:04なんか試験が溜まったら、え、発表して
- 38:06欲しいなという風に思います。ありがとう
- 38:07ございます。はい。では、そうですね、
- 38:10えっと、これから10分間の休憩に入ろう
- 38:12と思います。えっと、今が19時38分な
- 38:14ので、え、10分後の、え、19時48分
- 38:17頃から、え、再開したいと思います。で、
- 38:19後ろのテーブルの方に、えっと、お飲み物
- 38:21とか、えっと、食べ物もあるので、是非、
- 38:23え、ご順にお取りください。はい、では
- 38:26よろしくお願いします。
- 43:42はい。
- 44:09さ
- 44:30うん
- 44:37。
- 48:11はい、では、えっと、19時48分になっ
- 48:13たので、えっと、次の発表に移りたいと
- 48:15思います。次は、えっと、ターボスさん
- 48:17からの、えっと、発表です。よろしくお
- 48:19願いします。
- 48:23はい、えっと、1.26で解禁されました
- 48:26再期的方制制約についてお話しします。
- 48:29ターボフィって言います。え、配信基盤
- 48:30システムとかを開発してます。はい。えっ
- 48:33と、そろそろソフトウェアデザインの要4
- 48:35月号が出る時期なんですけど、3月号から
- 48:37買っていただくと今話題のレイヤXさんの
- 48:40連載記事が最初から読めます。是非、あの
- 48:42、皆さんお買い求めください。[笑い]
- 48:45はい。え、今日、あの、話すことなんです
- 48:46けれども、えっと、51.26で会禁に
- 48:49なった再期的方制約っていうのがどういう
- 48:52ものでどういう書き方をしているのかって
- 48:54いうのと、ま、あの、ユスケースをまとめ
- 48:56てみようと思います。で、あの、いきなり
- 48:59面積事項なんですけど、正直そんなにユス
- 49:01ケース多いかて言われるとそんなあの、
- 49:03多くはないです。で、あの、えっと、
- 49:06ジェネリクスって結構使ってらっしゃる方
- 49:09、ちょっと今日はもしかしたら多いかも
- 49:10しれないんですけど、一般的に言ってどう
- 49:12やって使うか分からないみたいなことを
- 49:14思ってらっしゃる方も結構多いんじゃない
- 49:16かなと思っていて、ま、今回その辺も意識
- 49:18してできるだけユースケースが分かり
- 49:20やすいようにあの、話したいと思います。
- 49:24はい。で、え、以前からできたことって
- 49:27いう意味では構造体とかインターフェース
- 49:29に型パラメーターを指定することっていう
- 49:31のはできました。この上の構造体の方とか
- 49:35の書き方はすごい今回のあの再期的制約に
- 49:38ちょっと似てはいるんですけれども、
- 49:39コンクリートっていう名前の構造体の中に
- 49:42コンクリートっていうのが別に入っている
- 49:43わけではないので、あの最ではないって
- 49:46いう感じですね。はい。で、今回可能に
- 49:49なった書き方としては、あの、この、え、
- 49:52アダーっていうインターフェースの書き方
- 49:54と、あのの感じなんですけれども、この
- 49:57アダーインターフェースの中にアダー
- 49:59インターフェースっていうのが、あの、
- 50:00制約として入っています。
- 50:03え、ちなみになんですけれども、今
- 50:04おそらくこっちの方が話題なのかなと思う
- 50:07んですけど、あの、レシーバーの定義の方
- 50:09を変えずにそのメソッドを呼び出す時点で
- 50:12そのパラメーターっていうのを指定できる
- 50:14ジェネリックメソドっていうのが今
- 50:15プロポーザルがアクセトになってまして、
- 50:17そろそろ導入される予定となっています。
- 50:20で、これの、え、この書き方なんです
- 50:22けれども、今Pでエニーになってると思う
- 50:24んですけど、この制約はエニーなんだ
- 50:26けれども、このコンパイル時に型情報って
- 50:28いうのは維持されるので、関数内で肩
- 50:31アサーションを使う必要がなくなって便利
- 50:32だねっていう話です。はい。で、今回あの
- 50:36話を戻すと再期的型制約については、え、
- 50:39えっとね、5のジェネリックスの設計のに
- 50:42ついて書かれている論文である
- 50:44フェザーウイトGOの中でも定義されてい
- 50:46ます。で、あの、この論文の中で今回この
- 50:50最適、最適、最期的制約によってこのFU
- 50:54誘拐多数っていうのが実現できるよって
- 50:56いうことは書いてあるんですけれども、
- 50:58ここにざっくりですね、え、ポリフォズム
- 51:00の分類について書いてみました。ここに
- 51:03書いてある図はミーシーではなくって、ま
- 51:05、あの、そうですね、これ以外にも用途
- 51:07っていうのはあるんですけれども、ま、
- 51:08最もメジャーなものを入れげさせて
- 51:11いただいてます。で、この中で
- 51:12パラメトリック多数っていうものがですね
- 51:14、いわゆるジェネリックスなんですけれど
- 51:15も、この右1番右側にある、え、誘拐
- 51:18パラメトリック多少の中のこの右、え、下
- 51:22から2番目がFU誘拐多数になってまして
- 51:24、ま、そこから上のもの、無限、無限
- 51:26パラメトリック多数っていうのところから
- 51:29下っていうのはもうすでに5では実現する
- 51:31ことができません。なので、あの、
- 51:33パラメトリック多少の中のメジャーケース
- 51:35の、え、大半をこれで実装できるように
- 51:38なったっていうことですね。はい。で、
- 51:41リリースノートには片制約がより強力にな
- 51:43るっていうことが書かれてました。で、
- 51:45具体的にどう協力になったのかっていう点
- 51:47なんですけども、そもそもFU回多数って
- 51:50いうのはですね、メソッドが扱う方を
- 51:53レシーバーと同じ方に固定できるように
- 51:56なったっていうことですね。で、これで
- 51:58その型っていうのがその5についてはあの
- 52:01インターフェースもま、型なのであの
- 52:03いろんな解釈があると思うんですけど今回
- 52:05もその愚傷型を固定できるようになっ
- 52:08たっていう話ではありません。
- 52:09あくまでその振る舞いがもそのレシーバーとodッドドの引数しくは立地で使えることがあの使うことができるようになったってことですね。なのでその自己参照的な振る舞いをつっていのを扱えます。ですね、この右側のような感じでけるんですけれどもはい。え、ごめんさい。
- 52:33[笑い]
- 52:35で、右側のような感じで書けるんです
- 52:37けれどもああ。はい。で、えっと、この
- 52:41左側に型セットを使った書き方っていうの
- 52:43を書いてます。で、この2つを、ま、
- 52:45ちょっと比較してみます。全くその用途が
- 52:47違うので、ま、比較するものでもないかも
- 52:49しれないんですけども、ま、何が
- 52:51ありがたいかっていうのをこれ説明してみ
- 52:53ます。で、型セットを使った書き方って
- 52:55いうのは、あの、いわゆるユニオン型
- 52:57みたいな感じで書かれるんですけれども、
- 52:59このナンバーとかだとこう、ま、規定型に
- 53:02とかIN64とかいろんなものを持って
- 53:04いる方になるんですけど、ま、これを扱う
- 53:06ことができるナンバーっていう
- 53:08インターフェースですね。で、これをもう
- 53:10下にあるアルゴっていうファンクションが
- 53:12あると思うんですけど、ここで使うことが
- 53:14できると。で、tはナンバー型なのでx+
- 53:18yっていうプラス演算子が使える、使え
- 53:20ます。なんですけど、ま、この、え、書き
- 53:23方で問題というか、ま、ちょっと扱い
- 53:25づらいなと思うシチュエーションとしては
- 53:27、このイントとかプリミティブ型以外の
- 53:30もの、ま、この状態だとストリングとかも
- 53:32入れられるんですけど、逆に例えば構造体
- 53:35で、え、フィールドの中にこの、えっと、
- 53:38ですね、プラス円子が使えないような
- 53:40フィールドを持っている構造体とかをこの
- 53:42ナンバーインターフェスに入れたいって
- 53:43なった場合に、このナンバー
- 53:45インターフェスの中にもう1つ型を足す
- 53:47必要があるわけですね。で、そうすると
- 53:49このアル5関数の中でこのプラスっていう
- 53:52のが使えないパターンが出てくるわけです
- 53:53ね。そうするとこの、え、アルゴ関数の中
- 53:56で、え、カタサーをしてifフなんとか
- 53:59みたいなこと書かないといけないわけです
- 54:01ね。なんで、ま、そこはちょっとめど
- 54:03くさいと。ただ、え、最期的型制薬を使う
- 54:06とこのアダーっていうインターフェイスを
- 54:08実装してる方を作るだけでこのアルゴって
- 54:11いう関数を全く変えずに、あの、
- 54:13インターフェスも変えずに、え、この、え
- 54:16、最期的型制約を使ってアルゴを使う、
- 54:19アルゴファンクションを使うことができ
- 54:21るってことですね。で、ここであの、ま、
- 54:24特にこの再期的方制約を、え、
- 54:27ライブラリー化したパッケージの中で使う
- 54:29時にこれが特に問題になってくるところで
- 54:31、ま、外部からこのパ、えっと、新しい
- 54:35パッケージを使うってなった時にこの
- 54:38ナンバーインターフェスてのがパッケージ
- 54:39の中にあるとその外部の方っていうのを
- 54:41ここに追加できないんですね。なんでこの
- 54:43アルゴ関数っていうのを外から使うことが
- 54:45外から、え、定義した定義型で使うことが
- 54:48できなくなるっていう点が、え、あります
- 54:50。
- 54:52はい。で、え、後半ちょっとユースケース
- 54:54について説明したいんですけど、他の言語
- 54:57で実際なんか似たような機能
- 55:13で、他の言語の似たような機能を使って
- 55:15どういった実装されてるかっていうのを
- 55:17調べてみたんですけど、ま、大きく分けて
- 55:193種類あるなっていう風に思っています。
- 55:21で、1つ目なんですけど、このフルエント
- 55:23インターフェスっていうですね、
- 55:24マーチィンファルア先生があの、えっと、
- 55:26ブログ書いてやつなんですけど、あの、
- 55:28事故型を返してメソッドチェーンをする
- 55:30パターンですね。これについてはマッツン
- 55:32さんがあの、素晴らしい、え、えっと、
- 55:34サンプルコードを書いたリポジト公開され
- 55:36てたので、そちらから拝借しました。あの
- 55:39、Javascririptとかで、あ、
- 55:40タイプとかでよくあるあの、プロミスの
- 55:43あの、メソッドチェーンの例ですね。なん
- 55:44かプロミス型を入して全々キャッチ
- 55:47アウェイトみたいなことができます。で、
- 55:50次に相互最データ構造の操作なんですけど
- 55:53、ま、例えばグラフのデータ構造になって
- 55:56くるとこのノードとエッジっていうのが
- 55:58あって、このノードはエッジの方を知って
- 56:00て、エッジがノードの方を知ってると、ま
- 56:03、振る舞いですね、方というかを知って
- 56:05いるという、え、構造が書けます。
- 56:08はい。で、3つ目に自分と同じ方としか
- 56:11計算比較できないっていう制約を作ること
- 56:13ができます。これについては、あの、特に
- 56:16Javでは、あの、コンパラブルっていう
- 56:18インターフェースが標準であると思うん
- 56:19ですけれども、これが結構メジャーな例と
- 56:22してあげられるかなと思っていまして、5
- 56:24のコンパラブルの制約って、あの、ま、
- 56:27比較、えっと、イコールかノットイコール
- 56:29かっていうのは比較できるんですけれども
- 56:31、同じ型であるかどうかっていうのは、
- 56:33あの、そこで制約はされていないと思うん
- 56:35ですが、Javのコンパラブルの
- 56:37インターフェイスは、あの、比較対象が
- 56:39同じ方であることを強制しています。で、
- 56:42ま、これを5であの書こうとするとすごく
- 56:45シンプルに書けるよっていう話ですね。
- 56:48はい。で、ま、ちなみにその再期的制約を
- 56:51使わないとどうなるのかっていう話なん
- 56:53ですけれども、今あの、え、元々同じ型
- 56:55同士を比較するApple2Appleで
- 56:57比較できた最型制約だったんですけど、ま
- 57:00、あの、とかにしてしまうと、え、
- 57:02レシーバーをAppleにして、え、引数
- 57:04をオレンジにしても、ま、その比較対象
- 57:07っていうものが、あの、比較が自体はでき
- 57:10てしまうってことですね。ま、あの、ま、
- 57:12見りゃ分かるって話かもしれないんです
- 57:13けど、ま、例えばしてて同じフィールドを
- 57:15持つ別の方っていうのを謝ってその定義と
- 57:18かしてしまっても気づくこと、
- 57:19コンパイラーで気づくことはできないって
- 57:20いう感じです。
- 57:23はい。で、次に、あの、そ、先ほどもお話
- 57:26だったと思うんですけども、あの、え、
- 57:27定義型を使って単位が混ざるのを防ぐって
- 57:30いうパターンですね。ま、ドメイン
- 57:32ロジックでとても重要ですよねって話で、
- 57:34はい。例えば、ま、メートルとあのフィー
- 57:37トっていうのを混ぜて計算しないように
- 57:40しようねっていうようなあの行動を
- 57:41ちょっと書いてみました。はい。ちょっと
- 57:44先ほどお話があったと思うんですけど、ま
- 57:46、こういった例とかではあの、ま、その
- 57:48ポンドとしていた重さをニュートンとあの
- 57:51ごっちゃにしてしまったためにその事故に
- 57:53なったっていう話があるんですけど、ま、
- 57:54そういったのを防ぐためにはい。使えま
- 57:57すっていう話です。はい。で、最後に
- 58:00ちょっと今回一周を読んでてすごく面白い
- 58:02コメントがあったので紹介したいなと思う
- 58:04んですけど、2023年のゴファーコンで
- 58:07グラファナの方があの講演されていた中で
- 58:11なん、そのあのちょうどそのジェネリクス
- 58:14のを使えなかったんでインターフェス諦め
- 58:16ましたみたいな話がありました。
- 58:20で、これが、あ、何をやってるかっていう
- 58:22とですね、このグラファナってなんか、今
- 58:23いろんなプロダクトあると思うんですけど
- 58:25、例えばログとかをこ、ま、いろんなログ
- 58:27ストリームから集めてその1つにマージ
- 58:31するみたいなところで、ま、あの、そう
- 58:34いうプロダクトありますよね。こうDVに
- 58:36ログを貯めていくみたいなで集約的に見る
- 58:38みたいなのがあると思うんですけど、ま、
- 58:40それを実際にそのアルゴリズムを使って
- 58:43実装するってなった時に、ま、この経営
- 58:45マージっていうあの方法でグラファナの、
- 58:49え、方は実装するっていう自社で実装
- 58:51するっていうことをやっていたそうです。
- 58:53で、このKMマージっていうのは何かって
- 58:55言うと、もう相当されているストリーム
- 58:58ですね。この1番右のところから1個ずつ
- 59:00その点頭の、え、濃度を持ってきてこの
- 59:04ヒープの中に入れてそのヒープの中から
- 59:061番小さいのを出してくることによって
- 59:07アウトプットが全部相されたままになる。
- 59:10ま、ま、マージできるっていうそういう
- 59:12アルゴリズムになります。で、これをです
- 59:14ね、このルーザー3っていうデータ構造に
- 59:16持ってるそうです。で、このルーザー3の
- 59:19はトーナメント形式と同じで、この1番下
- 59:22のこう2人が戦ってこの強い方が上に登っ
- 59:25ていくみたいな感じで、こう小さい値が
- 59:28どんどん上に登っていくんですけど、ま、
- 59:30こういったデータ構造を実現するために、
- 59:33え、グラファ穴ではこのような実装をして
- 59:35いたそうです。で、この左側にある
- 59:38釣リーっていう構造体が、あの、ま、気構
- 59:41像ですね。で、この中にそのノ、ノー図っ
- 59:44ていうのがあって、その中にノードが
- 59:46スライスで入ってるんですけど、この
- 59:48ノードの、え、濃度同士の値を比較する、
- 59:51そのどっちが勝ってるかっていうのを決定
- 59:53する関数っていうのがこの、え、
- 59:55釣リーストラクトの中のレスっていう、え
- 59:58、フィールドに関数として入っています。
- 1:00:00これはあの、ま、右側にあるように3.
- 1:00:04みたいな形でこの濃動を比較を2つ引数に
- 1:00:09入れて使うんですけれども、このノード
- 1:00:12コンペド.ド.みたいなできなかったの
- 1:00:14かっていう話で、で、これが、ま、その
- 1:00:17再期的片制約を使えなかったので、今回
- 1:00:19実現できなかったっていう講演です。で、
- 1:00:22ま、これ実際にちょっとやってみました。
- 1:00:25で、左側が現状の実装で、右側があの実際
- 1:00:29に再期的制約を使ったことによってこう
- 1:00:32いう風に変わるっていう実装なんです
- 1:00:33けれども、この3の下にVALUっていう
- 1:00:37インターフェースを新しく、え、実装して
- 1:00:39います。このVALUっていうのが濃度が
- 1:00:41持っている値ですね。その比較対象となる
- 1:00:43値を表していて、これがレスっていう関数
- 1:00:47を実装することによって、そのノードレ、
- 1:00:51え、かこノードっていう風な書き方をする
- 1:00:53ことができます。
- 1:00:55で、このvalリューに対してなんで
- 1:00:58インターフェースを使うのがいいのかって
- 1:00:59言うと、ま、このグラファの場合ですね、
- 1:01:02その濃度投資を比較するキーっていうのが
- 1:01:04複数ありました。で、さっき言ってた
- 1:01:06プロメテウスごめんなさい。さっきのロキ
- 1:01:08ですね。で、プロメテウスの場合は、ま、
- 1:01:10シリーズ参照番号でロキ、そのログの場合
- 1:01:12はタイムスタンプとラベルのモジレスで
- 1:01:15パイロスコープですね、プロファイラーの
- 1:01:16、え、サービスだと思うんですけど、この
- 1:01:18パイロスコープとかとタイムスタンプを
- 1:01:20比較することによってその相当の順番を
- 1:01:22決めています。で、このようなあの比較
- 1:01:25する値が違うので、それを的に扱うために
- 1:01:28、ま、インターフェスで、え、大使う必要
- 1:01:30があったってことですね。で、さらにこの
- 1:01:32、これらのその比較をするルーザー
- 1:01:34ツリーっていうあのツールをその
- 1:01:36パッケージとして、その汎用的な
- 1:01:38パッケージとして作成していたので、今回
- 1:01:40のケースが当てはまるよねっていう話が
- 1:01:42その一緒に書かれていました。
- 1:01:45はい。え、今回ですね、再期的方制約のお
- 1:01:47話させていただきました。正直あの、ま、
- 1:01:50パラメトリックタスめっちゃできるように
- 1:01:51なったやんって話なんですけど、ま、正直
- 1:01:53あのライブラリーのその、ま、実装には
- 1:01:56すごく便利で、ま、他の言語では一般的に
- 1:01:58使われてはいるんですけれども、普通の
- 1:02:00アプリ開発をしてるとあんまり使うことは
- 1:02:02ないかもしれません。はい。ま、あの、
- 1:02:04インターフェイスは中小っていう文脈だっ
- 1:02:06て、ジェネリックスは安全の表現力って
- 1:02:08いうのが武器なので、ま、ライブラリーを
- 1:02:09作る時が1番輝くっていうのは、ま、そう
- 1:02:11だよねっていう感じです。はい。ただ
- 1:02:14振る舞いを共通化したくって、ま、加えて
- 1:02:16そのレシーバーと共通する方情報っていう
- 1:02:18のを引数とか率で使いたい、そういう再期
- 1:02:20的なデータ構造とか使いたいと思ったら
- 1:02:23使ってみると良さそうだなっていう風に
- 1:02:24思っています。以上になります。
- 1:02:26ありがとうございました。
- 1:02:34タフさん、ありがとうございました。と、
- 1:02:37そうですね、えっと、こう例とか、えっと
- 1:02:39、タオさんの、えっと、解説がすごい
- 1:02:41分かりやすくて、え、びっくりしました。
- 1:02:43で、あとこうそうですね、そのまとめでも
- 1:02:45触れられていたと思うんですけど、あの
- 1:02:48ライブラリー開発でのその再期的方制薬は
- 1:02:51結構使えるところがあるのかなという風に
- 1:02:53思ったので、是非、えっと、自分も使える
- 1:02:55ところがあったら使ってみたいなという風
- 1:02:56に思いました。はい、
- 1:02:59ありがとうございます。
- 1:03:06はい。え、では次は、え、ゴシさんからの
- 1:03:09発表となります。
- 1:03:29はい、オッケーです。はい、えっと、じゃあ
- 1:03:335
- 1:03:33におけるインナーソースモデル構築への道乗りというタイトルで、え、
- 1:03:385
- 1:03:38が発表させていただきます。よろしくお願いします。
- 1:03:42あ、ありがとうございます。
- 1:03:46え、簡単に自己紹介しますと、ま、この
- 1:03:48GOCYという読みにくいスペルでゴシと
- 1:03:50いう、え、呼び方で活動しております。で
- 1:03:53、オープンソースの開発が趣味で、ま、
- 1:03:55長いことを、え、開発しておりますと。で
- 1:03:58、今日、え、は、えっと、珍しく技術的な
- 1:04:01、え、ゴリゴリの話ではなくて、えっと、
- 1:04:04コードのサンプルとかは1回も出てこない
- 1:04:07んですけど、ちょっと最後までお付き合い
- 1:04:08いただければなと思います。
- 1:04:12はい。頭の中でポーンという音を鳴らし
- 1:04:14ながらちょっと読んでいただきたいんです
- 1:04:16けど、え、あなたの会社は車内のOSS
- 1:04:19開発者に、え、ちゃんと報いていますかと
- 1:04:22いう、え、感じからこんな感じでいきます
- 1:04:25。今日は始まるんですけど。はい。え、
- 1:04:29多くの企業はオープンソースに支えられて
- 1:04:31いると思いますと。ま、でも、ま、自社の
- 1:04:34製品が、ま、どのオープンソースにどれ
- 1:04:36だけ依存しているか正しく把握できてい
- 1:04:39ますかと。え、自社が利用している
- 1:04:41オープンソースに貢献している車内の
- 1:04:42エンジニアを把握できていますかと。で、
- 1:04:45それらのエンジニアに報いる車内制度は
- 1:04:47ありますか?みたいなことを、ま、通って
- 1:04:49いきたいわけです。
- 1:04:52じゃあ、ま、オープンソースは、ま、置い
- 1:04:53ておいて、ま、車内のライブラリーの
- 1:04:56向き合い方ってどうですかと。で、車内で
- 1:04:58例えば横断的に利用されるような内の
- 1:05:01ライブラリーやフレームワークってよく、
- 1:05:03ま、どこの会社も作られてるかなとは思う
- 1:05:05んですけど、ま、そういうものに貢献して
- 1:05:07いる人正しく評価できていますかと。
- 1:05:10例えば今AIの対当でエンジニアのヘッド
- 1:05:12カウントを制限するみたいな話が多いです
- 1:05:14けど、ま、これらの内政ソフトウェアの
- 1:05:16開発に貢献するエンジニアに、ま、適切に
- 1:05:19リソースを、え、割り当てられていますか
- 1:05:21と、まさかボランティアでの開発に期待し
- 1:05:24ていませんかみたいな話です。
- 1:05:29で、このボランティア精神へ期待すること
- 1:05:32って、ま、ちょっと、えっと、ま、謝ちか
- 1:05:35なとここには書いてるんですけど、ま、
- 1:05:37その困ってる人が直してくれるとか、ま、
- 1:05:40すごい人が直してくれるとか、ま、思っ
- 1:05:42ちゃいがちなんですけど、ま、そういう
- 1:05:44ものに期待するのは、ま、やめた方がいい
- 1:05:46ですよねって、ま、みんな分かってるん
- 1:05:47ですけど、まあ、なかなかできてないん
- 1:05:49じゃないかなと思っちゃいますと。で、
- 1:05:53組織として、ま、誠実に評価する姿勢を、
- 1:05:55ま、示すことが大事だなとは個人的に思っ
- 1:05:58ていて、ま、こ、ここでいううその貢献
- 1:06:01っていうものを定量的に評価する仕組みを
- 1:06:03用意したりとか、ま、定期的に賞賛したり
- 1:06:06外部にアピアピールしたりする仕組みが、
- 1:06:08ま、必要なんじゃないかと。で、これやっ
- 1:06:11て貢献を評価やにつなげる文化が、え、
- 1:06:14必要なんじゃないかなと思ってます。
- 1:06:18で、ま、こういった文化が育てば、ま、
- 1:06:20貢献しやすくなっていくんじゃないかとな
- 1:06:22と考えていて、え、ま、その貢献する方の
- 1:06:26モチベーションも、ま、その土台があれば
- 1:06:29上がっていくのではないかと。で、
- 1:06:31インナーソースモデルっていうのはそう
- 1:06:33いう土台があってこそ成り立つと思ってい
- 1:06:35て、ま、ここでインナーソースモデルって
- 1:06:37ものについて簡単に触れると、ま、
- 1:06:39オープンソースの開発手法みたいなものを
- 1:06:41、ま、内政のソフトウェアに対して適用
- 1:06:43するような試みであって、ま、さっき言っ
- 1:06:45た車内のライブラリーとかフレームワーク
- 1:06:47みたいなものに、ま、オープンソースの
- 1:06:49ようなオープンな開発手法でこう車内の中
- 1:06:52で、え、特定の人にこうこだわって開発
- 1:06:55するんじゃなくて、ま、車内のその人的
- 1:06:57リソースをいい感じにそういう内の
- 1:06:59ソフトウェアに、えで配分して開発して
- 1:07:01いきましょうと。ま、みんなでいろんな
- 1:07:04その車内の大切なものを作っていき
- 1:07:06ましょうみたいな考え方ですね。
- 1:07:10じゃあ、じゃあどうやって貢献を定量的に
- 1:07:13評価するのかというのが気になると思い
- 1:07:15ます。で、是非ここからはその皆さんの中
- 1:07:18で、ま、この貢献ってものを定量的にどう
- 1:07:21やって評価するのか、ま、自分なりに
- 1:07:22ちょっと考えながら聞いていただければな
- 1:07:24と思うんですけど、ま、自分はこう考え
- 1:07:27ましたというのを話していきます。えっと
- 1:07:30、今回、ま、5の話なんですけど、ま、5
- 1:07:33に、え、まず限定して評価する仕組みを
- 1:07:36考えましたと。で、まず、え、
- 1:07:39リポジトリーのMODを全部調べて、で、
- 1:07:42依存ライブラリーを、え、抽出しますと。
- 1:07:45例えばGOModグラフみたいなコマンド
- 1:07:47使うと、えっと、どのモジュールがどの
- 1:07:49モジュールに依存してるか全部分かるん
- 1:07:51ですけど、で、こういうのを使って、ま、
- 1:07:54依存されているライブラリーの方が重要だ
- 1:07:56と考えてスコア付けしますと。え、ま、
- 1:07:59そのライブラリーが成り立つためには、ま
- 1:08:02、依存してるこのライブラリーが必要って
- 1:08:03ことなので、ま、元を辿っていけば、え、
- 1:08:06さ、あの、ずっとその依存回層が、ま、
- 1:08:09深い方が、ま、重要だと考えられるので、
- 1:08:12ま、そのままその数を加点していくという
- 1:08:15方式を取ろうと。で、これら12番を車内
- 1:08:19で管理してる全てのリポジトリーに対して
- 1:08:21操作、反操作していって、ま、モジュール
- 1:08:23ごとのスコアを出しましょうと。例えば
- 1:08:25このゴーラオンオルグXスみたいな
- 1:08:27モジュールだったら、え、Aの
- 1:08:29リポジトリーが10点、Bのリポジトリー
- 1:08:31が20点だったら30点みたいにけると。
- 1:08:34で、この後に、ま、そのモジュールに対応
- 1:08:37するリポジトリー、ホストしてる
- 1:08:38リポジトリーを、え、見つけますと。この
- 1:08:41シスっていうリポジトリーは、ま、この、
- 1:08:44え、リンクで、このリポジトリーで管理さ
- 1:08:46れてるので、ま、こういうものを、ま、
- 1:08:48マップして、ま、保存しておくと。で、
- 1:08:51また別に、ま、リポジトリーに対する、え
- 1:08:54、PRが回りされた数にこのリポジトリー
- 1:08:58ごとに、ま、ついているスコアっていうの
- 1:09:00を掛け算してあげて、おお
- 1:09:03、おお
- 1:09:06。
- 1:09:08あ、はいはい。掛け算してあげると、ま、
- 1:09:12そのスコアっていうものが貢献者に対して
- 1:09:15、ま、付与できるかなと思いますと。で、
- 1:09:18適当な期間を区切って、ま、その間に回り
- 1:09:21されたプルリクエストの、ま、数とか種類
- 1:09:23から、ま、開発者ごとのスコアっていうの
- 1:09:25が算出できるんじゃないかと。で、開発者
- 1:09:28ごとのスコアがあの区切った期間で、え、
- 1:09:32計算できたらじゃあそれを相とすれば、え
- 1:09:35、貢献が大きかった開発者を消賛するなど
- 1:09:38に使えるんじゃないかと考えましたと。
- 1:09:43で、ここで、え、作ったのがこう、5
- 1:09:45MODランクというツールなんですけど、
- 1:09:47ま、この、5モジュールごとに、ま、
- 1:09:49スコアを計算したりとか、ま、ホストされ
- 1:09:51てるリポジトリを見つけてDBに保存して
- 1:09:54くれるっていうツールです。で、1個前の
- 1:09:56ページの4番までこのモジュールに対応
- 1:10:01するリポジトリーを見つけ
- 1:10:02るっていうところまでを担当してくれる
- 1:10:05ツールですと。え、データベースの
- 1:10:07デフォルトはSQなんですけど、ま、
- 1:10:10ライブラリーとしてこれ使うことができて
- 1:10:12、え、ライブラリーとして使う時は、ま、
- 1:10:142位のデータベースに、え、保存する処理
- 1:10:16だけコールバックさせる仕組みがあるので
- 1:10:18、まあ、何でも保存できるんですけど、ま
- 1:10:22、うちの会社では、ま、これを、ま、
- 1:10:24スパナーに保存していって、で、依存して
- 1:10:26いる、ま、モジュールをランキング形式に
- 1:10:28して一覧できるサービスを作ったりしてい
- 1:10:30ます。
- 1:10:34で、ま、ここまで聞いてなんか単純そうだ
- 1:10:36なと思うんですけど、ま、ここから
- 1:10:38ちょっと技術的な話に入ります。で、意外
- 1:10:41と実際はちょっと作ろうとすると大変で、
- 1:10:44ま、リポジトリースキャンってご存知の通
- 1:10:46思いなので、ま、オーガナイゼーションに
- 1:10:49、ま、数とかリポチ取りがあると、ま、
- 1:10:52結構大変なことが多いですと。例えば、ま
- 1:10:55、全部クロンして調べますかと、え、時間
- 1:10:58かかりすぎませんかみたいな話があったり
- 1:11:00、ま、豪とは関係のないリポジトリーって
- 1:11:02のも当然あると思うので、ま、そういうの
- 1:11:04もクローンして調べるんですかって話にも
- 1:11:06ありますと。で、まあ、平行処理できるん
- 1:11:10だったらそれも考慮しないと、え、CPU
- 1:11:13使いきれないだろうしどうしましょうって
- 1:11:14話もあるし、その長いスキャンって長い
- 1:11:17処理なので、ま、リポジット率全部に対し
- 1:11:20てやってったら、ま、途中でなんか失敗し
- 1:11:23ちゃったりとかすることもあると思います
- 1:11:24と。で、そういう時に、ま、途中から始め
- 1:11:27られなかったら困ると思うんで、どうし
- 1:11:29ますかと。で、あとはそのギitubの
- 1:11:32APIっていうのを結構多様すると思うん
- 1:11:34ですけど、ま、数千数万とかになってき
- 1:11:36たらレートリミット大丈夫ですかみたいな
- 1:11:38話もあります。で、これをどうやって解決
- 1:11:41してますかって話をちょっと次にしたいと
- 1:11:43思うんですけど、
- 1:11:45はい。なんかいくつかカテゴリーに分けて
- 1:11:48、えっと、話します。
- 1:11:51で、まずリポジトリーのクローンの最適化
- 1:11:53なんですけど、ま、GitubAPIに
- 1:11:55よる事前フィルタリングっていうのやって
- 1:11:57て、ま、全部そのクローンしちゃうと、
- 1:11:59あの、時間の無駄なので、ま、クロー前に
- 1:12:03GitッハubAPIでそのオルグに存在
- 1:12:05してる全リポジトリーに対して、え、
- 1:12:07リポジトリーがアーカイブ積みかとか
- 1:12:09MODが存在するのかっていうのを事前に
- 1:12:11チェックしてますと。で、不要なクローン
- 1:12:13をスキップして、あの、必要なものだけ
- 1:12:15クローンしてますと。で、ここで問題に
- 1:12:17なるのがキットハubブレートリミットで
- 1:12:19、こういうAPIをそのままレストで使っ
- 1:12:21てるとあっという間にレートリミットに
- 1:12:22足しちゃうので、じゃどうやって工夫し
- 1:12:24ますかって話があって、え、中得代償の
- 1:12:27リポジトリを100件ずつぐらいに
- 1:12:29ジャンクに分割して、ま、グラフQL
- 1:12:31APIを使うことで、ま、コストを低く
- 1:12:33抑えて、あの、できますと。で、グラフQ
- 1:12:37を使う場合は、ま、ネストを少なくすると
- 1:12:40コストがめちゃくちゃ軽くなるので、数
- 1:12:42リポジトリーあっても全然大丈夫ですと。
- 1:12:47で、次にあの復帰処理なんですけど、ま、
- 1:12:49リポジトリーを解析するために、ま、その
- 1:12:52、え、リポジトリーのステータスっていう
- 1:12:53のを逐時データベースに保存してますと、
- 1:12:56その解析したリポジトリのヘッドコミット
- 1:12:58ハとか、ま、アーカイブされてるかどうか
- 1:13:00とか、GOMODがあるかどうかみたいな
- 1:13:01の保存してて、で、次回スキャンする時に
- 1:13:04、え、その最初にGitッハブAPIで
- 1:13:07リポチトリーのステータスを取ってるので
- 1:13:08、ま、その取った時のヘッドコミット
- 1:13:10ハッシュと保存してるコミットハッシュが
- 1:13:12一緒だったら、ま、保存したってことで
- 1:13:14スキップして次に行けるとで再開できま
- 1:13:17すっていう話です。
- 1:13:20で、リソースの最適化だと、えっと、
- 1:13:22スキャン済みの、え、状態を先ほど説明し
- 1:13:25た通りデータベースに保存しているので、
- 1:13:27ま、クロンしたリポジトリーっていうのは
- 1:13:29、え、ま、そのステータスを保存して、ま
- 1:13:31、解析したらすぐに削除することができる
- 1:13:33ので、ま、数リポジトリーディスクに、え
- 1:13:36、置いてあるみたいなことは、え、ない
- 1:13:38ですと。で、CPUを使いきれるように、
- 1:13:41ま、平行も行いましょう。ま、この辺は5
- 1:13:43が得意なところなので特別なことはないん
- 1:13:45ですけど、ま、ワーカーベースに平行
- 1:13:47スキャンサポートしたり、ま、GOMOD
- 1:13:49が1リポジトリに複数ある場合もあると
- 1:13:52思うんで、ま、そういう時は平行に
- 1:13:53スキャンしますと。
- 1:13:56で、意外と大変なのがモジュールのホスト
- 1:13:59リボジトリーの取得方法で、え、実は
- 1:14:02ちょっと難しくて、その最初いくつかこの
- 1:14:063リステップを使って上から順番に、え、
- 1:14:09リポジトリーのホストが、え、取れるか
- 1:14:11どうかやってたりしますと。で、最初は
- 1:14:13その5モジュールプロキシから取得仕様と
- 1:14:16して、え、ま、アクセスするんですけど、
- 1:14:20ま、当然その車内のライブラリーとかは
- 1:14:22ここにないし、ま、色々取れないことも
- 1:14:25ありますと。ま、ここから取れる時は
- 1:14:28レスポンスのにあるオリジンURLって
- 1:14:30いうのが取れるので、それでいいんです
- 1:14:31けど、ま、このGOパッケージインとかに
- 1:14:34、え、でホストされている時はちょっと
- 1:14:36困っていて、え、この場合は、あの、特別
- 1:14:39なんですけど、そのネーミングの規則が
- 1:14:41あるので、実はこういう感じでマップする
- 1:14:44と、あの、ホストリポチ取りが取れますと
- 1:14:46。で、最終的には、ま、これでも対応でき
- 1:14:49ない場合はこのインポートメタタグを見る
- 1:14:51ことによって、え、分かるので、ま、
- 1:14:53こんなことをして調べて保存してます。
- 1:14:57で、最後なんですけど、ま、インナー
- 1:14:59ソースモデルを構築するためには、ま、
- 1:15:01貢献が適切に評価される文化が必要だと
- 1:15:05自分個人的には考えてますと。で、5に
- 1:15:07おける会社にとって重要なソフトウェアの
- 1:15:10への貢献っていうものを定量的に評価する
- 1:15:12仕組みを考えてオープンソースとして提供
- 1:15:14しました。で、ゴモドランクで工夫した点
- 1:15:17についていくつか紹介させていただきまし
- 1:15:19た。
- 1:15:20じゃあ、最後にその同じ仕組みは実はそのパッケージソンとかで、ま、他の言語当てにも同じようにできるはずなので、ま、誰か作ってみませんかというところで閉めたいと思います。ありがとうございました。
- 1:15:41ありがとうございました。いや、すごいいい話でしたね。
- 1:15:45で、結構こう直接的な依存とかだとこう、
- 1:15:48ま、訂正的にも評価できると思うんです
- 1:15:50けど、そっからの先のこう水依存とかだと
- 1:15:52、ま、全然見えなくなっちゃったりとかも
- 1:15:54すると思うので、すごいそこはいい
- 1:15:56取り組みだなという風に思いました。はい
- 1:15:58、ありがとうございました。
- 1:16:03はい、では、えっと、こちらの方で、えっ
- 1:16:05と、発表、発表は、え、以上となります。
- 1:16:18はい。え、で、え、ちょっと時間が押し
- 1:16:21ちゃってはいるんですけども、えっと、
- 1:16:22これからちょっとアンケートのご回答にご
- 1:16:24協力をお願いいたします。で、その後に、
- 1:16:26えっと、オフライン参加者の、え、
- 1:16:28オフィスに来られている、え、皆様は、
- 1:16:30えっと、懇新会も設けておりますので、
- 1:16:31是非お楽しみください。はい。で、えっと
- 1:16:34、オンライン側の方に関しましては、えっ
- 1:16:35と、こちらの方で以上となります。と、
- 1:16:37本日はご参加いただきありがとうござい
- 1:16:39ました。
- 1:16:43で、アンケートはこちらになっているので是非ご回答よろしくお願いします。
- 1:16:55マジですか?少しお待ちください。
- 1:18:34はい。えっと、今アンケートの方が、え、
- 1:18:36見れるようになったということなので、
- 1:18:38是非、えっと、まだご回答されてない方は
- 1:18:40よろしくお願いいたします。はい、では、
- 1:18:44えっと、オフラインの方の、えっと、方は
- 1:18:45、え、以上になります。え、ご参加
- 1:18:47いただきありがとうございました。
About this transcript
This page contains the full transcript of layerx.go #4 by LayerX 公式, generated from the public captions YouTube serves with the video. The transcript has 1,510 words across 1,510 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.
What you can do with it
Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.
Free YouTube transcript tool
YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.