マルチモニタでセカンダリをON/OFFする方法。

せっかく大画面テレビ(といっても37インチですが)があるのだから、PCの動画をテレビ側に映したい、というときに、いくつか方法があります。

ひとつはChromeCast。
ChromeCastに対応した再生アプリ(VLC Media PlayerとかPowerDVDとか)を使えば、無線LAN経由で動画をキャストすることができます。

もうひとつは物理的に繋いでしまうこと。
HDMIケーブル(もしくはテレビ側で対応していればDPケーブルなど)でPCとテレビを繋げ、セカンダリディスプレイとして認識させます。するとWindows側では画面の複製 / 拡張 / PC側のみ / テレビ側のみの4つの状態を選択することができるようになります。
ただしこのとき、動画を見ないのに常時セカンダリを接続したままにしておくと、困ることがあります。
  1. ディスプレイが拡張されていると、マウスがセカンダリ側に行ってしまうと見えなくなる。
  2. オーディオがPCに接続されたスピーカではなくテレビ側のスピーカから再生される。
  3. セカンダリが電源オフなのに、セカンダリ側で使用したアプリはそちら側で起動されていまう。
これを防ぐには、デスクトップで右クリック→「ディスプレイ設定」→「マルチディスプレイ」のところでいちいち変えてやらなければいけません。ひと手間ふた手間かかるのでけっこう面倒です。

実は %windir%\System32\DisplaySwitch.exe というコマンドがあり、これを使えば画面右側にディスプレイの選択ができるようなバーを出してくれます。

デスクトップなどにこのコマンドへのショートカットを置いておき、切り替えたいときに起動すれば簡単に切り替えできるようになります。

また、オプション引数を指定することでワンクリックで切り替えることもできます。

拡張の場合には "/extend" オプションを、PC側のみの場合には "/internal" オプションを指定してやります。
また、"/clone" ではPC側の複製をテレビ側にも表示し、"/external" ではPC側をオフしてテレビ側のみにします。
/extendしたときにテレビ側のオーディオデバイスを選択しておくと、/internal したときにはPC側、/extend したときにはテレビ側のオーディオが選択されるようになるようです。

この動作をコンテキストメニューに割り当てる記事がありました。
WindowsスマートチューニングのWin 7/8/8.1編: マルチディスプレイをコンテキストメニューから切り替えるです。

この記事の通りにレジストリファイルを作成し、レジストリに格納することでコンテキストメニュー(デスクトップでの右クリック)で呼び出すことができるようになります。
一点、記事中ではUNICODEで保存となっていますが、うちの環境ではシフトJISで保存しておかないと文字化けしました。

元記事が削除されてしまう場合も考慮して、こちらにコードを引用させてもらいます。以下のコードをテキストエディタなどにコピーして multidisplay.reg などとファイル名をつけて保存すればOKです。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\DesktopBackground\Shell\DisplayChange]
"ExtendedSubCommandsKey"="!DisplayChange"
"MUIVerb"="マルチディスプレイ(&D)"
"Position"="Bottom"
"Icon"="%SystemRoot%\\System32\\display.dll,-1"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\01]
"MUIVerb"="PC画面のみ"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\01\command]
@="DisplaySwitch.exe /internal"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\02]
"MUIVerb"="複製"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\02\command]
@="DisplaySwitch.exe /clone"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\03]
"MUIVerb"="拡張"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\03\command]
@="DisplaySwitch.exe /extend"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\04]
"MUIVerb"="セカンドスクリーンのみ"

[HKEY_CLASSES_ROOT\!DisplayChange\Shell\04\command]
@="DisplaySwitch.exe /external"

4K放送とHDMIケーブル。

アンテナケーブル。のところで、4Kに対応するには屋外はS5CFB、屋内はS4CFB以上がいいよという話を書いたのですが、そういえばHDMIケーブルはどうなんだっけ、と思ったのでまとめ。

まず、現行2Kで使用されているHDMIケーブルは大抵がHDMI 1.4もしくはHDMI 1.4a規格に対応したものだと思います。

規格としては、大雑把に以下のようになるかと思います。参考: HDMI各バージョンの機能詳細

