Playwright for .NETを Linuxで使うときのメモ

長年動かしていたスクレイピングのコードがあったのが、この度対象のウェブサイトが Next.JSに移行して JavaScriptランタイムがないと全くサイトの情報が取れなくなってしまったので Playwrightを使うように書き換えた。TypeScriptを使うのが主流なんだろうけど馴染みがないので Python .NETのどちらを選ぶかとなったのがちゃんとした型あり言語の方がいいかということで .NET版, C#を選んだ。F#でもいいんだけど、手続型ぽくしか書けないだろうし、C#にした。いくつかすんなりといかないことがあったのでそのメモ

プロジェクトへパッケージの追加

dotnet add package Microsoft.Playwright

まあこれは普通にいける

各種ブラウザのインストール

パッケージをインストールするとブラウザインストールスクリプトもインストールされるのだが、これが PowerShellスクリプトWindows以外の環境だと初めに PowerShellをインストールする必要があった. Githubかバイナリを取得するのでもいいが、面倒なので dotnetコマンドで入れた

dotnet tool update --global PowerShell  

これは $DOTNET_ROOT/tools にインストールされるので、そこに PATHを設定し、設定ファイルを再読み込みする。インストール出来たらブラウザをインストールする

pwsh bin/Debug/net9.0/playwright.ps1 install

これで ~/.cache/ms-playwright の下に各種ブラウザがインストールされる。デフォルトだと Chromium, WebKit, Firefoxがインストールされる。Chromiumのみ必要などの場合は PowerShellスクリプトコマンドライン引数で調整することができる

シングルバイナリ化した場合の対応

Playwrightを動かすには, node.jsや JavaScriptファイルが必要になる。これらのファイルはパッケージインストール時に併せてインストールされるが、シングルバイナリ化した場合これらのファイルは同梱されない。(dotnet run で動かす場合は特に気にする必要はない)。これらのファイルが入ったディレクトリをバイナリと同じディレクトリか、環境変数 PLAYWRIGHT_DRIVER_SEARCH_PATH に置く必要がある。(開発時のためか 2つ上のディレクトリでも可ではある)

# シングルバイナリ化
dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true

# PATHが設定されている場所へインストール
cp bin/Release/DOT_NET_VERSION/linux-x64/publish/MyProgram your_install_path

# node.jsと JSファイルのインストール
cp -r bin/Release/$(DOTNET_VERSION)/linux-x64/.playwright your_install_path

これでシングルバイナリ化したプログラムを動かすことができた.

世田谷区で膨張したバッテリーを処分したときのメモ

こちらは 2025年 8月 3日時点の情報です。更新などされている可能性があるので詳細は市役所などに問い合わせてください

先日使用していた System76のラップトップのバッテリが膨張していることに気づいた。はじめは何かキーボードが打ちづらいなと思ってよく見てみるとキーボードが盛り上がる程度にバッテリーが膨張していた。危険なので修理のページを参考にラップトップからバッテリーを取り外した。

取り外したのはいいけど家に置いておくのも危険なので早めに処分するため世田谷区のごみ処理などページを見てみたが、世田谷区自体はそれらの充電式電池の処分を行っておらず一般社団法人JBRCが行っているとのことでそちらのホームページを確認した。しかし一般社団法人JBRCでは正常な充電式電池の処分は行っているものの、膨張したものは取り扱いしておらずそれらについては自治体に連絡してほしいとのことだった。

そこで市役所に問い合わせたところ世田谷区では下記の場所に直接持っていけば引き取ってくれるとのことだった。

  1. 清掃・リサイクル部事業課
  2. 世田谷清掃事務所
  3. 砧清掃事務所
  4. 玉川清掃事務所
  5. エコプラザ用賀
  6. リサイクル千歳台

最寄りの場所を特定しそこに持参し回収してもらうことができた。若干遠かったがもしものことを考えて公共機関などは使わず徒歩で持っていた。どの施設でも予約の必要はなく、また無料であった。係の人が危険性尾をわかっていなさそうな感じは少しあったが無事自宅からは危険物を撤去できて安心できた。

最後に

他の自治体を調べると豊島区や横浜市などではホームページに膨張したバッテリの処分方法が掲載されておりいちいち問い合わせなくても処分方法を把握することができた。どの自治体のホームページでもリチウムイオン電池などを安易に捨てるな危険だなどは書いているがその処分方法まできちんと掲載できているのは自治体ごとにまちまちであり、意識の差というか考えられているかは自治体依存であった。世田谷区では処分方法が皆無というわけではなかった、記載がなく問い合わせる必要があった。同じように困っている人がいると思うし、よくわからないから適当に捨ててしまおうとする人もいると思うので、そこは改善してほしいと感じた。

スマホが完全に壊れてしまったときのメモ

先日3年弱利用していた Pixel5aがいきなり全く使えなくなってしまった。ディスプレイ表示どころか充電さえ反応がない。原因は これ。最初は交換プログラムを使おうとしたのだが度重なるトラブルで交換まで 3-4週間近くかかるということになり、即座に新しいスマートフォンを買って移行作業を行った。しかしデータの移行は概ね古いスマホが生きていることが前提ですんなりとはいかなかったので今後同じ問題があったときのためにメモを残しておく

