手元の便利スクリプトをシェルスクリプトからdeno+daxに置き換えた

みなさん、シェルスクリプト書いていますか?

私は手元環境の更新用にbrew upgraderustup updateなどをまとめたシェルスクリプトを書いて定期的に実行していました。

便利にこのスクリプトを叩いていたのですが、linuxmacで実行するコマンドを変えるなどの込みいったロジックを書こうとするとシェルスクリプトでは力不足を感じます。 また存在しないコマンドは実行しないといった機能や文字をカラフルにしたいなどの機能追加を考えていましたが、これらはあまりシェルスクリプトではやりたくないです。

なので今回はdenoとdenoのライブラリであるdaxを用いてシェルスクリプトを置き換えました。

なぜdenoを使うのか

denoはマルチプラットフォームで動作するJavaScript ランタイムです。ネイティブでTypeScriptをサポートしていることやライブラリを使用するのにあらかじめ別途ライブラリをダウンロードすることが不要などの利点があります。

今回置き換える予定のアップデートスクリプトmaclinuxの両方の環境で実行されてほしく、またなるべく事前準備なく実行されてほしいです。

denoはimport $ from "https://deno.land/x/dax/mod.ts"のようにライブラリの参照元をURLを使って指定することができます。また実行時にローカルに存在していなければ取得をしてくれます。ユーザーはどのライブラリがインストールされているかを気にせずにただ実行すればよいだけです。

dax

daxはdeno上で動くシェルラッパーです。JavaScriptのタグ付きテンプレートを用いて実行することができます。また文字列などはシェルエスケープされて渡されるので安心です。

github.com

例えばechoをしたければ下のように$を付けたテンプレートリテラルを書くことにより実行することができます。またテンプレートリテラルなので変数も持ち込めます。

import $ from "https://deno.land/x/dax/mod.ts";

const sec = 1;
await $`sleep ${sec}`

以下のようにするとdenoとdaxによってhomebrewのアップデートを行うことができます。 便利。

import $ from "https://deno.land/x/dax/mod.ts";

const cmds = [
  ["brew", "update"],
  ["brew", "upgrade"],
];

for (const cmd of cmds) {
  const result = await $`${cmd}`;
}

色を付ける

コマンドの実行結果に色を付けて目立たせたくなったことはありませんか? シェルスクリプトを用いるとANSIコードを使って色付けを有効にしたり無効にしたりと大変です。

シェルスクリプトで行う場合は以下のようにするのが多分良いです。色を無効にしないとずっと色がついて大変。

# ANSIエスケープコードを変数に格納
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'  # No Color

echo "${GREEN}running $cmd_name${NC}"

cliffyというdenoでCLIツールを作成するライブラリの色付け部分を拝借し色を付けました。

TypeScriptで書かれているのでメソッドチェーンされていてもエディタでの補完が効いて簡単。

import $ from "https://deno.land/x/dax/mod.ts";
import * as cliffy from "https://deno.land/x/cliffy/ansi/colors.ts";

await $`echo ${cliffy.colors.green("this message colored green")}`

完成

daxによるシェル呼び出しとcliffyによるログ色付けを組み合わせるとこんな感じ。

import $ from "https://deno.land/x/dax/mod.ts";
import * as cliffy from "https://deno.land/x/cliffy/ansi/colors.ts";

const cmds = [
  ["brew", "upgrade"],
  ["rustup", "update"]
];

for (const cmd of cmds) {
  $.log(cliffy.colors.green(`executing ${cmd}`));
  await $`${cmd}`;
}

このスクリプトdeno runで呼び出せばアップデートコマンドを順次呼び出してくれる。

まとめ

daxを使ってシェルスクリプトを置き換えてみよう!

今回は使わなかったが、daxにはjsonで返ってきた結果をパースして、TypeScriptの世界でオブジェクトとして扱えるようになる機能などもある。 例えばjqを使ってパズルしている処理もArray.prototype.mapで捌くことができる。

皆さんもお手元のスクリプトを置き換えてみてはいかがでしょうか。

