YouTube2Text

layerx.go #4 — Transcript

by LayerX 公式 · 1,510 words · 1,510 segments · language ja · Watch on YouTube

Full transcript

  1. 0:50あ、あ、
  2. 0:52こんにちは。
  3. 0:5619時になったので、えっと、レx.
  4. 0:58GOの、え、第4
  5. 0:59回を始めていきたいと思います。よろしくお願いします。ありがとうございます。はい。えっと、ちょっとそうですね、今回自分が、えっと、主催しているので自己紹介させてください。えっと、自分の名前は、えっと、北太郎と言います。えっと、レア
  6. 1:16X
  7. 1:16の楽落申請視生産といったところで、えっと、エンジニアをしております。で、なの準ライブラリーは、え、
  8. 1:22IOです。で、あと最近、え、丸の地点を
  9. 1:25歩いて1周しました。
  10. 1:27はい。で、ちょっと会社の紹介だけ軽くさ
  11. 1:30せてください。はい。えっと、レアXでは
  12. 1:32、えっと、全ての経済活動をデジタル化
  13. 1:34するOミッションに、えっと、AIサース
  14. 1:37事業と、え、AIDX事業を展開しており
  15. 1:39ます。ま、えっと、3つの、え、事業合計
  16. 1:42展開しているような形になっています。
  17. 1:44はい。で、えっと、レア、lay.5に
  18. 1:47ついてですね。で、えっと、なぜ
  19. 1:49layerX.5を始めたのかっていうと
  20. 1:51、えっと、レayXのこうの地見、え、
  21. 1:54結構合がいるんですけど、え、その後の
  22. 1:56地見を、えっと、実践的なこう活用事例を
  23. 1:58共有するだけではなくて、ま、社外の方
  24. 2:00からの地見もこう積極的に取りればにし
  25. 2:02たいなという風に考えています。また、
  26. 2:05えっと、レアXの行動資信には得という
  27. 2:07ものがあるんですけど、こちらの特の観点
  28. 2:09からイベントを継続的に開催することで、
  29. 2:12え、後の、え、合言語のを広げていきたい
  30. 2:14という風に考えております。
  31. 2:17はい。で、えっと、今回の、え、Xの
  32. 2:19ハッシュタグは、え、SharレayX
  33. 2:21GOなので、是非、え、どんどんポストし
  34. 2:24てください。はい。え、今回のタイム
  35. 2:27テーブルはこのような形になっています。
  36. 2:29え、すごいたくさん発表していただけて、
  37. 2:32え、どれも、えっと、非常に面白い内容に
  38. 2:33なってるかなという風に思うので、ご期待
  39. 2:35ください。はい、では、えっと、レゴ、え
  40. 2:38、第4回始まります。よろしくお願いし
  41. 2:40ます。
  42. 2:44では、1番最初はレロさんからの発表と
  43. 2:46なります。
  44. 3:05はい。え、よろしくお願いします。
  45. 3:07初めまして。え、レロレロと言います。
  46. 3:11今日はゴルチンリークプロファイラーに
  47. 3:12ついてお話ししたいです。
  48. 3:16え、IDレレレロと言います。レアX入社
  49. 3:18したのは去年の9月でまだ半年ぐらいなん
  50. 3:21ですけども、北太郎さんと同じ、え、申請
  51. 3:23K生産で開発エンジニアになっております
  52. 3:26。で、今回51.26で入ったゴルーチン
  53. 3:30リークプロファイラーについて、え、ま、
  54. 3:33ゴルーチンリークて言うとあれですね、
  55. 3:36ゴルーチンが使われなくなったゴルーチン
  56. 3:38が、ま、メモリとかを食いつぶしてこう
  57. 3:40どんどん増えてくと大変なことにな
  58. 3:42るっていうようななんですけども、例えば
  59. 3:44Ubberの例では、あの、1つのイン
  60. 3:47スタンスで、あの、利ク修正前に
  61. 3:4943.5GBもこのゴルチンリクによって
  62. 3:52、え、使われてると利クを修正すると
  63. 3:553GBなんで92%も削現とこれの厄介な
  64. 3:59ところは、ま、あの、Webブサービス
  65. 4:00なんかですとデプロイの度にこうリセット
  66. 4:02されて気づきにくいんで、知らないうちに
  67. 4:04このゴルウチンリークによってコストが
  68. 4:06どんどん重んでいくみたいなリスクがある
  69. 4:09かなと思います。で、この厄介なゴルチン
  70. 4:11リークですが、従来の手法だと、例えば
  71. 4:15ゴルチンの数とかそのある時点での
  72. 4:18ゴルチンのスナップショットを見て、ま、
  73. 4:20なんか前後を比較してヒュリスティックに
  74. 4:22判定するみたいな方法か、ま、あるいは
  75. 4:24テスト時にこの5リークっていう
  76. 4:26ライブラリー使うと、ま、ツール使うと
  77. 4:28テストでは、ま、リークは検出できるん
  78. 4:30ですけども、その本番で実際に起きてる
  79. 4:33リークを確実に検出するっていう方法が、
  80. 4:35ま、なかったんですが、今回のこの
  81. 4:385.11、1.26のゴルチンリク
  82. 4:40プロファイラーでは、ま、本番環境で実際
  83. 4:43に起きている陸を確実に検出できると。で
  84. 4:47、え、ま、さらにこのフォルスポジティブ
  85. 4:49がない。実際に検出されたものはその本当
  86. 4:53のリークであると、ま、検出されない
  87. 4:55ケースもあるんですけども、検出された
  88. 4:56ものは確実にリークであるから安全にこう
  89. 4:59対処できるていうのと、ま、どこでリーク
  90. 5:01がてるかっていうのも分かりますと。これ
  91. 5:03素晴らしいなと思うんですけども、実際
  92. 5:06これどうやってそういう仕組みを、え、
  93. 5:08実装してるかというと、そのガベージ
  94. 5:10コレクションの仕組みに乗っかっている
  95. 5:12ですね。で、通常のガベージコレクショ
  96. 5:14ンっていうのはその使りないオブジェクト
  97. 5:15を見つけるために、あの、全てのルーチン
  98. 5:18のスタックからこう使っているポイン
  99. 5:20ターってのマークして巡っていって、え、
  100. 5:23残っているその使オブジェクトを、ま、
  101. 5:26片付けるみたいな感じなんですけども、
  102. 5:28ゴルチンリックプロファイラーも同じよう
  103. 5:30に、あの、実行されている、ま、ゴルチン
  104. 5:34から、えっと、ま、マーキングしていて、
  105. 5:39で、使われていない同期プリミテ、ま、
  106. 5:41チャンネルです。チャンネルとかを見つけ
  107. 5:43て、その使われていないチャンネルを、え
  108. 5:45、受信待ちとか送信待ちしている、
  109. 5:48ブロックしているゴルチンをリークと
  110. 5:50見なして、え、いるという感じです。で、
  111. 5:54これで確実に、え、ゴルチン力を
  112. 5:57見つけ出してるという仕組になってます。
  113. 5:59実際に、ま、コードでしますと、ここに
  114. 6:02簡単なそのゴルシンリークを再現する
  115. 6:04コードがあるんですけど、ま、ローカルで
  116. 6:06作ったチャンネルに対して、え、ゴルチン
  117. 6:09、新しいゴルチンの中でそれに送信すると
  118. 6:1242点を送信して、ま、これ受信する
  119. 6:15ところがないんで当然ブロックされて、え
  120. 6:18、しまいますと。で、ま、ここではその
  121. 6:21新しく潰ちンがブロックして
  122. 6:23ウェイティングの状態になっていて、この
  123. 6:25構図リークが抜けてしまうと、ま、上の
  124. 6:29このチャンネルはもうなくなっちゃうんで
  125. 6:30、もう使われなくなったチャンネルを
  126. 6:33ずっと待って、待ってるゴルチンっていう
  127. 6:35風に判断されて、これはゴルチンリクと
  128. 6:37ディテクトされます。はい。
  129. 6:42で、カベジコレクションなので、ま、その
  130. 6:46実行するコストというかもほぼガレージ
  131. 6:48コレクションと同じになると。で、5の
  132. 6:51ガレージコレクション非常に軽量に
  133. 6:53デザインされてまして、しかもその何もし
  134. 6:55てなくても2分に1回強制的に走るような
  135. 6:57ものなので、ま、利クの件数であれば別に
  136. 7:0010分とか1時間とか1回動かすのでも
  137. 7:03十分検数できるので、あの、本番環境でも
  138. 7:06安全に動かせるのかなと思います。
  139. 7:10で、実際あの自分たちの開発でもちょっと
  140. 7:13使ってみようと思いまして、え、ま、まず
  141. 7:16使、使い方からですね、あの、ま、
  142. 7:191.26の時点ではエクスペリメント
  143. 7:21フラグでビルドが必要なんですけども、
  144. 7:23イリースノートにはもう
  145. 7:24インプレメンテーションにその
  146. 7:25プロダクションレジット示されてるので、
  147. 7:27ま、本番でも使えますよと一応立ってい
  148. 7:30ます。で、1.2ではデフォルトで有効に
  149. 7:32なると。デビルドしたら、え、ゴルーチン
  150. 7:36リークのプロフでライト2を実行すると
  151. 7:39さっきのGCと同じようなフローが走って
  152. 7:42プロバイリングで減ってます。
  153. 7:46で、え、実際にそのマスキルを使ってる
  154. 7:50サーバーアプリケーションがあるんです
  155. 7:51けども、この開発環境に入れてやってみる
  156. 7:55となんと早速検数できたんですね。よく
  157. 7:59見るとそのデータベースすらSQL
  158. 8:02コネクションオープナーみたいなところで
  159. 8:05リクが起きてますよっていう風に言われて
  160. 8:07、ま、自分の行動じゃないんでなんかよく
  161. 8:09わからんなってなって色々調べたんですが
  162. 8:11、ま、先に結果だけ言いますと、その起動
  163. 8:15時に、え、スキーママイグレーションあっ
  164. 8:17てるんですね。そのファイル、スキーマ
  165. 8:19マイグレーションファイル読んでスキーマ
  166. 8:21変更あったら適用するみたいな。で、そこ
  167. 8:23のデビー接続のクローズを忘れて
  168. 8:26るっていう問題が、あ、これを引き起こし
  169. 8:28ているようだと。で、え、実際にその、ま
  170. 8:33、これ再現させるための最小コード書って
  171. 8:36みて試しなんですけども、よくあるその、
  172. 8:40え、データベースを使うようなウェブ
  173. 8:43サービスの例ですと、ま、メイン関数の中
  174. 8:46で1番最初にシグナルを受け取ります。
  175. 8:49シグナルの、え、コンテストを作って、で
  176. 8:53、なんかデータベース接続する。ここの
  177. 8:56デビ接続作りマイグレーション実行って
  178. 8:59ことですね。デビインスタンスを作って
  179. 9:01なんかマイグレーションしてで終わったら
  180. 9:04えっとサーバーをリスンするような、ま、
  181. 9:07ここdomeanンって書いてますけどな
  182. 9:09、なんか1番メインなところをやるとで、
  183. 9:12え、コンテキストでシグナルを受け取っ
  184. 9:14たら終了しますみたいな感じになりますね
  185. 9:17。で、ここで、ま、さっき言った通りこの
  186. 9:20デビっていう変数があるんですけど、
  187. 9:23こいつクローズし忘れてるんですね。
  188. 9:26ま、なんでこれ最後にデビクローズやれば
  189. 9:28、え、実際もう1回リクスすると検出し
  190. 9:32なくなったと。で、めでたし、メでたしか
  191. 9:35なと思ったんですけど、ま、こ色々触っ
  192. 9:37てると別にこれクローズしなくても検出し
  193. 9:41なくなるんですね。ま、そもそもこの
  194. 9:44ゴルチンリクプロファイルを動かせるのっ
  195. 9:46てこの弾を待つ1個上のメインの中でやっ
  196. 9:50てるんですね。だから、ま、この段の後に
  197. 9:53何かすることによって検出がしたりしなく
  198. 9:57なったりするのはこれなんでだろうなと
  199. 9:58思って、ま、もうちょっと調べてみること
  200. 10:00しました。
  201. 10:02で、実際にその利益検水する箇所っていう
  202. 10:04のがこのSQLライブラリーの中の
  203. 10:07OpenDBの中で、ま、チャンネルを
  204. 10:09内部で作って新しいゴルチンを起動して
  205. 10:12そこで、え、チャンネル待ってると。で、
  206. 10:16え、ま、なんかデビ書いてきたデビに
  207. 10:19クエリを投げるとこのゴルチャンネル系で
  208. 10:22ゴルチンが何か処理をするみたいな動作を
  209. 10:25しているようですと。
  210. 10:28で、ま、色々調べてくとこのビブネス
  211. 10:30アナリシスというものに行きついてこれが
  212. 10:33どうも関係してるだということが分かり
  213. 10:35ました。で、これが何かと言うと、
  214. 10:37コンパイラン的化で、ま、ある特定の場所
  215. 10:39でコレクターにそのどのオブジェクトが
  216. 10:42有効かっていうのを、え、マップみたいな
  217. 10:45ものをコンパイルに作ってると。で、これ
  218. 10:48がそのセーフポイントで利用されないと
  219. 10:50コンパイラーが判断したら、えっと、
  220. 10:53ガベージコレクターはその情報を持って、
  221. 10:55もう最初から到達負荷、スキャンしないで
  222. 10:57到達負荷と見なすみたいな仕組みがある
  223. 11:00みたいですね。で、こ、セーフポイントっ
  224. 11:02てのはそのガベージコレクターが、ま、
  225. 11:03メモリの位置を特定するポイントなんです
  226. 11:05けども、ま、え、その関数を呼び出す前と
  227. 11:09か後とか、ま、1.最近の1.14以降は
  228. 11:13その、もう結構どこでも割り込みが入れる
  229. 11:15んで、え、大体の場所がこの製なんです
  230. 11:19けども、これをなんかビルドフラグ、
  231. 11:22GCフラグスライブつけるとセーフ
  232. 11:25ポイントの情報が表示できるらしいという
  233. 11:27ことで早速試してみました。そうすると
  234. 11:31なんかこんな感じの出力になってでこれは
  235. 11:34何かと言うとソースコードの場所とまそこ
  236. 11:38でやってることとで最後の方にそのセーフ
  237. 11:42ポイントの位置で生きているシンボルって
  238. 11:45のが出るんですね。で、ここになんかデビ
  239. 11:48って書いてありますけどこれデのシンボル
  240. 11:51がこのセーフポイントの位置ではまだ生き
  241. 11:53てますよっていう風な情報が、え、
  242. 11:56コンパイル時に生成されてると。で、早速
  243. 11:58さっきのあのですね、このこのプリント
  244. 12:03LNDBをける後、けた後とける前で、え
  245. 12:08、試してみて比較してみるとプリントLの
  246. 12:12DAYBってのはDBはまだ参照してるん
  247. 12:14で、このまだ生きてますよっていう風に
  248. 12:18表示されるんですけど、ここコメント
  249. 12:20アウトするとデビがもうライブでなくなっ
  250. 12:23てると、
  251. 12:25ま、この結果からどうも、ま、デビー
  252. 12:29クローズとか、ま、もしくはデビ参照が
  253. 12:31ないとリーク判定されるっていうのがこの
  254. 12:34リーブネスアナリシスによるものだなって
  255. 12:35いうことが分かりました。ま、なのであの
  256. 12:40参照がないともうその時点でパパイラが
  257. 12:43もう使われてませんよってなってこの
  258. 12:45チャンネルも見ようとみなされてSQL
  259. 12:48ライブラリーの方でもう使われてないやつ
  260. 12:50を待っていると判断されたと。ま、実際
  261. 12:53今回の場合だとこのこれ実際のリークだっ
  262. 12:56たんで、ま、ただそのリブネスアナリシス
  263. 12:59によってそのリーク検出しないケースって
  264. 13:01のもあるんだなっていうことが、え、学び
  265. 13:04でした。はい。ということで、ま、最後、
  266. 13:08え、まとめですけども、ま、そういう流検
  267. 13:10されないケースがあるとはいえ、ま、それ
  268. 13:13でも検出されたリークての本当に100%
  269. 13:15今んところ本当のリークとなっているので
  270. 13:17、これ本番環境で安全にリークを検出
  271. 13:20できるし、え、どんどん使っていきたいな
  272. 13:23という風に思いました。ま、あとデイビ
  273. 13:25クロズは皆さん忘れないように気をつけ
  274. 13:27ましょう。はい、以上です。ありがとう
  275. 13:30ございました。
  276. 13:39はい、レロさん、ありがとうございました
  277. 13:40。えっと、自分も結構ゴリ、あの、
  278. 13:43Ubberのゴリクとか使ってたりしたん
  279. 13:44ですけど、こうテスト書かないといけなく
  280. 13:45て、ま、大変だったりとかなったんです
  281. 13:47けど、ま、今回標準でこうそうですね、
  282. 13:49簡単に使えるようになったってのは大きい
  283. 13:50のかなという風に思いました。はい。あと
  284. 13:53リブネス、え、アナリシスもすごい
  285. 13:55面白かったなという風に思いました。
  286. 13:57ありがとうございます。はい、では次の
  287. 13:59登壇者の、え、シ川プロさんお願いします
  288. 14:01。
  289. 14:31じゃあ始めていきますね。はい。え、では
  290. 14:355の型安全で実現する複数プロダクトの
  291. 14:38権限管理というタイトルで発表させて
  292. 14:40いただきます。よろしくお願いします。
  293. 14:46え、まず自己紹介です。え、石川明と申し
  294. 14:48ます。ハンドルネームは石川プロです。え
  295. 14:51、去年の10月に入社しまして、えっと、
  296. 14:54現在アカウント基盤開発部というところに
  297. 14:57所属しています。え、やってることとして
  298. 14:59は、え、爆落の共通管理と言われている、
  299. 15:03えっと、テナントの、その爆落のテナント
  300. 15:06の、えっと、設定とかアカウントとかを
  301. 15:09テラント内のアカウントとかを管理する
  302. 15:10ような、えっと、プロダクトが共通管理と
  303. 15:13いう名前であるんですけど、え、そこの
  304. 15:15共通管理の開発を運用したりとか、あと
  305. 15:18認証認とかの、ま、マイクロサービスとか
  306. 15:20の、え、管理とかをしていたりしています
  307. 15:23。今日はその爆落の、えっと、権限管理の
  308. 15:27、えっと、裏側のについてちょっと紹介し
  309. 15:29たいなと思ってます。で、ちょっと簡単に
  310. 15:32最初前提の説明なんですけど、ま、爆落で
  311. 15:35はすごいいっぱい、えっと、プロダクトを
  312. 15:37、えっと、提供していて、で、各お客様
  313. 15:40ごとに、えっと、契約してるプロダクトが
  314. 15:43違っていて、で、そのプロダクトごとに、
  315. 15:46えっと、有効な、あの、ロールの設定を
  316. 15:50することが可能になってます。この表の
  317. 15:53ように、えっと、例えば申請経費生産では
  318. 15:56、ま、一般権限とかで、えっと、近代でも
  319. 16:00、あ、で、ビジネスカードはこの人は利用
  320. 16:02できませんみたいなのを、ま、一単位で
  321. 16:05かつそのプロダクトごとに設定できるよう
  322. 16:07な、えっと、仕組みになってます。で、
  323. 16:11さらに裏側では、えっと、そのロールに
  324. 16:14応じて、えっと、細かくアクセス制御
  325. 16:16できるような、えっと、実装になってます
  326. 16:19。なので、えっと、爆落内では、えっと、
  327. 16:22複数のプロダクトごとに、えっと、ロール
  328. 16:25を設定できて、そのロールに紐づく、えっ
  329. 16:28と、詳細なその権限みたいなのを、えと、
  330. 16:32管理する必要がありますと。で、えっと、
  331. 16:34爆落ではすごい新規プロダクトとかも
  332. 16:36いっぱい開発しているので、えっと、ま、
  333. 16:39どんどんその管理しないといけないロール
  334. 16:41とか権限ってのが、ま、いっぱい増えてい
  335. 16:44くっていうのが、えっと、ま、現状であり
  336. 16:46ますと。で、それをいかにその、えっと、
  337. 16:50安全に管理していってるのかっていう
  338. 16:52ところを今日は説明したいなと思ってい
  339. 16:54ます。で、えっと、権限管理の、ま、実装
  340. 16:58として、ま、簡単なこう実装の例として
  341. 17:01思いつくのはこういう感じで、えっと、
  342. 17:04文字列で、ま、管理するような、ま、やり
  343. 17:07方がちょっと思いつくかなと思うんです
  344. 17:08けど、ま、こういう感じの実装をして
  345. 17:11しまうと、まずその人間が対捕しても実行
  346. 17:14時まで、ま、気づけないってのが1個問題
  347. 17:16があると思います。で、あとは最近は、ま
  348. 17:19、AIをAIに行動を欠かせることが多い
  349. 17:22と思うんですけど、ま、AIはよく嘘を
  350. 17:24つくので、ま、存在しないような権限を、
  351. 17:27えっと、こう書いてできましたって言って
  352. 17:29、そのまま人間が気づかずに、ま、
  353. 17:33リリースしちゃっても、ま、気づけないっ
  354. 17:35ていうような問題があると思います。また
  355. 17:37そのプロダクトがどんどん増えていくと、
  356. 17:39ま、こういう、えっと、分岐とかが
  357. 17:41いっぱい増えてくると、ま、なかなか管理
  358. 17:43しきれないので大変大変だというところも
  359. 17:45課題としてあると思います。で、そこで
  360. 17:48どうやって、えっと、権限管理の仕組みを
  361. 17:51実装してるかって言うと、えっと、5の
  362. 17:53ディファインドタイプっていうのを活用し
  363. 17:55て、えっと、実装してます。ま、ちょっと
  364. 17:58皆さんご存知だと思うんですけど、念の
  365. 18:00ため、えっと、簡単に説明しておくと、ま
  366. 18:02、こういう感じで、えっと、タイプで、
  367. 18:05えっと、既存の方から新しい、ま、方を
  368. 18:08作る、作る機能が、え、ディファインド
  369. 18:10タイプという機能です。ま、この例で言う
  370. 18:14と、えっと、パーミッションっていう方を
  371. 18:1632の、えっと、方から作ってるのと、
  372. 18:19あとプロダクトロールっていうのも同じ
  373. 18:22ように、えっと、イ32の方から作ってい
  374. 18:25ます。で、これらは同じ、えっと、元の方
  375. 18:28としては同じなんですけど、え、
  376. 18:30パーミッションと、ま、プロドクトロール
  377. 18:32それぞれは、えっと、別の方として、ま、
  378. 18:35使ってくれるようになりますっていうのが
  379. 18:37ディファイドタイプになります。で、これ
  380. 18:40の何がいいかって言うと、ま、えっと、
  381. 18:42もしそのパーミッションとロールの値を、
  382. 18:46えっと、間違えて比較するようなコードを
  383. 18:48書いた時に、ま、それぞれ違う方なので、
  384. 18:51えっと、比較できませんよっていうのを
  385. 18:53コンパイラーが、ま、えっと、指摘して
  386. 18:55くれたりとか、ま、あとその
  387. 18:57ハズパーミッションみたいな関数を作って
  388. 19:00引数に、え、パーミッションの値を受ける
  389. 19:03ような関数を作った時に、ま、それ以外の
  390. 19:06、えっと、例えば、ま、生のイント32の
  391. 19:08値とかを、えっと、引数に渡そうとした時
  392. 19:11にそれを違うんで渡せませんよみたいな
  393. 19:14ところを、ま、コンパイラーが指摘し指摘
  394. 19:16してくれるので、ま、あの、非常に権な
  395. 19:19実装をすることができるのがこの
  396. 19:20デファイドタイプのいいところかなと思っ
  397. 19:22てます。
  398. 19:24で、それを、ま、具体的にどういう風に
  399. 19:26使ってるかって言うと、えっと、爆落では
  400. 19:29、えっと、GRPC5間の、えっと、あ、
  401. 19:33コネクトRPCっていうそのなんだろうな
  402. 19:36、GRPC互間のRPCフレームワークを
  403. 19:39使って、ま、通信してるんですけど、その
  404. 19:42、えっと、なのでプロトコルバッファーで
  405. 19:44この、え、権限の定義を宣言してます。で
  406. 19:48、イナムで、え、パーミッションっていう
  407. 19:50、え、イナムとプロダクトロールっていう
  408. 19:53イナムを宣言してて、え、パーミッショ
  409. 19:55ンってのが結構詳細な具体的に何ができる
  410. 19:59かみたいなところを、えっと、宣言する、
  411. 20:02あの、最も細かい流度の、え、権限が
  412. 20:05パーミッションで、プロダクトロールって
  413. 20:07のが、えっと、実際にそのアカウントとか
  414. 20:11に紐づける、えっと、権限になります。な
  415. 20:14ので、え、例えばアカウントアドミン
  416. 20:16みたいな、え、権限とか、えっと、
  417. 20:19アカウントユーザーみたいな権限とか、ま
  418. 20:21、人に紐づくような、え、権限をここで
  419. 20:23イナムで宣言してます。で、え、その宣言
  420. 20:26した、えっと、プロトを、ま、
  421. 20:29プロドックジェン5で、え、生成す、え、
  422. 20:315のコードとして生成すると、ま、こう
  423. 20:34いう感じの、えっと、ディファインド
  424. 20:36タイプを作ってくれるのと、そのイナムで
  425. 20:38宣言した値を、ま、列教型みたいな感じの
  426. 20:42、えっと、値を生成して、自動生成して
  427. 20:44くれます。なので、えっと、
  428. 20:48え、プロトファイルに、え、1日権限を
  429. 20:50追加するだけで、ま、コードが自動生成さ
  430. 20:53れるような感じになっていますと。
  431. 20:56で、じゃあロールと権限の対応、紐付けを
  432. 20:59どうやって管理してるかって言うと、え、
  433. 21:01ここもプロトファイルに宣言してます。
  434. 21:04これはその先ほど説明した、えっと、
  435. 21:07イナムのところイナムにイナムvalリー
  436. 21:09オプションズで、えっと、値を拡張して、
  437. 21:12え、宣言できるようにして、その
  438. 21:15プロダクトロールの中、このプロダクト
  439. 21:18ロールは何のパーミッションを持ってま
  440. 21:20すってのを、えっと、プロト内に宣言
  441. 21:22できるような感じで、え、作ってます。
  442. 21:26で、ここも、え、その宣言イラムを活用し
  443. 21:29てコードを自動生成してて、ここはその、
  444. 21:33えっと、標準のプロトクが生成するコード
  445. 21:36ではなくて、えっと、自社で開発してる
  446. 21:39そのカスタムプラグインを使って、え、ま
  447. 21:42、マッピング表みたいなのを、ま、作って
  448. 21:44ます。で、このマップは何を使やってる
  449. 21:47かって言うと、えっと、キーに
  450. 21:49パーミッションを持ってて、えっと、値に
  451. 21:53プロダクトロールを、え、持っていて、ま
  452. 21:56、えっとですかね、プロダクト、この
  453. 22:00パーミッションを持っているプロダクト
  454. 22:02ロールの一覧を引けるマッピング表みたい
  455. 22:05なのを作っています。
  456. 22:08最後、えっと、RPCの定義でも、えっと
  457. 22:12、ちょっとか、手を入れていて、えっと、
  458. 22:15このRPCの定義のところで、このRPC
  459. 22:19を叩くのに、ま、何のパーミッションが
  460. 22:21必要かっていうのも、えっと、この定義内
  461. 22:24で宣言してます。これはメソッド
  462. 22:26オプションズで、えっと、独自の
  463. 22:28メタデータをけれる、ま、追加できる
  464. 22:30仕組みを活用して、えっと、こういう感じ
  465. 22:33でこのRPCごとにパーミッションの、
  466. 22:36えっと、設定を行っています。
  467. 22:40で、ここまでが、えっと、その実際に自動
  468. 22:42生成とかRPCでの定義の仕組みの説明
  469. 22:45だったんですけど、実際さ、どうや、どこ
  470. 22:47でどうやって、え、権限のチェックをし
  471. 22:50てるかっていうところをちょっと紹介
  472. 22:51しようかなと思います。えっと、まず
  473. 22:53クライアントから、えっと、リクエストが
  474. 22:55来た時に、えっと、認証トークンを元に、
  475. 22:58えっと、内部通信用の、え、トークンを
  476. 23:02生成して、ま、例えばサービス間通信とか
  477. 23:05全部で引き回してるんですけど、えっと、
  478. 23:08そのトークン、内部通信用のトークンの中
  479. 23:10にこの人は何の権限を持っているっていう
  480. 23:14そのプロダクトロールの一覧をそのトーク
  481. 23:17の中に埋め込んでます。で、えっと、通信
  482. 23:20、えっと、コネクトRPCの
  483. 23:23インターセプターを使って、えっと、この
  484. 23:25RPCの手前で、えっと、全ての、えっと
  485. 23:30、全てのRPCの中で、えっと、この権限
  486. 23:34チェックをインターセプターでやってい
  487. 23:36ます。で、えっと、先ほど説明した、え、
  488. 23:39マッピング表とか、ま、自動生したコード
  489. 23:41をに、え、自動生したコードとその内部
  490. 23:46通信用のトークンから、え、レコードして
  491. 23:50取れるその人が何のロールを持っている
  492. 23:53かっていう情報をもに、えっと、この人は
  493. 23:56RPCを、このRPCを叩けるかっていう
  494. 23:58のを判定して、ま、権、権限がなければ、
  495. 24:01ま、403で弾いてオッケーだったらその
  496. 24:04まま処理を継続するような感じの、え、
  497. 24:07仕組みになってます。で、ちょっと中身の
  498. 24:10コードもちょっと簡単に説明したいんです
  499. 24:12けど、ま、こういう感じのハズパミッショ
  500. 24:14ンっていう関数を定移してて、え、引数に
  501. 24:18パーミッション型を受けて、えっと、
  502. 24:20レシーバーで、えっと、そのトーク内でに
  503. 24:24入ってる、えっと、プロダクトロールを、
  504. 24:28え、レシーバーでの値で持ってます。で、
  505. 24:31えっと、1行目のこのロール、
  506. 24:34ロールズバイパーミッションってのが自動
  507. 24:36生成しているあのマッピング表で、えっと
  508. 24:40、キーにこの引数で受けたパーミッション
  509. 24:42を渡すと、えっと、そのパーミッションを
  510. 24:46持っているロール、え、が、アロード
  511. 24:49ロールとして取れるので、え、この
  512. 24:52アロードロールと、えっと、えっと、その
  513. 24:55人が持ってる権限を分で回して比較して、
  514. 24:59えっと、実際にその許可してるロールをも
  515. 25:02その人が持ってるかっていうのを、ま、
  516. 25:04ここの方分という部分で判断してます。で
  517. 25:06、権限があればトルーを返して、権限が
  518. 25:09なければフルスを返すっていうような感じ
  519. 25:11になってます。で、ま、ここでもここで
  520. 25:14そのディファインドタイプを活用してるの
  521. 25:15で、ま、5らしく、ま、綺麗なコードで
  522. 25:18綺麗か、ま、いいあの安全な、ま、実装が
  523. 25:22できてます。で、そのインターセプター内
  524. 25:25以外でも、ま、ビジネスロジック内で結構
  525. 25:28権限の確認とかチェックみたいなところを
  526. 25:30、ま、することもあったりするんですけど
  527. 25:32、ま、そういうところも、あの、同じよう
  528. 25:35に、え、コードを書くことができるので、
  529. 25:38ま、ここでもその
  530. 25:40、ま、えっと、対することもないし、AI
  531. 25:43が嘘ついたら、え、コンパイルエラーに
  532. 25:46なってくれるので、えっと、ま、
  533. 25:48ハルシネーションとかAIの嘘にも、え、
  534. 25:50強い権露な実装ができているという感じに
  535. 25:52なっています。え、最後まとめになります
  536. 25:55。えっと、ま、ディファインドタイプを
  537. 25:57活用することで、えっと、ま、コンパイル
  538. 26:00時に、えっと、ミスを検知できるような、
  539. 26:03ま、権ロな仕組みを、え、実装してます。
  540. 26:06で、最後は、えっと、プロトコル
  541. 26:08バッファーと、ま、プロトジェンゴの
  542. 26:10コード生成で、ま、スケーラブルな、ま、
  543. 26:13プロダクト数が増えてっても、え、
  544. 26:15スケール可能な、え、権限管理の仕組みっ
  545. 26:17てのを実現しています。え、ま、この、ま
  546. 26:20、プロ、プロトでの自動生成とか
  547. 26:23ディバインドタイプを活用した、え、
  548. 26:25仕組みのは他のことでも結構報用できると
  549. 26:28思うので、よかったら、え、参考にしてみ
  550. 26:30てください。ご成聴ありがとうございまし
  551. 26:31た。
  552. 26:40はい。え、石川プロさん、ありがとう
  553. 26:41ございました。と自分も結構そうですね、
  554. 26:44このプロダクトを活してるんで、この
  555. 26:45仕組みを使うことが多いんですけど、ま、
  556. 26:47プロト書くだけで、えっと、裏側の条件的
  557. 26:50な、条件的なコードが、えっと、自動で
  558. 26:52生成されるっていうのはすごい便利でいつ
  559. 26:54も助かってます。はい、ありがとうござい
  560. 26:55ます。では次は、えっと、たくさんの、え
  561. 26:58、発表です。よろしくお願いします。
  562. 27:49はい、こんばんは。えっとこれから5の
  563. 27:52DBアクセスにおける型安全と柔軟性の
  564. 27:54両率ポブという選択肢というという
  565. 27:57タイトルで発表します。よろしくお願いし
  566. 27:59ます。
  567. 28:04はい。えっと、高橋拓也でと言います。で
  568. 28:08、ま、車内ではタと呼ばれてます。で、ま
  569. 28:10、レックスの、え、爆落事業部で、えっと
  570. 28:12、2023年の12月から働いてて、
  571. 28:14えっと、2025年の新卒のエンジニアと
  572. 28:16しても働いています。で、ま、インターン
  573. 28:191年ぐらいちょっとしてたという、ま、
  574. 28:21意外とちょっと、ま、古だったりしてい
  575. 28:24ます。で、えっと、ま、週末に確定申告し
  576. 28:26ないとなと、えっと、焦っています。
  577. 28:30はい。で、ま、本題なんですけど、皆さん
  578. 28:335でDBSとかどうしてますか?
  579. 28:37ま、えっと、よく、ま、Oワ、ま、普通の
  580. 28:40ORマップ私よく使われるのが、ま、
  581. 28:42ゴルムだったり、えっと、ま、SQL
  582. 28:44ファーストで、えっと、自動で生成して、
  583. 28:47えっと、ま、DBにアクセスするSQLC
  584. 28:49だったり、ま、本当にスイラップとして
  585. 28:51SQLXがあったりとか、あと、ま、DB
  586. 28:54のスキーマ、ま、DBメイとかから、えっ
  587. 28:57と、ま、あらかじめ、え、インサートして
  588. 29:00おい、え、クリクリエトしておいて、えっ
  589. 29:01と、ま、それを元に型を作ったりするXO
  590. 29:03とかSQLボイラー、ま、あとコード
  591. 29:05ファーストのエントだったりがあ、あると
  592. 29:07思います。
  593. 29:09で、えっと、ま、こん中でも、ま、今日は
  594. 29:11DBスキーマ生成系をベースに、ま、見て
  595. 29:14みようと思ってます。で、えっと、ま、
  596. 29:17ボブにたどり着く入り口というのでSKL
  597. 29:19ボイラーがあって、えっと、ま、5Oの
  598. 29:21スキーマファーストで、ま、かなり有名
  599. 29:23だったコード生成ツールだと思うんです
  600. 29:24けど、えっと、ま、で、ま、これはDB
  601. 29:26スキルや、ま、クラット、ま、基本的な
  602. 29:29メストだったり、えっと、ま、関数だっ
  603. 29:31たり生成してくれる、ま、便利なツールで
  604. 29:33はあったんですけど、そのSQボイラーが
  605. 29:35、えっと、ま、1年、1、2年前ぐらいに
  606. 29:38メンテナンスモールに突然入って、ま、
  607. 29:41ざわざわちょっと一部していたところが
  608. 29:43こうあるかなと思います。で、ま、そこの
  609. 29:46メンテナンスモールの下の方に行くと
  610. 29:47オルタナティブスのところで、えっと、ま
  611. 29:49、ボブとか、え、こ、ボブとSKLCが
  612. 29:52並んでて、まあボブ
  613. 29:55なんかボブさんですかみたいな、ま、
  614. 29:57ちょっとよくわからないこう名前のものな
  615. 29:59んですけど、ま、なんかこれを見てみると
  616. 30:01、ま、SQLボイラーVの、ま、実験とし
  617. 30:04てなんか作ってたけど、あまりにも違、
  618. 30:07違いすぎて別プロジェクトになったという
  619. 30:09胸が書いてあります。
  620. 30:12で、ま、ちょっと、ま、その部分は一旦
  621. 30:14置いておいて、ま、ゴルムとかの良い点
  622. 30:16だったり、辛い点だったりをちょっとさっ
  623. 30:18ていくと、え、ゴルムは、ま、エコ
  624. 30:21システムが結構成熟してて、ま、ギタブの
  625. 30:23スターズもなんだかんだ3万9000とか
  626. 30:25あったり、えっと、ま、うちの会社で言う
  627. 30:28と、ま、結構、ま、ほとんどのサービスで
  628. 30:31結構使われていたりとかで、ま、ど、同的
  629. 30:33クエリーを、ま、いい感じに作ったりする
  630. 30:35のは、ま、なんだかんだやりやすいところ
  631. 30:37はあったりしつつも、ま、やっぱ
  632. 30:39インターフェイス型、ま、今だってエ型が
  633. 30:41対応されてて片チェックが引きにくかっ
  634. 30:43たり、ま、最近ジェネリクスが入ったとか
  635. 30:45あったりしますけど、ま、ちょっとこう
  636. 30:47工絶するゼロチトラップとか、ま、あって
  637. 30:49、ま、AIが高く時代にちょっと怖いなっ
  638. 30:51ていうところもあったりすると思います。
  639. 30:55で、ま、SQLCと、ま、こ、えっと、
  640. 30:57SQLファーストで、ま、型安全に一応
  641. 30:59作れたりとか、えっと、ま、レビューのし
  642. 31:01やすさとかあったりするんですけど、ま、
  643. 31:03なんか、えっと、一覧のフィルターページ
  644. 31:05とか、ま、同的クエがかなり大変だったり
  645. 31:08とか、えっと、ま、バルクリンサートとか
  646. 31:10もなんかこ公式にバルクリンサートは
  647. 31:13サポートさせてなかったりして、ま、
  648. 31:15頑張ってプラグインを書いたりとかする
  649. 31:16必要があったりで、ま、大変だったりする
  650. 31:18面があります。
  651. 31:21で、えっと、ま、あとX、X4とか、
  652. 31:23SQLボイラーとかだと、ま、DBスキで
  653. 31:26モデル生成して、ま、自由度が高かったり
  654. 31:28するんですけど、えっと、ま、
  655. 31:32SKLボイルメンテナンスボールだったり
  656. 31:33、ま、Xは結構自分でテンプレートをかけ
  657. 31:35ば頑張れるものの、ま、なんか運用コスト
  658. 31:37が結構乗ったりするかなと思います。で、
  659. 31:41ま、ボブは、ま、型安全で、ま、柔軟でS
  660. 31:43、えっと、ま、データベースSQL
  661. 31:45ネイティブで、ま、なんかSQLCみたい
  662. 31:47なこともできるし、ま、もちろんさっきの
  663. 31:49SQLボイラー的な性質も持ち合わせて
  664. 31:52いるんですけど、ま、あと、ま、名前が
  665. 31:53検索しやすかったりとか、ま、こう、
  666. 31:56こまらまこれからのプロジェクトだなと
  667. 31:57いう感じもあります。で、ま、ボブの
  668. 32:00ちょっと具体の話をざっとしていくと、ま
  669. 32:02、ボブは、ま、SQLボイラーみたいに、
  670. 32:04ま、ボブのやると、ま、クエリと、あと
  671. 32:06DBのスキーマも元に、ま、モデルだっ
  672. 32:08たりセッターだったり、イナムとか、ま、
  673. 32:10いろんな関数を作って、ま、クラットだっ
  674. 32:12たり色々そう操作できます。で、ま、
  675. 32:17こんな感じのこみたいな感じで、えっと、
  676. 32:20ヤムロを書いて、ま、どのプラグインを
  677. 32:22使うとかを定義したりとか、ま、DSN
  678. 32:24書いたりとか、ま、あとクリエイテッドと
  679. 32:27アップデッアを削除するみたいなことも
  680. 32:29できたりします。
  681. 32:32で、ま、ま、具体で実際に生成すると、ま
  682. 32:34、例えばこんな感じの方が生成されて、ま
  683. 32:37、コスぐれのUIは、ま、UIに
  684. 32:39マッピングされたりとか、ま、塗るとか、
  685. 32:41ま、こう、イナムも自動生成したりできる
  686. 32:44ので、
  687. 32:45ま、こんな感じで結構、ま、ちゃんとD、
  688. 32:48DBに忠実な方を作ることができます。で
  689. 32:53、あとセッター、これた、えっと、これ
  690. 32:55普通の、ま、えっと、ま、セレクトとかし
  691. 32:59て帰ってくる、ま、方なんですけど、
  692. 33:01セッターが分離していて、ま、えっとで、
  693. 33:03しかもこの、ま、工絶するんですけど、
  694. 33:05オミットとかオミットルとかというとかを
  695. 33:08使うと、えっと、ま、プットとパッチ、ま
  696. 33:12、全部一気に更新する、ま、これだけ更新
  697. 33:15するとかがもうセッターを使うだけで簡単
  698. 33:17に表現できて、ま、なんかポイントだけで
  699. 33:19頑張るみたいなことが不要になったりして
  700. 33:21便利な面があります。
  701. 33:24ま、具体では、ま、こんな感じで、えっと
  702. 33:26、ま、オミットとオミットぬる、塗るとの
  703. 33:28というのがあって、ま、値をセットしたり
  704. 33:30、ぬるをセットしたり、未セットしたり、
  705. 33:33ま、ま、セットしなかったりか、セットし
  706. 33:35なかったりができたりします。
  707. 33:38で、ま、えっと、ゴルムだとちょっと、ま
  708. 33:40、こう、車内でもちょっと怖いなみたいな
  709. 33:43話があったんですけど、ま、こう
  710. 33:47構造体のこう、あの、ゼロ値例えば
  711. 33:49ストリング型だと、ま、こうゼロ値は
  712. 33:51空文字だったりするので、ま、なんか気軽
  713. 33:54にこう
  714. 33:56なんかこれだけアップデートしたくて、
  715. 33:58えっと、ま、で構造体をアップデートに
  716. 34:00投げると、ま、なんかこう空文字に更新し
  717. 34:03たいんじゃなくて、そのまま置いとき
  718. 34:04たかったのに空文字に更新されてしまう
  719. 34:07みたいなことがあるんですけど、えっと、
  720. 34:10おミッドを使えば、えっと、ま、そういう
  721. 34:12のは、ま、こうそもそもセットしてなけれ
  722. 34:14ばSKに含まれないので、安全に更新とか
  723. 34:17ができます。
  724. 34:19で、ま、あとちょっと、ま、こ、個人的に
  725. 34:22バグにはまってコンビュートした話もあっ
  726. 34:24て、インサルトの話をちらっとするんです
  727. 34:26けど、えっと、ま、ポストグレーとかだと
  728. 34:28、ま、リタイニング区で、ま、インサート
  729. 34:30した後に値を取ったりできて、ま、こうで
  730. 34:33も1、こう1ていうメソッドを使うと、ま
  731. 34:35、値をそのままこう、えっと、インサート
  732. 34:38した上で値を持たせるんですけど、ま、
  733. 34:41マイスクールのドライバーだと、えっと、
  734. 34:44ま、そもそもリターニングがないので、
  735. 34:46えっと、ま、セレクトも1度実行しててま
  736. 34:49、そこで、えっと、ま、一応こブでは、
  737. 34:53えっと、クリエイテッドとか
  738. 34:54アプレーテッドをミットするみたいなこと
  739. 34:55もできるんですけど、こうそれが無視して
  740. 34:57全部アスタリスクで取得してて、こう
  741. 35:00マッティングのエラーになってたので、
  742. 35:01こうバグを修正するみたいなことをやっ
  743. 35:03たりしてコンビュートできて嬉しいなって
  744. 35:05こともありました。
  745. 35:08で、ま、そうですね、アップデートは
  746. 35:09さっき言った通りで、えっと、ま、同的
  747. 35:11クエとかも、ま、セレクトウェアとか
  748. 35:13クエリモつとか使って、ま、結構型安全に
  749. 35:15ちゃんと作れで、ま、柔軟な、えっと、
  750. 35:19クエリ構築ができます。で、ま、
  751. 35:22あとワツワ、えっと、こ、ワンツワの、
  752. 35:25えっと、関係はこうレフトジョインで1回
  753. 35:28こう取って、で、ま、ワンツメニューの
  754. 35:31やつは、えっと、別クエリーで、えっと、
  755. 35:34もう取ってくるみたいな、えっと、柔軟な
  756. 35:37クエリも発行できます。まあ、こう、Rと
  757. 35:40かの、えっと、Rというフィールドに、
  758. 35:43えっと、ま、プロジェクトメンバータスク
  759. 35:44コメンツみたいな、えっと、方も、ま、
  760. 35:47あらかじめ自動で生成されてるので、ま、
  761. 35:49欲しいデータは宣言しておくと取ってくる
  762. 35:51ことができます。あとSQLCみたいな
  763. 35:53こともできたり、ま、いろんな嬉しいこと
  764. 35:55があります。で、ま、データベースSQL
  765. 35:59を、ま、スクラップしてそのまま使えるの
  766. 36:01で結構だったりもします。
  767. 36:05で、ま、あとAXでは、ま、こ、ま、
  768. 36:08えっと、テナント、えっと、ま、こう
  769. 36:12マルチェナントの構成なんで、ま、
  770. 36:13テラントアイデを絶対入れないといけない
  771. 36:15みたいなことがあって、ま、以前こうよし
  772. 36:18さんがこう、えっと、ゴルムの、えっと、
  773. 36:22ま、ゴジ郎レテナントIDのフックを
  774. 36:24入れるみたいな、えっと、ご知り上げてた
  775. 36:26こともあるんですけど、ま、そ、こうそれ
  776. 36:28を、ま、えっと、え、え、ボブでも、ま、
  777. 36:32フックを簡単に入れることができるので、
  778. 36:35ま、テランと、ま、えっと、うちの、えっ
  779. 36:37と、
  780. 36:39マルチナントサスれもいい感じにこう運用
  781. 36:42できていい感じになってます。
  782. 36:46ま、こんな感じで、ま、良いところもあり
  783. 36:48つつ、ま、まだちょっとこれから検証の何
  784. 36:50回、ま、大規模テーブルのパフォーマンス
  785. 36:51だったり、ま、テンプレート周りとかが、
  786. 36:54ま、ありつつ、ま、重要なのは、ま、安全
  787. 36:56に価値を最速で届けることだなと思ってる
  788. 36:58ので、まあ、なんか撤退とかも、ま、こう
  789. 37:00、こう全然、えっと、ま、バグとかが
  790. 37:03多かったら、ま、もし多かったら撤退とか
  791. 37:05そういう選択肢もあるかなとは思いつつ、
  792. 37:07今頑張ってご検証しつつ導入進めてます。
  793. 37:10はい。そんな感じで、ま、5のDB
  794. 37:13アクセスでは、ま、型安全とか柔軟性の
  795. 37:14どちらか諦めだったりしたんですけど、ま
  796. 37:16、こう、ま、こうモデルとセッターの分
  797. 37:18だったり、ま、クエリモドだったり、
  798. 37:20SQL直書きこうできたり、ま、こう、
  799. 37:22あの、色々便利に使えて、ま、
  800. 37:24データベースSQLネイティブでで、まあ
  801. 37:26、今まさに導入中で、ま、ま、今んとこ
  802. 37:29結構便利だなと思ってるんで、ま、これ
  803. 37:31からもなんかいいことがあったら発表でき
  804. 37:33たらなと思ってます。一応なんか
  805. 37:36ボブコボブを使ったサンプルアプリみたい
  806. 37:38なの作ってみたんで、ま、なんかドックス
  807. 37:39とかも一応入れてみたんで、よかったら
  808. 37:41参考にしてください。はい、以上です。
  809. 37:44ありがとうございました。
  810. 37:54はい、たくさんありがとうございました。
  811. 37:56えっと、そうですね、結構ゴルムを使って
  812. 37:58て大変だなと思ってたところとかがこう
  813. 38:00うまく解決されてるっての結構自分も興味
  814. 38:02が出ました。で、またこう運用していって
  815. 38:04なんか試験が溜まったら、え、発表して
  816. 38:06欲しいなという風に思います。ありがとう
  817. 38:07ございます。はい。では、そうですね、
  818. 38:10えっと、これから10分間の休憩に入ろう
  819. 38:12と思います。えっと、今が19時38分な
  820. 38:14ので、え、10分後の、え、19時48分
  821. 38:17頃から、え、再開したいと思います。で、
  822. 38:19後ろのテーブルの方に、えっと、お飲み物
  823. 38:21とか、えっと、食べ物もあるので、是非、
  824. 38:23え、ご順にお取りください。はい、では
  825. 38:26よろしくお願いします。
  826. 43:42はい。
  827. 44:09さ
  828. 44:30うん
  829. 44:37。
  830. 48:11はい、では、えっと、19時48分になっ
  831. 48:13たので、えっと、次の発表に移りたいと
  832. 48:15思います。次は、えっと、ターボスさん
  833. 48:17からの、えっと、発表です。よろしくお
  834. 48:19願いします。
  835. 48:23はい、えっと、1.26で解禁されました
  836. 48:26再期的方制制約についてお話しします。
  837. 48:29ターボフィって言います。え、配信基盤
  838. 48:30システムとかを開発してます。はい。えっ
  839. 48:33と、そろそろソフトウェアデザインの要4
  840. 48:35月号が出る時期なんですけど、3月号から
  841. 48:37買っていただくと今話題のレイヤXさんの
  842. 48:40連載記事が最初から読めます。是非、あの
  843. 48:42、皆さんお買い求めください。[笑い]
  844. 48:45はい。え、今日、あの、話すことなんです
  845. 48:46けれども、えっと、51.26で会禁に
  846. 48:49なった再期的方制約っていうのがどういう
  847. 48:52ものでどういう書き方をしているのかって
  848. 48:54いうのと、ま、あの、ユスケースをまとめ
  849. 48:56てみようと思います。で、あの、いきなり
  850. 48:59面積事項なんですけど、正直そんなにユス
  851. 49:01ケース多いかて言われるとそんなあの、
  852. 49:03多くはないです。で、あの、えっと、
  853. 49:06ジェネリクスって結構使ってらっしゃる方
  854. 49:09、ちょっと今日はもしかしたら多いかも
  855. 49:10しれないんですけど、一般的に言ってどう
  856. 49:12やって使うか分からないみたいなことを
  857. 49:14思ってらっしゃる方も結構多いんじゃない
  858. 49:16かなと思っていて、ま、今回その辺も意識
  859. 49:18してできるだけユースケースが分かり
  860. 49:20やすいようにあの、話したいと思います。
  861. 49:24はい。で、え、以前からできたことって
  862. 49:27いう意味では構造体とかインターフェース
  863. 49:29に型パラメーターを指定することっていう
  864. 49:31のはできました。この上の構造体の方とか
  865. 49:35の書き方はすごい今回のあの再期的制約に
  866. 49:38ちょっと似てはいるんですけれども、
  867. 49:39コンクリートっていう名前の構造体の中に
  868. 49:42コンクリートっていうのが別に入っている
  869. 49:43わけではないので、あの最ではないって
  870. 49:46いう感じですね。はい。で、今回可能に
  871. 49:49なった書き方としては、あの、この、え、
  872. 49:52アダーっていうインターフェースの書き方
  873. 49:54と、あのの感じなんですけれども、この
  874. 49:57アダーインターフェースの中にアダー
  875. 49:59インターフェースっていうのが、あの、
  876. 50:00制約として入っています。
  877. 50:03え、ちなみになんですけれども、今
  878. 50:04おそらくこっちの方が話題なのかなと思う
  879. 50:07んですけど、あの、レシーバーの定義の方
  880. 50:09を変えずにそのメソッドを呼び出す時点で
  881. 50:12そのパラメーターっていうのを指定できる
  882. 50:14ジェネリックメソドっていうのが今
  883. 50:15プロポーザルがアクセトになってまして、
  884. 50:17そろそろ導入される予定となっています。
  885. 50:20で、これの、え、この書き方なんです
  886. 50:22けれども、今Pでエニーになってると思う
  887. 50:24んですけど、この制約はエニーなんだ
  888. 50:26けれども、このコンパイル時に型情報って
  889. 50:28いうのは維持されるので、関数内で肩
  890. 50:31アサーションを使う必要がなくなって便利
  891. 50:32だねっていう話です。はい。で、今回あの
  892. 50:36話を戻すと再期的型制約については、え、
  893. 50:39えっとね、5のジェネリックスの設計のに
  894. 50:42ついて書かれている論文である
  895. 50:44フェザーウイトGOの中でも定義されてい
  896. 50:46ます。で、あの、この論文の中で今回この
  897. 50:50最適、最適、最期的制約によってこのFU
  898. 50:54誘拐多数っていうのが実現できるよって
  899. 50:56いうことは書いてあるんですけれども、
  900. 50:58ここにざっくりですね、え、ポリフォズム
  901. 51:00の分類について書いてみました。ここに
  902. 51:03書いてある図はミーシーではなくって、ま
  903. 51:05、あの、そうですね、これ以外にも用途
  904. 51:07っていうのはあるんですけれども、ま、
  905. 51:08最もメジャーなものを入れげさせて
  906. 51:11いただいてます。で、この中で
  907. 51:12パラメトリック多数っていうものがですね
  908. 51:14、いわゆるジェネリックスなんですけれど
  909. 51:15も、この右1番右側にある、え、誘拐
  910. 51:18パラメトリック多少の中のこの右、え、下
  911. 51:22から2番目がFU誘拐多数になってまして
  912. 51:24、ま、そこから上のもの、無限、無限
  913. 51:26パラメトリック多数っていうのところから
  914. 51:29下っていうのはもうすでに5では実現する
  915. 51:31ことができません。なので、あの、
  916. 51:33パラメトリック多少の中のメジャーケース
  917. 51:35の、え、大半をこれで実装できるように
  918. 51:38なったっていうことですね。はい。で、
  919. 51:41リリースノートには片制約がより強力にな
  920. 51:43るっていうことが書かれてました。で、
  921. 51:45具体的にどう協力になったのかっていう点
  922. 51:47なんですけども、そもそもFU回多数って
  923. 51:50いうのはですね、メソッドが扱う方を
  924. 51:53レシーバーと同じ方に固定できるように
  925. 51:56なったっていうことですね。で、これで
  926. 51:58その型っていうのがその5についてはあの
  927. 52:01インターフェースもま、型なのであの
  928. 52:03いろんな解釈があると思うんですけど今回
  929. 52:05もその愚傷型を固定できるようになっ
  930. 52:08たっていう話ではありません。
  931. 52:09あくまでその振る舞いがもそのレシーバーとodッドドの引数しくは立地で使えることがあの使うことができるようになったってことですね。なのでその自己参照的な振る舞いをつっていのを扱えます。ですね、この右側のような感じでけるんですけれどもはい。え、ごめんさい。
  932. 52:33[笑い]
  933. 52:35で、右側のような感じで書けるんです
  934. 52:37けれどもああ。はい。で、えっと、この
  935. 52:41左側に型セットを使った書き方っていうの
  936. 52:43を書いてます。で、この2つを、ま、
  937. 52:45ちょっと比較してみます。全くその用途が
  938. 52:47違うので、ま、比較するものでもないかも
  939. 52:49しれないんですけども、ま、何が
  940. 52:51ありがたいかっていうのをこれ説明してみ
  941. 52:53ます。で、型セットを使った書き方って
  942. 52:55いうのは、あの、いわゆるユニオン型
  943. 52:57みたいな感じで書かれるんですけれども、
  944. 52:59このナンバーとかだとこう、ま、規定型に
  945. 53:02とかIN64とかいろんなものを持って
  946. 53:04いる方になるんですけど、ま、これを扱う
  947. 53:06ことができるナンバーっていう
  948. 53:08インターフェースですね。で、これをもう
  949. 53:10下にあるアルゴっていうファンクションが
  950. 53:12あると思うんですけど、ここで使うことが
  951. 53:14できると。で、tはナンバー型なのでx+
  952. 53:18yっていうプラス演算子が使える、使え
  953. 53:20ます。なんですけど、ま、この、え、書き
  954. 53:23方で問題というか、ま、ちょっと扱い
  955. 53:25づらいなと思うシチュエーションとしては
  956. 53:27、このイントとかプリミティブ型以外の
  957. 53:30もの、ま、この状態だとストリングとかも
  958. 53:32入れられるんですけど、逆に例えば構造体
  959. 53:35で、え、フィールドの中にこの、えっと、
  960. 53:38ですね、プラス円子が使えないような
  961. 53:40フィールドを持っている構造体とかをこの
  962. 53:42ナンバーインターフェスに入れたいって
  963. 53:43なった場合に、このナンバー
  964. 53:45インターフェスの中にもう1つ型を足す
  965. 53:47必要があるわけですね。で、そうすると
  966. 53:49このアル5関数の中でこのプラスっていう
  967. 53:52のが使えないパターンが出てくるわけです
  968. 53:53ね。そうするとこの、え、アルゴ関数の中
  969. 53:56で、え、カタサーをしてifフなんとか
  970. 53:59みたいなこと書かないといけないわけです
  971. 54:01ね。なんで、ま、そこはちょっとめど
  972. 54:03くさいと。ただ、え、最期的型制薬を使う
  973. 54:06とこのアダーっていうインターフェイスを
  974. 54:08実装してる方を作るだけでこのアルゴって
  975. 54:11いう関数を全く変えずに、あの、
  976. 54:13インターフェスも変えずに、え、この、え
  977. 54:16、最期的型制約を使ってアルゴを使う、
  978. 54:19アルゴファンクションを使うことができ
  979. 54:21るってことですね。で、ここであの、ま、
  980. 54:24特にこの再期的方制約を、え、
  981. 54:27ライブラリー化したパッケージの中で使う
  982. 54:29時にこれが特に問題になってくるところで
  983. 54:31、ま、外部からこのパ、えっと、新しい
  984. 54:35パッケージを使うってなった時にこの
  985. 54:38ナンバーインターフェスてのがパッケージ
  986. 54:39の中にあるとその外部の方っていうのを
  987. 54:41ここに追加できないんですね。なんでこの
  988. 54:43アルゴ関数っていうのを外から使うことが
  989. 54:45外から、え、定義した定義型で使うことが
  990. 54:48できなくなるっていう点が、え、あります
  991. 54:50。
  992. 54:52はい。で、え、後半ちょっとユースケース
  993. 54:54について説明したいんですけど、他の言語
  994. 54:57で実際なんか似たような機能
  995. 55:13で、他の言語の似たような機能を使って
  996. 55:15どういった実装されてるかっていうのを
  997. 55:17調べてみたんですけど、ま、大きく分けて
  998. 55:193種類あるなっていう風に思っています。
  999. 55:21で、1つ目なんですけど、このフルエント
  1000. 55:23インターフェスっていうですね、
  1001. 55:24マーチィンファルア先生があの、えっと、
  1002. 55:26ブログ書いてやつなんですけど、あの、
  1003. 55:28事故型を返してメソッドチェーンをする
  1004. 55:30パターンですね。これについてはマッツン
  1005. 55:32さんがあの、素晴らしい、え、えっと、
  1006. 55:34サンプルコードを書いたリポジト公開され
  1007. 55:36てたので、そちらから拝借しました。あの
  1008. 55:39、Javascririptとかで、あ、
  1009. 55:40タイプとかでよくあるあの、プロミスの
  1010. 55:43あの、メソッドチェーンの例ですね。なん
  1011. 55:44かプロミス型を入して全々キャッチ
  1012. 55:47アウェイトみたいなことができます。で、
  1013. 55:50次に相互最データ構造の操作なんですけど
  1014. 55:53、ま、例えばグラフのデータ構造になって
  1015. 55:56くるとこのノードとエッジっていうのが
  1016. 55:58あって、このノードはエッジの方を知って
  1017. 56:00て、エッジがノードの方を知ってると、ま
  1018. 56:03、振る舞いですね、方というかを知って
  1019. 56:05いるという、え、構造が書けます。
  1020. 56:08はい。で、3つ目に自分と同じ方としか
  1021. 56:11計算比較できないっていう制約を作ること
  1022. 56:13ができます。これについては、あの、特に
  1023. 56:16Javでは、あの、コンパラブルっていう
  1024. 56:18インターフェースが標準であると思うん
  1025. 56:19ですけれども、これが結構メジャーな例と
  1026. 56:22してあげられるかなと思っていまして、5
  1027. 56:24のコンパラブルの制約って、あの、ま、
  1028. 56:27比較、えっと、イコールかノットイコール
  1029. 56:29かっていうのは比較できるんですけれども
  1030. 56:31、同じ型であるかどうかっていうのは、
  1031. 56:33あの、そこで制約はされていないと思うん
  1032. 56:35ですが、Javのコンパラブルの
  1033. 56:37インターフェイスは、あの、比較対象が
  1034. 56:39同じ方であることを強制しています。で、
  1035. 56:42ま、これを5であの書こうとするとすごく
  1036. 56:45シンプルに書けるよっていう話ですね。
  1037. 56:48はい。で、ま、ちなみにその再期的制約を
  1038. 56:51使わないとどうなるのかっていう話なん
  1039. 56:53ですけれども、今あの、え、元々同じ型
  1040. 56:55同士を比較するApple2Appleで
  1041. 56:57比較できた最型制約だったんですけど、ま
  1042. 57:00、あの、とかにしてしまうと、え、
  1043. 57:02レシーバーをAppleにして、え、引数
  1044. 57:04をオレンジにしても、ま、その比較対象
  1045. 57:07っていうものが、あの、比較が自体はでき
  1046. 57:10てしまうってことですね。ま、あの、ま、
  1047. 57:12見りゃ分かるって話かもしれないんです
  1048. 57:13けど、ま、例えばしてて同じフィールドを
  1049. 57:15持つ別の方っていうのを謝ってその定義と
  1050. 57:18かしてしまっても気づくこと、
  1051. 57:19コンパイラーで気づくことはできないって
  1052. 57:20いう感じです。
  1053. 57:23はい。で、次に、あの、そ、先ほどもお話
  1054. 57:26だったと思うんですけども、あの、え、
  1055. 57:27定義型を使って単位が混ざるのを防ぐって
  1056. 57:30いうパターンですね。ま、ドメイン
  1057. 57:32ロジックでとても重要ですよねって話で、
  1058. 57:34はい。例えば、ま、メートルとあのフィー
  1059. 57:37トっていうのを混ぜて計算しないように
  1060. 57:40しようねっていうようなあの行動を
  1061. 57:41ちょっと書いてみました。はい。ちょっと
  1062. 57:44先ほどお話があったと思うんですけど、ま
  1063. 57:46、こういった例とかではあの、ま、その
  1064. 57:48ポンドとしていた重さをニュートンとあの
  1065. 57:51ごっちゃにしてしまったためにその事故に
  1066. 57:53なったっていう話があるんですけど、ま、
  1067. 57:54そういったのを防ぐためにはい。使えま
  1068. 57:57すっていう話です。はい。で、最後に
  1069. 58:00ちょっと今回一周を読んでてすごく面白い
  1070. 58:02コメントがあったので紹介したいなと思う
  1071. 58:04んですけど、2023年のゴファーコンで
  1072. 58:07グラファナの方があの講演されていた中で
  1073. 58:11なん、そのあのちょうどそのジェネリクス
  1074. 58:14のを使えなかったんでインターフェス諦め
  1075. 58:16ましたみたいな話がありました。
  1076. 58:20で、これが、あ、何をやってるかっていう
  1077. 58:22とですね、このグラファナってなんか、今
  1078. 58:23いろんなプロダクトあると思うんですけど
  1079. 58:25、例えばログとかをこ、ま、いろんなログ
  1080. 58:27ストリームから集めてその1つにマージ
  1081. 58:31するみたいなところで、ま、あの、そう
  1082. 58:34いうプロダクトありますよね。こうDVに
  1083. 58:36ログを貯めていくみたいなで集約的に見る
  1084. 58:38みたいなのがあると思うんですけど、ま、
  1085. 58:40それを実際にそのアルゴリズムを使って
  1086. 58:43実装するってなった時に、ま、この経営
  1087. 58:45マージっていうあの方法でグラファナの、
  1088. 58:49え、方は実装するっていう自社で実装
  1089. 58:51するっていうことをやっていたそうです。
  1090. 58:53で、このKMマージっていうのは何かって
  1091. 58:55言うと、もう相当されているストリーム
  1092. 58:58ですね。この1番右のところから1個ずつ
  1093. 59:00その点頭の、え、濃度を持ってきてこの
  1094. 59:04ヒープの中に入れてそのヒープの中から
  1095. 59:061番小さいのを出してくることによって
  1096. 59:07アウトプットが全部相されたままになる。
  1097. 59:10ま、ま、マージできるっていうそういう
  1098. 59:12アルゴリズムになります。で、これをです
  1099. 59:14ね、このルーザー3っていうデータ構造に
  1100. 59:16持ってるそうです。で、このルーザー3の
  1101. 59:19はトーナメント形式と同じで、この1番下
  1102. 59:22のこう2人が戦ってこの強い方が上に登っ
  1103. 59:25ていくみたいな感じで、こう小さい値が
  1104. 59:28どんどん上に登っていくんですけど、ま、
  1105. 59:30こういったデータ構造を実現するために、
  1106. 59:33え、グラファ穴ではこのような実装をして
  1107. 59:35いたそうです。で、この左側にある
  1108. 59:38釣リーっていう構造体が、あの、ま、気構
  1109. 59:41像ですね。で、この中にそのノ、ノー図っ
  1110. 59:44ていうのがあって、その中にノードが
  1111. 59:46スライスで入ってるんですけど、この
  1112. 59:48ノードの、え、濃度同士の値を比較する、
  1113. 59:51そのどっちが勝ってるかっていうのを決定
  1114. 59:53する関数っていうのがこの、え、
  1115. 59:55釣リーストラクトの中のレスっていう、え
  1116. 59:58、フィールドに関数として入っています。
  1117. 1:00:00これはあの、ま、右側にあるように3.
  1118. 1:00:04みたいな形でこの濃動を比較を2つ引数に
  1119. 1:00:09入れて使うんですけれども、このノード
  1120. 1:00:12コンペド.ド.みたいなできなかったの
  1121. 1:00:14かっていう話で、で、これが、ま、その
  1122. 1:00:17再期的片制約を使えなかったので、今回
  1123. 1:00:19実現できなかったっていう講演です。で、
  1124. 1:00:22ま、これ実際にちょっとやってみました。
  1125. 1:00:25で、左側が現状の実装で、右側があの実際
  1126. 1:00:29に再期的制約を使ったことによってこう
  1127. 1:00:32いう風に変わるっていう実装なんです
  1128. 1:00:33けれども、この3の下にVALUっていう
  1129. 1:00:37インターフェースを新しく、え、実装して
  1130. 1:00:39います。このVALUっていうのが濃度が
  1131. 1:00:41持っている値ですね。その比較対象となる
  1132. 1:00:43値を表していて、これがレスっていう関数
  1133. 1:00:47を実装することによって、そのノードレ、
  1134. 1:00:51え、かこノードっていう風な書き方をする
  1135. 1:00:53ことができます。
  1136. 1:00:55で、このvalリューに対してなんで
  1137. 1:00:58インターフェースを使うのがいいのかって
  1138. 1:00:59言うと、ま、このグラファの場合ですね、
  1139. 1:01:02その濃度投資を比較するキーっていうのが
  1140. 1:01:04複数ありました。で、さっき言ってた
  1141. 1:01:06プロメテウスごめんなさい。さっきのロキ
  1142. 1:01:08ですね。で、プロメテウスの場合は、ま、
  1143. 1:01:10シリーズ参照番号でロキ、そのログの場合
  1144. 1:01:12はタイムスタンプとラベルのモジレスで
  1145. 1:01:15パイロスコープですね、プロファイラーの
  1146. 1:01:16、え、サービスだと思うんですけど、この
  1147. 1:01:18パイロスコープとかとタイムスタンプを
  1148. 1:01:20比較することによってその相当の順番を
  1149. 1:01:22決めています。で、このようなあの比較
  1150. 1:01:25する値が違うので、それを的に扱うために
  1151. 1:01:28、ま、インターフェスで、え、大使う必要
  1152. 1:01:30があったってことですね。で、さらにこの
  1153. 1:01:32、これらのその比較をするルーザー
  1154. 1:01:34ツリーっていうあのツールをその
  1155. 1:01:36パッケージとして、その汎用的な
  1156. 1:01:38パッケージとして作成していたので、今回
  1157. 1:01:40のケースが当てはまるよねっていう話が
  1158. 1:01:42その一緒に書かれていました。
  1159. 1:01:45はい。え、今回ですね、再期的方制約のお
  1160. 1:01:47話させていただきました。正直あの、ま、
  1161. 1:01:50パラメトリックタスめっちゃできるように
  1162. 1:01:51なったやんって話なんですけど、ま、正直
  1163. 1:01:53あのライブラリーのその、ま、実装には
  1164. 1:01:56すごく便利で、ま、他の言語では一般的に
  1165. 1:01:58使われてはいるんですけれども、普通の
  1166. 1:02:00アプリ開発をしてるとあんまり使うことは
  1167. 1:02:02ないかもしれません。はい。ま、あの、
  1168. 1:02:04インターフェイスは中小っていう文脈だっ
  1169. 1:02:06て、ジェネリックスは安全の表現力って
  1170. 1:02:08いうのが武器なので、ま、ライブラリーを
  1171. 1:02:09作る時が1番輝くっていうのは、ま、そう
  1172. 1:02:11だよねっていう感じです。はい。ただ
  1173. 1:02:14振る舞いを共通化したくって、ま、加えて
  1174. 1:02:16そのレシーバーと共通する方情報っていう
  1175. 1:02:18のを引数とか率で使いたい、そういう再期
  1176. 1:02:20的なデータ構造とか使いたいと思ったら
  1177. 1:02:23使ってみると良さそうだなっていう風に
  1178. 1:02:24思っています。以上になります。
  1179. 1:02:26ありがとうございました。
  1180. 1:02:34タフさん、ありがとうございました。と、
  1181. 1:02:37そうですね、えっと、こう例とか、えっと
  1182. 1:02:39、タオさんの、えっと、解説がすごい
  1183. 1:02:41分かりやすくて、え、びっくりしました。
  1184. 1:02:43で、あとこうそうですね、そのまとめでも
  1185. 1:02:45触れられていたと思うんですけど、あの
  1186. 1:02:48ライブラリー開発でのその再期的方制薬は
  1187. 1:02:51結構使えるところがあるのかなという風に
  1188. 1:02:53思ったので、是非、えっと、自分も使える
  1189. 1:02:55ところがあったら使ってみたいなという風
  1190. 1:02:56に思いました。はい、
  1191. 1:02:59ありがとうございます。
  1192. 1:03:06はい。え、では次は、え、ゴシさんからの
  1193. 1:03:09発表となります。
  1194. 1:03:29はい、オッケーです。はい、えっと、じゃあ
  1195. 1:03:335
  1196. 1:03:33におけるインナーソースモデル構築への道乗りというタイトルで、え、
  1197. 1:03:385
  1198. 1:03:38が発表させていただきます。よろしくお願いします。
  1199. 1:03:42あ、ありがとうございます。
  1200. 1:03:46え、簡単に自己紹介しますと、ま、この
  1201. 1:03:48GOCYという読みにくいスペルでゴシと
  1202. 1:03:50いう、え、呼び方で活動しております。で
  1203. 1:03:53、オープンソースの開発が趣味で、ま、
  1204. 1:03:55長いことを、え、開発しておりますと。で
  1205. 1:03:58、今日、え、は、えっと、珍しく技術的な
  1206. 1:04:01、え、ゴリゴリの話ではなくて、えっと、
  1207. 1:04:04コードのサンプルとかは1回も出てこない
  1208. 1:04:07んですけど、ちょっと最後までお付き合い
  1209. 1:04:08いただければなと思います。
  1210. 1:04:12はい。頭の中でポーンという音を鳴らし
  1211. 1:04:14ながらちょっと読んでいただきたいんです
  1212. 1:04:16けど、え、あなたの会社は車内のOSS
  1213. 1:04:19開発者に、え、ちゃんと報いていますかと
  1214. 1:04:22いう、え、感じからこんな感じでいきます
  1215. 1:04:25。今日は始まるんですけど。はい。え、
  1216. 1:04:29多くの企業はオープンソースに支えられて
  1217. 1:04:31いると思いますと。ま、でも、ま、自社の
  1218. 1:04:34製品が、ま、どのオープンソースにどれ
  1219. 1:04:36だけ依存しているか正しく把握できてい
  1220. 1:04:39ますかと。え、自社が利用している
  1221. 1:04:41オープンソースに貢献している車内の
  1222. 1:04:42エンジニアを把握できていますかと。で、
  1223. 1:04:45それらのエンジニアに報いる車内制度は
  1224. 1:04:47ありますか?みたいなことを、ま、通って
  1225. 1:04:49いきたいわけです。
  1226. 1:04:52じゃあ、ま、オープンソースは、ま、置い
  1227. 1:04:53ておいて、ま、車内のライブラリーの
  1228. 1:04:56向き合い方ってどうですかと。で、車内で
  1229. 1:04:58例えば横断的に利用されるような内の
  1230. 1:05:01ライブラリーやフレームワークってよく、
  1231. 1:05:03ま、どこの会社も作られてるかなとは思う
  1232. 1:05:05んですけど、ま、そういうものに貢献して
  1233. 1:05:07いる人正しく評価できていますかと。
  1234. 1:05:10例えば今AIの対当でエンジニアのヘッド
  1235. 1:05:12カウントを制限するみたいな話が多いです
  1236. 1:05:14けど、ま、これらの内政ソフトウェアの
  1237. 1:05:16開発に貢献するエンジニアに、ま、適切に
  1238. 1:05:19リソースを、え、割り当てられていますか
  1239. 1:05:21と、まさかボランティアでの開発に期待し
  1240. 1:05:24ていませんかみたいな話です。
  1241. 1:05:29で、このボランティア精神へ期待すること
  1242. 1:05:32って、ま、ちょっと、えっと、ま、謝ちか
  1243. 1:05:35なとここには書いてるんですけど、ま、
  1244. 1:05:37その困ってる人が直してくれるとか、ま、
  1245. 1:05:40すごい人が直してくれるとか、ま、思っ
  1246. 1:05:42ちゃいがちなんですけど、ま、そういう
  1247. 1:05:44ものに期待するのは、ま、やめた方がいい
  1248. 1:05:46ですよねって、ま、みんな分かってるん
  1249. 1:05:47ですけど、まあ、なかなかできてないん
  1250. 1:05:49じゃないかなと思っちゃいますと。で、
  1251. 1:05:53組織として、ま、誠実に評価する姿勢を、
  1252. 1:05:55ま、示すことが大事だなとは個人的に思っ
  1253. 1:05:58ていて、ま、こ、ここでいううその貢献
  1254. 1:06:01っていうものを定量的に評価する仕組みを
  1255. 1:06:03用意したりとか、ま、定期的に賞賛したり
  1256. 1:06:06外部にアピアピールしたりする仕組みが、
  1257. 1:06:08ま、必要なんじゃないかと。で、これやっ
  1258. 1:06:11て貢献を評価やにつなげる文化が、え、
  1259. 1:06:14必要なんじゃないかなと思ってます。
  1260. 1:06:18で、ま、こういった文化が育てば、ま、
  1261. 1:06:20貢献しやすくなっていくんじゃないかとな
  1262. 1:06:22と考えていて、え、ま、その貢献する方の
  1263. 1:06:26モチベーションも、ま、その土台があれば
  1264. 1:06:29上がっていくのではないかと。で、
  1265. 1:06:31インナーソースモデルっていうのはそう
  1266. 1:06:33いう土台があってこそ成り立つと思ってい
  1267. 1:06:35て、ま、ここでインナーソースモデルって
  1268. 1:06:37ものについて簡単に触れると、ま、
  1269. 1:06:39オープンソースの開発手法みたいなものを
  1270. 1:06:41、ま、内政のソフトウェアに対して適用
  1271. 1:06:43するような試みであって、ま、さっき言っ
  1272. 1:06:45た車内のライブラリーとかフレームワーク
  1273. 1:06:47みたいなものに、ま、オープンソースの
  1274. 1:06:49ようなオープンな開発手法でこう車内の中
  1275. 1:06:52で、え、特定の人にこうこだわって開発
  1276. 1:06:55するんじゃなくて、ま、車内のその人的
  1277. 1:06:57リソースをいい感じにそういう内の
  1278. 1:06:59ソフトウェアに、えで配分して開発して
  1279. 1:07:01いきましょうと。ま、みんなでいろんな
  1280. 1:07:04その車内の大切なものを作っていき
  1281. 1:07:06ましょうみたいな考え方ですね。
  1282. 1:07:10じゃあ、じゃあどうやって貢献を定量的に
  1283. 1:07:13評価するのかというのが気になると思い
  1284. 1:07:15ます。で、是非ここからはその皆さんの中
  1285. 1:07:18で、ま、この貢献ってものを定量的にどう
  1286. 1:07:21やって評価するのか、ま、自分なりに
  1287. 1:07:22ちょっと考えながら聞いていただければな
  1288. 1:07:24と思うんですけど、ま、自分はこう考え
  1289. 1:07:27ましたというのを話していきます。えっと
  1290. 1:07:30、今回、ま、5の話なんですけど、ま、5
  1291. 1:07:33に、え、まず限定して評価する仕組みを
  1292. 1:07:36考えましたと。で、まず、え、
  1293. 1:07:39リポジトリーのMODを全部調べて、で、
  1294. 1:07:42依存ライブラリーを、え、抽出しますと。
  1295. 1:07:45例えばGOModグラフみたいなコマンド
  1296. 1:07:47使うと、えっと、どのモジュールがどの
  1297. 1:07:49モジュールに依存してるか全部分かるん
  1298. 1:07:51ですけど、で、こういうのを使って、ま、
  1299. 1:07:54依存されているライブラリーの方が重要だ
  1300. 1:07:56と考えてスコア付けしますと。え、ま、
  1301. 1:07:59そのライブラリーが成り立つためには、ま
  1302. 1:08:02、依存してるこのライブラリーが必要って
  1303. 1:08:03ことなので、ま、元を辿っていけば、え、
  1304. 1:08:06さ、あの、ずっとその依存回層が、ま、
  1305. 1:08:09深い方が、ま、重要だと考えられるので、
  1306. 1:08:12ま、そのままその数を加点していくという
  1307. 1:08:15方式を取ろうと。で、これら12番を車内
  1308. 1:08:19で管理してる全てのリポジトリーに対して
  1309. 1:08:21操作、反操作していって、ま、モジュール
  1310. 1:08:23ごとのスコアを出しましょうと。例えば
  1311. 1:08:25このゴーラオンオルグXスみたいな
  1312. 1:08:27モジュールだったら、え、Aの
  1313. 1:08:29リポジトリーが10点、Bのリポジトリー
  1314. 1:08:31が20点だったら30点みたいにけると。
  1315. 1:08:34で、この後に、ま、そのモジュールに対応
  1316. 1:08:37するリポジトリー、ホストしてる
  1317. 1:08:38リポジトリーを、え、見つけますと。この
  1318. 1:08:41シスっていうリポジトリーは、ま、この、
  1319. 1:08:44え、リンクで、このリポジトリーで管理さ
  1320. 1:08:46れてるので、ま、こういうものを、ま、
  1321. 1:08:48マップして、ま、保存しておくと。で、
  1322. 1:08:51また別に、ま、リポジトリーに対する、え
  1323. 1:08:54、PRが回りされた数にこのリポジトリー
  1324. 1:08:58ごとに、ま、ついているスコアっていうの
  1325. 1:09:00を掛け算してあげて、おお
  1326. 1:09:03、おお
  1327. 1:09:06。
  1328. 1:09:08あ、はいはい。掛け算してあげると、ま、
  1329. 1:09:12そのスコアっていうものが貢献者に対して
  1330. 1:09:15、ま、付与できるかなと思いますと。で、
  1331. 1:09:18適当な期間を区切って、ま、その間に回り
  1332. 1:09:21されたプルリクエストの、ま、数とか種類
  1333. 1:09:23から、ま、開発者ごとのスコアっていうの
  1334. 1:09:25が算出できるんじゃないかと。で、開発者
  1335. 1:09:28ごとのスコアがあの区切った期間で、え、
  1336. 1:09:32計算できたらじゃあそれを相とすれば、え
  1337. 1:09:35、貢献が大きかった開発者を消賛するなど
  1338. 1:09:38に使えるんじゃないかと考えましたと。
  1339. 1:09:43で、ここで、え、作ったのがこう、5
  1340. 1:09:45MODランクというツールなんですけど、
  1341. 1:09:47ま、この、5モジュールごとに、ま、
  1342. 1:09:49スコアを計算したりとか、ま、ホストされ
  1343. 1:09:51てるリポジトリを見つけてDBに保存して
  1344. 1:09:54くれるっていうツールです。で、1個前の
  1345. 1:09:56ページの4番までこのモジュールに対応
  1346. 1:10:01するリポジトリーを見つけ
  1347. 1:10:02るっていうところまでを担当してくれる
  1348. 1:10:05ツールですと。え、データベースの
  1349. 1:10:07デフォルトはSQなんですけど、ま、
  1350. 1:10:10ライブラリーとしてこれ使うことができて
  1351. 1:10:12、え、ライブラリーとして使う時は、ま、
  1352. 1:10:142位のデータベースに、え、保存する処理
  1353. 1:10:16だけコールバックさせる仕組みがあるので
  1354. 1:10:18、まあ、何でも保存できるんですけど、ま
  1355. 1:10:22、うちの会社では、ま、これを、ま、
  1356. 1:10:24スパナーに保存していって、で、依存して
  1357. 1:10:26いる、ま、モジュールをランキング形式に
  1358. 1:10:28して一覧できるサービスを作ったりしてい
  1359. 1:10:30ます。
  1360. 1:10:34で、ま、ここまで聞いてなんか単純そうだ
  1361. 1:10:36なと思うんですけど、ま、ここから
  1362. 1:10:38ちょっと技術的な話に入ります。で、意外
  1363. 1:10:41と実際はちょっと作ろうとすると大変で、
  1364. 1:10:44ま、リポジトリースキャンってご存知の通
  1365. 1:10:46思いなので、ま、オーガナイゼーションに
  1366. 1:10:49、ま、数とかリポチ取りがあると、ま、
  1367. 1:10:52結構大変なことが多いですと。例えば、ま
  1368. 1:10:55、全部クロンして調べますかと、え、時間
  1369. 1:10:58かかりすぎませんかみたいな話があったり
  1370. 1:11:00、ま、豪とは関係のないリポジトリーって
  1371. 1:11:02のも当然あると思うので、ま、そういうの
  1372. 1:11:04もクローンして調べるんですかって話にも
  1373. 1:11:06ありますと。で、まあ、平行処理できるん
  1374. 1:11:10だったらそれも考慮しないと、え、CPU
  1375. 1:11:13使いきれないだろうしどうしましょうって
  1376. 1:11:14話もあるし、その長いスキャンって長い
  1377. 1:11:17処理なので、ま、リポジット率全部に対し
  1378. 1:11:20てやってったら、ま、途中でなんか失敗し
  1379. 1:11:23ちゃったりとかすることもあると思います
  1380. 1:11:24と。で、そういう時に、ま、途中から始め
  1381. 1:11:27られなかったら困ると思うんで、どうし
  1382. 1:11:29ますかと。で、あとはそのギitubの
  1383. 1:11:32APIっていうのを結構多様すると思うん
  1384. 1:11:34ですけど、ま、数千数万とかになってき
  1385. 1:11:36たらレートリミット大丈夫ですかみたいな
  1386. 1:11:38話もあります。で、これをどうやって解決
  1387. 1:11:41してますかって話をちょっと次にしたいと
  1388. 1:11:43思うんですけど、
  1389. 1:11:45はい。なんかいくつかカテゴリーに分けて
  1390. 1:11:48、えっと、話します。
  1391. 1:11:51で、まずリポジトリーのクローンの最適化
  1392. 1:11:53なんですけど、ま、GitubAPIに
  1393. 1:11:55よる事前フィルタリングっていうのやって
  1394. 1:11:57て、ま、全部そのクローンしちゃうと、
  1395. 1:11:59あの、時間の無駄なので、ま、クロー前に
  1396. 1:12:03GitッハubAPIでそのオルグに存在
  1397. 1:12:05してる全リポジトリーに対して、え、
  1398. 1:12:07リポジトリーがアーカイブ積みかとか
  1399. 1:12:09MODが存在するのかっていうのを事前に
  1400. 1:12:11チェックしてますと。で、不要なクローン
  1401. 1:12:13をスキップして、あの、必要なものだけ
  1402. 1:12:15クローンしてますと。で、ここで問題に
  1403. 1:12:17なるのがキットハubブレートリミットで
  1404. 1:12:19、こういうAPIをそのままレストで使っ
  1405. 1:12:21てるとあっという間にレートリミットに
  1406. 1:12:22足しちゃうので、じゃどうやって工夫し
  1407. 1:12:24ますかって話があって、え、中得代償の
  1408. 1:12:27リポジトリを100件ずつぐらいに
  1409. 1:12:29ジャンクに分割して、ま、グラフQL
  1410. 1:12:31APIを使うことで、ま、コストを低く
  1411. 1:12:33抑えて、あの、できますと。で、グラフQ
  1412. 1:12:37を使う場合は、ま、ネストを少なくすると
  1413. 1:12:40コストがめちゃくちゃ軽くなるので、数
  1414. 1:12:42リポジトリーあっても全然大丈夫ですと。
  1415. 1:12:47で、次にあの復帰処理なんですけど、ま、
  1416. 1:12:49リポジトリーを解析するために、ま、その
  1417. 1:12:52、え、リポジトリーのステータスっていう
  1418. 1:12:53のを逐時データベースに保存してますと、
  1419. 1:12:56その解析したリポジトリのヘッドコミット
  1420. 1:12:58ハとか、ま、アーカイブされてるかどうか
  1421. 1:13:00とか、GOMODがあるかどうかみたいな
  1422. 1:13:01の保存してて、で、次回スキャンする時に
  1423. 1:13:04、え、その最初にGitッハブAPIで
  1424. 1:13:07リポチトリーのステータスを取ってるので
  1425. 1:13:08、ま、その取った時のヘッドコミット
  1426. 1:13:10ハッシュと保存してるコミットハッシュが
  1427. 1:13:12一緒だったら、ま、保存したってことで
  1428. 1:13:14スキップして次に行けるとで再開できま
  1429. 1:13:17すっていう話です。
  1430. 1:13:20で、リソースの最適化だと、えっと、
  1431. 1:13:22スキャン済みの、え、状態を先ほど説明し
  1432. 1:13:25た通りデータベースに保存しているので、
  1433. 1:13:27ま、クロンしたリポジトリーっていうのは
  1434. 1:13:29、え、ま、そのステータスを保存して、ま
  1435. 1:13:31、解析したらすぐに削除することができる
  1436. 1:13:33ので、ま、数リポジトリーディスクに、え
  1437. 1:13:36、置いてあるみたいなことは、え、ない
  1438. 1:13:38ですと。で、CPUを使いきれるように、
  1439. 1:13:41ま、平行も行いましょう。ま、この辺は5
  1440. 1:13:43が得意なところなので特別なことはないん
  1441. 1:13:45ですけど、ま、ワーカーベースに平行
  1442. 1:13:47スキャンサポートしたり、ま、GOMOD
  1443. 1:13:49が1リポジトリに複数ある場合もあると
  1444. 1:13:52思うんで、ま、そういう時は平行に
  1445. 1:13:53スキャンしますと。
  1446. 1:13:56で、意外と大変なのがモジュールのホスト
  1447. 1:13:59リボジトリーの取得方法で、え、実は
  1448. 1:14:02ちょっと難しくて、その最初いくつかこの
  1449. 1:14:063リステップを使って上から順番に、え、
  1450. 1:14:09リポジトリーのホストが、え、取れるか
  1451. 1:14:11どうかやってたりしますと。で、最初は
  1452. 1:14:13その5モジュールプロキシから取得仕様と
  1453. 1:14:16して、え、ま、アクセスするんですけど、
  1454. 1:14:20ま、当然その車内のライブラリーとかは
  1455. 1:14:22ここにないし、ま、色々取れないことも
  1456. 1:14:25ありますと。ま、ここから取れる時は
  1457. 1:14:28レスポンスのにあるオリジンURLって
  1458. 1:14:30いうのが取れるので、それでいいんです
  1459. 1:14:31けど、ま、このGOパッケージインとかに
  1460. 1:14:34、え、でホストされている時はちょっと
  1461. 1:14:36困っていて、え、この場合は、あの、特別
  1462. 1:14:39なんですけど、そのネーミングの規則が
  1463. 1:14:41あるので、実はこういう感じでマップする
  1464. 1:14:44と、あの、ホストリポチ取りが取れますと
  1465. 1:14:46。で、最終的には、ま、これでも対応でき
  1466. 1:14:49ない場合はこのインポートメタタグを見る
  1467. 1:14:51ことによって、え、分かるので、ま、
  1468. 1:14:53こんなことをして調べて保存してます。
  1469. 1:14:57で、最後なんですけど、ま、インナー
  1470. 1:14:59ソースモデルを構築するためには、ま、
  1471. 1:15:01貢献が適切に評価される文化が必要だと
  1472. 1:15:05自分個人的には考えてますと。で、5に
  1473. 1:15:07おける会社にとって重要なソフトウェアの
  1474. 1:15:10への貢献っていうものを定量的に評価する
  1475. 1:15:12仕組みを考えてオープンソースとして提供
  1476. 1:15:14しました。で、ゴモドランクで工夫した点
  1477. 1:15:17についていくつか紹介させていただきまし
  1478. 1:15:19た。
  1479. 1:15:20じゃあ、最後にその同じ仕組みは実はそのパッケージソンとかで、ま、他の言語当てにも同じようにできるはずなので、ま、誰か作ってみませんかというところで閉めたいと思います。ありがとうございました。
  1480. 1:15:41ありがとうございました。いや、すごいいい話でしたね。
  1481. 1:15:45で、結構こう直接的な依存とかだとこう、
  1482. 1:15:48ま、訂正的にも評価できると思うんです
  1483. 1:15:50けど、そっからの先のこう水依存とかだと
  1484. 1:15:52、ま、全然見えなくなっちゃったりとかも
  1485. 1:15:54すると思うので、すごいそこはいい
  1486. 1:15:56取り組みだなという風に思いました。はい
  1487. 1:15:58、ありがとうございました。
  1488. 1:16:03はい、では、えっと、こちらの方で、えっ
  1489. 1:16:05と、発表、発表は、え、以上となります。
  1490. 1:16:18はい。え、で、え、ちょっと時間が押し
  1491. 1:16:21ちゃってはいるんですけども、えっと、
  1492. 1:16:22これからちょっとアンケートのご回答にご
  1493. 1:16:24協力をお願いいたします。で、その後に、
  1494. 1:16:26えっと、オフライン参加者の、え、
  1495. 1:16:28オフィスに来られている、え、皆様は、
  1496. 1:16:30えっと、懇新会も設けておりますので、
  1497. 1:16:31是非お楽しみください。はい。で、えっと
  1498. 1:16:34、オンライン側の方に関しましては、えっ
  1499. 1:16:35と、こちらの方で以上となります。と、
  1500. 1:16:37本日はご参加いただきありがとうござい
  1501. 1:16:39ました。
  1502. 1:16:43で、アンケートはこちらになっているので是非ご回答よろしくお願いします。
  1503. 1:16:55マジですか?少しお待ちください。
  1504. 1:18:34はい。えっと、今アンケートの方が、え、
  1505. 1:18:36見れるようになったということなので、
  1506. 1:18:38是非、えっと、まだご回答されてない方は
  1507. 1:18:40よろしくお願いいたします。はい、では、
  1508. 1:18:44えっと、オフラインの方の、えっと、方は
  1509. 1:18:45、え、以上になります。え、ご参加
  1510. 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.