赤壁の戦い:「船酔い」で敗れた?

「船酔い」「車酔い」はヒトが自分の足以外で空間移動をしているときに脳の誤機能として起こる。だからヴァーチャル・リアリティーによる移動、無人自動車、宇宙旅行などでも起こり得る。「船酔い」の機構の解明はこれからも重要なことになる。

ヒトの「船酔い」の歴史は長く、「船酔い」が船を使った戦いの帰趨を決めたこともあるという。その一つが「赤壁の戦い」である。

A Historical View of Motion Sickness—A Plague at Sea and on Land, Also with Military Impact

という論文がある。著者たち(Doreen Huppert等)はギリシア、ローマそして中国の古典を調べ「船酔い」というものの認識、対処法などがどのようなものであったかを推察し、そのような「船酔い」が海戦に果たした影響にも言及している。

中国の歴史の中で有名な「赤壁の戦い」にもこの影響があるという。

この「赤壁の戦い」は北方の覇者である魏の曹操が南下して長紅で蜀の劉備、呉の孫権の同盟軍と戦ったものである。北方の曹操軍は船の戦い苦手で「船酔い」になる兵士が続出した。これを知った同盟軍は曹操の知人と思われる人物に見せかけの解決策を示唆し曹操軍はそれを採用するように謀った。その解決策とは船をお互いに結びつけて固定し船を安定化するというものであった。

その結果同盟軍は曹操軍の船団全体を火責めすることができ、戦いに勝つことができた。

ピラミッドより2000年古い巨大遺跡

昨日の朝刊の新聞記事のタイトルである。

アラビア半島の北部に古い巨大遺跡があることは衛星写真からわかっていたが、マックスプランク人類史科学研究所の研究者たちが現地調査をした。その結果それらの建造物の一つは約7000年前に作られたことが判った。

巨大な石の建造物があるのはアラビア半島北部のネフド砂漠の周辺である。長方形をしており一辺が600メートルもあるものもある(写真はここ)。この建造物はアラビア語で「ムスタティル」と呼ばれているが、何のために作られたかは不明の由。

これらのムスタティルからはウシなどの動物の骨や幾何学模様が描かれた石などが発掘されていて、この地域に住んでいた人々の儀式の場ではなかったのではと研究者たちは推測している(7000年前ごろはアラビア半島は今より湿潤で、当時はここは草原に覆われていたと考えられる)。

わが国における乗馬の習慣(2)埴輪

わが国で乗馬の習慣がいつごろ始まったかという問題を調べている。

今回は馬の埴輪でみる。古墳後期(六世紀)の墳墓の副葬品には馬の埴輪が多い。その中で人が騎乗した姿の馬の埴輪は唯一であるが1例ある。それは石川県小松市にある矢田野エジリ古墳から出土した埴輪である。馬具(ばぐ)で飾られた馬と、馬とは別につくられた騎乗(きじょう)の人物、そして馬を曳(ひ)く馬子(まご)が別々に作られたようである。騎乗者と思われる人物は股を開き両腕を前にだしている。馬子は右腕を挙げている。馬子は従って馬の左に立ち馬を曳いている格好になる。この馬の埴輪はこの古墳で二例見つかっている。

数が少ないが古墳時代後期ごろには乗馬の習慣があったことの証拠である。

わが国における乗馬の習慣

世界史的にみると馬に乗る習慣は馬の家畜化の過程でおきたものである。この家畜化・乗用化は黒海・カスピ海ステップで紀元前4000年あたりのことである。この解明は馬の乗るときにハミを使うがそのハミによる臼歯の磨耗の特徴を調べたことによる。以前のこのブログでもこのことに触れた。

我が国では古墳時代後期(六世紀)の遺跡から鐙や鞍の遺物が沢山出土することからこの時代あたりから乗馬の習慣が始まったと思われている。しかし出土した鞍などは華美なもので実用に供したのかは疑問である。胡服を着て馬を扱っている人物の壁画があるが、これも乗馬ではない。

今回は時代が下るが万葉集(七世紀から八世紀の歌)に現れる馬を歌った歌の中に明らかに乗馬を意味する情景があるか調べてみる。

馬に関する歌は沢山ある。これは当時馬はかなり日常的な風景として存在したことを示唆している。その中で「乗馬」に直接的に触れた歌がある。例えば:

塩津山(しほつやま)打ち越え行けば、わが乗れる、馬そつまづく、家恋(こ)ふらしも

意味: 塩津山(しほつやま)を越えて行くと、私が乗っている馬がつまづきました。きっと、家のものが私のことを想っていてくれるのでしょう。

あきらかに騎乗している馬である。作者は笠朝臣金村(かさのあそんかなむら)という人物である。

関東上空「火球」再び

これも天体現象の記事である。

新聞によれば21日の夜(午後10時半ごろ)、関東地方の上空で流星の中でも明るい「火球」が出現した。

7月には関東地方で午前2時半ごろに「火球」が目撃された。

一般に流星(「火球」はその中でも明るいもの)は彗星が太陽周辺を通過する際に放出された物質が彗星の軌道に沿って残されている中を地球が通過するときにそれらの物質が地球の大気圏と接触することで落下燃焼する現象である。だからその接触する場所は太陽からみたら一定の場所になる。ペルセウス座流星群というのはその場所がペルセウス座の方向にある。スイフト・タットル彗星(109P/Swift-Tuttle)が流星の材料を提供している彗星である。