バージョン 変更点
1.3 1440p対応
帯域 10.2Gbps対応
1.4 ARC対応の追加
HDMI Etherチャンネル追加
4K解像度(3840x2160/30p)対応
2.0 2160p60Hz対応
帯域18.0Gbps対応
2.1 4320p60Hz対応
帯域48.0Gbps対応

映像および音声信号はTMDSという差動信号を使って伝送していて、基本的にはジッタ(+/-の信号線長の違いによる信号のズレ)や損失、インピーダンスの不整合(反射による信号の汚染)が少ないほどいい、ということになります。

上記によれば、HDMI 1.4規格に対応したケーブルであれば4K/30pは出力できます。Wikipediaの記述によれば、1.4規格では「すべての信号線にシールド」となっていますが、これは各信号のツイストペアをそれぞれシールドする、という意味になります。そのため、外部ノイズおよび信号ペア間のクロストークが抑えられるようになっています。
一般には、ケーブルが太いものほどシールドなどがしっかりしていると考えてよいと思いますが、細いケーブルでも机の脚で踏み潰したり、直角に曲げるなどのことがなければ基本的には伝送はできると考えてもよいかと思います。

新規で購入する場合には、HDMIケーブルの認証プログラムをパスしたものを購入するのがよいでしょう。HDMIケーブルのパッケージには、認証を取得していることを示すロゴが表示されています。
規格としては "HIGH SPEED" "HIGH SPEED with ETHERNET" と、"STANDARD" "STANDARD with ETHERNET" の4種類があると考えてよいかと思います。この他に "STANDARD AUTOMOTIVE" というのがありますが、あまり目にすることはないでしょう。
このうち、STANDARDはもう市場ではほとんど見かけなくなっていますので、市販されているのはほぼハイスピードケーブルということになります。あとは使用する機器がHDMI Ethernet対応になっているかと、8Kまでの伝送が正常にできるかという点になります。HDMIでは2.0の認証を受けたケーブルは "Premium" というロゴを表示してもよいことになっているので、プレミアムケーブルを購入しておけばまず間違いはありません。が、一方でハイスピードケーブルでも4K/30pは伝送できるので、ハイスピードケーブルでも十分、ということは言えると思います。

MPC-BEでmadVRの設定。

ノートPCでMP4動画を再生するのに、VLCメディアプレーヤーは使いやすいし何も設定しなくてもインストールしただけで使えるので便利ですが、画質・再生品質的には今一つの印象があります。印象なので、ここから先は単なる自己満足の世界で、定量的な評価などはありません。動画を見ていて、再生時に「ん?」と思うような引っかかりがなくなればOKというレベルでの自己満足追求です。

ちょっと否定的な出だしになりましたが、そんな感じで MPC-BE + madVR です。

MPC-BEは、もともとはWindows Media PlayerとそっくりなUIのMPC(Media Player Classic)からの派生です。WMP6.4が結構人気があったのにWindows MEのときにWMP7で外観が大きく変わってしまったため、前のほうが好きだった人たちがオープンソースで開発していました。その後、MPC-HC(Home Cinema)が派生し、さらにそこからMPC-BE(Black Edition)へと派生しています。一方でMPC-HCのほうもGitHubで開発が再開しているようです。

MPC-BEはChromeCast(以下CC)へのキャストはできないので、大画面で見たい向きにはそこのところはちょっとカユイのですが、そもそもVLCなどでのCCへのキャストはMP4などのメディアファイルをCCへ流し込んでいるだけで、デコード処理自体はCC側で行うため、コーデック自体はCCで使っているSoCのライブラリによるはずです。なので、PCのディスプレイで高画質動画を観たい、もしくはPCからHDMIやDPなどで大画面テレビで再生したい、という場合の方法になります。
ただし、PCの構成、特にCPUやGPUの処理能力が不足するとけっこう悲惨なことになりますので要注意。

参考にしたのはこちら。"LOL, I has a web server"というサーバなんでしょうか。けっこういろいろと興味深いページがあるんですが、こちらから3.1 DXVA2 Focusedをベースにしています。

MPC-BEのインストールは他のサイトなどを参照していただいて、madVRの設定から始めます。

