旅とプログラミングを少々

趣味に関する記録などをします。おそらくプログラミング入門に関しての内容を連ねていきます。

スーパーカブC125を購入した

スーパーカブC125を購入した

近所のスーパーへ行くだけならば50ccで良いが、もう少し足を伸ばすと50ccはだいぶキツい。結局50ccカブでは足りないと判断して買いかえた。

まず免許。ATに乗ろうとのにATで卒検通るのは難しそうだと感じたので普通二輪コースで教習所に入校して予約はかなり先からしか取れなかったが夏の暑いうちに夜最後のコマをキャンセル待ちで1段階をクリアし、2段階を入校当初の予約分でなんとか埋めて一発で卒検合格。これでも2段階のシミュレータ部分が小型ATや大型バイクの人とも予約戦争状態で丸2ヶ月はかかった。一時期よりは取りやすくなっているらしいとはいえ、まだバイクは人気な様子。

2023年秋現在ようやくホンダバイクの需給関係は落ちついてきているようで、モンキーやGB350のような昨年から今年にかけて中古の方が高かった車種でも現物取り寄せが可能になっていた。目的のスーパーカブC125については最新より1年前の色だけ在庫から新車即納可能で最新の色は少しだけ待つということで色は夜に見にくい色でなければ何でもいいと思いトリコロールカラーのものを即時購入した。

さすがに風防などは流用できないが、保険関係やドラレコ類はそのまま置き換えで済み50ccカブの下取りもまあまあな値段であったので出費は多少は抑えられた、と思うことにしている。

まだ乗りはじめたばかりだが、50と比較して125Cはドコドコと低いおもしろいエンジン音がする。素のパワーがあり住宅街ではアクセルを吹かす必要がないので気持ち静かになったか。そして何よりも普通の道で5,60km/hを出して流れに乗ってよいことと、複雑な三叉路等で周りの車を困惑させながらの二段階右折をしなくて良いのが乗り替えて一番楽に感じる。本格的な山道はさすがに登りが遅そうだが、多少のツーリングならば全然問題なくこなせそうで実用じゃなく趣味として乗れる車種という下馬評にも納得で、良い買い物だった。

おかげで春の終わりからこのかた仕事と教習とバイクでずっと忙しく、私的なプログラミングはほぼ一切できていないが、たまにはこういう年もある。

スーパーカブ(50cc)を購入した

2023年夏現在、まだコロナ禍や熊本大地震の余波があり新車の在庫が無い場合1ヶ月~待つ。おかげでいい中古の値段も下がってないので価格差がないならと新車待って納車。

原付なんて30万円で釣りが来るだろと高をくくっていたら本体以外で結構金がかかった。

  • 任意保険

ビッグモーター事件のおかげでそもそも検討する保険会社が3社ほど減ってくれた。ノンフリート等級が完全1年目なので高い。6万円ほど。

バイク用のは振動対策とかがなされた専用品となり高かったので、じゃあもう正規で買ってしまえと取り付けも依頼して工賃入れて5万円ほど。

  • 風防、リアボックス

田舎なので風防は向かい風対策というよりは虫対策に役立つ。ドライブレコーダーの取り付けもお願いしたのでもう全部いったれと一緒に依頼し工賃まで合計して3万円弱。

  • ヘルメット

2りんかんに自転車で行き、なぜ自転車……という雰囲気の駐輪場のおっさん達がおもしろかった。試着して典型的原付おじさんらしさの溢れる白いジェットタイプのものを購入。1万円ほど。 本当はシステムヘルメットが欲しかったがやたらけばけばしいデザインで高い価格帯のものしか置いてなかったので断念。もうちょっとリーズナブルな目立つ色で単色のをそのうち買いたい。

2りんかんでヘルメットと共にチェーンタイプのを購入。6000円。

  • グローブ

ホンダドリームでバイクと一緒に買うのでなんかいいの下さいと言って多少割引で4000円ほど。本当はヘルメットもバイクと一緒に買うからと割引してもらおうとしていたが、品揃えがフルフェイスのみかつデザインもゴツいバイクとかオフロード向けで結構高かったので諦めた。

  • ジャケット

