国府・多賀城と海との関係

律令制のもとで国府が各地に作られたが、陸奥の国府は現在の多賀城市(多賀城跡)に設置された。国府の設置された場所はそれなりの理由で選択されたと思われるが、多賀城のばあいは何であったのだろうか?

それは海かもしれない。多賀城が作られた8世紀ごろの海岸線についてははっきりしないが、縄文時代まで遡ると海岸線がずっと内陸にあったらしく現在は内陸になっている近郊の利府や岩切といったところが海岸線であったらしい。多賀城の創建当時はかなり海岸線に近いところに建てられたのではないかと思われる。

海が近いと便利なことは一つは海上交通の便がよいことであり、二つ目は海産物とくに塩が身近に得られることである。

海上交通では太平洋側は大変だったはずで、日本海側の中世の「廻船」に比較して近世になってようやく「東廻り」が開拓されたほどだから8世紀ごろは現実的な問題となっていなかったと思われる。

塩の問題が面白い。国府が行政組織であれ軍事組織であれ多くの人間が常駐しているわけで「兵糧」の問題が深刻であったはずだ。特に塩は重要なもので近くに塩が得られる場所があると都合がよい。塩釜の製塩がいつごろから始まったのははっきりしないが、多賀城に近い塩釜神社では原始的な製塩法である「藻塩焼神事」(もしおやきしんじ)が現在も行われており、製塩の古さを示唆している。塩が身近に得られるところは国府に相応しい場所と考えたのではないか。

Python備忘録:イテレータとジェネレータ

  • イテレータとは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。 … 実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。 JISでは反復子(はんぷくし)と翻訳されている。

Pythonに即してみると:


>>> a='abcd'

>>> for a in a:
	print(a)
a
b
c
d
>>> 

より基本的なイテレータはiter関数を使うものである:


>>> d=dict([(1,'one'),(2,'two')])
>>> d
{1: 'one', 2: 'two'}
>>> it = iter(d.items())
>>> next(it)
(1, 'one')
>>> next(it)
(2, 'two')
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in 
    next(it)
StopIteration
>>> 
  • ジェネレータは、プログラムにおいて、数列の各要素の値などを次々と生成(ジェネレート)し他の手続きに渡す、という機能を持っている手続きである。つまりイテレータを生成する手続きである。大事なことはジェネレータは要請がある毎に一つ一つ要素を生成することである。

Pythonチュートリアル」(Guido van Rossum著)で示した例:


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

for char in reverse('golf'):
    print(char)

ジェネレータを一行で書くこともできる。


>>> g = (x**2 for x in range(5))
>>> g
<generator object <genexpr> at 0x0000000002ED07C8>
>>> next(g)
0
>>> next(g)
1
>>> 

ジェネレータは大きなファイルを要請のある毎に読むなどのとき便利な機能である。をみよ。

 

済州島の馬と倭寇(わこう)

済州島のシンボルは馬(済州馬)であるが、この小型の馬の起源はかなり古いらしい。

海と列島の中世」(網野善彦著)によれば、中世に「倭寇(わこう)」と呼ばれていた海の人々(海人)は西北九州、済州島、朝鮮半島の南端に渡るひろい範囲に住む人々からなり、「船を以って家となす」と言われていたように船や海に長けていた人々であったが、騎馬にも優れ多くの馬を所有してたという。その馬の牧場(牧)が済州島にあった。

 

Pythonの話題:辞書の結合(付録)

二つの辞書の結合を議論して三つの方法があることがわかった。

今回はたまたま二つの辞書でキーが同じものがあったときの振る舞いを調べる:
例題


>>> d1=dict()
>>> d1['one'] = 'イチ'
>>> d1['two'] = 'ニ'
>>> d2=dict()
>>> d2['one'] = 'ヒトツ'
>>> d2['three'] = 'サン'
>>> d=dict(**d1, **d2)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in 
    d=dict(**d1, **d2)