まずMPC-BEからレンダラとしてmadVRを設定します。
ここのビデオレンダラーの設定をmadVRにします。
するとタスクトレイにmadVRアイコンが出てくるので、そこを右クリックして "Edit madVR settings..." を選択し、設定画面を出します。

最初にデバイスの設定を行います。
液晶モニタなので2番めの "Digital Monitor / TV" を選択して "Apply" ボタンを押します。

次にプロセッシングのところです。
  • deinterlacing のタブはデフォルトのまま。
  • artifact のタブは、
    • "reduce banding artifacts" をチェックして両方とも "high"
    • "reduce compression artifacts" はチェック
  • "image enhancements" と "zoom control" はそのまま。

次はスケーリングアルゴリズム。
ここで、NGUというのは "Next Generation Upscaling" のことで、作者 madshi氏独自のものです。バージョンアップごとに速度面などでも改良されてきていますが、かなり重いために非力なCPUではコマ落ちが発生することもあります。
  • "chroma upscaling" は "NGU" → "Anti-Alias, very high quality" あるいは "Jinc" を好みで。参考 madVR chroma upscaling comparisons
  • "image downscaling" は "DXVA2" または "Jinc" を好みで。
  • "image upscaling" は "NGU Anti-Alias"→ luma doubling "very high" または "DXVA2" または "Jinc" を好みで。
  • "upscaling refinement" はそのまま。

次はレンダリング。
  • "general settings" はそのまま。
  • "windowed mode" はそのまま。
  • "exclusive mode" はそのまま。
  • "stereo 3d" はそのまま。
  • "smooth motion" は "enable smooth motion frame rate conversion" にチェック。
  • "dithering" は "Error Diffusion - option 2" にチェック。
  • "screenshots" はそのまま。
  • "trade quality for performance" はそのまま。

最後はユーザインタフェースですが、ここはそのままで。

PowerShell for Linux。

バッチファイルをPowerShellスクリプトに置き換えるにはどうすればいいのかと、ちょっと調べていたら、Wikipediaのほうで最新バージョンは6.1.2ですよと書いてありました。

PowerShellはGitHubでリリースされていますが、よく見るとLinux用のRPMやDEBパッケージもあるじゃないですか。

MicrosoftのInstalling PowerShell Core on Linuxには、どのディストロ/バージョンに対応しているのかが記載されています。そこには、家で使おうとしているManjaro LinuxのベースとなっているArchLinuxもサポートされているようです。Experimentalの但し書き付きですが。

ところで、Stack Overflowの2018年のプログラミング言語の人気ランキングでは、人気トップ3がRust、Kotlin、Pythonの順で、25位までにはPowerShellは入ってないようです。一方、嫌われている言語としてはVisual Basic 6が1位、Cobolが2位などで、なんとかつて一世を風靡したPerlが8位に入っています。

これを眺めているととても興味深いですが、PowerShellはどこにもないですね……。

話を戻して、PowerShell 6.1.2はMSIインストーラがあるようなので、インストールは簡単です。

ただ、興味は多少あるにしてもPythonでいいかな、と思う自分がいるのも確かですし、一応メモだけにとどめておきます。

gmailのニュースメールを一括で削除する方法。

注意: この記事は未完成です。一括削除する方法はまだ見つけられていません。


いろんなニュースメールがありますが、数が多いとどんどん未読が溜まっていくし、ニュースである以上古いものは不要です。読んだら削除、というスタイルで運用していても読まずに溜まっていくものもたくさんあり、それがGoogleの自分用ディスクスペースを圧迫しています。

だいぶ前ならば、「あとで、何かあったときにふと検索する用途」などという目的で保存しておいてもよかったのですが、最近ではそれこそググれば情報の取得はラクですし、何より古いニュースはリンクに飛んでも時効(expire)にされたり有料だったりと、あまり役に立ちません。なによりググったほうが検索エンジンが賢いので、手元にニュースメールをアーカイブしておく必要がなくなってきています。

だったらもういっそのことサクッとまとめて削除したい。なんとかできないだろうかと調べてみました。

まずGoogleのGmailヘルプから、Gmail で使用できる検索演算子

