🚅

GitHub CertificationやらCIやらasdf互換ツールやら|Productivity Weekly(2024-01-10号)

2024/01/22に公開

こんにちは。サイボウズ株式会社 生産性向上チームの平木場です。

僕たち生産性向上チームは毎週水曜日に Productivity Weekly という「1 週間の間に発見された開発者の生産性向上に関するネタを共有する会」を社内で開催しています。
本記事はその時のネタをまとめたものです。

2023-01-25 号から、基本的に隔週で連載することとしました。たまに単独でも投稿するかもしれません。
今週は 2024-01-10 単独号です。

今回が第 138 回目です。過去の記事はこちら

news 📺

GitHub Copilot Chat now generally available for organizations and individuals - The GitHub Blog

https://github.blog/2023-12-29-github-copilot-chat-now-generally-available-for-organizations-and-individuals/

2023 年の年末にいよいよ GitHub Copilot Chat が GA(一般公開)されました。これにより、すべての GitHub Copilot 利用者は Chat 機能を利用できるようになりました(有効化が必要)。

GitHub Copilot 自体はコード補完をする機能であり、コードの記述中に次の単語などを提案してくれるものとなっています。Copilot Chat は対話型の機能であり、開発に関する質問をしたり、開いているコードの解説をしてもらうことができます。また、質問に答えるだけでなく、コード生成もできるため、Copilot Chat にユニットテストを記述してもらうことすら可能です。

僕はベータ時代に少し触っていたことがあるのですが、手軽にコードに関して質問できるのはやはり便利でしたね。ユニットテストを書かせる機能はよく使っていました。昔は英語で回答されることがしばしばあって「日本語で回答してください」とさらに質問することが多々ありましたが、現在は VSCode の表示言語がデフォルトになったみたいでだいぶ使いやすくなってそうです。

Chat using configured display language
By default, Copilot Chat now initially responds using your configured display language in VS Code. You can override this automatic behavior by configuring github.copilot.chat.localeOverride.
https://code.visualstudio.com/updates/v1_84#_chat-using-configured-display-language

GitHub Copilot for Business として使っている方はもしかしたら管理者によって Copilot Chat が一律無効化されているかもしれませんね。もしベータという理由で無効化されているのであれば管理者に問い合わせてみてもいいかもしれません。

GitHub Copilot 利用者の皆さんぜひ一度使ってみてください。

本項の執筆者: @korosuke613

GitHub Certifications are generally available - The GitHub Blog

https://github.blog/2024-01-08-github-certifications-are-generally-available/

GitHub が認定資格を提供するようになったようです。現時点では次の 4 つの資格が提供されています。

  • GitHub Foundations Certification[1]
  • GitHub Actions Certification[2]
  • GitHub Advanced Security Certification[3]
  • GitHub Administration Certification[4]

学習ガイドトレーニングが提供されています。

試しに GitHub Actions のトレーニングを眺めてみたところ、基本的なワークフローの書き方から始まり、カスタムアクションの作り方、アプリケーションの Azure へのデプロイ、Self Hosted Runner の設定など、かなり実践的な内容が含まれていました。

試験を受けないとしても、トレーニングを受けるだけでも知識が身につきそうです。公式トレーニングがあるとキャッチアップやオンボーディングに役立ちそうでいいですね。

本項の執筆者: @r4mimu

know-how 🎓

メルコインにおけるGitHub Actions活用術 | メルカリエンジニアリング

https://engineering.mercari.com/blog/entry/20231223-mercoin-github-actions/

メルコインさんの GitHub Actions で利用している Action やリリースフローに関する自動化の紹介記事です。

Auto Correct というワークフローを用意して format、lint、コード生成を CI で実行しているとのことです。
GitHub App のトークンを用いたコミット署名や、concurrency を利用して無駄な CI の実行を防いでいたりと、作り込まれているなと感じました。
この記事で、Action のバージョンをハッシュで固定化する pinact という Action を知りましたが、地味に便利な Action ですね。
様々な CLI ツールを aqua でインストールしているので、lazy install が効いていそうで、aqua の良さが活きていそうです。

GitHub Actions での自動化を検討している方は参考になると思います。

本項の執筆者: @r4mimu

CircleCI の費用が突如 1.5 倍になった話 | Wantedly Engineer Blog

https://www.wantedly.com/companies/wantedly/post_articles/879561

CircleCI の費用が増加した原因調査とその対応について書かれた記事です。

原因としては、Renovate の rebase だったそうです。これに対して、開発生産性は落とさずに費用を抑える際の考えが述べられていました。
CI ワークフローをチューニングすることでもさらに費用を抑えられるかもしれないが、費用対効果を考えるとそこまでの労力をかけるのは難しいということで、ある程度の費用は受け入れるという判断もされていて、なるほどなと思いました。