「火球」という現象は地表からの高度が低く(だから関東地方のみで確認された)大気圏をどの様な経路で落下してきたのか分ると面白い。

小惑星「2020QG」、地球に最接近

今朝の新聞に記事のタイトルである。

火星と木星との間に小惑星帯があり、大きいものだけでも1万個以上の小惑星が存在している。小さいものは無数にあるが、他の大きな小惑星の影響を受け、地球にまで接近するものもある。

今回の記事の小惑星「2020QG」もそのような小惑星の1つだったのだろう。記事によればこの小惑星は直径3~6メートルと自動車なみの小さなもので、最も接近したのは16日午後1時8分(日本時間)、南インド洋上空2590キロであった。この距離は国際宇宙ステーションの高度の7倍強にあたるが、観測史上、小惑星の接近記録としては最小距離との由。

地球の大気圏が高度約500キロであることを考えるとかなり遠くを通過したことになるが、この小惑星の軌道は地球の重力の影響を受けているらしい。

無限階段と無限音階

エッシャーの話がでたので関連するだまし絵とだまし音階の話をしたい。

まず「無限階段」:原理はこれた。作品を一つ。

この「無限階段」に似たものに「無限音階」がある。床屋の看板にあるが単にそこで回転しているだけなのにパターンは常に上昇しているように見える。これを音階として表現したものである。

実例はここにある。

ヒトの耳の可聴音域は約20ヘルツから2000ヘルツで、最も感度かよいのは1000ヘルツである。20ヘルツ以下の音や2000ヘルツ以上の音はヒトの耳には聞こえない。単音で周波数が上昇する音を聞くと音階が上昇していることを認識するがこの単音は2000ヘルツを越えるとヒトには聞こえなくなる。「無限」ではない。ところが複数の単音を次から次に発生させ、常に可聴音域に周波数が上昇する単音があるようにすると、ヒトは常に上昇する音が出てると錯覚する。

おれが「無限音階」の原理である。

この「無限に高く(低く)なっていく音」は1964年にベル研究所のRoger N. Shepardが考案した「1オクターブ上がっても最初と同じに聞こえる音」によるもので「シェパードトーン(無限音階)」と呼ばれている。

 

Python備忘録:ジェネレータの実際

ジェネレータはnext関数を使って呼び出す。この関数の呼び出し毎にジェネレータは一定の長さのデータを吐き出す。この機構を使って動画ファイルをフレーム毎に読みこむことにする。このような例をimageioモジュールで見てみる。このモジュールは様々な画像ファイル(動画ファイルを含む)を処理することができる。今回の例は動画ファイルを読み込みヴィデオ表示するPythonプログラムである。

プログラム例


#coding: utf-8
import tkinter as tk, threading
import imageio
from PIL import Image, ImageTk

video_name = "test.mp4" #ここにヴィデオ・ファイル名を書く
video = imageio.get_reader(video_name)
gen = video.iter_data()
def stream(label):
    def showlabel():
        global count
        try:
            image=next(gen)
        except: 
            return
        frame_image = ImageTk.PhotoImage(Image.fromarray(image))
        label.config(image=frame_image)
        label.image = frame_image
        label.after(14, showlabel) #フレーム・レイトの調整
    showlabel()

if __name__ == "__main__":

    root = tk.Tk()
    root.title('TKinterでヴィデオを見る')
    my_label = tk.Label(root)
    my_label.pack()
    thread = threading.Thread(target=stream, args=(my_label,))
    thread.daemon = 1
    thread.start()
    root.mainloop()

赤い文字の部分がジェネレータに関連する部分で、video = imageio.get_reader(video_name)はファイルを読み込む機構の設定で、video.iter_data()でその機構にジェネレータの性格を付与している。

iter_data()
Iterate over all images in the series. (Note: you can also iterate over the reader object.)

と説明がある。
image=next(gen)でフレーム毎にデータを読み込みそれをimageに代入している。フレーム毎にデータを読みこみデータが尽きるとエラーになるのでエラー処理をしている。

Python備忘録:関数でジェネレータをつくる

関数でジェネレータをつくることもできる。


def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

この関数ではreturn文の代わりにyield文を使う。yield文がfor文の内部にあることに注意。yield文に達するとこの関数は一時停止し値を返すが、この関数のローカル変数などは保持されたままである。この一時停止の解除はこの関数を呼んだプログラムの要請による(同期している)。
上の関数の実行例を示す。


>>> s = reverse('golf')
>>> s
<generator object reverse at 0x0000000002ED07C8>
>>> next(s)
'f'
>>> next(s)
'l'
>>> next(s)
'o'
>>> next(s)
'g'
>>> next(s)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in 
    next(s)
StopIteration
>>> 

 

Python備忘録:クラス定義によるジェネレータ

ジェネレータの性格を持ったクラスを定義することができる。例を示す:


class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

このクラス定義で__next__メソッドがあることが重要である。このメソッドがnext関数の定義をなしている(これはクラスの__str__メソッドがそのクラスの固有のprint関数の定義になっていることと同じである)。__iter__メソッドも同様にiter関数を定義するものであるが今は何もしない。
結果は


>>> s = Reverse('flog')
>>> next(s)
'g'
>>> next(s)
'o'
>>> next(s)
'l'
>>> next(s)
'f'
>>> next(s)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in 
    next(s)
  File "<pyshell#0>", line 11, in __next__
    raise StopIteration
StopIteration
>>> 

となる。