2020-10-24

劇場版 銀河鉄道999

2020年10月4日にBS12で「劇場版 銀河鉄道999」が放送されたので(録画しておいて)観てみました。有名な作品なので大体の内容は知っていたのですが、以前に観た記憶はないので、最初から最後まで通してみたのは初めてです。おおまかなストーリは、母親を機械伯爵に殺された少年(星野鉄郎)が機械の身体を貰えるという星に行くため、銀河超特急999号にメーテルと一緒に乗車して旅を続ける、という話だったと思います。1979年公開なので、40年ほど前の作品です。


鉄道が出てくる作品ですが、鉄道ファン向けの作品という訳ではないでしょう。しかし鉄道ファン的に鑑賞することは可能だと思います。そのような視点で考えると、まず「超特急」というのが時代を感じます。1964年に開業した東海道新幹線で「超特急ひかり号」が登場(ちなみに「こだま号」は特急です)しました。特急よりも速いのが「超特急」というイメージです。今日の東海道新幹線の主役は「のぞみ」なので、「ひかり」に過去の輝きは失われています。


また1979年頃は、鉄道を趣味とする人は「鉄道ファン」もしくは「鉄道マニア」と呼ばれていたのではないかと思います。その後「鉄道オタク」という呼び方が生まれ、さらには「鉄ちゃん」などの呼び方もされ、最近では細分化して「乗り鉄」とか「撮り鉄」のような「○○鉄」という呼び方が多くなっています。そう思うと、主人公である星野鉄郎はメーテルから「鉄郎」と呼ばれていますが、もっとカジュアルに「鉄ちゃん」と呼ばれる可能性だってあったかもしれません。そういう呼び方になると、なんだかなぁという気もしますが。


999号を牽引したのは(見かけ上だけですが)「C62」の姿をしています。現実のC62は東海道本線などの幹線で優等列車を牽引した名機です。しかしSLの代表がC62なのかと考えると、そうも言えないところがあるのではないでしょうか。「デゴイチ」の愛称で有名な「D51」の方が蒸気機関車の代表のような気もします。しかし銀河超特急999号の牽引機がD51では物語にならないとは思いますので、C62で良かったのでしょう。

VSIから新しいPAKが届いた

VSIが提供するCommunity License Programを利用してOpenVMS Alpha 8.4-2L1を利用しています。先日新しいPAKの連絡が来ました。


PAKを更新する必要のある積極的な理由はありませんでしたが、入れ換えておきました。

Active licenses on node PWS500:

------- Product ID --------    ---- Rating ----- -- Version --

Product            Producer    Units Avail Activ Version Release    Termination

ALPHA-LP           VSI             0  H     0      0.0  (none)      20-SEP-2021 

ALPHA-SYSTEM       VSI             0  A     0      0.0  (none)      20-SEP-2021 


2020-10-21

西村義樹・野矢茂樹『言語学の教室』を読んで

