それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

mpv でキー操作を書き換える。

mpv のスキップ機能が不便なので改善する。

mpvinput.conf で キー操作を上書き(変更)できるので、設定を変更して便利に使いたい。

設定ファイルの場所と・作成

touch  ~/.config/mpv/input.conf
cat  ~/.config/mpv/input.conf

設定ファイルはGlobalでもUserでもどちらでもいい

~/.config/mpv/input.conf

UP    osd-msg seek  300 exact
DOWN  osd-msg seek -300 exact
RIGHT osd-msg seek  20 exact
LEFT  osd-msg seek -20 exact

キーと、操作内容を書いた.

osd-msg は画面に現在の再生位置を表示する。osdon screen display とかでよく使われる用語。ここの s は status の s かもれしれない。設定自体は--osd-on-seek=<no,bar,msg,msg-bar> に相当する。

再生スキップ時に何分スキップしたか見えないと不便なので、をon にしてる。

seek で 指定秒数をスキップする。書式は、seek <target> [<flags>]

この設定を応用すれば、スクショを撮ってその場でアップロードとかもできるかもしれない。

参考資料

mpv マニュアル

mpv の設定を書いて、起動オプションを省略する

mpv の設定は以下の場所に設置できる。

  • /etc/mpv/
  • /usr/local/etc/mpv/
  • ~/.config/mpv/

上記に設定ファイル(mpv.conf)を設置すると、起動時に読み込まれる。

ファイル名も固定で指定できて/etc/mpv/{mpv.conf,input.conf} のファイルを指定できる。input.conf はキー操作に関する設定。mpv.conf は起動オプションに関する設定である。ファイル名も設定で変えられるはずだが、変えないほうが無難だと思う。

設定例

たとえば、コマンドのオプションの次の場合

mpv --fullscreen 

設定ファイルは次のようになる。

## 設定例
fullscreen=yes

引数で=XX と変数を与えない場合、つまり引数の有無で判断する場合は、YESを書いてあげる。

つぎに、コマンドのオプションで値を与える場合

mpv --audio-device=alsa/sysdefault

値がある場合は次のようになる。

## 設定例
audio-device=alsa/sysdefault

この場合は、設定ファイルにそのまま書けばいい

起動オプションと設定の対応

設定自体は、公式サイトに解説がある。

公式サイトの解説によれば、次のように対応してる。

Option Configuration file entry
--flag flag
-opt val opt=val
--opt=val opt=val
-opt "has spaces" opt=has spaces

設定例

設定書式は INI 形式である。

# normal top-level option
fullscreen=yes
audio-device=alsa/sysdefault

hr-seek=yes
#hr-seek-demuxer-offset=20
#hr-seek-framedrop=no

# a profile that can be enabled with --profile=big-cache
[big-cache]
cache=yes
demuxer-max-bytes=512MiB
demuxer-readahead-secs=20

[network]
profile-desc="profile for content over network"
force-window=immediate
# you can also include other profiles
profile=big-cache

[reduce-judder]
video-sync=display-resample
interpolation=yes

# using a profile again extends it
[network]
demuxer-max-back-bytes=512MiB
# reference a builtin profile
profile=fast

こんな感じに色々と設定できる。

参考資料

https://mpv.io/manual/stable/

raspberry pi 4 は hdmi から音が出ない事がある。

raspberry pi 4 の debian/bookwarn で hdmi から音が出ない。

VLC の場合でもAnalogが選ばれてしまうことが多い。

Raspi4 では、HDMIとアナログがあるのでアナログが使われる。

ググると、この辺のオーディオ設定が初心者泣かせと書かれていた。わかる気がする。アナログ・オーディオのほうが汎用性が高いんだけど。使う人は減った。Raspi5 ではこの問題は起きない。アナログが排除された。

コマンドから選ぶ。

mpv の場合は、次のコマンドで、オーディオデバイスを一覧できる。

mpv --audio-device=help

一覧を出すとこんな感じ。