Google Account

保存していて backup codeの 1つを使って復旧。これにより Google関係はほぼ問題なかった。Google Authenticator の移行も特に問題なかった。Google Authenticatorが大変なのかなと思っていたけど問題がなかったのでそこに依存する MFAも軒並み問題なかった。

Microsoft Authenticator

仕事で使っているアカウントについてはどうやっても復旧できなかった。そのため会社の担当の方に連絡し、一度MFAを無効化し再度登録することで問題を解消した。個人で使っていた方はアプリ以外の認証手段がいくつかあったのでそれを使ってサインインし、古いスマホを削除、新しいスマホで新たに MFAの登録を行った。

Google Wallet

Suicaで使っていたものだったので

  1. モバイル Suicaにサインイン
  2. カードの再発行

を行い, しばらく時間を待ち再発行が確認されたあと新しいスマホに同カードを登録した。1万円以上入れていたからどうなるかと思ったけどそのままで問題はなかった。

Paypay銀行

独自のトークンアプリを使っており、前のスマホなしで復旧するためには利用時に発行された物理カードのカード番号とパスワードが必要であった。ただ私は一時海外のサイトで買い物をしすぎた結果物理カードが止められてしまい、新しい非物理カードを発行した際に古いものが無効になり処分していたため持っていなかった。このためやむおえず物理カードを再発行してもらい、アプリを利用することができるようになった。再発行手数料は 1100円だった。

その他

残りのアプリについてはパスワードやら SMSを使って概ねなんとかなった。

最後に

スマホが文鎮化するというのを初めて経験したけど、旧スマホがないと復旧がかなり手間だなと感じた。このためだけに 2台持ちにするのもどうかとは思うけど、もしものことは考えておかないと結構詰むなと思いました。

markdown-modeに VSCodeっぽい画像貼り付け機能を実装した

github.com

Emacs 29に yank-media という機能が追加されて clipboardにあるデータを各モードで自由にハンドリングできるようになった. VSCodemarkdownを書いているときに画像をペーストすると inline linkが挿入されますが、それと同じようなことができるように markdown-mode に機能を追加しました. ただし Emacsでは普通の yankでは実現できなくて, M-x yank-media という別のコマンドを使う必要があります. (clipboardの中身を見て先頭が画像だったら挙動を変えるとかの関数を自分で実装すればいけるとは思います). あと Emacs29以上が必要になります.

example

ブラウザでコピーした画像を markdownファイルに貼り付けている例になります.

実装

例として html-mode で clopboardの画像を img タグで Base64で貼り付ける場合を示します.