Pythonのパッケージ管理ツールRyeのURLのドメインが変更されています

3行まとめ

RyeをダウンロードするスクリプトのURLやドキュメントのURLに使われていたドメインである rye-up.com が使えなくなっている

メンテナらは把握していて代替手段が取られている

新しいドメインは rye.astral.sh となっていて、rye-up.com も復旧次第 rye.astral.sh へとリダイレクトされる

2024年5月29日追記

rye-up.comドメインは無事に復活し、予告通りrye.astral.shへとリダイレクトされるようになりました。 https://github.com/astral-sh/rye/issues/1111#issuecomment-2136490615

追記ここまで

Ryeとは?

Pythonのパッケージの管理や仮想環境の管理などをしてくれるツールです。 このエントリではスコープ外として詳しくは説明しません。 id:nsakki55 さんのこちらの記事がちょっと前の記事ですが詳しいので参考にしてください。

nsakki55.hatenablog.com

本題

Ryeのドキュメントやダウンロードスクリプトを管理していたドメインである、rye-up.comがドメインまわりのトラブルで使用できなくなったようです。

実際にいままでドキュメントやダウンロードスクリプトを提供していたURLにもアクセスできなくなっています。

この問題はURLのドメインを rye-up.com から rye.astral.sh と置き換えることにより解決します。

例えば、旧ダウンロードスクリプトを用いたRyeのセットアップは、以下のコマンドを叩くことにより実現していました。

curl -sSf https://rye-up.com/get | bash

ドメイン移行後は以下のようにURLを変える必要があります。

curl -sSf https://rye.astral.sh/get | bash

従来のドメインが復活したらrye.astral.shは使用できなくなるのではないかという心配は不要そうです。

というのもメンテナが今後はrye.astral.shをメインのドメインとし、rye-up.comへのリクエストをrye.astral.sh へとリダイレクトすることを表明しているからです。

github.com

まとめ

2024年5月26日現在、ドメインをそのままrye.astral.sh に変えることで生活はできます。

fcitx5-skk+FirefoxでScrapboxやGoogle Docsなどの変換確定直後の子音が落ちるときはpreeditを切ると良い

3行まとめ

  • fcitx5-skkFirefoxの組み合わせで一部のページでの変換の挙動がおかしい
  • 例えば Kousatu suruが「考察うる」となるように子音が落ちる
  • preeditを無効にすると変換の挙動が意図通りになる

症状

fcitx5-skkとFirefox121.0を組み合わせた状況で、ScrapboxGoogle Docsなどに入力すると、変換確定後の子音が欠落していまいます。 これだけだと分かりにくいので例を上げます。

例えばScrapboxGoogle Docsで「考察する」と入力するときは"Kousatu suru"と入力しますが、実際には「考察うる」と変換されてしまいます。

おそらくですが、Fcitx5-skkのデフォルト設定だと「▽こうさつ」と入力した直後のsを入力したタイミングで考察と確定してしまい、その直後の「す」を入力するためのsが欠落してしまうからであるかと思います。

Scrapboxの検索欄やブラウザのアドレスバー、はてなブログの編集画面などではこのようなことは発生しません。<input>タグだと何も問題ないのではと考えています。

またこの症状はChromeでは発生しません。

解決策

このようなことをツイートしていたらfcitxのメインコントリビュータの@CSSlayerさんに解決策を教えてもらえました。

確かにpreeditを無効にすると子音が落ちることなく、意図通りに変換ができます。

なのでpreeditを恒常的に無効にすることとしました。 fcitx5-config-toolを開いて、Global Options -> Behavior -> Show preedit in appllicationのチェックを外すとpreeditを無効にできます。

Fcitx5 configurationのpreeditを無効にするチェックボックス

おわりに

@CSSlayerさんありがとうございました。

音楽サブスクサービスをより便利に使うための外部サービスn選

お約束

大幅に遅刻していますがUEC Advent Calendar 2023 - Adventarの記事を書いていきます。

adventar.org

この記事はUEC Advent Calendar 2023 19日目の記事です。今これを書いているのは25日です。何とかしてクリスマスが終わる前に書ききります。