これで削除したいメールの条件を設定して、「検索」することはできます。が、それをゴミ箱に移動する「アクション」を記述する方法は記されていません。SQLみたいにdeleteコマンドとかはないのかしら。

いくつか方法を考えてみます。

1. 検索したメールに一括で「ゴミ箱」ラベルを付ける

もしできれば、これができれば一番まっとうなやり方かなと思います。おそらく「他のラベルを外す」かつ「ゴミ箱ラベルをつける」ことができればいいのですが、ラベルを付ける/はずすコマンドがわかりません。

2. IMAPSで接続して削除する - メーラー編

プリミティブな方法ですが、もしかしたらこれが一番手っ取り早いかもしれません。IMAPSをサポートしているメーラーを利用して一括削除するというものですが、メーラー側で「検索」→「マーク」→「削除」などができることが必要です。
自分が使っているBecky!2は、単純な検索はできても検索結果をマークはできなさそうです。

その他で自由がききそうなのは UNIX系の環境になりますが、mutt(IMAPとSSLを有効にする)やEmacsベースのMewWanderlustなどはあたってみるのもいいかもしれません。

3. IMAPSで接続して削除する - Python編

Python 3.6では、imaplibがIMAPSにも対応しています。マークして削除とかしなくても、「検索」→「削除」をループさせればいいんだと思いますが、もしかしたら時間がかかるかもしれません。

下に行くほど難易度が高くなってますね…。

win32kbase.sys。

どうも年が明けてから、メインPCの調子が今ひとつな感じです。
実は先程もいきなりBSOD(Blue Screen Of Death)して、「自動的に再起動します」と出ているのに再起動せず、メッセージにはwin32kbase.sysのSYSTEM_SERVICE_EXCEPTIONというものが表示されていました。

マイクロソフトのフォーラムを覗いてみると、BSOD System_Service_Exception win32kbase.sysというスレッドがありました。それに対しての返答をみると、

1. SFCを走らせてみる
コマンドプロンプトを管理者モードで起動し、sfc /scannow して結果をみる。
もしなにかあれば、
2. DISMを走らせてみる
コマンドプロンプトを管理者モードで起動し、次のそれぞれのコマンドを実行する。
DISM.exe /Online /Cleanup-image /Scanhealth
DISM.exe /Online /Cleanup-image /Restorehealth

あるいはここを読んで参考にする

ただ、このスレッドのリプライを見てみるとあまりうまい具合に解決したというものはないようです。

もう少ししたら時間をとって、メインPCをクリーンインストールし直そうかと思っています。もともとがWindows7からのアップグレードですし。

2K放送はどうなるのか。

アンテナケーブル。のところで4K/8Kのためには準備しなくちゃねということを書いたのですが、じゃあ2Kで十分な人はどうすればいいですか、という疑問がふと湧いてきたのでメモ。

総務省のよくある質問 1章 4K8Kについてに、以下のようにありました。
従来の衛星放送の継続について

問1-7: 新4K8K衛星放送の開始により、現在のBS及び東経110度CSのハイビジョン(2K)放送は終わるのですか?

答1-7: 新4K8K衛星放送が始まっても、現在の衛星放送(2K等)は続きます。現在の放送は、引き続き、現在お使いになっているテレビ、チューナー、アンテナで見ることができます。

期限とかは書いていなくて、2K放送は続きます、だそうです。

TeXLive Manager 2018のアップデート。

TeXLiveをアップデートしようとしたらTeXLive Managerがなんかメッセージを出して終了してしまったのでメモ。


このように下のログ部分を大きくしてやらないとちゃんと見えないので、ログ部分を大きくしてから「導入済みのものをすべて更新」をクリック。

すると
======
tlmgr itself needs to be updated.
Please do this via either
tlmgr update --self
or by getting the latest updater for Unix-ish system:
http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
and/or Windows systems:
http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.exe
Then continue with other updates as usual.
=====
と書いてあります。

要は、tlmger自体をアップデートしてねってことですので、まずはそれを行います。

$ cd C:\texlive\2018\bin\win32

