- Ruby / Rails関連
週刊Railsウォッチ: GitHub CopilotのAI補完、Pure Ruby実装のRuby JIT rhizome、PostgreSQLのPG-Strom拡張ほか(20210706後編)
こんにちは、hachi8833です。Kaigi on Rails 2021のプロポーザル募集中です。
【プロポーザル募集中🎙】
Kaigi on Railsであなたの「開発への情熱トーク」してみませんか?
Railsネタだけでなく、Web開発に関わるネタも大歓迎です!
締め切りは7月31日(土)。皆様からのご応募を心よりお待ちしております✨https://t.co/fFdxO37Zhm#kaigionrails— Kaigi on Rails (@kaigionrails) July 6, 2021
🔗Ruby
🔗 rhizome: Pure Rubyで実装されたRuby JIT(Ruby Weeklyより)
つっつきボイス:「RubyのJITをPure Rubyで実装ですか」「すごいものを作る人がいるんですね」「rhizomeって生物学用語だったかな?」「植物の"地下茎"の意味で、哲学用語にもなってるみたい↓」
参考: リゾーム - Wikipedia
英語の発音だと「ライゾーム」が近いようです。
「READMEには"You're supposed to read it, not use it!"ってある」「使っちゃだめよ読むだけよ、ですね」「パーサーやバイトコードなど、JITに必要そうな要素のドキュメントはひととおりあるみたい」「ドキュメントそのものもかなりみっちり書かれてる感じですね、すごい👍」「壮大なプロジェクト」
🔗 Rails Girls Japan
"女性だけのコミュニティを作りたいわけではなく、苦手意識を克服し、最初の仲間を持ってもらおうと考えています" 🙏 » 自分の世界は自分の力で少しずつ変えられる! Rails Girls Japan 江森真由美さんに聞いたRubyコミュニティの世界 (1/2):CodeZine(コードジン) https://t.co/7H2keaH0Jo
— Kakutani Shintaro (@kakutani) July 1, 2021
つっつきボイス:「Rails Girlsは日本でもワールドワイドでも活躍していますね」「Rubyでこういうコミュニティ活動が盛んなのはいい👍」
後で他の言語にも同じような活動があるかどうか少しだけ探してみました。
参考: Python Girls
参考: js-girls
参考: GoLang Girls (Pune, インド) | Meetup
参考: GTUG Girls - connpass -- さまざまな言語やフレームワークが対象
🔗 記法の名前
昔同じ疑問を持って調べた結果、特に公式の定義はないという結論に落ち着きました。少なくともJLSとかJVMSとかには無かったはずhttps://t.co/CRJzmSSaDG
— 書けない猫はただの猫さ (@Kengo_TODA) July 1, 2021
つっつきボイス:「そうそう、クラス名#インスタンスメソッド名
やクラス名.クラスメソッド名
みたいな記法に名前欲しい」「インスタンスメソッドのときは#
で、クラスメソッドのときは.
で書く記法、たしかに名前がありませんね」「レビューのときにこの記法を名前で呼びたくなることがよくあります」
「最初にRubyを学んだときに#
は実際のコードに出てこないので不思議に思った覚えがあります」「Rubyの公式ドキュメント↓でこの記法が使われているので、そういうものだと思ってました」「Rubyを使っている人にとってはもう常識でしょうね」「知らないとドキュメントを読むのが大変」
参考: オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル (Ruby 3.0.0 リファレンスマニュアル)
# https://docs.ruby-lang.org/ja/3.0.0/class/IO.html より
IO.foreach
IO.readlines
IO#each_line
IO#gets
IO#getc
IO#ungetc
IO#read
IO#readchar
IO#readline
IO#readlines
🔗 その他Ruby
「Rubyベストブログ集だそうですけど、Evil Martiansのブログがエントリにないのが意外ですね」「そうなんですよ、TechRachoでは露出度高いのに(お世話になってます🙇)」
参考: Martian Chronicles, Evil Martians’ team blog
🔗DB
🔗 『決済システムの残高管理周りのDB設計と戦略』
つっつきボイス:「決済システムを含む、いわゆる口座系のシステムはこの記事のような設計にするのが一般的ですね」「なるほど」「応答速度を上げるために現在の残高を保存することもないわけではありませんが、基本的に口座系のシステムでは入金と出金を積み上げていく設計になります」「そうそう、履歴テーブル的に作りますよね」「そのように作っておかないと、たとえば特定日時の残高を求められなくなってしまいます」
「履歴テーブルだからUPDATEは禁止ですよね」「当然禁止: UPDATEしたらエビデンス改ざんになってしまいます」
「記事を見ていても、口座系システムの基本部分は昔からあまり変わりませんね: ポイントやソシャゲの"石"を扱うシステムだと現金と関連する"有償石"と"無償石"を分けて管理する必要があるとか、速度面や設計上の戦略は変わってくるところもありますが」「ふむふむ」
「こういう業務に寄り添ったDB設計記事をあまり見かけたことがなかったかも」「この種の記事は昔からいろいろありますよ: Web系をやっているとあまり見えてこないかもしれませんが」「あぁ、探すところが違ってたのか」「普段B2Cなシステムばかり触っているWeb系ソフトウェアエンジニアだと、こういうビジネストランザクションを扱うチャンスがなかなかないこともあるので、こうした「堅い」システムの設計も勉強しておくと学べることがあると思います」「そうですね」
「こういう定番のシステム設計を、より現代的な技術を使って改めて丁寧に説明してくれる記事はありがたい👍」「たしかに」
🔗 PG-Strom: GPUでPostgreSQLのSQLワークロードを高速化
- 日本語ドキュメント: PG-Strom Manual
Stormかと思ったらシュトローム(Strom)だそうです。
PG-StromはPostgreSQL v11および以降のバージョン向けに設計された拡張モジュールで、チップあたり数千個のコアを持つGPU(Graphic Processor Unit)デバイスを利用する事で、大規模なデータセットに対する集計・解析処理やバッチ処理向けのSQLワークロードを高速化するために設計されています。
同ドキュメントより
つっつきボイス:「ここに書かれている↓ようなSCANやJOINやGROUP BYは実行計画的にもパラレル処理しやすいので、PG-StromはそういうものをGPUで処理するようですね」
PG-Stromの中核となる機能は、SQL命令から自動的にGPUプログラムを生成するコードジェネレータと、SQLワークロードをGPU上で非同期かつ並列に実行する実行エンジンです。現バージョンではSCAN(WHERE句の評価)、JOINおよびGROUP BYのワークロードに対応しており、GPU処理にアドバンテージがある場合にはPostgreSQL標準の実装を置き換える事で、ユーザやアプリケーションからは透過的に動作します。
同ドキュメントより
「PG-StromはApache Arrow関連でググって見つけました」「なるほど、Apache Arrowとも相性よさそう」
参考: Apache Arrow - PG-Strom Manual
参考: Apache Arrow | Apache Arrow
「GPUダイレクトSQL実行という機能は、CPUバスを通さずにSSDからPCIe(PCI Express)バス経由でダイレクトにGPUに接続するんですね」「名前が強そう」「メモリにも読み込まずにGPUに転送するからメモリも節約できるのか: こういう構成だから、NVMe(NVM Express)経由で直接SSDを接続して、NVIDIAのGPUDirect Storageモジュールなどを使う必要があるのね」
本機能は、内部的にNVIDIA GPUDirect Storageモジュール、またはHeteroDB社の独自Linux kernelモジュールであるNVME-Stromモジュール(RHEL7/CentOS7)を使用して、GPUデバイスメモリとNVMEストレージとの間でP2Pのデータ転送を行います。したがって、本機能を利用するには、PostgreSQLの拡張モジュールであるPG-Stromだけではなく、上記のどちらかのLinux kernel拡張モジュールが必要です。
また、本機能が対応しているのはNVME仕様のSSDや、NVME-oFで接続されたリモートデバイスのみです。SASやSATAといったインターフェースで接続された旧式のストレージには対応していません。今までに動作実績のあるNVME-SSDについては 002: HW Validation List が参考になるでしょう。
同ドキュメントより
参考: PCI Express - Wikipedia
参考: NVM Express - Wikipedia
「PG-Stromって何だかとてもハードウェア寄りのシステムですね」「ぽすぐれは昔からこういうハードウェアの性能を限界まで引き出すような機能を研究したり実現したりしていますね: いかにL1キャッシュに乗せるかとか」「お〜」
「こんなすごいシステムを実際に使うのかな?使うんでしょうね」「有効なクエリにはものすごくよく効くと思います」「なるほど」「一種のクエリ計算機的なものをたくさん生成して、GROUP BYなどのパラレル化しやすい処理を分散するといった処理は昔から行われていますね」
「こういうシステム構成なら、必ずしも最新のGPUでなくても速度を出せそう: たとえばビットコインを掘るにはもう力不足になった安いGPUをたくさん手に入れて、その上でぶん回すみたいなこともできるかも」「へ〜!」「今はGPUコア数も増えましたよね: 昔のGPUはコア数はあっても機能が少なかったんですが、最近のGPUはたいていのことができるようになっていますし、メモリもメインのものより高速だったりしますね」「PG-Strom、なかなか面白い👍」
参考: Graphics Processing Unit - Wikipedia
以下はつっつき後に見つけたツイートです。
PG-Strom v3.0をリリースしました!
主な変更点)
・NVIDIA GPUDirect Storageに対応
・GPU版PostGISとGiSTインデックスへの対応
・GPUキャッシュ機能を追加
・カスタムGPUデータ型/演算子(実験的)
・GPLv2からPostgreSQLライセンスに変更
・数多くのバグ修正https://t.co/C00mVQ4MgR pic.twitter.com/Qhu6aq4Oh5— 海外 浩平|KaiGai Kohei🌻 (@kkaigai) June 30, 2021
🔗言語/ツール/OS/CPU
🔗 GitHub CopilotのAI補完機能
おーすげーどうつかうんやろ / GitHubにAIプログラミング機能「Copilot」登場 関数名とコメントから中身を丸ごと自動補完 - ITmedia NEWS https://t.co/kpodLR7iQ4
— すろっくさん (@srockstyle) June 30, 2021
つっつきボイス:「ぼくのツイートが載ってる〜」「GitHub Copilot、早くもあちこちでネタにされていますね」「この間ウォッチで取り上げたAWS Copilot(ウォッチ20210601)ではない😆」
GitHub CopilotでQuine書こうとしたら著作権を奪われました pic.twitter.com/egMROlzLaQ
— Yusuke Endoh (@mametter) July 1, 2021
「GitHub Copilotってどうなんでしょうね?」「Copilot自体はいいと思いますよ: ツイートにも書きましたけど、AIで使われたコードのライセンス周りはしばらく問題になるかもしれませんが」「あ、GPLか」
GitHub Copilot、いいなーと思うのは実際に動くコードを書く開発者向けよりむしろ企画・ビジネス寄りの人かなと思っている。ビジネス側のまとめた仕様と実装側が要求する仕様・前提条件の差を埋めるのに使えるのではないかと(続
— Masato Mori (@morimorihoge) June 30, 2021
GitHub Copilot。「AIなんて信用できないから禁止」とかいうところは論外だが、ライセンス問題が絡むとなると禁止には妥当性があるよなあ。流石にその辺は考慮して学習元データ取ってきてるだろうけど、mimemagic事件みたいにリポジトリ側のライセンスが間違ってた場合はどうなるの?とかはある
— Masato Mori (@morimorihoge) June 30, 2021
github copilot はgplのコードを学習してんならgithub copilotが生成するコードはgplなコードのderivative worksでしかあり得ねえだろうが、という指摘がされており一考の価値がある https://t.co/pacomctOzW
— 7594591200220899443 (@shyouhei) June 30, 2021
参考: GNU General Public License - Wikipedia
「個人的にこれがウケました↓」「ベストテキストエディターはVim?」
— Yusuke Endoh (@mametter) July 1, 2021
「@mametterさんもその後クワインを補完だけで書くのに成功してますね」「当分遊べそう」
特定の仕様を満たすコードが補完される書き始めの短さを競うコードゴルフのような競技が成立しそう
— KOBA789 (@KOBA789) July 1, 2021
🔗 AI補完よもやま
「GitHub Copilotで思ったんですが、AI補完が使えれば、自分が書いたことのないプログラミング言語でも書けるようになるんじゃないかな」「あ、それいいですね!」「他の言語の経験者なら、たとえばRubyの構文を詳しく知らなくてもRubyを書けるかも」「正しい構文を補完してくれれば、関数の引数のおかしいところを自分でちょっと修正するぐらいはできそう」「夢が膨らみますね」
僕達が失業するまであと少しです。(TABとENTERしか押してない) pic.twitter.com/YdPPWcjpuf
— mattn (@mattn_jp) July 1, 2021
「GitHub CopilotのようなAI補完でプログラマーが職を失うかどうかについても、詳細設計書どおりにコーディングするだけのプログラマーならともかく、AIで補完したコードをちゃんと吟味して評価できるのは結局プログラマーなのであまり心配していませんし、便利なものなら使えばいいくらいの気持ちです」「ですよね」「機械翻訳と人間の翻訳者の関係にも似ていますね」
「AI補完が今後何か問題になるとすれば、プログラミングの授業で出す課題を採点するときとか、採用面接で成果物を評価するときなんかに、どこまで本人が作ったのかの判断が難しくなるかもしれない、とかかな(面接の場でコーディングするところを見せてもらうならいいんですが)」「たしかに」「論文のパクリチェッカーのようにはいかなさそうですね」「補完では書けないような問題を工夫する必要があるかもしれない」
🔗 TabNine: VSCodeのAI補完拡張
つっつきボイス:「自分はまだGitHub Copilotが招待待ちですが、こちらのAI補完はVSCode拡張なのですぐ動かせます」「MicrosoftはVSCodeを持っているから、AI補完もVSCodeでやれる強みがある」「JetBrains IDEもAIまでは使っていないけどコード補完や表示の優先順位とかは相当賢くできてますね」
「ところで今使いたいのはむしろGitHub Codespacesかな: 自分もまだ招待待ち」「WebだけでできるIDEですね」「Codespacesが使えれば本当にブラウザだけで開発できるようになるのが大きい」「環境構築の手間から解放されたいですね」
参考: Codespaces
🔗 その他
🔗 howtheytest: 有名企業のテスト方法集
なにこれすごい / abhivaikar
/howtheytest https://t.co/TyGLKMVlgr— すろっくさん (@srockstyle) June 29, 2021
つっつきボイス:「これもぼくのツイート〜」「大手企業のソフトウェアテスト方法の記事や動画へのリンク集だそうです」「さっき眺めてたら、PayPalとかいくつかのエントリは中身が空でした😆」「軽くずっこけましたね」
「少し前ならAwesomeなんとかみたいな名前になりそうなリストですけど、使われすぎて陳腐化してきた気もするので違う名前にしたのかな」「いっときGitHubリポジトリで山ほど見かけましたけど、たしかにAwesomeは手垢ついちゃいましたね」
🔗 fishとzshとbash
Design — fish-shell 3.2.2 documentation https://t.co/xj4L378ThT
ああ、この哲学はいいな。はるかにモダンだ、古代のunixプログラミング時にはなかった、現代のコマンドが備えるべき設計方針だ。
これでfishがかなり好きになった。— k.bigwheel⌨️🦀🖊️ 開発基盤エンジニア(SRE)@株式会社Speee (@k_bigwheel) June 29, 2021
つっつきボイス:「fishはまだ使っていないけど、そろそろシェルを変えてみてもいいかな: WSL2上のUbuntu 20.04の標準bashでコマンド補完がイマイチうまく動かなくて」「あ〜」
「fishもよさそうだけど、zshもいいかも」「ぜひぜひ!ぜとしぇはいいですよ〜」「お、zshお使いなんですね」「基本zshです」「zshなら何でもリッチに動くし、凝ったコンフィグにしなければ基本的にbashと同じ挙動なんですよね」「そうそう」
「今のbash環境だと、ハイフン抜きのdocker compose
(Docker Compose CLI)で-f
オプションの補完が効かないのがつらい」「あ〜なるほど」「従来のハイフンありdocker-compose
なら補完が効くので、こっちで補完してからハイフンを消したりしているんですけど、さすがに何度もやっていると地球環境に優しくないなと」「ですよね」
「原因不明なんですが、ハイフンありのdocker-compose
だとWSL2のUbuntu環境でたまにペアレントディレクトリを見失うことがあって、ハイフンなしのdocker compose
なら問題なくやれるんですよ」「う〜む」
「そういえば最近ハイフンありのdocker-compose up
を使っていると"docker compose up
がありますよ"みたいなメッセージが出るようになりましたね」「へ〜、今後はDocker Compose CLIがメインになるのかな、既に使ってますけど」
後編は以上です。
バックナンバー(2021年度第3四半期)
週刊Railsウォッチ: DI的な書き方が必要なとき、脆弱性学習用アプリRailsGoat、brakemanは優秀ほか(20210705前編)
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)