18日目の記事はつまみさんの菅平セミナーハウスを使って旅行した話でした。菅平楽しかったですね。途中離脱したのが悔しい。

また20日目の記事はまどさんのホロライブEN(を使った英語学習)の布教でした。英語のスラングとかは受験とかでは使わないから推しの力を使うと良さそう。

続きを読む

GitHub AppsのToken作成Actionが公式から出たので乗り換えるときの注意点

はじめに

GitHub ActionsでGitHub Appsを使うときには登録時に入手できるApp IDとsecret keyから一時的に使用できるトークンを発行する必要があります。

このトークンはGitHubが用意しているRest APIやGraphQL APIに対してリクエストすることによって入手することができます*1が、いちいちAPIを叩く準備をするのは面倒なので個人が作成したActionであるtibdex/github-app-tokenやSentryが提供しているActionであるgetsentry/action-github-app-tokenを使うことによって楽をすることができました。

今まで非公式なActionに依存していたトークン生成ですが、GitHubが公式でAppsトークンを作成するActionであるactions/create-github-app-tokenを提供するようになったので公式のActionへ依存先を切り替えられるようになりました。 実際、GitHubのドキュメントでは今までtibdex/github-app-tokenを使う手順が紹介されていましたが、actions/create-github-app-tokenを使うように変更*2されています。

docs.github.com

しかし乗り換えるにあたって注意事項がいくつかあったので紹介します。

今回はGitHub Appsが何かについてはスコープ外とします。以下の記事で詳しく説明されているので参考にしてみてください。

zenn.dev

注意事項

1. Optionalな引数を追加で渡さないと、WorkFlowが動いているリポジトリの外にアクセスできない

# https://github.com/actions/create-github-app-token#create-a-token-for-the-current-repository
    steps:
      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}

READMEには上のような例が記載されています。この例には "Create a token for the current repository"というタイトルがついている通りWorkFlowが動いているリポジトリのみにアクセスできるトークンが発行されます。

tibdex/github-app-tokenはデフォルトではGitHub Appsがアクセスできるすべてのリポジトリ*3にアクセスすることができます。またgetsentry/action-github-app-tokenはアクセスできるRepositoryを制限できず、すべてのリポジトリにアクセスできるトークンのみが発行できます。

Git Submodulesを使用しているなどの場合はOptionalな引数であるrepositoriesを指定する必要があるので注意が必要です。

トークンがアクセスできるリポジトリを絞りやすくなって良いですね。

2. 必須引数が既存のActionそのままだとdeprecated

tibdex/github-app-tokenやgetsentry/action-github-app-tokenは必須パラメータであるAppIDとPrivateKeyをそれぞれキーをapp_idprivate_keyとして指定します。

# https://github.com/getsentry/action-github-app-token#usage
  - name: my-app-install token
    id: my-app
    uses: getsentry/action-github-app-token@v2
    with:
      app_id: ${{ secrets.APP_ID }}
      private_key: ${{ secrets.APP_PRIVATE_KEY }}

しかしactions/create-github-app-tokenではスネークケースで指定するapp_id, private_keyはdeprecated扱いとなっていて、かわりにケバブケースでapp-id, private-keyと表記することを求められています。

使えはしますが、いちいちWarningが出るのも面倒なので直しておきましょう。

まとめ

GitHub AppsをGitHub Actionsで使うツールをActions公式が新しく出してきたので乗り換えるときの注意点をまとめました。

GitHubのドキュメントでも紹介されているActionなので、GitHub AppsをGitHub Actionsで使っている人はぜひ移行を検討してみてください。

*1:https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app-installation

*2:変更があったコミット https://github.com/github/docs/commit/a07fc6cf5f74b3f843319aa6a504db193fc379d7

*3:Appsのインストール時にすべてのリポジトリにアクセスできるようにしたのであれば文字通りすべてのリポジトリにアクセスできるようになる。特定のリポジトリを選択してインストールした場合は、その特定のリポジトリすべてにアクセスできるようになる。