takuya@raspberrypi:~ $ mpv --audio-device=help
List of detected audio devices:
  'auto' (Autoselect device)
  'pulse/alsa_output.platform-bcm2835_audio.analog-stereo' (内部オーディオ Analog Stereo)
  'pulse/alsa_output.platform-fef00700.hdmi.hdmi-stereo' (内部オーディオ Digital Stereo (HDMI))
  'alsa' (Default (alsa))
  'alsa/sysdefault' (Default Audio Device)
  'alsa/lavrate' (Rate Converter Plugin Using Libav/FFmpeg Library)
  'alsa/samplerate' (Rate Converter Plugin Using Samplerate Library)
  'alsa/speexrate' (Rate Converter Plugin Using Speex Resampler)
  'alsa/jack' (JACK Audio Connection Kit)
  'alsa/oss' (Open Sound System)
  'alsa/speex' (Plugin using Speex DSP (resample, agc, denoise, echo, dereverb))
  'alsa/upmix' (Plugin for channel upmix (4,6,8))
  'alsa/vdownmix' (Plugin for channel downmix (stereo) with a simple spacialization)
  'alsa/plughw:CARD=vc4hdmi0,DEV=0' (vc4-hdmi-0, MAI PCM i2s-hifi-0/Hardware device with all software conversions)
  'alsa/sysdefault:CARD=vc4hdmi0' (vc4-hdmi-0, MAI PCM i2s-hifi-0/Default Audio Device)
  'alsa/hdmi:CARD=vc4hdmi0,DEV=0' (vc4-hdmi-0, MAI PCM i2s-hifi-0/HDMI Audio Output)
  'alsa/dmix:CARD=vc4hdmi0,DEV=0' (vc4-hdmi-0, MAI PCM i2s-hifi-0/Direct sample mixing device)
  'alsa/usbstream:CARD=vc4hdmi0' (vc4-hdmi-0/USB Stream Output)
  'alsa/plughw:CARD=vc4hdmi1,DEV=0' (vc4-hdmi-1, MAI PCM i2s-hifi-0/Hardware device with all software conversions)
  'alsa/sysdefault:CARD=vc4hdmi1' (vc4-hdmi-1, MAI PCM i2s-hifi-0/Default Audio Device)
  'alsa/hdmi:CARD=vc4hdmi1,DEV=0' (vc4-hdmi-1, MAI PCM i2s-hifi-0/HDMI Audio Output)
  'alsa/dmix:CARD=vc4hdmi1,DEV=0' (vc4-hdmi-1, MAI PCM i2s-hifi-0/Direct sample mixing device)
  'alsa/usbstream:CARD=vc4hdmi1' (vc4-hdmi-1/USB Stream Output)
  'alsa/plughw:CARD=Headphones,DEV=0' (bcm2835 Headphones, bcm2835 Headphones/Hardware device with all software conversions)
  'alsa/sysdefault:CARD=Headphones' (bcm2835 Headphones, bcm2835 Headphones/Default Audio Device)
  'alsa/dmix:CARD=Headphones,DEV=0' (bcm2835 Headphones, bcm2835 Headphones/Direct sample mixing device)
  'alsa/usbstream:CARD=Headphones' (bcm2835 Headphones/USB Stream Output)
  'jack' (Default (jack))
  'sdl' (Default (sdl))

オーディオ出力先を指定。

再生機器をHDMIに指定して、再生すると次のようになる。

DISPLAY=:0 mpv  --fullscreen --audio-device=pulse/alsa_output.platform-fef00700.hdmi.hdmi-stereo

認識していれば、ALSAを選べば良いようです。

DISPLAY=:0 mpv  --fullscreen --audio-device=alsa/sysdefault

認識していないとき

raspi-config で pulse を選べば動くはずなんだが。

この辺はわからないので、明示してALSAを使うほうが無難。

ちなみに、PipeWireを設定した場合は、次のようなデバイス一覧になる。

List of detected audio devices:
  'auto' (Autoselect device)
  'pipewire' (Default (pipewire))
  'pipewire/alsa_output.platform-bcm2835_audio.stereo-fallback' (内部オーディオ Stereo)
  'pipewire/alsa_output.platform-fef00700.hdmi.hdmi-stereo' (内部オーディオ Digital Stereo (HDMI))
  'pulse/alsa_output.platform-bcm2835_audio.stereo-fallback' (内部オーディオ Stereo)
  'pulse/alsa_output.platform-fef00700.hdmi.hdmi-stereo' (内部オーディオ Digital Stereo (HDMI))

ALSAはあるけどpulse に加えて、pipewireが出てくる。

hdmi を使うときはオーディオ注意

