コマンドプロンプトのタイトルバーをPythonから変更する。

 ちょっと調べればわかることですが、WindowsTerminalでコマンドプロンプトも扱うようにしたので、タブがいくつもあってどれが何のタブなのかわかりにくくなってしまい、実行しているPythonスクリプトからタブに表示されるタイトルを変更できないかと思いまして。

調べてみると、コンソールからコマンドで "title" というのがあり、Pythonからは

subprocess.run(["cmd", "/c", "title", "アブラカタブラ"])

みたいにすればできることがわかりました。

ところでこのtitleコマンドがどこにあるのか調べてみたら、cmd.exeのビルトインコマンドだということがわかりました。

C:\Users\kats$ wsl strings /mnt/c/Windows/System32/cmd.exe | grep -i title
GetConsoleTitleW
SetConsoleTitleW

ここで、Win32 APIのSetConsoleTitleW()というのが呼ばれていることがわかりました。wslマジ有能。

それじゃあこのWin32 APIを叩けるPythonモジュールはないかと探したら、Pywin32にありました。

Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from win32api import SetConsoleTitle
>>> SetConsoleTitle("アブラカタブラ")
>>>

とまあこれだけでタイトルが変わりました。

どっとはらい。

Windows 11でシステムロケールをUnicodeにしてみる。

 だいぶ前(2019年5月9日)にWindowsロケールをUTF-8にして不具合のあるアプリ。でちょっとお試ししたものの、ヘタレなのでもとに戻してしばらく立ちます。その後どうなったかを見てみようかということで再度設定、確認してみました。


追記: 結論から先にいうと、やっぱりやめたほうが良さそうです。

影響があったソフトで今も使っているものは、Python3とcmd.exe、筆王くらいでしょうか。

まずはPython。バージョンは3.10.1で、Windows Terminal Preview上のコマンドプロンプトから実行してみます。

以前の画面キャプチャがないですが、どうやら使えそうな雰囲気です。reとか試してませんが。
前回はだめだったIDLEも起動します。

cmd.exe。こちらはコードページが65001になって、メッセージも英語になってしまいます。

こんな感じ。まあ、これで問題なければ使えます。

次に筆王。これはだめでした。

スプラッシュ画面は表示されますが、起動しません。たぶん、なんかキーになるものを見てるんでしょうけど、よろしくないですね。

あと、Aviutlではプラグインがやっぱりどうやらだめみたいで、前回はなにか勘違いしていたみたいですね。

ということで、やっぱりUnicode UTF-8はまた封印することにしました。

NeovimからWSL2のMeCabを使ってみる。

Neovimで日本語のファイル内をうろついているときに、もっといい感じで移動できるといいのに、と常々感じてはいたのですが。実はだいぶ前に deton/jasentence.vim と deton/jasegment.vim というのを見つけてまして、もうちょっとちゃんといじってみようかなと。

