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

2020/10/06

変体漢文とJapanese English

放送大学教養学部で2020年度第2学期は「漢文の読み方('19)」 (宮本 徹・松江 崇)を受講することにしました。そこで図書館に行き、参考になるような書籍を探し、『漢文と東アジア―訓読の文化圏』(金 文京)を借りてきました。日本語を表記するために漢字は欠かせませんし、中学高校でも漢文の授業があります。漢文を読むために訓読がありますが、よく考えると「訓読」は日本だけではなく、漢文の影響を受けた東アジアでは(訓読とは呼ばないとしても)同様のことがおこなわれたハズです。


学校で習う漢文の時間では軽く流してしまうような事柄についても、本書では実例を踏まえて詳述されており、とても興味ぶかく読了しました。


「第3章 漢文を書く/2 さまざまな漢文」の192~194頁では「変体漢文の分類」として、変体漢文が生じる理由として4つに分類されています。

  1. 書き手が未熟で、規範的漢文を書くつもりが、変則的になってしまう。
  2. 母国語の語法が無意識に反映される(これを日本では「和習」とか「和臭」と呼ぶようです)。
  3. 母国語の語法を意識的に反映させる。
  4. 漢字を表音的に用いて自国語を記述する。

変体漢文というのは規範的な漢文に対する用語です。日本人が漢文だと思っているのは古代中国語に相当しており、(本書によれば)近現代の中国語とは違うもののようです。

それはともかく、変体漢文が生じる理由は、今日において日本人が英文を書こうとしたときにも生じているのではないでしょうか。1番目の理由のように、「書き手が未熟で、規範的英文を書くつもりが、変則的になってしまう」ことを「ブロークン・イングリッシュ」と呼ばれています。2番目の理由のような「和習や和臭」のことを「Japanese English」と呼ばれていると思います。

いつの時代でも、どのような外国語でも、生じる現象は同様であるようです。

2020/10/05

Windows10 2004はまだか

Windows10の次期アップデート「20H2」が間もなくリリースされるという情報があります(まもなく登場のWindows 10のアップデート「20H2」でこう変わる)。これは「安定性と品質を重視した「マイナーアップデート」となる。このため、新機能は細かいものばかりだ」との情報がありますが、それ以前にアップデート「2004」が届いていません。


Windows10 2004が未だに届いていないユーザは他にもいるようです。

  1. Windows 10 Ver.2004 が配信されてこない」(2020年9月23日)
  2. Windows 10 バージョン2004(May 2020 Update)が未だにこない件」(2020年9月30日)

アップデート「2004」が届かないままに「20H2」がリリースされた場合、未だにアップグレード「1909」のままのマシンは「2004」がスキップされるのでしょうか。それとも、まず「2004」がインストールされ、次いで「20H2」がインストールされることになるのでしょうか。


そもそもWindows10のアップデートが約半年ごとにリリースされるというのは、マイクロソフトの方針に過ぎないのです。半年ごとでなければならない理由がユーザ側にある訳ではありません。1ヵ月ごとだろうが1年ごとだろうが、マイクロソフトの方針として実現させてくれればよいことです。それなのに半年たってもリリースされないような状況が生まれるのは、いったいどうなっているんだと思います。

2020/10/03

VT端末で使われるLK201キーボードを意識したRLoginにおけるキー配置

OpenVMS Alpha 8.4-2L1にRLoginを用いてSSH接続することが出来るようになりました。コマンドラインで普通にキー入力している分には問題になりませんが、エディタを使おうとすると多少厄介な問題があります。


OpenVMSはDEC製なので、端末もDEC製のVTシリーズが利用されます。VTシリーズで使われる標準的なキーボードLK201はファンクションキー等の配置がPCで使われているキーボードとは異なります。両者の違いをどのように吸収して配置するかを考えなければなりません。


まずLK201のファンクションキーは20個ですが、PCは12個しかありません。そこでPCのファンクションキーF1~F10を使って対応付けます。

  1. PCのF1~F10を、LK201のF1~F10に対応させます。
  2. PCのF1~F10を「ALT」キーと共に押した場合、LK201のF11~F20に対応させます。

LK201はテンキーの上の段の4個をPF1~PF4として扱います。このようなものはPCのキーには存在しません。そこでPCのF1~F4に割り当てることにします。これでは上述したファンクションキーと重なってしまうように思えます。しかしVTではF1~F5は特殊目的に使われているので、問題ないでしょう。

VTではF15を「Help」、F16を「Do」として扱います。エディタでも良く使われます。そこでこの2個をF11とF12に割り当てることにしました。当然ながらALTを押しながらF5やF6を押しても同等のはずです。


以上のような方針でRLoginのキー配置を変更します。デフォルトではVT52に対応させる設定が入っていますが、全て削除しました。