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()はこれらすべてに対応するようです。

SWDなら3線でいいとはいうものの。

 安価で優秀なデバッグプローブはないかしら、と探したら、 Raspberry Pi Debug Probe というのがあったんですが、これは3線がにゅるんと出てるだけです。 もちろんSWDなら3線を繋げばいいのではありますが、汎用的に考えるなら5x2のリボンケーブルコネクタが欲し...