CircleCI API からユーザーの pipeline の実行履歴を集計して分析されている点や、時には費用をかけても開発生産性を上げることも大事だという点が印象的でした。

本項の執筆者: @r4mimu

JavaScriptの組み込みAPIのIntlが凄いので紹介してみた。

https://zenn.dev/ame_x/articles/e314ce3a84ad1f

JavaScript の組み込み API である Intl について紹介している記事です。Intl は i18n[5]に関する便利 API 群です。

この記事では、Intl オブジェクトの持つ 9 つの機能(コンストラクタ)と 2 つのサブ的な機能(メソッド)を機能ごとになぜ嬉しいか&使用例を紹介してくれています。

Intl は機能が多く存在は知っていてもよくわかっていない人は決して少なくないと思います(僕もそうでした)。僕もこの記事の例を実際に手元で色々動かしてみて[6]便利だなと思った口です。なんとなくでしか知っていなかったのでとても良かったです。

この記事を読んで大まかに Intl の機能を知ることで、今後の開発に役立てていきたいですね。

本項の執筆者: @korosuke613

GitHub Actionsのサードパーティーマネージドランナーの紹介 - いけだや技術ノート

https://ikesyo.hatenablog.com/entry/github-actions-managed-runners

GitHub Actions でジョブを実行するためのランナーは、GitHub が管理してくれるものとユーザーが自身で管理するセルフホストランナーの 2 種類が存在するのですが、第 3 の選択肢として GitHub 以外がホスティングしているセルフホストランナーを紹介している記事です。

紹介されているほとんどのサービスでは GitHub がホスティングしているランナーより価格と性能に優れていることをアピールしており、X86 に加えて ARM のランナーを提供しているサービスもあるようです[7]。また、サービスによってはキャッシュの高速化に力を入れていたり、SSH デバッグ可能だったりと単に GitHub のランナーよりコスパに優れているだけではないことも紹介されています。

個人的に一番興味深かったのは最後に紹介されている Cirrus Runners でした。近年の CI サービスではビルドに使用した時間に応じた従量課金が一般的となるなか、Apple Silicon の mac が$150/month の固定料金で利用できるというのはかなりの格安だと思います。

実は自分は Cirrus という会社自体は以前から知っており Cirrus CI という GitHub Actions とは異なる独自の CI サービスの運用元で、そこで利用されている基盤技術である macOS の VM を動かす tart をかつては OSS[8]として公開していた企業として覚えていました。その Cirrus が GitHub Actions 用のランナーも提供しているので、記事中で ikesyo さんが述べられているように他サービスよりも技術的な優位性がありそうだと自分も思いました。

GitHub も M1 のランナーを既に public beta で提供し始めておりサイボウズでも既にいくつかのチームが利用し始めていますが、やはりお値段はそこそこするという印象です。今後 CI の費用が問題となってきた場合に自前でセルフホストランナーを運用する以外の選択肢として今回紹介されているサービスは覚えておきたいと思いました。

本項の執筆者: @Kesin11

tool 🔨

mise (旧 rtx) で脱 node-build (asdf)

https://zenn.dev/teppeis/articles/2024-01-introduce-mise

複数のツールのバージョン管理ツール mise が盛り上がっていますね!この記事では主に node を利用する視点から asdf と比較をしています。

メリットとして以下が挙げられています。

  • 動作が速い
    • 実際に手元で mise install node@20 のように実行してみたところ、1.5 秒で完了しました。(asdf でも同様のコマンドを実行してみたところ 4.5 秒ほど)
    • 正確な計測はできていませんが、ちょっと使った感じでは確かに動作が軽快だと感じます。
  • node の最新バージョンの反映が早い
  • asdf のような shim 方式ではなく mise は PATH 方式なので shim 周りで詰まることがない

デメリットとして古い node(v14 以前)を入れる際の x64 バイナリが入れづらい、などが挙げられていますが、通常使う分には mise で問題になることはあまりなさそうです。ぜひ一度試してみましょう。

個人では volta を使っていたので volta とも比較してみたいです。また、バージョン管理ツールの仕組みも初めて知ったので、他の言語のバージョン管理ツールの仕組みも気になりました。

本項の執筆者: @uta8a

大規模コードベース向けASTツールのast-grepについて

https://zenn.dev/makotot/articles/ea823805582e5c

AST を用いて検索・置換を高速に行えるツール ast-grep の公式ドキュメントに沿って理解を深めている記事です。

grep と名前がついていますが、実際には想像される grep の単純な使い方よりも多機能で、検索や置換、Lint や Codemod に利用できます。
(Codemod: 大規模コードのリファクタリングに用いられる、コードを AST や構造体レベルまで変換した後に別のコードに変換する手法)