C:\texlive\2018\bin\win32$ tlmgr update --self
tlmgr.pl: package repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet (not verified: pubkey missing)
tlmgr.pl: saving backups to C:/texlive/2018/tlpkg/backups
tlmgr.pl: Preparing TeX Live infrastructure update...
tlmgr.pl: Backup option not implemented for infrastructure update.
DO NOT CLOSE THIS WINDOW!
TeX Live infrastructure update in progress ...
Detailed command logging to "C:\texlive\2018\temp\update-self.log"
self update: texlive.infra (48560 -> 49228) texlive.infra.win32 (48059 -> 48877)
Infrastructure update finished successfully.
You may now close this window.

C:\texlive\2018\bin\win32$

もしかしたら c:\texlive ディレクトリには書き込み禁止の属性があるかもしれないので、そのときには管理者モードのコマンドプロンプトから実行します。

その後、再度 tlmgr を起動してアップデートを行います。

ネジについて。

ボルト、ナット、ワッシャについては置いておいて、木工用のネジについて自分用にまとめ。

  • 木ねじ
    木工用ネジ全般の呼称。材質が鉄またはステンレスで、鉄の場合にはメッキあるいは防錆処理しているものもある。
    焼入れしているものは強く、インパクトドライバなどトルクの強い工具を使う場合には焼入れの鉄ネジかステンレスを使う。
  • コーススレッド
    coarse threadと書き、つまりは並目ねじのことだが、木工用の軸が細くネジ山が高いものをいう。
  • タッピングネジ
    自分でタップを切りながらねじ込んでいくネジ。アルミやプラスチック、薄めの鉄板などに使う。もちろん木材にも使えるが、コーススレッドに比べると軸が太いため下穴を開けたほうがよい。
  • 全ねじ
    ネジの軸の全長に渡ってネジが切ってあるネジ。引き抜き強度は強いが、締め付け時に手前の板が浮き上がってしまうことがあり、そのときには半ねじタイプを使う。あるいはボンドで接着しクランプで固定した状態でネジを打つ。
  • 半ねじ
    木の材料同士をネジで締め付けるときに使う。スレッド(ネジ山)部を抜ければネジ頭で押さえつけるので、一旦隙間ができても再度締め付けることができる。

作業台を作る。

商品の展示用に小さいテーブルが必要になって、それだったら作業台にも兼用できるようなのを作ろうかと勘案中なので、まずはメモ。

2x4材で馬を作って、その上に天板を乗せるスタイルでいきます。

馬を作るのに簡単なのは、ソーホースブラケットを使うこと。検索するとFultonやE-Valueなどから出ているようです。

Fultonのものは100SHB、300SHB、400SHBの3種類が手に入りやすいようですが、違いは、

  • 100SHBは蝶ネジとボルト止めのみで、木ねじは使わないようです。
  • 耐荷重は100SHBが225kg、300SHBが180kg、400SHBが135kg。
  • どうやら300SHBが一番安く手に入りそうです。

ちなみにブラケットは2個1組で売られているので、テーブルを作るには2セットあれば十分です。
300SHBはAmazonで1405円、ジョイフル本田で780円と倍近い開きがあります。また固定用の木ネジはφ4のものがよいようです。

2x4材は防腐ニスを塗ることを前提に、これも安いホワイトウッドにします。

馬の開きは30度なので、脚の先端を15度でカットしないと角だけの支えになってしまうため、そこは工夫する必要がありますね。15度ということは、逆から見れば75度でカットする必要があります。

ちょっと調べてみるとのこぎりガイドなるものがあって、藤原産業からはSK11 マイスターボックス、その他GREATTOOLSなどからも出ているようです。
ただ、これらで対応しているのは90度、60度、45度、22.5度の4種。しかも今回の場合には横方向の斜めカットではなくて縦?奥行き?方向になりますから、これらのボックスで使うのは結構難しそうです。一番ラクなのはワークベンチに4本並べて固定して、角度をつけた丸鋸で一気に切ってしまう方法です。これなら歪まず曲がらずきれいに切れるはずです。

ところがうちには丸鋸がありません。以前に使ったときには近所のドイトのレンタルを使っていますが、実は以前から欲しいことは欲しくて、コード式ならHiKOKIがいいかなとは思っているのですが、先日ボッシュのインパクトドライバを買ったときにバッテリが3個もついてきているので、ボッシュのコードレス18Vを買ってしまおうかと考えています。