放送大学で受講中の「新しい言語学('18)」の第2章で参考文献としてあげられていた『言語学の教室』を読んでみました。この本は対談形式で書かれていますが、リアルな対談ではないようです。本書には「付録――対談のひとこま」として、リアルな対談のやりとりが掲載されています。本書全体がリアルな対談だと冗長だったりするので、手を入れているということのようです。したがって、著者が書き下した文章ではないが、発言(を基にしているものの)した言葉そのものというわけでもない形式です。

それはともかくとして、全体として興味深く読み進めることが出来ました。本書には「哲学者と学ぶ認知言語学」という副題がついています。しかし本書を読んだからと言っても、「言語学」や「認知言語学」の入門にはならないでしょう。そのような分野に入門するための「入り口」ではないかと思います。

2020-10-17

『ソシュール超入門』(ポール・ブーイサック/【訳】鷲尾 翠)を読んで

放送大学教養学部で受講している「新しい言語学('18)」の中で「近代言語学」の”父”としてソシュールについて記されています。ソシュールの名前は、これまでも目にしたことがあり、本人が書いたわけでもない『一般言語学講義』が代表作と誤解もされています。


ソシュールについて概要を押さえておこうと思い図書館に行ったら『ソシュール超入門』を見つけたので、読んでみました。「第1章 ソシュールの最終講義」から読み始めたら、なにやら日記のような時系列の記述がはじまったので面喰いましたが、そこで投げ出さず最後まで読了しました。人によって良し悪しの評価は分かれるでしょうが、「超入門」としては悪くないのではないかと思います。もっと深く知りたいのであれば、さらに類書に進めば良いと思います。入門段階で、右も左もわからないので、難解な専門用語が出てきて、読む気を失くすよりも、よほどマシだと思います。

『はじめての構造主義』(橋爪大三郎)を読んで

放送大学教養学部で 2020年度第2学期は「新しい言語学('18)」を受講することにしました。講義の第1回は、「新しい言語学と言うからにはその前の言語学がある」ということで、これまでの言語学の歴史について説明がありました。


そこで出てきたのが「構造主義」です。「構造主義」とか「ポスト構造主義」という言い方は、論文を読んでいると目にすることがあります。関係する人物としてレヴィ・ストロースの名前が挙げられますが、結局なんなのか良くわかりませんでした。


図書館で入門書を探したところ、講談社現代新書898の『はじめての構造主義』(橋爪大三郎)を見つけたので読んでみました。出版されたのは昭和63年ですから、30年以上前の書籍です。しかも以下のような記述もあり、もはや構造主義(とポスト構造主義)は過去の話にすぎないのかもしれません。

ところで最近では、「ポスト構造主義」というのが主流です。「ポスト」とは「それ以後」といういみですから、構造主義なんかにいまごろまだひっかかっているようでは、”遅れてる”もいいところでしょう。だいいちポスト構造主義でさえ、もうけっこう”古い”わけです。


古い話を今頃になって勉強する意義はともかく、本書を読んで、なんとなく構造主義の考え方や関連人物の関係が見えてきた気がします。筆者の語り口は、新書だからかもしれませんが、普通の学術書に比べれば、くだけています。わかりやすくしようという試みのひとつなのかもしれません。


本書は入門書なので、これを読んだだけで構造主義について完全な理解が得られるわけではないと思いますが、十分に「入門」の役割をはたしていると思います。さらに深く知りたいのであれば、本書を基礎に、別の書籍を読み進めていけばよいのでしょう。


2020-10-09

pythonのargparseモジュールでコマンドラインで指定した文字列を数値に変換するロジック

Pythonを利用して簡単なツールを作成しているところです。ツールを組むにあたり、Pythonが標準的に提供しているモジュールを活用することを基本とし、同じようなロジックを自前で作らないようにしたいと考えています。この方針のもとに、コマンドライン引数を解釈するのはモジュール「argparse」 を、ログ出力にはモジュール「logging」を使用しようと思っています。


モジュール「logging」では、ログレベルの表記と数値が「16.6.2. ロギングレベル」で定められています。例えば「DEBUG」なら「10」、「WARNING」なら「30」のようになります。このようなログレベルをコマンドライン引数で指定できるようにしたいのですが、考えておく必要のある事項があります。

  1. コマンドラインでは文字列(「DEBUG」など)を指定したとしても、ツール内部では対応する数値(「DEBUG」が指定されたのであれば「10」)で処理したい。
  2. どの文字列がどの数値に対応しているのかという「知識」をユーザが持つ必要が無いようにしたい。

モジュール「argparse」ではメソッド「add_argument()」において「choices」を使えば、考えているような事ができると思います。しかし注意しておかなければのは、選択肢を「choices={'debug', 'warning', ...}」のように定義すれば、考えているような形でコマンドライン引数を指定することができます。ただしモジュール「argparse」のメソッド「parse_args()」の結果としては、変数に格納される値も「文字列」になってしまいます。これを対応する数値にする方法はないか考えてみました。

当初はメソッド「add_argument()」の仕組みの中で対処しようと考えていました。例えば「choices」に指定しておくのは対応する数値の方にしておき、「type=lambda s: myfunc(s)」のようにしておけば、自前の関数「myfunc()」の中で「コマンドラインで与えられた文字列を、対応する数値に変換」することができるようになります。これで意図した動作をするのですが、もしコマンドラインでオプション「-h」を指定すると表示されるヘルプメッセージでは、選択肢として「数値の列」が出てきてしまいます。この問題は「metavar」を使えば対処できます。

これで問題が全て解決したかと思いましたが、まだ問題が残っていました。もし選択肢にない文字列をコマンドラインで指定した場合、エラーメッセージ「invalid choices」が表示され、そこでは正しい選択肢として「choices=」で指定している情報が出力されます。それは「数値」であり「文字列」にはなっていません。モジュール「argparse」の実装(/usr/lib64/python3.6/argparse.py)を確認すると、以下のようになっていました。この問題はモジュールの実装に手を入れない限り解決できないようです。

def _check_value(self, action, value):
# converted value must be one of the choices (if specified)
if action.choices is not None and value not in action.choices:
args = {'value': value,
'choices': ', '.join(map(repr, action.choices))}
msg = _('invalid choice: %(value)r (choose from %(choices)s)')
raise ArgumentError(action, msg % args)


モジュール「argparse」の仕組みの中では問題を解決することはできませんので、モジュールの外で対処するしかなさそうです。その結果として以下のようなロジックにしました。これならば意図していたような動作にはなりそうです。

#!/usr/bin/python3

import argparse
import logging

def parseArgv():
        loglevel = {'debug':10,'info':20,'warning':30,'error':40,'critical':50}
        parser = argparse.ArgumentParser()
        parser.add_argument('-l', '--level',
                choices=loglevel.keys(),
                default='info',
                type=str.lower,
                help='log level not case sensitive (default: %(default)s)')
        parser.add_argument('-v', '--version',
                action='version',
                version='%(prog)s 1.0')
        args = parser.parse_args()
        args.level = loglevel[args.level]
        return args

def outputLog():
        # create logger
        logger = logging.getLogger(__name__)
        logger.setLevel(logging.DEBUG)

        # create console handler
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)

        # create formatter
        formatter = logging.Formatter(
                '%(asctime)s %(name)s:%(levelname)s:%(message)s',
                datefmt='%Y/%m/%d-%H:%M:%S')

        # add formatter to handler
        handler.setFormatter(formatter)

        # add handler to logger
        logger.addHandler(handler)

        # application code
        logger.setLevel(args.level)
        logger.warning('Watch out!')
        logger.info('I told you so')
        logger.debug('often makes a very good meal of %s', 'visiting tourists')

if __name__ == "__main__":
        args = parseArgv()
        outputLog()
#[EOF]

2020-10-07

VMware上のCentOS7でavahiを試す

DHCPでアドレスが割り当てられたマシンに対してホスト名でアクセスできるようにするためにはavahiが使えるという情報を得ました。そういうパッケージが存在することは耳にしていました。しかし、どのような設定をすれば良いのか、 何が出来て何が出来ないのか、よくわかりません。そこでVMwareでCentOS7を動かして実験してみることにしました。


設定の参考にしたのはWebで見つけた記事「 CentOS 7でmDNS(Avahi Daemon)を有効にする」です。やる事はシンプルです。設定後に念のために再起動しました。

  1. yumでavahiを入れる。
  2. avahi-daemonを有効にする。
  3. ファイアウォールでサービス「mdns」を通す。


ここでWindows10からpingを飛ばしてみます。すると反応がありました。すばらしい。

C:\Users\FURUSAWA>ping -4 vmware.local

vmware.local [192.168.1.17]に ping を送信しています 32 バイトのデータ:

192.168.1.17 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.1.17 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.1.17 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.1.17 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.1.17 の ping 統計:

    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、

ラウンド トリップの概算時間 (ミリ秒):

    最小 = 0ms、最大 = 0ms、平均 = 0ms


それでは逆にCentOSからWindows10に向かってpingを投げてみましたが、うまくいきません。コマンド「avahi-resolve」ではIPアドレスが見つかっているのに、pingでは名前をわかってくれません。ファイル「/etc/nsswitch.conf」にはmDNSを見に行くように指定している(つもり)なのですが、他にも何かする事があるのでしょうか。
[root@vmware log]# avahi-resolve -n windows10.local
WINDOWS10.local  192.168.1.31
[root@vmware log]# ping -4 windows10.local
ping: windows10.local: Name or service not known
[root@vmware log]# grep '^hosts:' /etc/nsswitch.conf
hosts:        files mdns_minimal [NOTFOUND=return] dns myhostname