あれこれと変更点があって、素直に行かない気はするけど。昔は問題なく動いてたものが、動かなくなるのは辛いけど、Raspiでてから10年も経つし、あれこれ変わってきてるのは仕方がない。

慎重に見れば、まぁ大丈夫でしょう。

ssh 経由でmpv を起動して、動画再生したい。

raspi の64bit OS にはomxplayer がない

omxplayer が死ぬので、代替手段を考える。

omxplayer はその名の通り OpenMax を使ったものである。OpenMAX=OMXである。

しかし、32bit 版だけの対応である。64bit 版では対応していない。OpenMAXからソース提供やライブラリ提供が行われないため64bit版に対応不可能らしい。また、32bit 版は legacy 扱いなので今後の展開は期待できない。また、raspi4 からOpenMAXが外されたので今後の使えることはない。

そのうち対応するのかなと思って3年待ったがもう駄目のようです。

代替方法を考える必要がある。

実現したいこと

RaspiにSSHでログインして、動画を再生したい。

ディスプレイ・ミラーリングじゃ面倒くさいし、手元の動画をリモートに送るのが面倒くさい。

URLを叩いてRaspiに接続されたHDMIモニタに動画を流したい。

手元で見ている動画をテレビで流したい。

デジタルサイネージも同じように管理できる。

もし、遠隔から動画を再生できるのであれば、動画を流すだけのサイネージ・システムも手軽になるわけです。

独立したシステムなど要らず、SSHでコマンドを実行するだけで管理できる。

いままではomxplayer で出来てた

いままではRaspberryPiと HDMIモニタを使ってSSH経由でOMXPlayerを起動だけで、簡単に実現ができていた。

OmxPlayerなら、TVリモコンで「停止・再生」や「早送り・巻き戻し」が可能になって便利だった。

しかしomxplayer は死んだ。

omxplayer の代替としてのmpv

Xウインドウに直接画面を表示するにはいくつか方法があるが、キーボードから操作ができるものはmpv以外には無い。

そこで、mpv を使うことにする。

mpv でサイネージ(リモート再生)

例えば、次のようにすれば、mpv で再生ができる。

DISPLAY=:0 mpv  --fullscreen 'http://192.168.100.5/sample.mp4

--fullscreen--fs でもいけるっぽい

mpv のインストール

mpv は apt install でインストールが可能

sudo apt install mpv 

簡単です。

mpv の操作

キーボードショートカットで操作できる。

fは、小文字です。Aは大文字(Shift+a) です。