原付だしいらんかなーと思っていたが事故時死亡率約4割カット装備がリアルマネー1.5万円は格安と言われると買ってしまうよね。

任意保険にもレッカーあるので少し迷ったが一応その他ロードサービス等もあるので加入。将来的にもう少しでかいバイク乗る時で良かった気がする。13000円。

  • Tile

AirTagでも何でもいいが、うちではTileを常用していたのでキーホルダー用にTileを追加購入。7000円ほど。

  • LED式非常信号灯、停止表示板

原付なので車検はないが一応公道走行するのでリアボックスに放りこんでおく用。合わせても2000円ほど。

既にこれで20万円ほど使ってしまったが、さらにバイク用の靴が欲しくなり2万円ほど、地球ロック用に家の駐車スペースにアンカー自前設置で諸々1万円ほど、冬用のジャケットとグローブ等でまた追加2万円~くらいの出費は見えている。原付とあなどっていたが意外と金がかかる。

2023年初頭のWaylandと多言語入力

このブログポストのきっかけ

先日IPAの未踏プロジェクトの発表会をWeb配信で見たが、そのなかでもKonjac と IMPlaneの発表がちょうど自分の関心領域であった。 プロジェクトではMacに翻訳機能付きIMを実装してデモしており、研究の展望としてIMPlaneが他環境にも実装できれば共通のIMをOSを越えて実装できるのではないかと語っていた。 MITOU2022 Demo Day/第29回 未踏IT人材発掘・育成事業 成果報告会 開催のご案内:IPA 独立行政法人 情報処理推進機構 (本人のツイート及び録画へのリンク https://twitter.com/k3k3h0/status/1627184019929722880 )

実際に、今そういったものが欲しい。現在のLinuxでの多言語入力の実装はとても難しい。

2023年初頭のWaylandと多言語入力

概要

キー入力およびそれに限らない全ての入力はwaylandの'Seat'と呼ばれる仮想レイヤーに集約される。一般的にはseatは一つだけでキーボードを複数繋ごうとseatは同一のものに集約され、それぞれのキーを打つたびにキー配列等を切り替えて処理するが、どう処理するかはCompositorの実装依存でありプロトコル等で決められているものではない。

文字入力の際にはIMEがwaylandクライアントとしてグローバルのwl_seatからwl_keyboardをgrabして全てのキー入力をもらう。

IMEはテキストの入力をwayland compositorに渡し、各プログラムはwayland compositorからテキストを受けとって入力として扱う。

Text-input protocol

(GUI) Program <-> Wayland Compositor 間のプロトコルが text-inputプロトコル v1-v4まである

v1: Compositor側では参考実装でwestonくらいしか対応してないはず。

プログラム側ではChrome--enable-wayland-ime を有効にして起動すると一応まだ動くかも。

v2: wayland-protocols にマージされていない。多少は対応があった様子だけど、よく知らない。

Qtがサポートしている。

v3: wayland-protocolsにマージされているので、2023年現在多くのプログラムとCompositorが対応している。

Compositor側では mutter (GNOME shell のwindow composition manager), kwin (KDEの同上), wlroots(sway等) などの代表的なものは全てサポートしている。

Program側ではGtkがサポートしている

v4: wayland-protocolsのwip/text-input-next treeで現在進行で策定をしようとしている版 とはいえまだほぼv3と同じなので2023年現在は実質v3サポートとみなしてよい。

プログラム側ではQtがサポートしている。

zwp-input-method protocol

Wayland Compositor <-> Input Method 間のプロトコル

v1: wayland-protocolsにマージされている。weston, kwinがサポート

v2: wlrootsがサポート(一部)

GNOMEは多言語対応がいろいろおかしいのはここでも発揮されていて、どれもサポートせず、IBusプロトコルを使っているらしい。*1

zwp-virtual keyboard protocol

Wayland Compositor <-> Input Method 間のプロトコル

テキスト入力ではなくキー入力としてそのまま送りたい場合に使うことを想定されている。まだきちんと実装として対応しているものはないと思っていたが、wlrootsが実装した様子。しかしイベントを送るIMEは寡聞にして知らない。

まとめ

これらのプロトコル対応を見てわかる通り、waylandでの多言語入力はまだまだ発展途上の領域であり、実用上はXWaylandを介した古いプログラムのためXの対応まで必要となる。そのため実質的にfcitx5か、ある程度のwayland対応を無視してのIBusしか選択肢が無い。

参考文献

*1:Fcitx5はわざわざibusの非公開プロトコルまで一部実装してGNOME対応をしている。

最近(2022中期〜)のAWS Lambda + Rust

以前のRust製lambdaがたいへん古いのに、世間にあまりアップデートされた例が見られないためここに記録する。

比較的最近のやりかたの例 github.com

以前の書き方の例 AWS LambdaでRustを使う - 旅とプログラミングを少々

  • lambda向けコード

lambda_runtimeとaws_lambda_eventsが用いられる。Go用SDKからの変換でRustの型を作っているため稀に型がおかしかったが、両方ともに日進月歩で改良されておりおおむね実用可能。 https://github.com/naokiri/clean_house_public/blob/master/apiauth/src/main.rs の例のようにlambda_runtime::runでLambdaEvent<inputの型> -> Result<outputの型> の関数を書くだけでlambdaが起動した時にmainでのセットアップを、そして各コールでrunの内容を走らせてくれる。

  • AWS ライブラリ

rusotoはdeprecatedとなり、awslabsのSDKを用いるようになった。AWS SDK for Rust | aws-sdk-rust 非公式の間牽引してきたrusotoの作者の方々には感謝である。

  • ビルド+パッケージング

以前はまだAmazon公式にはRustをサポートしていなかったためmusl向けにビルドした後、さらにコンテナ化していた。最近は https://docs.aws.amazon.com/sdk-for-rust/ の通り公式に様々なRustライブラリをサポートしはじめており、それらのリポジトリから読む限りcargo-lambdaでビルドすることが一般的のようである。さらにAWSがGravitonコアを推奨しているのでそれに従うと

cargo lambda --arm64 

とコマンドを打つだけでアップロードすべきbootstrapが作成される。muslライブラリやらlibcの互換性やらの問題はもう考えなくとも良い。

Ubuntu22.04のIME設定

Ubuntuは国際化の際にアジア等を軽視すること甚しく、全く要領を得ないGNOMEのキーボード設定と入力設定が一体化したインタフェースを利用してしまったことでとても使いにくい設定GUIがあるがその中身について。

GUI (その1)

Settings -> Region & Language -> Manage Installed Languages 内になぜか存在するKeyboard input method systemでIMEをドロップダウンから設定できる。

GUI(その2)

im-configコマンドがウィザード形式でIME設定できる。

設定ファイル

GUIその1も実態はim-configコマンドを利用しており、設定は~/.xinputrcの書き換えによって行われる。

起動時の動作

Ubuntuは基本的にWaylandに移行しており、一部の未対応なアプリケーションがXWaylandによってXインタフェースをエミュレーションされて動くのみである。IMEの設定も本来ならばxinputrcに書くだけでは無視されるが、Ubuntu 22.04時点では移行期ということで複雑に動いている。

まず、システム全体のprofileである/etc/profileから/etc/profile.d/im-config_wayland.shが呼ばれる。

/etc/profile.d/im-config_wayland.shは本来ならばXセッションの起動時に順に呼ばれる設定ファイルのうち/etc/X11/Xsession.d/70im-config_launchのみ呼ぶ。

/etc/X11/Xsession.d/70im-config_launchはIM_CONFIG_PHASEを1にし、/usr/share/im-config/xinputrc.commonを呼び、その後.xinputrcを呼ぶ。

すると.xinputrcGUIツールで書かれた通りに/usr/share/im-config/xinputrc.commonで定義されているbash関数run_imが引数の通り/usr/share/im-config/data/*.rcを呼びだす (ただし、9がmissing等正常ではないものに予約されているので0-8で始まる2桁の番号のファイルのみ)。ここではGTK_IM_MODULE等の環境変数が設定されるのみである。

次に、大部分の起動が終わった後XDG Autostart specに従って、起動時に/etc/xdg/autostart/im-launch.desktopが呼ばれる。ここの呼ばれ方はUbuntu22.04時点のGNOME shellではまだsystemdを利用してはいないようだが、おそらく将来的には/usr/lib/systemd/user/xdg-desktop-autostart.targetを介して呼ぶはず。今は単にGNOME shellがXDG specのautostart directoryを探査して全部起動しているようである。

ここでIM_CONFIG_PHASEを2として.xinputrcを呼び、前記の通り/usr/share/im-config/data/*.rcが呼ばれ、ここでようやくIMデーモンが起動される。

githubにはAWS_ACCESS_KEYは一切入力しない

githubにはAWS_ACCESS_KEYは入力しない

リポジトリに入れないのはもちろんのこと、github actionsのCI/CDとしてもsecret.AWS_ACCESS_KEYを入力するのは古いやりかたであり、推奨されない。 2021年10月終わりごろ*1からgithubOpenID Connectに正式対応し、aws等のクラウドを利用する際にはOIDCで認証することが推奨される。

事前設定

AWS側でOIDCプロバイダとしてgithubを利用するよう設定し、そこからAssumeRole可能なRoleを準備する。 Terraformの例となるが、以下のgithub_oidcとgithub_roleのように設定することでgithub側には何のsecretも入れずにgithub actionでawsが使えるようになる。 github.com

github actionsでOIDCを使う際の規則として、jwtのsub検証をしなければならない。 ( 事実上しなくともgithub側から対応はとれないだろうが、一応MUSTとされている ) このsubの内容はgithub actionsの利用方法によりどのような形式が渡されるのか複雑であり、リポジトリ名まで検証していれば十分と思われる。 Example subject claimsでしかsubの内容の解説がなされていない。docs.github.com

github actions利用側

このActionを使うだけで良い。下手に公式以外の方法で行おうとすると、ログ等からjwtが漏洩するのを防ぐために多大な労力がかかる。デフォルトで1時間しか有効でない認証ではあるが、CI/CDに使われる強い権限があるはずなので注意する。 github.com

launchpadにopenpgp鍵を設定する

先の記事 Yubikey5にもう少し重要な秘密鍵を置く - 旅とプログラミングを少々 にて作った鍵の使いどころの話。

個人的に作ったバイナリをppaを通して配布したい場合、Ubuntuのlaunchpadに登録する必要がある。 Ubuntu Oneアカウントを作る部分は割愛し、ppaオーナーはOpenpgp鍵を登録して署名をしなければならない。

c.f. Packaging/PPA - Launchpad Help

まず公開キーサーバーに自分の公開鍵を登録する。

gpg -K --keyid-format short # keyIDを確認
gpg --keyserver hkps://keyserver.ubuntu.com --send-key {KeyID}

その後launchpadのインタフェースから鍵のフィンガープリントを送る。

pgp -K # fingerprintを確認

すると'Launchpad openpgp key confirmation'から暗号化されたメールが届く。 ウェブメールを使っている場合、おそらくはgpg smartcardに保存された鍵を使えないのでメッセージをコピーしてテキストファイルにしてから復号化が必要だろう。

gpg --decrypt --armor mail.txt

でYubikeyを刺していればPINを求められ、おそらく復号化できる。

ThunderBirdを使っている場合、メールのフォルダではなくルートのメールアドレスを選択してアカウント設定のend-to-end encryptionから Add key を押して外部プログラムGnuPGを使わせ、keyIDを設定するとまた同様に復号化ボタンを押すとPINを求められて復号化できる。

その復号化されたメールのリンク先へブラウザでアクセスして認証すれば完了となる。