PKS18LIHは、いわるゆ左勝手あるいは逆勝手と呼ばれるスタイルで、通常は材料を作業者の左方向に置いてカットした右側を落とす形になりますが、左勝手の場合には逆になります。そのため、左手で材料を押さえることはできません。必ずワークベンチの木工クランプやFクランプなどで固定する必要があります。また、定規は右側に当てることになるため、これも左手で固定することはできません。つまり、丸鋸ガイド定規などを使いたい場合には、どういう使い方になるのかをきちんとイメージしておく必要があります。

そこさえ押さえておけば、左勝手でも問題ないでしょうし、むしろ下書きの線は見やすいかもしれません。

一応左利き用の左勝手ガイド定規はあるのですが、この場合にはノコを握るのは左手になるため、基本的には丸鋸用のT型のスライダー定規を使ったり、あるいはまっすぐな板などをガイド代わりにしてクランプで固定するのがよいかもしれません。

アンテナケーブル。

最近は地上波デジタル放送とか衛星放送とかで搬送周波数が上がってきていて、さらに4K/8K放送もあるのでアンテナ(お皿)とテレビとかレコーダーを買い換える人も増えてると思うのですが、家を建てるときにケーブルを壁中に埋め込んでしまっているので、そのままのケーブルを使っている人もいるようです。

簡単にまとめると、従来のBS/CS110は右旋円偏波という電波にのみ対応していますが、4K放送の場合には左旋円偏波のチャンネルがあり、左旋円偏波に対応したアンテナがないと受信できません。またケーブルやブースター、分配器、分波器などについては3224MHzまで対応したものを使わないと減衰が大きく、正常な受信ができない可能性があります。

機器類についてはSHマークなどの形で対応・非対応がラベルに表示されているのでわかりやすいですが、アンテナケーブルについてはちょっとわかりづらいのでまとめてみます。
ちなみにSHマークは以下のようなものです。


現在ではアンテナケーブルはほとんどが同軸ケーブルになっています。テレビ放送受信用の同軸ケーブルはインピーダンスが75Ωになっていますが、使用される素材によって周波数特性が異なり、一般には高周波になるほど減衰しやすくなっています。減衰すると信号が弱くなり、ちょっとした天候の変化でブロックノイズが増えたり映像が止まったりするようになります。

アナログ放送の頃は5C2Vという規格のケーブルが多かったですが、衛星放送が始まってからはS5CFBという規格のケーブルが必要になってきました。S5CFBでは芯線は軟銅線、それを発泡ポリエチレンの絶縁体で覆い、アルミ箔、編組線で覆っていき、最後にビニール皮膜となっています。ここでインピーダンスの75Ωは、絶縁体の発泡ポリエチレンの誘電率と、アルミ箔と芯線との距離で決定されますが、柔らかい素材の発泡ポリエチレンが潰れたりするとその部分でのインピーダンスが変化してしまうために損失が増えてしまいます。特に室内での取り回しでは、ケーブル固定時に金具などで潰されてしまうということが起こりやすいので注意が必要です。S5CFBにはアルミ箔を2重にしたS5CFB□という規格のケーブルもあり、これは外来ノイズにより強いという特性があります。
一方、インピーダンスの特性をアップして低損失化するために高発泡ポリエチレンを使用したS5CHFBという規格のケーブルも出ていますが、これはさらに潰れやすい素材のためにシースを固くしてあり、屋内での使用には向きません。
また、屋内では取り回しのしやすさを考慮して一回り細いS4CFBを検討してもよいでしょう。

ということで、4K/8Kを含めた衛星放送を受信するには、最低でも屋外ではS5CFBケーブル、屋内ではS4CFBであることが必要です。

アンテナケーブルは数十cmから1mごとくらいに型番が印刷されており、そこを見ればケーブルの種類はわかるのですが、それ以外にも見分け方があります。

まずケーブル太さですが、S5CFBの 5 は絶縁体の直径を表しています。そのため、ビニル被覆まで含めた直径はおよそ7.7mmあります。より細いケーブルでS4CFBというものもありますが、これは外径が6mmで、取り回しは楽になりますが特性的には減衰がS5CFBよりも大きくなります。