jasentence.vim は )( を使って「。」や「、」への移動(センテンス移動)を行えるプラグインです。"、。,.?!" を見てくれるらしいので、ついでに "「" や "」" も見てくれればいいのにな、と思ったり思わなかったり。まあそれはさておき。

英語だと w や e での移動は単語単位になりますが、文の構造上単語を切り出すのが難しい日本語では、漢字・カタカナ・ひらがな・その他という感じで大雑把な単位での移動になってしまいます。:help word-motions では、

  • w: 次のwordの先頭に移動
  • b: 直前のwordの先頭に移動
  • e: 次のwordの末尾に移動
  • W: 次のWORDの先頭に移動
  • B: 直前のWORDの先頭に移動
  • E: 次のWORDの末尾に移動
  • word: 空白(space, tab, <EOL>)で区切られた文字の連続。空白行もwordとして扱われる。
  • WORD: 空白(space)で区切られた文字の連続。空白行もWORDとして扱われる。

などとなっています。

当然、日本語でも同じキーで移動したいわけで、じゃあやっぱり形態素解析で文を見てもらったほうがいい感じで動作するのかな、と。

jasegment.vim がそのへんをうまくやってくれるようで、後ろで動いてくれるエンジンには CaboCha や TinySegmenter、MeCab などを使えるようです。デフォルトでは KNBコーパスで文節を学習させたデータが使われるようで、それでもいいんですが、ここは MeCab を使ってみようかと。

Windows用バイナリは MeCab: Yet Another Part-of-Speech and Morphological Analyzer に用意されているのですが、せっかくなので WSL2 上の ArchLinux で動作させてみようかなと。幸い、AUR をmecabで検索すると mecab、mecab-git、mecab-ipadic、python-mecab、mecab-ipadic-neologd-git などが登録されているようですので、ビルドとインストールは makepkg でうまいこといきそうです。ちなみにソースは mecab だと tarball を拾ってきて、mecab-git だと github から拾ってくるようです。github のほうは ipadic と jumandic をソースツリーに取り込んでるように見えます。ここでは github からのほうを使ってみます。

ということで早速始めます。

git clone https://aur.archlinux.org/mecab-git.git
cd mecab-git
makepkg -sri

でも辞書はインストールされていません。なので mecab-ipadic をインストールします。

git clone https://aur.archlinux.org/mecab-ipadic.git
cd mecab-ipadic
makepkg -sri

辞書は /usr/lib/mecab/dic/ipadic 以下にインストールされました。さらに mecab-ipadic-neologd-git もインストールします。

git clone https://aur.archlinux.org/mecab-ipadic-neologd-git.git
cd mecab-ipadic-neologd-git
makepkg -sri

こちらの辞書は /usr/lib/mecab/dic/mecab-ipadic-neologd にインストールされました。

MeCab の辞書指定は /etc/mecabrc で行います。

dicdir =  /usr/lib/mecab/dic/ipadic

標準では ipadic が指定されていますが、不満が出てこなければこのままでもいいか、と手を付けずに置きます。

念の為、mecab になにか食わせてみます。

% mecab
念の為、mecab になにか食わせてみます。
念 名詞,一般,*,*,*,*,念,ネン,ネン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
為 名詞,非自立,副詞可能,*,*,*,為,タメ,タメ
、 記号,読点,*,*,*,*,、,、,、
mecab 名詞,一般,*,*,*,*,*
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なにか 副詞,助詞類接続,*,*,*,*,なにか,ナニカ,ナニカ
食わ 動詞,自立,*,*,五段・ワ行促音便,未然形,食う,クワ,クワ
せ 動詞,接尾,*,*,一段,連用形,せる,セ,セ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS

次にコマンドプロンプトから食わせてみます。

C:\Users\kats$ wsl mecab
念の為、mecab になにか食わせてみます。
念 名詞,一般,*,*,*,*,念,ネン,ネン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
為 名詞,非自立,副詞可能,*,*,*,為,タメ,タメ
、 記号,読点,*,*,*,*,、,、,、
mecab 名詞,一般,*,*,*,*,*
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なにか 副詞,助詞類接続,*,*,*,*,なにか,ナニカ,ナニカ
食わ 動詞,自立,*,*,五段・ワ行促音便,未然形,食う,クワ,クワ
せ 動詞,接尾,*,*,一段,連用形,せる,セ,セ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS

ちゃんとできてますね。

では、Neovimでやってみます。


まず knbc_bunsetu から。


次に、以下のコマンドを実行して mecab で動かします。

let g:jasegment#mecab#cmd = 'wsl mecab'
let g:jasegment#model = 'mecab'


できてるようですね。パチパチパチ。


でも、どちらかというとカーソル移動では knbc_bunsetu のほうが好みかも。

二ヶ国語のMP4ファイルをエンコードする。

TSファイルで二ヶ国語(音声多重)のものを二ヶ国語MP4にエンコードするのは、Aviutlだとひと手間必要です。Handbrakeなど他のツールは使っていないのでわかりませんが、自分は以下のような手順で行っています。
 
もちろん他にもいろいろやり方はあるでしょうが、バッチファイル化してTS(うちの場合はTMSRで編集したm2tsファイル)を食わせてやれば自動的にdemuxしてくれますので、この方法でずっとやっています。

  1. M2TSファイルを用意します。
  2. ffmpeg でストリーム0(映像部)を切り出して、m2v にします。
  3. ffmepg でストリーム1(音声1)を切り出して、m4a にします。
  4. ffmpeg でストリーム2(音声2)を切り出して、m4a にします。
  5. m2v は Aviutl に食わせて mp4 にします。
  6. m4a はそれぞれ音声コーデックに食わせて、aacにします。
  7. 最後に remuxer に食わせて結合します。
2と3は、そのまま結合するとなぜかTMSRが「MP4で標準的な音声ストリームではない」と言われてしまうため、あえて入れています。
また、5の音声コーデックはffmpegでもいいしQAACでもいいです。音質的には ffmpeg + libfdk_aac と qaac と、どちらでも非常によいです。また、5.1ch音声でもちゃんとエンコードしてくれます。remの部分でqaacかffmpegを選択して使います。
ffmpeg -i "%~nx1" -map 0:0 -c copy "%~dpn1.m2v"
ffmpeg -i "%~nx1" -map 0:1 -c copy "%~dpn1-1101.aac"
C:\Apps\aviutl\exe_files\qaac64 -V 127 "%~dpn1-1101.aac"
rem ffmpeg -i "%~nx1" -map 0:1 -c:a libfdk_aac -vbr 5 "%~dpn1-1101.m4a"
ffmpeg -i "%~nx1" -map 0:2 -c copy "%~dpn1-1102.aac"
C:\Apps\aviutl\exe_files\qaac64 -V 127 "%~dpn1-1102.aac"
rem ffmpeg -i "%~nx1" -map 0:2 -c:a libfdk_aac -vbr 5 "%~dpn1-1102.m4a"

ffmpeg は libfdk_aac を使えるように自分でビルドしています。
結合は remuxer を使います。

remuxer -i {video} -i {audio1} -i {audio2} -o {mp4file}

です。
以前はmp4box使ってたんですが、ファイル名の扱いの部分でちょっとおかしい(たぶん文字コード関係)ことがあったので、こちらに切り替えました。

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...