キー 効果
f フルスクリーン切替
O(オー) 時間表示切替
P 画面表示(押してるときだけ)
p pause ポーズ 切替
SPACE pause ポーズ 切替
1分進む
1分戻る
5秒進む
5秒戻る
} 再生速度 倍(200%)
{ 再生速度 半分(50%)
] 再生速度 +10%( 1.1倍, 1.21倍, 1.33倍...)
[ 再生速度 +10%( ..1.33倍, 1.21倍, 1.1倍, 1.0, 0.91, 0.83...)
BACKSPACE 再生速度 1.0倍に戻す
9 ボリュームアップ
0 ボリュームダウン
* ボリュームアップ
/ ボリュームダウン
m ミュート 切替
s スクショ保存
L ループ再生
A アスペクト比率 強制切替
q 停止
Q 停止(再生位置を記憶しレジューム可能で終了)

詳しくは 公式サイト を参照

なお、このキーボードショートカットは、設定ファイルで更新可能である。

またLuaスクリプトなどで拡張可能らしい。

キーボードとリモコンの関連付け。

後は、HDMICEC機能を使って、リモコンのボタンとMPVのキーボードショート・カットを割り当ててしまえば

Omxplayer と同じようにリモコンから操作ができるはずである

SSH経由で再生が開始すれば、あとはTVリモコンから制御ができる。

TVリモコンで制御するほうが簡単である。CEC使えるならリモコンでRaspiとMpvを紐づけしてしおけば、録画ファイルも簡単に視聴できる。

Raspi4 で再生時のCPU使用率

hevc コーデックの動画を再生した場合の負荷を測定した。720p

mpv はraspi4 で 遅延なく低負荷で再生できていて嬉しい。

デコードを明示したときでも、CPUパワーはそこまで使わない。

明示したときでも mpv --hwdec=yes --hwdec-codecs=hevc_v4l2m2m

そんなに変換しない。メモリもそこまで使わない。

明示してもしなくてもCPU負荷が変わらないので、mpvでhevc を再生するときは、なにもしなくてもハードウェア・デコードが効くのかもしれない。

Raspi4でHEVCを再生してこのパフォーマンスであれば、全然有りである。

録画ファイルはHEVCにして容量を削減

TV録画のファイルは HEVC h265 にしてしまえば、h264 よりも容量を70%ほど削減できる。

そもそも、地上波なんてものは、720pでしかないしパラパラのスライドのような動画である。HEVCで容量削減しても情報量はさして変わらない。地デジはスポーツ番組ですらひどいエンコード画質なので、もともと画質良くないので、圧縮しても、地デジだしそんなものだろうという程度である。

Raspi4 でHEVCがリモート再生できるのであれば、もうこれで再生して地デジのアーカイブは圧縮してしまおうと思った。

omxplayer はhevc 未対応だったのでmpv にすることで録画ファイルの取り扱いが軽くなる。私が動画ファイルに求めるのは情報である。画質ではなく情報であるため、画質はそこまで求めないとすれば、mpv でH265再生でいい気がする。

その他の方法

今回の解決方法は、mpv にDISPLAY環境変数をつけるだけである。

DISPLAY=0

これだけで行けるために、VLCmplayerffmpeg (ffplay)でも同じように再生ができると思う。

https://zenn.dev/yakumo/articles/24eee761d4534ca79c5ffcd9882c57f1

ほかにも、ブラウザのキオスクモードで再生させるという手段も有り得る。動画の再生速度制御・ループ・プレイリスト対応を考えるとmpv でいい気がする。スライドを再生するよりファイルをURLで制御するほうがサイネージ的には使いやすいだろうしね。

ただ、まぁTV用リモコンからの制御も含めて考えると、やはり、mpv が望ましい。

raspi 以外でも

n97 / n100 のミニPCでも mpv が動けば、同じことができると思われる。

omxplayer は openmax で raspi 専用コマンドだったが、mpv であれば汎用性は高い。

tvservice コマンドがない。

最新版のRaspi用 Debian だと tvservice コマンドがない。

tvservice コマンドで割と便利に使っているのであるが。RaspbianがなくなってLegacyにされたので、通常のDebianには提供されないコマンドがいくつかある。そのひとつが、tvservice コマンド。

hdmi 出力をオフにする

vcgencmd display_power 0
vcgencmd display_power 1

まあCECHDMIモニタ自体をオフにしてもいいのですが。

cecコマンドの場合。

echo 'standby 0' | cec-client -s 
echo 'on 0' | cec-client -s 

関連資料

js で querySelector では取れない「コメント」ノードをを取得したい

js で querySelector では取れない「コメント」ノードをを取得したい。

スクレイピングしていると、データのIDが属性値になくコメントに入っている事があるので。

コメント・ノードを取得する

function getComments( node ) {
    var comments = [];
    var treeWalker = document.createTreeWalker(
        node,
        NodeFilter.SHOW_COMMENT,
        null,
        false
    );

    var currentNode = treeWalker.nextNode();
    while (currentNode) {
        comments.push(currentNode);
        currentNode = treeWalker.nextNode();
    }

    return comments;
}

ツリーの中をたどって指定したタイプのノードを取得する。今回は、コメントノードを取得する。

動かしてみる。

var e = list[0]
var commentNodes = getComments(e);
console.log(commentNodes);  // コメントノードのリストが表示されます

コメントの中身がほしいときは

コメント要素(ノード)それ自体を取得したい場面より、コメント本文を参照したい場面が多いと思うので。

getComments(e.querySelector('div'))[0].textContent.trim()

参考資料

MDN(https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker)

hdparm で HGST だけがまともな値を返してくれる。

Seagate / WD / HGST の情報を見たとき

/dev/sdbHGSTなのですが。 APM に対応してて、Acousticに対応してるのはHGSTだった。

買うならHGSTのストレージですね。

ストレージも値段で選ぶなら、ちょっといいやつを買うほうが、細かい制御に対応してて良いのかもしれない。

DNS問い合わせは、また「監視される」。

DNS問い合わせ監視が有耶無耶の間に、既成事実化されつつある。

どこの◯ワンゴが仕掛けてるのか、と思うんだけど、「金盾」を日本に導入がなし崩し的に規定にされつつあります。

インフラ事業者や大学を国が守る、悪性サイトへの接続防ぐサービスを政府が無償提供

 政府は今夏にも、医療機関などの重要インフラ(社会基盤)事業者や大学・研究機関に対し、サイバーセキュリティーを強化するサービスの無償提供を始める。情報を抜き取るマルウェア(悪意のあるプログラム)などが仕込まれた悪性サイトへの接続を未然に防ぐ仕組みで、国民生活に直結するインフラを守る体制作りにつなげたい考えだ。

[]

 複数の政府関係者が明らかにした。内閣サイバーセキュリティセンター(NISC)は今年度予算に政府機関などのサイバーセキュリティー強化関連として49・3億円を計上しており、その具体策の一つとして実施する方針だ。

 それぞれの機関はサイバー攻撃への防御策を講じているが、政府がより能力の高いサービスを提供し、 脆弱(ぜいじゃく) 性が指摘される国内のサイバーセキュリティーの底上げを図る。対策を通じ、先端技術の外部流出を防ぐ狙いもある。

 提供するサービスは、米国や英国などで導入が進む「プロテクティブDNS(ドメイン・ネーム・システム)」だ。メールなどに届いたURLを通じ個人情報を抜き取るフィッシングサイトに誤って接続しようとすると、ブロックされたり、警告が発出されたりする。マルウェアが仕込まれた不審なファイルをダウンロードしようとすると、警告が表示される。

 サービスの提供先としては、機能不全になると国民生活への影響が甚大な医療や水道といったインフラ事業者や、先端技術研究を担う大学・研究機関、独立行政法人などを想定する。今後、内閣府文部科学省などの関係府省庁を通じて利用を呼びかける。サービス利用に伴い得られた悪性サイトの情報はNISCで蓄積して分析し、さらなる能力の向上にも役立てる。

 近年、医療機関や大学・研究機関へのサイバー攻撃は相次いでいる。3月には、鹿児島県の医療機関が攻撃を受け、診療の一部を制限する事態になった。政府は、先端技術に関する情報を盗むためのサイバー攻撃への警戒も強めており、新たな対策を講じる必要があると判断した。

防衛という「大義名分」を借りて、監視を強めようとする。

みんなDNSは自分でRoot Serverから名前解決をするべきだと思います。

もしくは信頼できるPublicDNSやプロバイダのDNSを使っていくべきだと思います。

それらを使った上で、「特定の名前解決」を誰に肩代わりしてもらってるのか、ちゃんと認識するべきだと思います。

憲法にか書かれているとおり、日本国憲法では政府が検閲をしたり通信を監視することはできないはずです。しかし「防衛」という大義名分から、蟻の一穴を開けられると、「監視を使ってない」ことを国民同士で誹謗して、最終的には監視を受け入れることになると思います。

どこの会社に委託するのですか。

そこそも、DNSの問い合わせのセキュリティチェックは、CloudflareやAdguardからあらゆる会社が提供している。政府はどこの企業に委託金を払って提供しているのか。

これって、利益誘導・・・・

委託先がトレン◯マイク◯とか、カスペル◯キーでないことを祈ります。

「合意を取るのが最低限」

企業であれ国の組織であれ、建前上でも「合意」を取るのが、最低限行われるべき合法施策だと思うのですよね。

従業員・組織の皆さんの通信は「こういう場面で監視する」とちゃんと契約書をとるのが、この国のかたちだとおもうのですが、みんなやらないよねぇ。

やらないと、黙って監視すればいいことになり良くないと思うし。

どういう場面でどういう脅威から防衛するのか、これを説明しないのは「セキュリティ教育」の観点からも不適切かなと思う。

以前の記事 に書いた通り

unboundでrootから引くdnsサーバを作り、DNSフィルタリングに備える - それマグで!

以前の記事にも書いた通り、徐々に徐々に包囲されて既成事実化しつつある状況はあまり良くないなと思う。そのうちに、自由なソフトウェアで自由に通信するだけで逮捕状が発行される状況になりかねない。

mac のタイムマシンって動作し過ぎじゃないですか??

mac のタイムマシンって動作し過ぎじゃないですか

ふと気づいたんですが、macのタイムラインってめっちゃ頻繁に起動しますね。

デフォルトは1時間に1回ですよね。 毎時間のように起動するのはちょっと無いわ。

(Catallinaなので古い情報ですが、Appleの設計思想がそうなってる。と知るにはこの画像が適切だと思った。)

RaspberryPのネットワーク、妙にがおそいときがあると思ったのはこのせいでした。

SMBを不使用時に、自動的に電源をオフにするようにSambaを構成したけど、何故か電源が入ってしまう。

なんでそんな事になってるのかと、見直したらタイムマシンがんガンガンにパケット送ってWOLしてしまうのが原因だった。

Sambaのバックアップに向いてないわこれ。帯域もめっちゃ食う

ネットワークだと1時間に一回って割と不便ですよね。

ローカルだけの構成ならローカルスナップショットで済むのだけど、SMBを保存先にすると、書き込みはかなりの頻度で行われる。

頻度を変える方法

昔は、Defaultsを書き換えできた。いまはSIPやCSPで保護されていて、何も書き込めない。ほんとうにMacOSは・・・

Defaultsに書き込みに行くソフトウェアTimeMachine Sscheduler は動かない。

TimeMachimeScheduler の設定

タイマー設定を変える。

そこで、代替手段になり得るのが、タイマーを使ってタイムマシンをOn/Offするソフトウェアである。

TimeMachineEditor (https://tclementdev.com/timemachineeditor/ )

ただし、この場合は、タイムマシンはOffで運用し、定期的タイマーでOnにすることで指定時間のバックアップを実現する。

そのため、通常タイムマシンとは異なる挙動になる。通常はスリープ状態でもタイムマシンは起動してバックアップを始めるが、そういう事が行われないので注意が必要だった。

最新版では解消される。

さすがに、Appleもまずいと思ったのか、最新版では任意のタイミングが標準機能で選べるようになった。

こういうAppleの設計思想を知ると、トラブルがおきたり苦情が来ないと対応しないというアップデート強制は割りと怖いんですよね。

cpu電源管理が面倒なので、powertop を自動的に実行する

CPUの電源管理設定を調べる。

cat でサクッと目見れる。

 cat /sys/class/scsi_host/host*/link_power_management_policy

https://wiki.archlinux.jp/index.php/%E9%9B%BB%E6%BA%90%E7%AE%A1%E7%90%86#SATA_Active_Link_Power_Management

## cpu の電源管理の設定を変える。

パワーマネジメントを変えることはそう難しくない

for i in  /sys/class/scsi_host/host* ; do 
    echo $i
    echo 'min_power' | sudo tee  $i/link_power_management_policy
done

ノートPCなら、min_powermed_power_with_dipm でいいかと思う。

面倒なので、powertop にやらせる。

このへんは powertop でチューニングされるはず

systemd サービスを作る

cat <<"EOS;" | sudo tee /etc//systemd/system/powertop.service

[Unit]
Description=Powertop tunings

[Service]
ExecStart=/usr/sbin/powertop --auto-tune
RemainAfterExit=false


[Install]
WantedBy=multi-user.target


EOS;

systemd のタイマーを作る。

cat << "EOS;" | sudo tee  /etc/./systemd/system/powertop.timer
[Unit]
Description=PowerTop auto tune

[Timer]
OnCalendar= daily
RandomizedDelaySec=3600
Unit = powertop.service

[Install]
WantedBy=default.target

EOS;

Serviceを有効にする。

sudo systemctl daemon-reload
sudo systemctl enable powertop.service
sudo systemctl start powertop.service

なぜこんなことをするのか

たまに、フルパワーでぶん回してベンチマークを取得たりするとき、元に戻し忘れる。

帰宅したときファンが轟音たててて、戻し忘れてたことを忘れるとかある。悲しい。

対応策は、あれこれあるけど、とりあえず、powertop にお任せ。

参考資料。

https://gist.github.com/shunirr/7510857

PowerShell で確認Y/Nをスキップする

Remove-Item で確認が出る。

例えば、Powershellレジストリを消そうとすると。

レジストリの削除

Remove-Item -LiteralPath 'HKLM:\SOFTWARE\Classes\Directory\background\shell\VSCode' 

確認が表示される。

If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

確認無しで削除を実行

確認が表示されると自動化に困難なので、確認を出さない

Remove-Item -LiteralPath 'HKLM:\SOFTWARE\Classes\Directory\background\shell\VSCode'  -Confirm:$false  -Recurse -Force

コレで、確認無しで削除を実行できる。

-confirm:$falseで「無」確認で実行できる。

Bashなどのスクリプトにある「常にYESと答える。」、PowerShellは、Bashとは違い、「はじめから確認なし」になる。

参考資料

https://stackoverflow.com/questions/4753702/automatic-confirmation-of-deletion-in-powershell

.bat ファイルをVsCodeで編集する関連付け

.bat ファイルの右クリックメニューを追加する。

Editで開くと、メモ帳になって不便なので、適当なエディタ(今回はVsCode)で開くようにした。

.bat ファイルのコンテキストメニューについての留意点

.bat ファイルのメニューを操作する前に知っておくべきこと。

いくつかの注意点があるので、備忘録として残しておく。

HKCU:\SOFTWARE\Classes\batfile を触る。

.bat ファイルは、拡張子.bat だが、レジストリではbatfile として登録されている。

拡張子で触るのではなく、batfile のエントリを触る。そして可能な限りHKCUで触る。

OpenWith系やダブルクリックは使用不可

OpenWith やOpenなどのdefault挙動を変えてはいけない。なぜなら、.batファイルをダブルクリックでコマンドとして実行する必要がある。そのため、標準の挙動を変えると起動するべき.batファイルが起動せずに、おかしなことになる。

もちろん、現代に於いて、.batファイルを利用したソフトウェアを標準配布するなど皆無に等しいため、変えても構わないはずだが、WindowsではOpenWithProgidを指定しても、OpenWithを変えることが出来ない。制限事項である。

.regファイルや.exeファイルとの比較

.batと似たようなシステムファイルの例として、regfile(レジストリ・ファイル)がある。

レジストリファイル(.reg)の場合は、OpenWithが利用可能である。

なぜなら、.regファイルを実行(登録)するには、regedit.exeを通すので、実行するexeを指定できる。

ところが、.batファイルは「ファイル自身」が実行対象になるため、OpenWithするexeがないことになる。

cmd.exeで開けばいいとか、persiste handler を変えたり、open を変えれば不可能ではないが、やるべきではない。

batfile ファイル形式は、次のように自分自身を実行するようにopen で定義されている・

batfile の定義(自分自身が実行対象)

%1 %* となり自分自身が実行対象であることがわかる。

コレは、.exeのexefile と同じ定義である。

exefile の定義(自分自身が実行対象)

bat と同じ定義である

このようなことから、OpenWith(関連付けの変更可能ファイル)として設定することは無意味であるし、するべきではない。

shell / shellex を通して、メニューを追加するに留めるわけです。

エントリの追加

上記を踏まえた上で、エントリを追加する。

## vs code 開くに追加
## .bat
New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile' -ItemType Directory 
New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell' -ItemType Directory 
New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode' -ItemType Directory 
New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode\command' -ItemType Directory 
New-ItemProperty -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode' -Name 'Icon' -Value "C:\Users\takuya\AppData\Local\Programs\Microsoft VS Code\Code.exe"
New-ItemProperty -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode\command' -Name '(Default)' -Value '"C:\Users\takuya\AppData\Local\Programs\Microsoft VS Code\Code.exe" "%1"'

icon について

icon を入れると次のように、コンテキスト・メニュにアイコンが見える

vscode のインストール場所に注意

Vscode はユーザ空間と、システム全体(グローバル)のどちらかにインストールされるが、基本的にはユーザ空間である。 まれにシステム全体になっていることがあるので注意する。

まとめ

BATファイルは、右クリックメニューのShell(またはShellEx)でメニューを登録するしか無い。

.batのOpenWithを使うと標準起動が変わってしまうので、OpenWithは使うべきではないし、使えない。

cygwin 環境の構築 をする

cygwin 環境の構築

wsl v2 がWindowsへのアクセスが遅すぎる。また、WSLは権限がめんどくさい。

そこで、古き佳きCygwinの世界に舞い戻ることにする。

msys/ mingw でもいいし、git-windows で git-bash(mingw) を使ってもいいのだが、パッケージのインストールをしようとすると、cygwinがやっぱり便利である。

cygwin をインストール

choco install cygwin 

apt-cyg をインストール

curl -LJ rawgit.com/transcode-open/apt-cyg/master/apt-cyg -O /bin/apt-cyg 
lynx -source awgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

あとは適当に使う。

git-bash は msys なんでパッケージ追加がめんどうだし、やっぱりcygwin でいいや。

cygwin でパッケージインストールをコマンドで

cygwin でパッケージインストール

.\cygwinsetup.exe --no-shortcuts --no-admin -q -P curl

apt-cyg を使えばいいのだが。apt-cyg自体をインストールするのにコマンドのインストールが必要だし、cygwinsetup.exe だけでパッケージをインストールができるのであれば、コレでも十分に間に合う。

WindowsターミナルでCygwinのタブを作る

Windows ターミナルでCygwinを使いたい。

最短の方法(WSL内からCygwinへ切り替え)

WSL やCmd.exeから次のコマンドを打ち込めば、簡単にCygwin環境に入れる。

wsl から

/mnt/c/tools/cygwin/bin/bash.exe /bin/xhere /bin/bash ~

cmd.exe / powershell.exe からbatを実行

C:\tools\cygwin\Cygwin.bat

既存のターミナルが切り替わる。

私は、C:\tools\cygwin\ がインストール先なのでbashをそこから起動している。

Windows ターミナルにプロファイルを作る(chere利用)

こっちが王道の解決方法。ターミナルにプロファイルを作ってそこから、起動する。

ただし、今回は chere ( open cygwin here ) を活用して起動する。

なくても可能です(後述)

cygwin / xhere を準備

xhere は chere パッケージに含まれるので

.\cygwinsetup.exe --no-shortcuts --no-admin -q -P chere

コマンドからサクッとパッケージを突っ込めばいい。

ターミナルを設定する場合

次の画面のように、プロファイルを設定する

JSONにプロファイルを直接指定

JSON を直接触るなら、

.profiles.list[] に次のエントリを追加する。

{
    "guid": "{xxxx-xxxx-xxxx}",
    "name": "Cygwin",
    "suppressApplicationTitle": true,
    "commandline": "C:\\tools\\cygwin\\bin\\bash.exe /bin/xhere /bin/bash ~",
    "icon": "C:\\tools\\cygwin\\Cygwin-Terminal.ico",
    "useAcrylic" : true,
    "acrylicOpacity" : 0.6
}

guid は各自で新規作成する。

PS >  [guid]::NewGuid()

chere を使わない場合

chere を使わない場合は、初期ディレクトリを指定しつつ、bashを指定すればいい。

bash.exeを指定しただけ(うまくいかない)

ただし上記の場合は、環境変数が引き継がれず、lsコマンドすら機能しないので、bash の引数などをうまく調整する必要がある。

Cygwin.batを指定する。

Cygwin.bat を指定すればいい。

Windows TerminalでCygwinが起動して嬉しい

便利

更に、Cygwinのショートカットをmintty から windows ターミナルに変えてもいいかもしれない。

まぁそこまでする必要もないか

まとめ

cygwin.batを使えばいいが、WSL内部からだとちょっと面倒くさい。

今回は、WSL内部からCygwin.batを起動出来ないので、xhere コマンドを経由してWSLからでも行えるようにした。そのためprofile からもxhere を使って指定している。

WSLv1 の未来は暗い。

私は、純粋なLinuxがほしいのでなく、WindowsLinuxコマンドで操作したいので、基本的にCygwinで事足りるのだが、WSLv1でも同じことができるので、WSLv1を愛用している。

純粋なLinuxがほしければ、2万出せばMiniPCが買えるし、Raspi4もあるので特に困らない。Hyper-VでわざわざLinux仮想マシンにしてそこからネットワーク経由でWindowsを操作するのはなにか違うと思ってるが、MSは確実性をとってWSLv2にシフトしているし、Hyper-Vを使ってすべてのマシンが仮想環境で並列に動くようになっている。

ほしいのは、Powershell以外のコマンド体系。VimAwkwindowsのファイルを弄ったり、SCPで転送したりしたいわけで、Linux自体がほしいわけじゃない。その欲求を満たしてくれるWSLv1 が今後ずっと使えることはなさそうです。素直にPowershellを覚えるか、Cygwin使って事らしいです。

そのために、CygwinやMSYSをWindowsターミナルでも使えるように準備をしておいた。

WSLv2を使うのであれば、Hyper-VUbuntuいれてMutipassで管理するんだよなぁ。

参考資料

https://qiita.com/yokra9/items/e8b184021091dbabb8a1