古いアンテナケーブルだと絶縁体が半透明のものがありますが、これはポリエチレンで、衛星放送には対応できません。ふわふわした真っ白の絶縁体であることが必要です。また、ビニル被覆を剥くと編組線(編み線)がありますが、これが銅色をしていれば2K用です。この場合には型番も5CFVとなっていると思います。4K/8K対応品は錫メッキされているので銀色になっています。

ということなので、手元に余っているケーブルの編組線が銅色のものは今後間違って使うのを避けるために捨ててしまうのがよいかと思います。

そういえばF型接栓の予備がなくなってるから買ってきておかないと…。

WindowsでHere-docを使ってみる。

Here-docもしくはヒアドキュメントというのは、文字列をシェルスクリプトやプログラムコード中に埋め込む方法の一つです。

UNIX系のシェルである sh (Linux系ではbashへのシンボリックリンクであることが多い)では、たとえば
$ cat << _EOT_
> hello, world.
> _EOT_
hello, world.
$
などというように、 _EOT_ で囲まれたものをコマンドへの標準入力に食わせるために使います。_EOT_ は前後で同じものを使えばいいので、食わせたいテキスト中に同じものがなければなんでも可能です。ちなみに EOT は "End of Text" の意味で、慣用句としてよく使われます。
同じことはPythonでもできます。
$ python - << _EOT_
print('hello, world')
_EOT_
hello, world
$
この場合には _EOT_ で囲まれた部分をスクリプトとして Python に食わせています。
この手法を使えば、ひとつのシェルスクリプトの中にPythonのスクリプトを埋め込むことで、スクリプトファイルを一つにまとめることができます。

とここまでを踏まえて。

これをWindowsで使えないかと思ったのがここでの趣旨。バッチファイル内にpythonスクリプトを埋め込めば、いくつもファイル作らなくて済むじゃん、というお話です。可読性は落ちますが…。

まず cmd.exe では、調べてみたけれどHere-docは使えないようです。()を使うというトリッキーな方法がありますが、これはちょっと筋が違うので却下です。stackOverflowにも heredoc for Windows batch? というような記事がありますが、ちょっと一筋縄ではいかないようです。他にも How to use “<<” in batch file or command prompt? というトピックがsuperuser.comにあります。

次に Windows PowerShell では、@' と '@ (および @" と "@)で囲んだ部分を here stringsヒア文字列)という形で利用できるようです。ちょっとPythonに食わせられるかどうかを試してみます。

PS C:\Users\kats> python - @'
>> print('hello, world')
>> '@
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z

PS C:\Users\kats> @'
>> print('hello, world')
>> '@ | python -
hello, world
PS C:\Users\kats>

見て分かる通り、Pythonにうまく食わせるには、冒頭に 'python -' ではなくて、パイプで '|python -' してやればいいようです。ちなみにダブルクォーテーションを使うと変数の展開が行われるようです。

さらに Nyagos を見てみると、Support Here Document #130を参照する限り、残念ながらHere-docはまだ組み込まれていないようです。

なので、Windows環境でHere-docを使うには、WSLやCygwinを除けば今のところ Windows PowerShell に頼るしかないようです。

…でもWPSはよくわからない…(というかわかろうとしていない)。

MP4のチャプター名に日本語を使う。

MP4のチャプター名。の中で、「makechap.pyを改変中」と書いたのですが、ちょっと時間ができたのでやってみました。
VLCでもちゃんとチャプター名が表示されるように、エンコーディングはUTF-8を指定しています。

#!python3
# -*- coding: utf-8 -*-
# vim:fenc=utf-8 ff=unix ft=python ts=4 sw=4 sts=4 si et fdm fdl=99:
# vim:cinw=if,elif,else,for,while,try,except,finally,def,class:
#
# makechap.py:
# カレントディレクトリからすべての.keyframeファイルを検索し
# 順次aviutl(muxer.exe, remuxer.exe)が取り込める形式の
# チャプターマークに変換する。
# ファイルが引数として指定された場合は、そのファイルだけを処理する。
#
# TMPGEnc MPEG Smart Rendereの.keyframe 出力形式
# [chap1]
# Name=[チャプター名1]
# [chap2]
# Name=[チャプター名2]
# ただし[chapx]はフレーム番号
# チャプター名が明示的に指定されたときはName=の部分が使用される。
#
# muxer / remuxer のチャプター形式
# CHAPTER01=00:03:00.000
# CHAPTER01NAME=チャプター名1
# CHAPTER02=00:06:30.000
# CHAPTER02NAME=チャプター名2