TypeError: type object got multiple values for keyword argument 'one'
>>> d=dict(list(d1.items()) + list(d2.items()))
>>> print(d)
{'one': 'ヒトツ', 'two': 'ニ', 'three': 'サン'}
>>> d1.update(d2)
>>> print(d1)
{'one': 'ヒトツ', 'two': 'ニ', 'three': 'サン'}
>>> 
  • 形式d=dict(**d1, **d2)ではエラーになる。
  • 形式d=dict(list(d1.items()) + list(d2.items()))では上書きされる。
  • 形式d1.update(d2)では予想したしたように上書きされる。

Pythonの話題:辞書の結合(再論)

辞書の結合を議論した。「ばらす」演算子(**)を使った以下のような方法を紹介した。


d = dict(**d1, **d2)

これはスマートに見える方法であるが、万能ではない。

例を示す:


>>> d1 = dict()
>>> d1[1]='one'
>>> d1[2]='two'
>>> d2=dict()
>>> d2[3]='three'
>>> d2[4]='four'
>>> d=dict(**d1, **d2)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in 
    d=dict(**d1, **d2)
TypeError: keywords must be strings
>>

つまりキーが文字列以外のときは上記の方法は使えないことになる。


d1.update(d2)

とする方法もあるが、d1が書き換えられてしまうので面白くない。

以下のような関数はどうだろうか


def dict_merge(d1, d2):
    """二つの辞書d1,d2を結合して新たな辞書d
を返す関数"""
    d = dict()
    for key, item in d1.items():
        d[key] = item
    for key, item in d2.items():
        d[key] = item

    return d

d1=dict()
d1[1] = 'one'
d1[2] = 'two'
print(d1)
d2=dict()
d2[3] = 'three'
d2[4] = 'four'
print(d2)

d = dict_merge(d1, d2)
print(d)

追記:
コマンドで書ける:


d=dict(list(d1.items()) + list(d2.items()))

 

核兵器禁止条約批准44ヵ国目:セントクリストファー・ネビス

今朝の新聞で目に留まった記事のタイトルである。

この条約の発効には最低でも50ヵ国での批准が必要であるが、セントクリストファー・ネビスでの批准で、条約の発効にはあと6ヵ国となった。

核兵器禁止条約は2017年に122ヵ国によって採択されたが、50ヵ国目の批准書が国連に寄託された後90日で発効する。

セントクリストファー・ネビスはカリブ海にある国で人口約5万3千人。カリブ共同体(カリコム)に加盟している。

Pythonの話題:「ばらす」演算子(**)と(*)

Pythonでは可変長の引数を持つ関数を作ることができる。


def func( *arg, **kwarg):
    print(type(arg), arg)
    print(type(kwarg), kwarg)

func(1, 2, 3, k1=10, k2=20, k3=30)

結果の出力:


<class 'tuple'> (1, 2, 3)
<class 'dict'> {'k1': 10, 'k2': 20, 'k3': 30}
>>>

このように「ばらす」演算子(*)、(**)を使う。*argでは位置が固定されている実引数をタプルの形で引き取ることができ、**kwargでは、キーつきの引数を辞書の形で引き取ることができる。キー引数は文字列になっていることに注意。

 

Pythonの話題:辞書の結合

二つの辞書があるときそれらを結合して新たな辞書を作る方法:


>>> d=dict(k1=1, k2=2, k3=3, k4=4)
>>> print(d)
{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
>>> d1=dict(k1=1, k2=2)
>>> d2=dict(k3=3, k4=4)
>>> d=dict(**d1,**d2)
>>> print(d)
{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
>>> 

「ばらす」演算子(**)で辞書{‘k1’:1}はキー引数k1=1の形に展開される。文字列が引数名に変わることに注意。こうしてdictの引数にキー引数を与えて、二つの辞書を統合することができる。

「エッシャーが命を懸けて守った男、メスキータ」展

今朝の新聞の美術欄の展覧会の案内である。

サミユル・イェスルン・デ・メスキータは19世紀末から20世紀の当初にオランダで活躍した画家、版画家、デザイナーである。画像のように大胆に単純化された白黒の画面が印象的である。

ユダヤ人であった彼は1944年1月にアウシュビッツ強制収容所で死去。教え子の一人であったエッシャーは師の作品200点をアトリエから持ち出し戦争中も守りとうした。

記事は日本初の回顧展で宇都宮美術館