対象言語について、個人的には TypeScript や Rust のように、すでに高機能な Linter がある言語ではユースケースがないのでは?と思ったのですが、試してみると検索や置換が気軽に行える点で高機能 Linter より有用なケースがありそうです。

また、高速に動作するとあったので大規模なコードベースで ast-grep を試しに使ってみました。対象は rust-lang/rust の compiler/ ディレクトリ以下、調べた時のコミットハッシュは 3071aefdb2821439e2e6f592f41a4d28e40c1e79 です。

compiler/ ディレクトリ以下にはコードが 532058 行あります。
次のクエリを投げて、rust のコンパイラで let-else 構文が使われている箇所を検索しました。

let Some($$$) = $$$ else {
    $$$
};

実行してみるとたくさんマッチします(出力は省略)

$ time ast-grep --pattern 'let Some($$$) = $$$ else {
    $$$
};' --lang rs compiler

...
compiler/rustc_span/src/lib.rs
2441│        let Some((file, line_lo, col_lo, line_hi, col_hi)) = ctx.span_data_to_lines_and_cols(&span)
2442│        else {
2443│            Hash::hash(&TAG_INVALID_SPAN, hasher);
2444│            return;
2445│        };
...

ast-grep --pattern 'let Some($$$) = $$$ else {     $$$ };' --lang rs compiler  3.42s user 0.18s system 528% cpu 0.680 total

今回のケースに関しては 10^5 オーダの行数に対して 1 秒オーダで動作することが確かめられました。

参考として、単純に grep をかけた様子は次のとおりです。text ベースの方が早いのはそうなんですが、個人的には AST 変換を通しても思ったより高速だなと感じました。

Program : grep -R 'let Some' compiler
CPU     : 27%
user    : 0.044s
system  : 0.053s
total   : 0.354s

大規模コードベースで検索や置換に困った際には ast-grep による AST ベースのアプローチも試してみてはいかがでしょうか。

本項の執筆者: @uta8a

最近気に入っているOSSを淡々と紹介する

https://zenn.dev/noplan_inc/articles/3a623b2eb6d42d

気に入っている OSS をツール・フレームワーク問わず紹介していく記事です。僕はこの中では sheldon, lima(Rancher Desktop のバックエンドとして使用), ghq, fzf を利用していたので、この機会に star していないものはお世話になっていますという気持ちを込めて star しておきました。ghq も fzf もいいぞ。

使っていないものだと aicommits が気になりました。軽く見た感じ OpenAI の API Key を用いているようです。GitHub Copilot に去年搭載された Commit message generation using Copilot in VS Code 機能と比較してみたいですね。

本項の執筆者: @uta8a

read more 🍘

Productivity Weekly で出たネタを全て紹介したいけど紹介する体力が持たなかったネタを一言程度で書くコーナーです。

  • know-how 🎓
    • DenoとFreshでペアプロ・モブプロ用タイマー『timer.team』を開発して得た知見⏰
      • Deno や Deno 組み込みの KVS こと Deno KV、Deno 公式のフルスタックフレームワーク Fresh、Deno 公式のサーバレスプラットフォーム Deno Deploy などをフル活用して作られたモブプロタイマーアプリ timer.team の紹介記事です
      • timer.team の技術スタックをふんだんに説明してくれており、Deno を使った開発を行う上で大変参考になる記事だと思いました

あとがき

新年あけましておめでとう号でした。今週もネタが盛りだくさんでしたね。

サイボウズの生産性向上チームでは社内エンジニアの開発生産性を上げるための活動を行なっています。そんな生産性向上チームが気になる方は下のリンクをクリック!
https://speakerdeck.com/cybozuinsideout/engineering-productivity-team-recruitment-information

脚注
  1. 平木場注: GitHub、git 全般の基礎知識 ↩︎

  2. 平木場注: GitHub Actions の基礎知識 ↩︎

  3. 平木場注: GitHub Advanced Security の基礎知識 ↩︎

  4. 平木場注: GitHub の管理者としての基礎知識 ↩︎

  5. Internationalization の略。今の時代国際化対応は無視できないぜ! Internationalization (i18n) (国際化対応) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN ↩︎

  6. try: Intl by korosuke613 · Pull Request #52 · korosuke613/playground ↩︎

  7. 記事中でも紹介されていますが、GitHubもARMのランナーを提供する予定を公開しています(現在は private beta) ↩︎

  8. 以前は AGPL-3.0 として公開されていましたが、2023/03/01のpull-req以降は Fair Source ライセンスに変更されています。 ↩︎

GitHubで編集を提案
サイボウズ 生産性向上チーム 💪

Discussion