import sys
from glob import glob
from os.path import join, splitext
from dateutil.relativedelta import relativedelta

if sys.version_info[0] != 3:
    print('This script requires Python 3')
    exit()

path = '.'
debug = 1
files = []
i = 0
print(sys.argv)
if len(sys.argv) > 1:
    files = sys.argv
    del files[0]
    print(files[0])
else:
    files = glob(join(path, '*.keyframe'))

if debug:
    print('files:', files)

for kffile in files:
    base = splitext(kffile)[0]
    f = open(kffile, 'r', encoding='utf-8')
    outfile = open(base+'.chapter.txt', 'w', encoding='utf-8')
    lines = f.readlines()
    i = 0                      # line number
    j = 1                      # chapter number
    while i < len(lines):
        chap = ''
        s = lines[i].rstrip()
        if s == '':            # skip blank line
            i = i + 1
            continue
        if s.isdecimal():      # if line is frame number
            rd = relativedelta(seconds=round(int(s)*0.0333667))
            chap = "{:02}".format(j)
        if (i+1) < len(lines):
            if lines[i+1][0] == '#':    # if next line is chapter name
                chap = lines[i+1].lstrip('#Name=').rstrip()
                i = i + 1
        time = "{0.hours:02}:{0.minutes:02}:{0.seconds:02}.000".format(rd)
        outfile.write(f'CHAPTER{j:02}={time}\n')
        outfile.write(f'CHAPTER{j:02}NAME={chap}\n')
        i = i + 1
        j = j + 1
    f.close()
    outfile.close()
そしてこれを、MP4ファイルにあとからチャプターを打つ。でやったようにバッチファイルに仕込めばOKです。

Pythonのreadline() / readlines() で行末の改行を削除する。

pythonでファイルを開き、readlines()で読み込んだらリストの各要素に '\r\n' がくっついていたのでそれを削除する方法のメモ。

なんでこれが大事かというと、MP4のチャプター名。のところで、フレーム番号と時間の変換を行い、さらにチャプター名を処理しようとしたときに、フレーム番号だけの行なのに isdecimal() で False が返ってきたから。

簡単なのは str.rstrip() で削除してしまうことなんだけれど、ちょっと試してみます。

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s='1234\r\n'
>>> s
'1234\r\n'
>>> print(s)
1234

>>> s.rstrip()
'1234'
>>> print(s.rstrip())
1234
>>> s.isdecimal()
False
>>> s.rstrip().isdecimal()
True
>>>

という感じ。

rstrip()はオンラインマニュアルによると次のように書いてあります。
Description
Returns a copy of the string with trailing characters removed.

Syntax
str. rstrip([chars])

chars
Optional. String specifying the set of characters to be removed. If omitted or None, the chars argument defaults to removing whitespace. The chars argument is not a prefix; rather, all combinations of its values are stripped.

'trailing characters' というのは末尾の文字のことで、'末尾の文字を削除した文字列のコピーを返す' という説明になっていますが、引数の 'chars' が省略されたときには 'whitespace' を削除することになっています。ここで、'whitespace'の定義は次のようになっていました。
string.whitespace
A string containing all ASCII characters that are considered whitespace. This includes the characters space, tab, linefeed, return, formfeed, and vertical tab.
'whitespace' とは、「whitespaceと考えられるすべてのASCII文字を含む文字列のこと。空白、タブ、行送り、行頭復帰、用紙送りと垂直タブ文字のこと。」だそうです。

一般にテキストファイルでの改行文字は、UNIXでは '\n'、Macでは '\r'、Windowsでは '\r\n' ですが、rstrip()はこれらすべてに対応するようです。

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...