(add-hook 'html-mode-hook (lambda ()
                            (yank-media-handler "image/.*" #'html--image-media-handler)))

まず各種 major-modeやその hookで yank-media-handler 関数を呼び出して, マッチさせたい mime-typeの正規表現とそのハンドラを設定します. ハンドラの引数は 2つあって, 1つめが mime-type, 2つめがデータになります.

(defun html--image-media-handler (mimetype data)
  (let* ((mime (mailcap-mime-type-to-extension mimetype))
         (base64 (base64-encode-string data))
         (img-tag (format "<img src=\"data:image/%s;base64,%s\" />" mime base64)))
    (insert img-tag)))

ハンドラの実装はこのようになります. あとは dataを好きなように扱ってやればよいです. mime-typeをどうかしたい場合は, mailcap packageなどに各種ユーティリティがあるので探してみるとよいでしょう.

Ubuntu 22.04の設定メモ

syohex.hatenablog.com

PC買ったので設定に関するメモ. 最近デフォルト信仰なので昔ほど凝ったことはせず最低限使えるようにするメモ

Gnome Extension

  • Auto select headset 有線ヘッドフォンなどを使ったときいちいちどのデバイスを使うのか問われるのがうざかったので
  • Clipboard Indicator クリップボード履歴のために. 個人的には Windowsのものがベストで, 使い勝手はそれより悪いのだけど使えるレベルではある. 同じ名前の拡張があるので注意(Linuxに限らず macOSもそうだけど未だになんでこの機能がデフォルトで使えないのだろうか)
  • Workspace Indicator 今自分が作業している workspaceをわかりやすくするため

dconf editor

  • /org/gnome/shell/app-switcher/current-workspace-only trueに設定. falseだと macみたいな挙動になる. アプリを選んだら workspace関係なくすでに開かれているアプリにフォーカスする. true だと workspaceごとにアプリを起動したりスイッチできたりするようにする.
  • /org/gnome/desktop/interface/enable-animations false に設定. animationがうざいので
  • 不要なショートカットキーを全部無効化する. Settingsからでもできるけど, 一部できないのもあるので主に dconf editorから操作している.

その他

  • Ctrl, Caps lockの入れ替え. 最近は標準機能でできるのでそれを使った
  • マウス, trackpad速度の調整. 自分の気に入るレベルに調整

ぐらいかな. あとは開発などに必要なツールや動画見るのに困らないツールを apt で入れたぐらい.

System76 Lemur Proを買った

syohex.hatenablog.com

使っていた PCを処分することに伴い新しい PCを買った. 大学生のときに先輩に勧められて以来 ThinkPadを使っていたけど, 最近の ThinkPadカスタマイズの幅が昔ほど広くないし, たまには違うのを買ってみるかということで Lemur Proを選んでみた. Linuxを使うしインストールし直すの面倒だなということで初めから入っているメーカかつ日本に shipping可能ということでかなり選択肢の幅は狭くなってしまったのだが, 評判も悪くないし System76にしてみた.

値段

円安時期だったからかそこまでカスタムしていないけど本体 + 送料 + 関税で 21万円ぐらいだった. なんで米ドルで見るほどのお得感はなかった. まあ ThinkPadだと同スペックだと 30万円近くなってしまうのでそれよりかはお得かなと思った(Windowsじゃないとかはあるけど)

注文

Webからポチポチと構成を選んで住所を入れただけ. メモリとディスクと OSを変えた程度. PopOSにしようかと思ったけど画面が狭くてそこまで利点がなさそうかなと思ったのと, PopOSは Ubuntu LTSベースで半年ごとのアプデができないので Ubuntuにしておいた.

ただしすんなりとは買えず, カード請求にランダムな 5桁の英数字があるからそれをメールしてから発送するということだった. 自分のカード会社の問題なのか普通はそういうものなのかわからないけど, そのメールを受けて 4日後ぐらいに請求が来ていた. しかし使っているカード会社の表示の問題なのかなんなのか 3桁しか表示されておらずどうしたものかと, System76に問い合わせたところそれでもいいということでした. そのあと 1週間しないうちぐらいに届いた.

関税支払い

クロネコヤマトに関税を払うのだけど, Webで見るとカード払い可とあったのだけどカード払いできませんと言われて焦ってしまった. 交通系決済では払えるということだったので急いで mobile Suicaに限度額チャージして事なきをえた.

Lemur Pro感想

良い点

  • 軽い. 寝ながら使うようなのでちょうど良い感じ.
  • 処理速度は悪くない. そこそこのプログラミングなどでも問題なく使えている. ただファンはわりとすぐに回る.

微妙な点

  • 標準アダプタのケーブルが短すぎる. 2mもなく 1.5とかそれぐらい. ThinkPadが長過ぎる(3mぐらい)というのもあるけど, 想定していた電源には全く届かず, それを使わず USB Type-Cの長いケーブルを買ってそれで充電することにした
  • insertキーがない. Windowsも使うから Shift-insertとか結構使っていたのだけどキーがないので代替手段を使うことになってしまった. 慣れの問題ではある.

タッチパッド

今どきのタッチパッドmac以外使ったことがなかったけど, 慣れない. 昔みたいに物理左クリック, 右クリックボタンがあるわけではなく macみたくフラット. それなのに場所によって左クリック, 右クリック, 中クリックがあるというのは非常にわかりづらい. 中クリックはいるのか ?? 今どきのは非 macでもだいたいこれっぽいのだけど, シングルクリックの macはさておき, そうじゃないのは合っているのかなと思った. あとカチカチするのが以外と手間というか力がいるなと感じた.

調べたり試行錯誤していると以下の方法で代替は可能 - 左クリック: 1つの指で軽くタップする - 右クリック: 2本指で軽くタップする - スクロール: 2本指でスクロール

最後に

現状 Thinkpadの方が長年使いすぎた影響で良かったかなと思ってしまうけど, せっかく買ったので慣れていこうかと思います.

ThinkPad T490を処分した

4年ほど酷使していたのだけど, 最近ディスクエラーが増えまくって強制終了せざるを得ないことが増えてきたので新しいラップトップを買った. それにともない不要になった ThinkPad T490を処分することにしたのでその記録.

ディスクの消去

scrapbox.io

自分でやるの久しぶりだったので, dd if=/dev/zero of=/dev/hoge でいいんじゃねって思っていたけど, 調べると SSDはそうじゃないとのことだった. NVMeタイプだったので Linuxだと nvme-cli でいけるとのこと. bootable USBメモリを作って必要なソフトをインストールして試してみたのだが, ThinkPadではうまく機能しなかった. (各所で見られる一度 suspendしてからなども試したが無理であった)

github.com

NVME Admin command error:ACCESS_DENIED: Access to the namespace and/or LBA range is denied due to lack of access rights(4286)

上記のリンクのようにこのエラーが出てどうしようもなかったので, 上記の issueに書いていた Thinkpad Drive Erase Utilityを使って消去することにした.

Thinkpad Drive Erase Utility

support.lenovo.com

ここから自分の機種にあったツールの isoを取得し, USBメモリに焼いた

dd if=thinkpad_drive_erase_utility.iso of=/dev/sda bs=1M

この USBメモリからブートして指示に従い消去作業を進めたところエラーがでることなく, ディスクの消去が問題なく行えた.

PCの処分

住んでいる区と連携している リネットジャパンに申し込んだ. 箱だけ用意すればその他費用は不要であった. 宅配便の人が受け取りに来るのでそれまでに箱の梱包を済ませた.