かもブログ

かもかも(@kam0_2)の雑記。地理やITに関するにわか稚拙センテンスの掃き溜め。

低メモリ(RAM)環境で、gensimのword2vecモデルを使うテクニック(備忘録)

この記事について

 Python 3.x で自然言語処理ライブラリgensimでword2vecを使います。学習済みのモデルデータを読み込んで、各単語のベクトルをえられるようにしたいとき、低メモリ(RAM)環境では、うまく行かないことがあります。この記事では、低メモリ環境で、学習済みword2vecモデルから各単語ベクトルを抽出する方法を紹介します。

問題の根源

 gensimのword2vecモデルはmost_similar()メソッドのように、「すべてのベクトルをメモリ上に展開していないと使えないメソッド」を含んでいます。そのため、モデルをロードする際に、モデルのサイズ以上の空きメモリがないと、読み込みに失敗します。自分の手元には日本語版Wikipediaから作ったモデルがありますが、モデルと付随するファイル含めて合計で1.3GBあります。一般的なパソコンでは問題ないですが、VPSなどの極めてメモリが少ない環境では問題になります。

解決法1 KeyedVectorsのみにする

 gensimのword2vecモデルは単語のベクトル情報以外にも様々な情報を持っています。これらを切り落として、単純なベクトルのみにします。

f:id:two_headed_duck:20200405150704p:plain
https://radimrehurek.com/gensim/models/keyedvectors.html より引用
再学習はできなくなりますが、オブジェクトを軽量化できます。また、オリジナルのword2vec形式での保存/読み込みが可能になります。これは後に重要になります。

from gensim.models import Word2Vec
model = Word2Vec.load("jawiki.model") # gensim形式のモデルをロードします
model.wv.save("jawiki.kv")  # KeyedVectorsのみを保存します。

当方では、1.3GBから732MBに減量することができました。これを読み込むには以下のようにします。

from gensim.models import KeyedVectors
kvs = KeyedVectors.load("jawiki.kv")
for l in kvs.most_similar(positive=["女性", "皇帝"]):
    print(l)

most_similar()similarity()などがそのまま使えます。kvs["安倍晋三"]のようにしてここのベクトルが得られます。

解決法2 正規化して元データを消す

 正規化とは「すべての単語ベクトルを単位ベクトルにする」ことです。単語ベクトルを扱う場合は、ベクトルの長さを無視して考えたほうが効果的であることが知られています。出現頻度や単語の文字長にベクトルの長さは影響されるため、単語同士の類似度を考える上では余計です。また、similarity()で利用されるコサイン類似度は比較対象のベクトルの角度差のみで計算されます。事前に正規化することで、後の計算処理を減らすことができます。
 事前正規化を行っている場合、元のオリジナルベクトルを消しておくことで、メモリー消費量を減らせます。半分にできるはずです。事前正規化はinit_sims()メソッドで行いますが、init_sims(replace=True)とすると、オリジナルのベクトルを忘れます。これを行うと、再学習はできなくなります。

kvs.init_sims(replace=True)
kvs.save("jawiki_normalized.kv")

解決法3 読み込む単語数を絞り込む

 word2vecのオリジナル形式からモデルを読み込む際は読み込む単語数を絞り込むことができます。まずは、gensim形式のモデルをword2vec形式に変換します。

kvs.save_word2vec_format("jawiki_normalized.kv.bin", binary=True)

バイナリ形式で保存することで、若干のファイル軽量化効果があります。50MBぐらい小さくなりました。また、単一のファイルになります。読み込む場合はこうします。

kvs = KeyedVectors.load_word2vec_format(
        "jawiki_normalized.kv.bin",
        binary=True,
        limit=10000)
print(len(kvs.vocab))  # -> 10000

limit=*を書き換えることで任意の数の単語のみを読み込みます。どの単語が選ばれるかなどはよく調べてません。

最終解決法

 今までの方法は結局の所、モデルをすべてメモリにロードする必要がありました。最終解決法ではgensimを使うのをやめて、必要な単語のベクトルだけをメモリにロードできるようにします。most_similar()などは使えなくなりますが、similarity()などは自分で実装することで、使えるようになります。
 まずは、gensimからモデルをテキスト形式で吐かせます。

kvs = KeyedVectors.load("jawiki_normalized.kv")
kvs.save_word2vec_format("jawiki_normalized.kv.txt", binary=False)

headしてみるとこんなデータができます

879000 200
の -0.18367043 -0.029534407 -0.04568029 0.059862584 -0.07997447 -0.046858925 0.14023784 0.07425413 -0.008315135 -0.12953435 -0.026671728 0.0070677847 0.16410053 -0.018117158 0.010087145 0.01466953 0.041376486 -0.1008434 -0.06180911 -0.058874626 0.008909045 0.044234663 0.014539371 -0.0028310632 0.018776815 0.049506992 0.073248215 -3.157805e-05 0.10673941 0.03583274 -0.10652217 -0.059396442 -0.0261147 -0.03284311 0.081868224 -0.012962754 -0.034510043 -0.10235525 -0.0769274 0.082873024 -0.012097447 0.0727865 0.014861626 0.03009095 -0.030071974 0.027952265 -0.025505234 -0.05018914 0.0417648 -0.02850465 0.07273282 -0.09483565 -0.04345289 0.15165983 -0.031632055 0.17059058 -0.044084977 0.0052842456 -0.028103009 -0.04878716 -0.024238652 0.054972656 -0.03674599 -0.040995907 -0.0050267056 -0.055824015 -0.062449194 0.13537866 0.07244164 -0.0714956 -0.019936046 -0.16671564 -0.100499384 0.007035132 -0.11507068 0.04457269 -0.13684298 -0.0803739 -0.017586963 0.08030843 0.033362087 -0.108916104 0.039713085 0.04878837 -0.04515106 -0.018243527 0.12831812 -0.017795842 0.04866434 -0.060816325 -0.050964024 -0.01270505 -0.033732776 -0.08854351 0.06676082 -0.05967011 0.07151932 0.061369702 -0.044702165 0.05061344 0.14359577 -0.051136304 0.0615069 -0.022738786 0.051260248 -0.07742282 0.02800144 0.03599446 0.06877219 -0.01719892 0.06675788 0.06307474 -0.036053922 -0.22192973 -0.048423205 -0.04822691 0.059284963 0.052187417 -0.07442425 -0.07336827 -0.118471846 -0.08167546 -0.013464366 0.006391276 0.0012051899 -0.114997625 -0.055676162 -0.053286873 0.047492016 -0.053404514 -0.042560868 0.039681405 0.11049425 0.07539424 -0.08105653 0.06514334 0.116133265 0.0396685 0.050337143 -0.055580735 -0.12020915 0.010553302 0.100789204 0.057277914 -0.01211393 -0.0009179714 0.08036089 0.0055075907 -0.17496698 0.13960186 -0.016151525 -0.062465787 0.038296852 0.017309219 0.012427443 -0.02194943 -0.09682389 -0.06353024 -0.060949646 0.020672444 0.13299905 0.028146993 0.07839865 0.022320326 -0.047637332 0.0005690668 0.07873213 -0.02366066 0.053062834 -0.011705997 0.056978896 -0.13023455 -0.048329093 -0.012450362 0.08268035 0.027270395 -0.09271215 0.014355482 0.11091846 -0.016312167 -0.06322232 0.024058044 -0.15635346 -0.060165983 -0.06801029 0.053233985 -0.091366336 -0.04244707 0.03506038 0.010074944 -0.039310183 0.003523075 0.026648186 -0.09815444 0.0450355 0.0151189305 -0.09069526 -0.015519027 0.06754098 -0.021642119
(略)

先頭行に単語数 ベクトル次元数があり、以降の行に単語 ベクトル...となっています。必要な単語だけこのファイルからベクトルを読み込むようにすれば、低メモリ環境でも何十万というヴォキャブラリを活かすことができます。

SQLiteのDBにしてしまう。

 個人的なおすすめはこのファイルをさらにデータベースにしてしまうことです。CSVなどより検索が早くなります。クソみたいなコードを貼ります。

import sqlite3
import logging

WORD2VEC_TEXT = "jawiki_normalized.kv.txt"
DB_PATH = "jawiki_normalized.kv.db"

def return_column_names(n):
    if n >= 0:
        r = "keyword TEXT PRIMARY KEY,"
        for i in range(n):
            r += f" vec{i} integer,"
    else:
        r = "?,"
        for i in range(-1*n):
            r += "?,"
    return r[0:-1]

if __name__=="__main__":

    fmt = "%(asctime)s %(levelname)s %(name)s :%(message)s"
    logging.basicConfig(level=logging.INFO, format=fmt)

    con = sqlite3.connect(DB_PATH)
    c = con.cursor()

    with open(WORD2VEC_TEXT, "r") as f:
        fl = f.readline()
        logging.info("Start: " + fl)
        count = int(fl.split(" ")[0])
        size = int(fl.split(" ")[1])
        c.execute(f"create table kv( {return_column_names(size)} );")
        for i in range(2, count+2):
            line = f.readline()
            row = line.split(" ")
            if len(row) != (size+1):
                logging.warn(f"Index error: line: {i} text: {line}")
                continue
            c.execute(f"insert into kv values ({return_column_names(-1*size)});", row)
            if i % 10**4 == 0:
                logging.info(f"{i} / {count} done. {i/count*100} percent.")
                con.commit()
    logging.info("DONE!!!")
    con.commit()
    con.close()

DBができたら、インデックスを作っておきましょう。

$ sqlite3 jawiki_normalized.kv.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> create index keyword_index on kv(keyword);
sqlite> .exit

DBのCursorを受け取って、ベクトルを返す関数は以下のようになります。

def get_vec(c_kv, surface):
    c_kv.execute("select * from kv where keyword=?;", (surface,))
    r = c_kv.fetchall()[0]
    return np.array(r[1:])

c_kvがDBのCursorで、surfaceが単語、単語が見つからない場合はIndexErrorになります。

コサイン類似度の算出

 別にユークリッド距離でも構わないと思いますが、ユークリッド距離は「短いほど近く」コサイン類似度は「大きいほど近く」なります。正規化を行っている場合は、ユークリッド距離は2の時が一番遠くなります。コサイン類似度では-1が一番遠く、1が一番近くなります。コサイン類似度はsimilarity()などで使われています。gensimを使わないので自分で実装する必要があります。

コサイン類似度ってなんやねん

コサイン類似度は2つのベクトルabの間の角度をθとしたときのcosθのこと
(やたら難しい概念かと思ったら高校1年生でもわかりそうなものでびっくりしちゃった。)具体的にどう求めるかというと、ベクトルの内角の公式より、

f:id:two_headed_duck:20200405164656p:plain

そんだけ。ちなみに、abユークリッド距離をdとおくと、
f:id:two_headed_duck:20200405171204p:plain
となり、ここで、abは正規化されていて単位ベクトルなので、
f:id:two_headed_duck:20200405171937p:plain
という関係がコサイン類似度とユークリッド距離で成り立つ。

実装

ユークリッド距離を求めてから、コサイン類似度を求めたほうが早い気がするのでそうする。
f:id:two_headed_duck:20200405172324p:plain より、

def get_similarity(vec1, vec2):
    # vec1, vec2は事前正規化済みとして
    # ユークリッド距離
    diff = (vec1 - vec2) ** 2
    d_2 = diff.sum()    # ユークリッド距離の二乗
    # コサイン類似度に
    cos_sim = (2 - d_2) / 2
    return cos_sim

とすると求められる。簡単じゃん。

その他

 最終的解決法をつかうとモデルをメモリにロードする必要がなくなるので、ロード時間を大幅に減らせます。most_similar()などを使わなければ、限りなくいい方法だと思います。よんでくれてありがとね。

しりとりを科学する。 ~論理に基づいた最強のしりとり戦法を求めて~

しりとりに必勝法はあるのか(ポエム)

 昔からしりとりが好きだった。しりとりは一見すると、勝ち負けもないようなただの言葉の言い合いに過ぎない。しかし、しりとりには明らかに「強い人」「弱い人」が存在する。どうすれば強くなれるのだろうか。
f:id:two_headed_duck:20200401191434p:plain  Googleで適当に検索してみると、色々出てくる。「る攻め」がいいとか「ぷ攻め」がいいとか。僕は昔「む攻め」を極めたし、友達には「や攻め」使いがいた。しかし、これらの言説に総じて言えるのは、「論拠の不足」であろう。感覚的に「〇〇が強い」というのは、信用に値するのであろうか。そんなことを日々思っていたときに、ある本に出会った。とつげき東北氏の「科学する麻雀」である。麻雀は「ツキと流れ」が支配する感覚のゲームと長い間思われていた。しかし、統計学やコンピュータシミュレーションを用いることで「麻雀必勝法」を科学的に導出できることをこの本は示している。しりとりの話から逸れてしまったが、僕はしりとりでも同じことが研究できるはずだと思ったのである。
 そこで、僕の稚拙なプログラミング能力を生かしてしりとりを科学的に極めてやろうと思ったのだ。GitHubにリポジトリを公開しているので、暇だったら覗いてほしい。とはいえ、人に見せるものではないような気もする。
 この記事はそんなくだらない遊びの中間報告である。書いている人の頭は良くない。

一般化してみる

 しりとりとはなんだろうか。流れを一般化してみよう。
 はじめに、単語というものを定義する。単語は「サーフェス」と「ヨミガナ」という属性を持つ。「サーフェス」というのは分かりづらい言い方だが、"見た目"のことだ。*1
 しりとりのルールを一般化しよう。しかし、ここで一旦制約をつける。しりとりは1人以上いれば遊べるゲームではあるが、今回の研究では2人でプレイするものだとする。3人以上になると、麻雀で言うところの「コンビ打ち」のように、誰かを蹴落とすための戦略性が生じてくるが、今回はそれを抜きにして、シンプルに2人対戦で考える。
 ここで、終端文字取得関数E(w)を考える。E(w)はルールによって定義が異なる。E(w)は単語を引数に取り、その単語の「終端文字」を返す。「終端文字」が1文字とは限らないことに留意しよう。次に敗北判定関数L(c)を定義しよう。L(c)は「終端文字」を引数に取り、これが敗北する終端文字であれば、敗北の判定を返す。*2
 次に、単語を記憶するリストWLを定義する。このリスト末尾に単語を追加する関数P(w)と、与えたられた単語(のヨミガナ)がリストの中に存在しないか、確認する関数C(w)も定義できる。C(w)はルールによって定義が異なる。「サーフェス」で区別するのか、「ヨミガナ」で区別するのかという問題である。そして、WLの末尾要素を取得する関数S()を定義する。
 最後に、プレイヤーが単語を思いつく関数G(c)を定義する。G(c)は終端文字を引数に持ち、その終端文字で始まる単語を返す。ただし、返す単語はユニーク(一意)であるとする。*3もし、返せないときは敗北とする。
 これまでの定義から、しりとりの1ターン、プレイヤーが自分の番にやるべきことは以下のように一般化される。

  1. x <- S() # 前回言われた単語を参照する
  2. c <- E(w) # その単語の終端を得る
  3. if L(c) { # ここでL(c)が真なら勝利する }
  4. w <- G(c) # 単語を思いつく、思いつかない場合は負けとするが割愛
  5. if !C(w) { P(w) } else { Goto 4 } # すでに言われた語でなければ、WTに追加する。そうでない場合は、考え直す。

1~5が完了すると、同じことをもうひとりのプレイヤーも行う。これを延々と繰り返すのがしりとりであると定義できる。このように一般化することで、しりとりシミュレータを作ることもできる。

単語の獲得

 しりとりをコンピュータ・シミュレーションする際に問題となるのは、G(c)の実装である。G(c)は「知っている単語の中でcから始まる単語を返す」部分と、「返された単語の中で何で答えるのがいいのかを戦略的に選ぶ」部分に分けることができる。ここでは前者、「知っている単語の中で~」すなわち、コンピュータにどのようにして単語を覚えさせるのかを検討する。
 今回の研究では、mecab-ipadic-NEologdという自然言語処理に使われるOSSの辞書を利用した。IPA辞書と呼ばれる基礎的な日本語の単語に加えて、mecab-ipadic-NEologdはインターネット上から最新の単語を取得し、辞書に追加するシステムを備えているため、最新のトレンド用語やマイナーな学術用語もカヴァーしている。オタク用語もバッチリである。
 しかし、問題もある。この辞書は形態素解析向けの辞書であるため、「表記ゆれ」の語が多く存在する。例えば、「鴨そば」も「鴨蕎麦」も「かも蕎麦」も「かもそば」もそれぞれ別単語として登録されているイメージである。これらを別単語と考えるのは無理がある。そこで、今回の研究では「ヨミガナユニークルール」を導入する。同じヨミガナの語は1度しか使えないというルールである。同音異義語は認めない。こうすることで、「カモソバ」1単語と捉えることができる。同音異義語を認めるルールの場合、同音異義語か否かをコンピュータが判定することは難しく、*4このルールはコンピュータを扱う上で合理的だと思われる。
 また、一般的(世間的)に、しりとりは名詞のみという原則がある。そこで、mecab-ipadic-NEologdから名詞に関わる単語を抽出した結果、2020/3/15の最終更新データでは1,982,873単語となった。広辞苑は約25万単語と言われており、約8倍の単語数である。(広辞苑は動詞とかも含んでいるが)ここまで多い単語数であれば、このデータは「日本語の単語母集団」に対する「十分な数の標本」と見ることができる。(筆者は統計に理解はない)この単語データはシミュレーションのコンピュータの記憶に使えるだけでなく、「日本語の単語全体」の傾向を掴むのにも使えるはずだ。
 「知っている単語の中でcから始まる単語を返す」はこれでもう実装できる。単語データが有れば、コンピュータにはあとは朝飯前である。筆者はSQLiteのデータベースに落とし込むことで、単語検索に十分なスピードが出るようにしている。返された単語の中で何で答えるのがいいのかを戦略的に選ぶ」に関しては、後述する。

○攻めについて

 しりとりの戦術といえば、「○攻め」である。巷にはさまざまな「○攻め」言説が溢れている。本当に強いのは何攻めだろうか。調べてみよう。

その前に、ルール定義が必要だ

 しりとりには様々なルールが有る。Ngokのプログラムは様々なルールに対応した各種関数を持っている。それらにはしりとりのルールを素数の積で指定する。

# モードは各オプションの積で指定します。
   # 何も指定しない場合、厳密に一致する必要があります。    
   # 相互交換可能オプション
   # 2 濁点<=>濁点              e.g.)帝国=>軍事法廷
   # 3 半濁点<=>濁点            e.g.)法被=>広島
   # 小文字に関するオプションは併用不可です。
   # 何も指定しない場合は、自動車=>社宅のようになります。
   # 5 小文字<=>標準文字        e.g.)自動車=>ヤクザ               
   # 7 小文字を除く             e.g.)自動車=>指紋
   # 11 小文字は負け            e.g.)自動車(負け)
   # 13 (予約)
   # 長音のルールも併用不可です。何も指定しないと、マヨラー=>ラーメンのようになります。
   # 17 長音は省く              e.g.)メーデー=>デビルマン
   # 19 長音は母音を取る        e.g.)メーデー=>エンブレム
   # 23 長音は負け              e.g.)メーデー(負け)
   # 29 (予約)
   # その他のルール
   # 31 「ン」で負けにしない。  e.g.)食パン=>ンゴック族
   # 37 ジ<=>ヂ                 e.g.)鼻血=>ジルコニウム
   # 41 ズ<=>ヅ                 e.g.)木更津=>ずんだ餅
   # 43 ヲ<=>オ                 e.g.)みつを。=>折り紙
# 推奨は2*3*5*17*43です。

今回は筆者の偏見で最も一般的と思われる2*3*5*17*43=21930で見てみよう。簡単に言えば「濁点半濁点無視」「小文字は大文字」「長音無視」「を=お」である。しりとりのルールは簡単なようで難しい。今回最も苦労したのは、あまたのルールに対応するE(w)を作ることであった。

Xで終わりYで始まる単語

https://github.com/comradeKamoKamo/Ngok/raw/dev/output_21930/cm.png?raw=true

 この図はX(横軸)で始まり、Y(縦軸)で終わる単語の数をヒートマップで表したものである。注意点としては、カラーバーが5000で頭打ちであるが、実際には5000以上の単語数を持つXYの組み合わせも多く存在する。
 これを見ると、日本語の単語には偏りがあることがわかる。よく言語学の領域では「日本語の単語にはら行から始まる単語は少ない」という説がある。すでに証明されてるだろうが、この図をつかってもたやすく証明することができる。逆に「な行で終わる言葉は少ない」という事実もわかる。
 ここで、二次元配列CMを定義する。CM[Y,X]でYで始まり、Xで終わる単語の数を返すものとする。これは以降の議論で頻繁に使用する。
 図を見ると、何攻めにしたらいいかのヒントが見つかるかもしれない、がもっと簡単な方法がある。「単語終始比率R」というパラメータを導入する。ある文字cについての単語終始比率R(c)は

R(c) = cで終わる単語の数の合計 / cで始まる単語の数の合計

とする。R(c)が高い値の時、その文字は「攻めやすく」相手が「返しづらい」ということである。これを各文字ごとに取得し、グラフにしてみよう。

https://github.com/comradeKamoKamo/Ngok/blob/dev/output_21930/rate.png?raw=true

これを見ると、一目瞭然、「る攻め」最強説誕生である。群を抜いている。次点が「う攻め」でこれは正直以外だった。普段から「う」で攻めていた人の話は聞いたことがなかった。僕の「む攻め」、友達の「や攻め」は悪くないが良くもない。

番外編:「ぷ攻め」

「ぷ攻め」が強いかどうか、21930のルールでは半濁点を無視するため、わからない。別途検証してみよう。ルールは5*17*37*41*43= 5544635 である。 https://github.com/comradeKamoKamo/Ngok/blob/twi_bot/output_5544635/rate.png?raw=true ぷが強いとか言ってた人はしりとりやめたほうがいいんじゃないかなと思える結果である。(別に悪くはない。)濁点半濁点無視をしない場合は、「る攻め」よりも「ず攻め」が有利である。これは僕の父親がよく使っていた戦法であり感慨深い。「ず攻め」の強さは圧倒的で、濁点半濁点無視でない場合はず攻めするしかない。が、基本は21930のルールで話をすすめる。

先行研究者様がいました。(追記)

単語分析に関して、先行研究者様がいました・・・。

active-galactic.hatenablog.com

qiita.com

驚くほどやり方が似てますけど本当に偶然です。データの扱いが違うのか、ルールが違うのか、やや結果が異なっていますね。

戦略

 しりとりは攻めるだけだろうか。その前提から検証してみることにする。まずは、戦術を実装しよう。

戦略論の前にガバイ理論

 「攻めるか」「守るか」これが基本である。ここで、「攻め方」「守り方」は極力シンプルに実装する。このような「攻守」の戦略を立てる際は、シンプルな戦術が有利であるということが一般的な気がするからだ。*5冒頭のポエムで科学がどうこう言っていたのに、この根拠もないガバイ理論を出して申し訳ない。
 要するに、各戦術は極力単純化して考えシミュレーションしてみようということである。しかし、各戦術が有効な戦術かどうかをしっかりと検証できる手法はない。「この戦術のが強い」という物があれば教えてほしい。

攻撃的戦術

 攻撃的戦術は「cで始まり、R(c)が最大となる文字で終わる単語を返す」ものである。それだけ。

防御的戦術

 防御的戦術は「cで始まり、CM[x,c]が最小となるような文字xで終わる単語を返す」とする。つまり、相手にまたcで攻められることを防ぐ。

中間戦術

 中間戦術は、

  1. rate = WLにおけるcで終わる単語数 / WLにおける総単語数 とし、
  2. 一様乱数randを0.0~1.0で発生させ、
  3. rate >= rand なら防御し、 そうでなければ、攻撃する。

というルーチンを取る。c攻めされている割合で防御する。

ランダム戦術

 ランダムは「cで始まる単語の中から、ランダムで1つ返す」という戦術である。

シミュレーション

 先程のしりとり一般化を用いて、シミュレーションができる。十分な回数のシミュレーションを行った。*6
 結果はどうやっても、攻撃的戦術が勝利した。防御的戦術は攻撃的戦術に対して逆効果だったのだ。(防御的戦術はランダムよりは圧倒的に強いため、効果がないわけではない。)この時点で、中間戦術は意味がない。中間戦術は防御に勝ち、攻撃に負けるからである。ランダムはどの戦術よりも悪かった。
 防御的戦術の失敗は、結局の所、防御といっても「○攻め」になってしまうからであろう。実際には「る攻め」に対して「ぬ攻め」で返していた。防御のためとはいっても、効率の悪い攻め方であったら負けて当然なのである。
 以上の結果から、しりとりにおいては「攻め」は圧倒的な王道戦術と言える。また、ランダム同士の対戦シミレーションから「先攻」「後攻」に特に優劣はないこともわかった。*7

まとめ

 以上のことから、しりとりの最強戦術はここで述べた「攻撃的戦術」である。つまり、「○攻め」であり、その攻め文字は、ここで示された単語終始比率が高い順に行えばいい。あとは、単語を覚えるだけと言える。それだけである。つまらないゲームですね。
 しりとりは突き詰めると面白くなくなるという実感が以前からあったが、真実だったようだ。

本当にそれだけ?

 本当にそれだけだろうか。コンピュータは単語の意味を理解できないため、上のような結果になっている。しかし、実際には、ある人はずっと同じジャンルの言葉で返す、とかそういうのがあるはずである。ここからは、科学的に検証できないが、筆者が強いと思う戦い方である。つまり、ネット上の根拠のないしりとり戦術言説であり読まなくても良い。

  • 返す単語は相手の単語と関連した単語のがよい。相手の語彙を減らせる。
  • 関連語のないときはなるべく短い単語が良い。短い単語は相手も思いつきやすい。

根拠がないので、本当かわからない。

今後の展望

 今後があるかもわかっていない。考えているのは、人名や外来語を禁止したときにどうなるのかといったルールを制限した場合である。そのような際には、「る攻め」神話が大きく崩れ、ほんとうの意味での「しりとり」が見えてくるかもしれない。

謝辞

 ここまで読んでくれてありがとね!

*1:見た目とは、例えば、漢字で表記したときの単語の見た目である。しかし、口頭でしりとりを行う際はそれはアクセントや声量を絡めた発音方式を含むかもしれない。後述するが、今回の研究では「ユニークヨミガナルール」を採用しているため、サーフェスはさほど重要でない。アクセントや単語の意味によって、同音異義語を容認するルールの場合は重要である。

*2:通常は「ン」であるが、ルールによっては異なる。長音や「ヂ」を敗北とする場合など。

*3:細かいことはそんなに気にしないでほしい。こうしないと4-5で無限ループして兵庫県警に捕まってしまう。

*4:「君」と「黄身」はサーフェスで区別できるが、例えば、地名としての「四日市」と市としての「四日市」は区別が難しい。あまりいい例ではないかも。

*5:リチャード・ドーキンスの「利己的な遺伝子」でそんなのを読んだ気がする。

*6:ただし、コンピュータにとってはサーフェスはどうでもいいため、単語を使わずに、配列CMの数字を引き算するだけで実際はシミュレーションする。ヨミガナユニークルールの利点である。また、次の注で述べるとおり、中間戦術とランダム戦術が絡まないシミレーションは回数を重ねる必要はない。

*7:攻撃的戦術同士を戦わせると、必ず後攻が勝つ。しかし、これは意味のない結果で、攻撃的戦術や防御的戦術は乱数要素を含まないため、勝敗は単語データの単語数の運命で決まるからである。

4月2日 緊急事態宣言 不思議なことはすぐ気になる。

4月2日 緊急事態宣言 で検索しても何もヒットしないらしい。

f:id:two_headed_duck:20200330232950p:plain 4/2や4月3日、1日ではヒットする。何がおかしい。英語でも出ない。
海外サーバだと検索できるみたい...魚拓👉https://archive.is/sWdEh
国内サーバから魚拓を取れた。目的外使用だが、👉https://securl.nu/saved.php?key=20200330582f07358d39568e613d36a2f6384ec8
「非常事態宣言」でも検索できない模様。「4月」と「2日」を区切ると検索可能になる。

そんだけ

個人的にこういうやり方は嫌い。百度で「天安門事件」を検索してヒットしないのはおかしい。それと同じだ。Googleくんさぁ。

追記

朝日新聞の取材によると、Google曰く「不具合」。

www.asahi.com

グーグル日本法人にこの検索結果について取材すると、「ご指摘の問題について把握しており、現在調査対応しています」と説明。「情報にアクセスし使えるようにすることはグーグルの使命です。私たちのシステムは、アルゴリズムにより自動的に公平な検索結果を生成するように設計されており、これにより特定の個人・団体の偏見や意図に影響されることを防いでいます」とコメントし、検索結果の不具合で意図的なものではないことを強調した。

本当か?そうであるなら不具合の原因を開示してほしい。状況に応じて追記します。

ごみ

4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言 4月2日 緊急事態宣言

東京湾観音に行ってきた(不要不急)

東京湾観音!

f:id:two_headed_duck:20200322212135p:plain
東京湾観音
 恥ずかしながら、東京湾観音の存在を全く知らなかったんです。こんなにでかい観音像が東京湾にあったなんて、ということで紹介します。

アクセス

f:id:two_headed_duck:20200322212321p:plain
※話題の香川は関係ありません
 最寄り駅はJR内房線「佐貫町駅」。東京湾といっても房総半島側にあります。電車の本数は1時間に1本程度。東京からは総武線快速内房線直通「君津」行で、君津で乗り換えることで簡単に行けます。駅前はカフェ以外なにもないです。コンビニもありません。
 昔は、駅から観音像までのバスがあったようですが、今は廃止されたようです。駅を出たら、左に進んでいきます。
f:id:two_headed_duck:20200322212816p:plain
表参道(ただの道)
 進むと表参道への分岐があります。表参道をひたすら登っていきます。歩行者に優しい道ではありません。車に注意です。
f:id:two_headed_duck:20200322212946p:plain
こういう、うっそうとした道を約20分登ります
 進んでいくと、老人ホームがあります。するとすぐそこに巨大な観音様が見えるはずです。観音様しかないような場所に老人ホームを立てるセンスには敬服します。

東京湾観音について

 f:id:two_headed_duck:20200322213401p:plain
 東京湾観音は戦後に世界平和を目的に建てられた、全長56mの救世観音像です。新しい観音様の部類でしょうか。拝観料は大人500円で、観音様の胎内に入ることができます。

東京湾観音は、東京湾を一望できる南房総国定公園(大坪山)に建つ高さ56mの救世観音です。 本像は昭和36年に宇佐美政衛氏が世界平和の理念の元に建立されました。 そのお姿は平和な世の中を祈願した珠を懐き、常に我々の幸せを願う安らかなお顔です。 また、美術作品としても有名な東京湾観音の原型の作者は、国際グランプリを受賞した彫刻家の長谷川昴(こう)氏です。観音様の胎内にも長谷川氏の作品が多数あり>ます。天上界までの324段の道のりをゆっくりと拝観しながら歩いて頂ければ、きっと心が満たされてゆくことでしょう。 天上界(宝冠の高さ)から一望できる東京湾は絶景で、天候に恵まれた日には富士山や夕焼けも美しく見えます。
東京湾観音 / 東京湾観音についてより引用。

f:id:two_headed_duck:20200322213905p:plain
 こんなものもありました。僕の曽祖父はシベリア抑留で帰ってこなかったらしいので。。。

胎内

 20階建て構造で、各階には七福神を始めとしていろいろな像が置かれています。螺旋階段を登って上に上がります。結構大変で20分ぐらいかかります。 f:id:two_headed_duck:20200322214443p:plain
f:id:two_headed_duck:20200322214527p:plain
f:id:two_headed_duck:20200322214513p:plain
f:id:two_headed_duck:20200322214604p:plain
鼻の穴から観音様の大きさがわかります。上の方には展望台?的なものがあります。僕が行った日は超強風の日で、高いのでそれがさらに強風になっており大変でした。。。 f:id:two_headed_duck:20200322214730p:plain
f:id:two_headed_duck:20200322214804p:plain やっとこさ天上界につきましたと。 f:id:two_headed_duck:20200322214844p:plain
登ってきたご褒美にお守りがもらえます。あと、願い事を書くノートなんかもありました。南無大師遍照金剛。

まとめ

 お土産屋とプチ資料館もあります。甘酒を買って飲んでました。東京湾観音は知名度が低めだと思いますが、珍しく楽しい観音様なのでみんな行きましょう。徒歩でのアクセスは最悪ですが。

おまけ

f:id:two_headed_duck:20200322214955p:plain
この書き方かっこいいですよね
f:id:two_headed_duck:20200322215041p:plain
採光窓があるので、後ろ姿はやや面白いです

鋸山に行きました(不要不急)

 ご存じの方はご存知だと思いますが、最近千葉県木更津市に引っ越してきて一人暮らしをはじめました。千葉県の東京湾側の真ん中、チーバくんのおへそ、アクアラインストロー効果のジュースの方の街、木更津でございます。私は埼玉で生まれ、埼玉で育った埼玉県人ですので、海の近くに住んでいるだけで幸せな気分です。木更津市はゴミ袋がクソ高いこと以外には文句はございません。
 せっかく房総半島に引っ越してきたのですから、房総半島の名所を色々廻ってみたいものです。そこで今回は第一弾として鋸山に行きました。コロナ?知らんな。あと、筆者は交通弱者なので車のことには一切触れません。

鋸山(のこぎりやま)

f:id:two_headed_duck:20200311224942p:plain
鋸山
鋸山は房総半島の東京湾側にある小規模な山です。(千葉県の山は総じて小規模ですが。)房総半島の房総とは、千葉県の旧国名「下総・上総(しもうさ・かずさ)」と「安房(あわ)」から1文字ずつ取って、「房総」といいます。下総が都会の方の千葉(北の方)で上総が真ん中(木更津や一ノ宮)、安房が南端(館山・鴨川)です。上下は京都へのアクセスのしやすさで決まっており、上総国は木更津あたりから船で神奈川方面ショートカットできるので、京都に近かったわけですね。

 話がそれてしまいましたが、鋸山は東京湾側の上総と安房の境界になっている山だったりします。鋸山以南は「安房」。里見八犬伝の世界になるわけです。

最寄り駅は2つある

 鋸山の最寄り駅は2つあります。JR内房線の「浜金谷駅」と「保田駅」です。浜金谷駅久里浜から東京湾フェリーが就航しており、交通のプチ要所です。保田駅は駅前に砂浜が広がっていて気持ちいいです。どちらも内房線の単線区間のため、本数は1時間1本で、大抵は「木更津<->館山」の区間運行です。鉄道アクセスは最悪ですね。僕は木更津駅から乗るだけだけど。
 浜金谷駅から乗る場合は、「鋸山ロープウェー」で山頂に行くのが一般的なルートです。登山路もありますが、マイナーなようです。保田駅からは整備された山道/参道を登っていくだけです。こちらは階段を上り下りするだけです。ただ、登山路の入り口が駅から離れており、徒歩40分程かかります。
 今回のお出かけのルートは、「浜金谷駅」→「ロープウェー」→「山頂」→「保田駅」のルートでいってきました。そこそこおすすめです。

浜金谷

f:id:two_headed_duck:20200311230733p:plain
浜金谷駅Suica使えるし有人駅だけど屋根はない)
木更津駅から各停に乗って浜金谷駅に到着。内房線の君津以南は非常に海の近くを走るため車窓がきれいです。同じ目的の観光客がそこそこ降りてました。平日なのでそんなに多くないですが。
f:id:two_headed_duck:20200311231014p:plain
こういうのすき
 駅前にエモい立て看板がありました。東京湾口道路は三浦半島と富津あたり(浜金谷?)を結ぶ道路を作ろうって話らしいです。要するに東京湾フェリーを潰したいってことですかね。内房線の複線化・総武快速線乗り入れの隣にあるのはシュールです。なぜかって、昔は東京発館山行特別快速が走ってたんですが、アクアラインのせいで、内房線はガラガラ鉄道になったのでなくなっちゃたんですよね。東京湾口道路なんかできたら内房線特定地方交通線まっしぐらでは?
 f:id:two_headed_duck:20200311231612p:plain  町並みはこんな感じで非常にエモい。エモい・・・。 f:id:two_headed_duck:20200311231717p:plain  漁港があります。海がとっても綺麗です。木更津・君津あたりは工場があるのでそんなにきれいじゃないからね。

鋸山ロープウェー

f:id:two_headed_duck:20200311232242p:plain
硬券(大都会さいたま生まれのなので初めて)
 ぼちぼち歩くと山麓駅につきます。写真を取りそこねました。片道500円。往復950円です。片道を注文したら「自力で降りるのめっちゃ辛いよ、いいの?」的なことを言われました...。切符が硬券でした。京成グループって書いてあります。筑波山のロープウェーとか、ケーブルカーも京成だし、京成は山持ちすぎでしょ。あとなんで、ロープウェーなんですかね。ロープウェイだろ。

鋸山山頂

f:id:two_headed_duck:20200311232542p:plain  ロープウェーを降りるとすぐ山頂です。めっちゃきれい。遠くが曇ってて富士山は見えませんでした。こうやって見ると富津岬ってめちゃでかいな。あと館山ってくっそ遠いなと思います。横須賀も見えますね。山頂駅にプチ資料館がついていて、鋸山の地理や、石切の歴史を学べます。古東京湾などの展示が面白かったですね。地理オタクなので。山頂駅には食堂もあります。ご当地メニューもあります。「地獄アイス」とか。

日本寺

 日本寺という山頂にある寺の敷地に入ります。拝観料は600円でしたが、4月から800円だそうです。一部展示は台風被害で封印中とのこと。羅漢道が見れないのが残念。

世界救世教

 f:id:two_headed_duck:20200311233407p:plainf:id:two_headed_duck:20200311233438p:plain

ja.wikipedia.org

 世界救世教という新宗教をご存知ですか?何でも開祖が啓示かなんかを受けたのが鋸山ということで記念碑が立っていました。宗教オタク必見です。

地獄のぞき

 f:id:two_headed_duck:20200311233650p:plain
 鋸山といったらこれです。写真の飛び出したところから下を覗けます。結構な迫力です。写真は撮ってませんが。このような岩肌になっている理由は人為的に石の採掘が行われたからです。靖国神社とかにも使われてるらしいよ。

景色

f:id:two_headed_duck:20200311233937p:plainf:id:two_headed_duck:20200311234004p:plain

大仏

f:id:two_headed_duck:20200311234313p:plain
日本一
 ここからは山を下ります。日本寺の入り口は保田駅側にありますので、正式なルートを逆行する感じです。てなわけで、降りていくと大仏があります。これは日本一大きい大仏だそうです。知らなかった。全長31mで鎌倉大仏の2倍以上あります。お祈りしたのでコロナにはかからなくなりました。(デマ)
 この先にもの日本寺の諸施設がたくさんあります。日本寺は国号を名前に持つ凄まじい寺ですが、聖武天皇の勅命であの行基が作ったとのこと。現在は曹洞宗ですが、過去には真言宗天台宗などにも属しており、特に弘法大師ゆかりのものがそこそこありました。僕は真言宗徒なので嬉しいですね。南無大師遍照金剛。

下山

f:id:two_headed_duck:20200311234915p:plain
入口の門
というわけで、保田口に無事降りられました。さして大変でないです。仁王門がありました。

保田海水浴場

f:id:two_headed_duck:20200311235209p:plain
 降りると駅まで結構ありますが、海浜浴場の砂浜を歩いて駅まで行きます。埼玉県出身なので海に来ると楽しくなります。 f:id:two_headed_duck:20200311235353p:plain
 磯もあります。

f:id:two_headed_duck:20200311235454p:plain
河口?
 こんな感じに川が流れてたりもします。ちょっと笑っちゃうな。
f:id:two_headed_duck:20200311235609p:plain
本当?
 ここ、「房州海水浴発祥地」だそうです。そーなの。

保田駅に到着

f:id:two_headed_duck:20200311235810p:plain
特に駅前になにかあるわけではありません。運が悪いと、何もないところで待つことになります。実際、待てないでタクシー呼んだ家族がいました。
f:id:two_headed_duck:20200311235941p:plain
帰りの電車がこんなでした。なんなんですかねこれ...?不思議がいっぱいチーバくんランドってね。

まとめ

 鋸山はいいぞ。ロープウェーあるんで体力皆無ニキでも大丈夫です。ただ、保田の海岸がとっても良かったので僕はそれを推します。

シーランド公国亡命政府の実態と闇、そしてパナマ文書とネオナチ。

シーランド公国亡命政府とはなにか

f:id:two_headed_duck:20200217221143p:plain  シーランド公国は非常に有名な自称国家です。(自称国家の中でもシーランド公国は主権をしっかりと有している大変珍しい例でもあります。)シーランド公国を知らない人はこの記事を読む前に調べてみてください。
 イギリス人のロイ・ベーツが1967年にシーランド公国を建国して後の、1975年、シーランド公国はロイの名のもとに憲法を発布しました。このときに憲法制定に関わったのが、西ドイツ人でアーヘンという都市でダイアモンド取引商をしていた、アレクサンダー・ゴットフリート・アーベンバッハ(Alexander Gottfried Achenbach)という男でした。彼はシーランドで自由なカジノを経営することを考えていました。彼はすぐにシーランド政府で出世し、首相に上り詰めました。
 そして来る1978年8月、ロイがカジノに関わるビジネスでドイツに出張中の間に、アーベンバッハはクーデターを起こします。ロイの息子のマイケルを人質に取り、オランダ人傭兵を用いて、シーランドを占拠しました。そして、アーベンバッハは「ロイが海外勢力に不正に領土を売却しようとした。」ことを憲法違反としてロイを解任したのです。しかし、ロイはすぐに英国軍時代の友人を頼りにシーランドを武力で取り戻したのでした。
 シーランド市民であったアーベンバッハはロイによりシーランドの法によって拘束されました。しかし、西ドイツ政府は自国民であるアーベンバッハを守るために、ロイに外交官を派遣し交渉を試みました。ロイは外交官を派遣して、「まるで国のように」扱われたことを喜び、アーベンバッハを釈放するのでした。
 しかし、アーベンバッハは諦めていませんでした。「憲法に基づいて、ロイは解任されており、法的なシーランドの最高指導者は自分である。」と信じた彼は、シーランド亡命政府を立ち上げたのでした。

亡命政府のWebサイト

www.principality-of-sealand.ch  亡命政府について、日本のインターネットにおいて知られていたのはこのサイト程度であると思います。正直、僕はこのサイトが本物であるのかすら疑っていました。なぜなら、シーランド公国亡命政府に関する説明はほとんどなく、また、シーランドとは関係のないような内容も多く掲載されているからです。
 そこで、このサイトについて、あるいは、亡命政府について詳しく調べることにしました。すると、明らかになったのは、シーランド公国亡命政府の深い闇でした。

アーベンバッハからザイガーへ

 現在の亡命政府のサイトには、亡命政府の歴史が書かれていません。インターネット・アーカイブを調べてみると、亡命政府の歴史が書かれていたのを見つけました。 https://web.archive.org/web/20130313130631/http://www.principality-of-sealand.ch/chronologie/chrono_e.html
 ベルギーに亡命政府を樹立したアーベンバッハがどのように過ごしていたかは謎に包まれています。亡命政府の歴史として重要なことは、アーベンバッハ枢密院議長が1988年にヨハネス・WF・ザイガー(Johannes WF Seiger)を経済協力大臣に任命したことでしょう。翌年の6月には、ザイガーに亡命政府をあらゆる権限を委任する書面がかわされ、8月には、(公式サイトによると、アーベンバッハの健康上の理由から、)アーベンバッハに代わり、ザイガーが亡命政府の首相と枢密院議長に就任したのです。これ以降、亡命政府はザイガーが中心となって動いていくことになります。これには、何らかの罪状でアーベンバッハが西ドイツ当局に拘束され、刑務所に収監されたことと関係があるようです。これ以降、上記亡命政府サイトはザイガーとその仲間が運営していくことになったのです。

ザイガーという男と「ライヒ市民運動

f:id:two_headed_duck:20200218005254p:plain
ヨハネス・WF・ザイガー
 ザイガーは「ライヒ市民運動」という政治運動の信奉者でした。これは、西ドイツやドイツ連邦共和国を認めず、ナチス・ドイツの「ドイツ第三帝国」が現在も存在しているという極端な右翼・そして反ユダヤ主義の政治運動です。(cf. en.wikipedia.org)

ライヒ市民運動とミクロネーション思想

 ライヒ市民運動の一風変わった特徴に、ドイツ連邦共和国を認めない代わりに、ナチスドイツの「ドイツ帝国」の正式な継承者として、運動家たちが各地域コミュニティごとに「政府」を構成するというものがあります。内閣のポストを割り当てたり、政府として各種許可書を無断で発行したり、さらには、ライヒ市民運動に反対するものに「死刑」を宣告さえするのです。軍を組織して武装し、治安当局と銃撃戦になることもあります。
 これは、ある意味でミクロネーション思想と共通点があります。ザイガーはこうした経緯でシーランドに興味を持ったのではないでしょうか。歴史的な妄想で成立する自称国家よりも、シーランドの方が明らかに合理的な自称国家といえます。
 ちなみに、ドイツの有名な自称「ドイツ帝国」政府とシーランド亡命政府はお互いに「承認」し合っているとされています。

ザイガーとシーランド貿易会社

 ドイツのメディアが2001年にザイガーをインタビューしています。Google翻訳で読んでみました。(ドイツ語わからん)

Ausgabe 05/2001 - Was Menschen bewegt
Der Herr Premierminister, fern der Heimat
https://www.brandeins.de/magazine/brand-eins-wirtschaftsmagazin/2001/globalisierung/der-herr-premierminister-fern-der-heimat

インターネット・アーカイブにはザイガーの写真が残っています。
 ザイガーは、まあ、明らかに頭がおかしい人です。ですが、ビジネスにおいては多少の才能があるのかもしれません。彼は、経済協力大臣となったあとに、ドイツに「シーランド貿易会社(Sealand Trade Corporation)」を設立しました。どんな取引を行っていたかはわかりませんが、いくらかの利益を上げていたのは事実です。なぜなら、ザイガーはシーランド貿易会社はシーランドの企業であるとして、あるいは、ライヒ市民運動的な考えからドイツ連邦共和国を認めないゆえに、国に対する税金の支払いを拒否し、当局と何度も争っているからです。課税されるだけの利益を上げていたのです。ザイガーは1991年に所有権が定かでない元国営企業の土地を不正に取得したことでも、土地の所有権を持つことになった地元地方自治体と対立しているようです。また、この土地を利用してリサイクル事業に参入し、1990年代前半に赤軍の廃棄品を多く受託していたことも明らかになっています。
 しかし、2001年にシーランド貿易会社は破産します。上の記事はこのタイミングで書かれたもののようです。その後2004年に、ザイガーは今度はスイスに「Sealand Trade Corporation Schweiz AG」(スイスシーランド貿易株式会社)を設立しています。シーランド亡命政府のWebサイトが作られたのは、この会社が建てられた時期と同時期です。(サイトのドメイン、.chはスイスのccTLDです。さらにwhois情報はこの会社名義で登録されています。)しかし、この会社もスイスで2019年に法的に解散状態になった模様です。(スイスの公的な会社情報ページ。スイス政府の見解では会社は住所を失効していますが、それ以前は「Joweid Zentrum, 1 Rüti ZH 8630 Switzerland」が会社の住所だったようです。)

「ブリル協会」ナチスの超科学技術

 ザイガーが熱狂的なライヒ市民運動の賛同者であることは述べたとおりです。ザイガーを語る上で重要なのは「ブリル協会」という単語です。Wikipediaを軽く読めば「あっ...」ってなると思います。この単語の本来の意味とは異なりますが、ザイガーはナチス・ドイツが大戦中に秘密裏に開発していた、超科学的、つまりオカルティックな技術を「Vril Technology」と呼んでいます。陰謀論者たるザイガーは、ナチス・ドイツは戦時中に「Vril Energy」つまり、永久機関的な超科学的機関を完成させており、また、ナチはそれを用いてUFO型の兵器を開発し....といったことを主張し、さらには、自分らはその技術を受け継いでいるとして、その技術を亡命政府のサイトで販売しているのです。本当です。シーランド亡命政府の公式サイトのトップページに載っています。ナチスのUFO兵器に関する動画のリンクも紹介してます。。。シーランド亡命政府のサイトに意味わからんことがたくさん書いてあったのはこういう背景だったのです。他にもシーランド亡命政府のサイトにはナチスに関することや反ユダヤ主義的なことがたくさん掲載されています。

ナチスの財宝を探せ!

 ザイガーが過去に取り組んだことには他に、「ナチスの隠された財宝を探す」ことがあります。ナチスの財宝には、先述のUFO兵器などよりももっとすごい、「琥珀の間」というものがあります。ドイツ軍に戦争中にサンクトペテルブルクから持ち去られ、大戦後に行方不明となった秘宝です。 ja.wikipedia.org  ザイガーらは財宝が埋まっている土地を見つけたようでした。しかし、他人の土地ですし、発掘許可がありません。そこでザイガーは「ドイツ帝国」の暫定政府に発掘許可を申請し、発掘をはじめました。もちろんこれが違法でないわけがありません。発掘許可などライヒ市民運動家の頭のおかしい方便です。彼はこの件でも警察沙汰になったようです。シーランド亡命政府の公式サイトのアーカイブには、ザイガーらに何度も治安当局の捜索が入ったことが記されています。 taz.de これもまた、ドイツ語の記事でいまいち読めませんが、ライヒ市民運動家がどんなことをしているのかが書かれています。ザイガーの宝探し事件についても言及されています。
 宝探しの話は後半にまた出てきますので覚えておいてください。

シーランド・ビジネス・クラブ

 そして、ザイガーらが開いているのが「シーランド・ビジネス・クラブ」です。シーランドタックスヘイブンなどとして活用することなどまともそうに見えることから、「Vril Technology」の販売や意見交換、あるいは世界経済や政治への意見交換などが行われる会員制クラブとされています。会員の殆どはライヒ市民運動家で、急進的な右翼・反ユダヤ主義的な意見でクラブは満ちているとされます。だいたい水素水がまともに見える超トンデモ科学技術を売っているクラブの会員がまともなはずがありません。

ザイガー率いる亡命政府とは何なのか

 もはや、シーランド亡命政府とは、シーランド亡命政府ではなく、よくわからないネオナチ老人の集まりといったほうが正しいかもしれません。ライヒ市民運動の支持者は主に貧しい中高年ドイツ人だとされています。シーランド亡命政府のサイトがいまいち意味不明なのは、言語の壁でもなんでもなく、書いている人らがまともじゃないからです。陰謀論者の類です。地図に載らない国botから記事を消そうか真剣に検討しています。シーランドの大地?に実際に足を踏み入れ、クーデターを起こしたアーベンバッハと対照的に、名前だけシーランドを使い、よくわからないことをしているネオナチザイガーには失望しかありません。

アーベンバッハは何をしていたのか?

 では、張本人アーベンバッハは何をしていたのでしょうか?アーベンバッハはまともな人でしょうか?それについても興味深い記事がありました。

パナマ文書が明かす真実

 パナマ文書はドイツの地方紙「南ドイツ新聞」率いるジャーナリストチームが2016年に公開した、みんな知ってるあのパナマ文書です。このパナマ文書に、アーベンバッハの名前が載っているというのです。南ドイツ新聞が、シーランド亡命政府とアーベンバッハについてパナマ文書を含めて興味深い記事を書いています。 panamapapers.sueddeutsche.de  この記事によると、アーベンバッハはチェコ人のトレジャーハンター、ヘルムート・ゲーゼル(Helmut Gaensel)とともに事業を行っていたというのです。ゲーゼルはチェコではそこそこ有名な「琥珀の間」探しのトレジャーハンターです。同時に事業家としての側面も持っているようです。
 南ドイツ新聞の報道とパナマ文書によれば、

  • アーベンバッハは何らかの手段によって、亡命後にいくらかの資産を築いていた。(逮捕されていたことと関係があるかもしれません。)
  • 1995年に2人は「Sealand Trade Development Authority Ltd.」をパナマに創立した。
  • 同時に、2人はスロベニアに銀行口座を作り、約1200万ドイツマルク(600万ユーロ)を預けた。
  • 不審に思ったスロベニア当局はこの口座を1997年にマネー・ロンダリングの疑いで没収した。
  • アーベンバッハはこれを不服として裁判を起こす。
  • 8年間の法的闘争を経て、スロベニア最高裁は2005年に、アーベンバッハの主張を認め、お金を返す判決を出す。
  • 2010年にアーベンバッハは「お金に長い間アクセスできなかった損害」をスロベニア当局に訴える訴訟を起こすも、負ける。
  • 亡命後、生涯をベルギーで過ごしたアーベンバッハ、2015年に亡くなる。享年80歳。
  • ゲーゼルは南ドイツ新聞の取材に対して、「口座をアーベンバッハからもらったこと」「現在約700万ユーロ(約8000万円)の資金がある。」と2016年に述べている。

ということが明らかにされています。1995年以降のアーベンバッハの動きについては、ヨーロッパでは有名だったのでしょうか....。アーベンバッハは2015年に80歳で亡くなっていました。(ちなみに、シーランド創始者、ロイ・ベーツは2013年没。享年91歳。)資金を集めた方法はわかっていませんが、多額の資金を巡って、スロベニア当局と戦っていたのです。

ヘルムート・ゲーゼルという男

f:id:two_headed_duck:20200219000416p:plain
ヘルムート・ゲーゼル
 ゲーゼルはチェコのそこそこ有名なトレジャーハンターです。ホームページが有りました。 www.helmutgaensel.com  1934年生まれのチェコ人で、若い頃に鉱夫として働いていたようです。その後チェコスロバキアで兵役につきます。兵役の後、チェコスロバキア当局のスパイになり、東西を往復する生活を送っていたようです。1964年あたりから、「琥珀の間」を始めとする財宝の情報を集め、宝探しを始めています。1968年にはブラジルの金鉱山の開発を始め、「Gaensel Gold Mines.」社を設立。1977年にはCIAからの仕事を受け、大きな成果を残したようです。翌年、1978年にアメリカへと渡り、アメリカや南米の鉱山を経営するようになりました。そして、1990年に彼はチェコに戻り、宝探しを再開した・・・。とHPには書かれています。
 1990年にチェコに戻ったというのは、アーベンバッハとともにビジネスを始めた時期と一致します。また、アーベンバッハが元来ダイアモンド取引商であったことを考えると両者は似ているかもしれません。ゲーゼルもまた優れたビジネスマンと言えそうです。

ザイガーとの共通点

 共通点を挙げるなら、ともに宝探しをしている点でしょう。ゲーゼルも「琥珀の間」やナチスの超科学兵器が地面の下にあると信じています。しかし、何も見つかっていないのですが。ただ、偏見ですが、ゲーゼルはザイガーのような頭のおかしい人ではないと思われます。反ユダヤ主義の主張をサイトでたれ流す人でもありません。まともな人に見えてきたぞ。でも元スパイという点は怪しいけど。(南ドイツ新聞の記事には元スパイであることは、法廷で本人が証言しているとのこと。多分本当。)

ゲーゼルにも怪しい話がある。

 アーベンバッハとともにパナマフロント企業を立てていた時点で十分怪しいのですが、さらに怪しさが増す事実があります。ゲーゼルは2004年「市民連邦民主党(OFD)」という泡沫政党から欧州議会選挙に立候補しています。欧州議会選挙は名簿順の比例代表形式で、ゲーゼルは2番です。問題は、1番の党首ヴィクトル・コジェニー(Viktor Kožený)です。英語版Wikipediaには悪い話がたくさん書かれています。パナマを中心にマネーロンダリングや金融詐欺を何度も行い、何度も指名手配、服役しているかなりの金融犯罪者です。
www.ceskenoviny.cz 2004年の市民連邦民主党の紹介記事。写真がコジェニー。
 ゲーゼルもまたパナマフロント企業を運営していたわけですし、アーベンバッハはマネーロンダリングの嫌疑がかけられた人物です。汚いお金の流れの匂いがプンプンする人脈と言えます。
 ゲーゼルは今でも世界中の企業の経営者のようです。2017年には、事業が失敗したことが報道されていました。シーランド名義の大金がどうなったかについては謎です。

謎深き亡命政府

 シーランド亡命政府は日本ではまれに言及されますが、その実態は意味不明なウェブサイトと言語の壁のせいでよくわかっていませんでした。今回少し時間をかけて、インターネットで深く調べてみるとこのような興味深い事実を知ることができました。
 ザイガー率いる亡命政府はネオナチ陰謀論者集団であること。アーベンバッハがパナマ文書に載っていることなど、亡命政府の闇は思っているよりも遥かに深そうです。もう僕は調べる気力がないので誰か調べてください。
 インターネットとGoogle翻訳を駆使してまとめた内容ですので間違いも多いかと思われます。「ネット de 真実」ですのであまり過信しないでくださいね。ここまで読んでくださりありがとうございます。

参考URL

www.principality-of-sealand.ch web.archive.org en.wikipedia.org de.wikipedia.org de.wikipedia.org taz.de web.archive.org panamapapers.sueddeutsche.de offshoreleaks.icij.org www.helmutgaensel.com www.ceskenoviny.cz zpravy.aktualne.cz

https://www.zefix.ch/en/search/entity/list/firm/465141

なぜCoinhive事件でプログラマが怒っているかを一般向けに解説したい。

 Coinhive事件の二審の判決が出た。一審の横浜地裁が無罪判決を出したのに対して、東京高裁は有罪判決。非常に残念な判決だった。事件が起こってからすでに1年半以上経っているが、事態は一向に良い方向に向かっていないと感じている。ネット上のプログラマたちは怒りの声をここ数年上げ続けているにもかかわらず、だ。
 しかし、一般の多くの人にとっては、Coinhive事件はあまたの新聞記事の1つかもしれない。その記事を読んだとしてもなぜプログラマが怒っているかわからないかもしれない。少しでもCoinhive事件に関して戦っている人の応援がしたい。そこで、一般の人のために「なぜハッカーが怒っているのか」をQ&A形式で解説したい。 と思う。
(この記事の著者は専門家ではないので色々と誤りがあると思われますが、お許し願います。)

Q&A

Q Coinhive事件って?

A 自分のWebサイトに、利用者に「Coinhiveを使ってます」と書かずにCoinhiveを設置した人たちが一斉に「ウイルス作成罪」で全国で検挙された事件。ほとんどは罰金数十万円を求刑された。

Q 裁判やってるの?

A 日本の司法制度では、軽い罪であれば課された罰金を払うだけで裁判なしで司法手続きを終わらせられるため、多くの検挙者は裁判を起こさなかった。(裁判には莫大な費用や時間がかかる。罰金を払ってしまうほうがお財布に優しい。)しかし、「これはおかしい」と思う人が勇敢にも裁判を起こして戦っている。一審では無罪判決。検察の控訴の後の二審では有罪となった。現在は上告を検討しているそうだ。

Q Coinhiveって何?勝手に仮想通貨を採掘したって聞いたけど...?

A Coinhiveは「現在の広告の代わりとして、広告を表示するのではなく、仮想通貨をWebサイト閲覧者のパソコン/スマホで採掘して、サイト管理者に収益をもたらす」サービスの名前。現在は収益性の問題からサービスは公開停止している。「Coinhiveを使ってます」と書かずにCoinhiveを置いたのは確かに「勝手に仮想通貨を採掘」していることになる。

Q それは普通に悪いことじゃん。捕まって当たり前でしょ。なんでプログラマは怒るの?

A 主に2つの理由がある。1つ目は「それは悪いことかは置いておいて、Coinhiveはウイルスではないので、『ウイルス作成罪』で捕まるのはおかしい。」という意見。これは事件に怒っている人に共通する理由と言える。2つ目は「そもそも悪いことではないだろう。」という意見。2つ目は怒っているプログラマでも意見が分かれる。

Q「ウイルス作成罪」って?

A 正式には「不正指令電磁的記録に関する罪」という。ウイルスを作ること、あるいはウイルスを使う(配る)ことを取り締まる法律。ウイルスにはいろんな定義があるが、法律には、

「人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録」

とあり、簡単にすると...?

「俺らがスマホとかパソコン使うときに、俺らがやりたいことを邪魔する悪いソフト=ウイルス」

って感じになる。つまり、PCにあっていつでも見れると思っていた写真を勝手に暗号化して読めなくしてしまうランサムウェアはもちろんウイルスになる。しかしこの定義だと、文書をワープロで作っているときに邪魔をしてくる「ソフトウェア更新のご案内」とか、スマホ音ゲーをやっているときに通知を送ってきて邪魔してきたアプリなんかもウイルスになってしまう。法律には明確な定義がなく、もとから「何でもかんでもウイルス扱いされてしまうのではないか」という法律の問題点が指摘されていた。
 重要なのは「ユーザーの意図しない行為をするシステム」であるかどうかとされている。

Q 仮想通貨を採掘することは、サイトを見てる人にとって、意図しない行為だし、邪魔な行為じゃないの?

A サイトを見てる人が意図していることは、そのサイトに書かれた内容を読むことだと言える。だから、それを邪魔するようなものは確かにウイルスかもしれない。仮想通貨を採掘することは、実は「パソコンやスマホにめちゃくちゃ難しい数学の問題を解かせること」と言い換えることができる。(記事末尾参照) だから、仮想通貨を採掘するためにはコンピュータに頭を使わせる行為なので、コンピュータが本来行わなければならない「サイトを見せる行為」に頭を働かせられなくなる可能性がある。(サイトを見せるためにもいろんな計算問題や、絵や文字をかくという美術の問題を解かなくてはいけない。)人間のようにコンピュータもいろんなことを同時にやるとうまくいかない。しかし、コンピュータが人間と違うのは、同時に物事をやるときに、どれにどの割合で頭を使うか正確に決められる。Coinhiveでは採掘のためにコンピュータがどれぐらいまで頭を使っていいかを指定することができた。裁判をしていた人は、サイトを見ることや、他のソフトをサイトを見ながら使うことにはほとんど影響しないように設定していた。
 さらに、「ユーザーの意図しない行為」であったかどうかについても、このように考えるとそうではないと考えられる。Coinhiveは従来のネット広告の代わりとして開発されたが、我々はネットでWebサイトを見るとき、「広告を見ることを意図しているだろうか?」Youtubeでヒカキンの動画を見るときに、動画広告を見たいと思っているだろうか?答えは明らかに違うはずである。ネットには邪魔な広告がたくさんあるがこれらも明らかに意図しない行為である。さらに、Coinhiveは、サイトを見てる人のコンピュータに計算をさせてお金を稼ぐ仕組みだが、ネット広告もサイトを見てる人のコンピュータに、広告を表示するために絵や文字をかかせて、お金を稼いでいる。両者に大きな違いを見出すことはできないのである。Coinhiveはネット広告の一種であると考えるべきで、(ネット広告は明らかにウイルスでないから)ウイルスには当たらない。と多くのプログラマは考えているのだ。また中には、Coinhiveは広告と同じだから悪いことではないと考えるプログラマもいる。それはこういう理屈でなのだ。

Q でもやっぱり勝手に採掘するのは悪そうなんだけど?

A 採掘とは数学の問題を解くことで、それ以外は特に何もしない。パソコンやスマホを壊したり、個人情報を抜き取ったり、あなたのお金を盗むような悪いことは一切していない。勝手に採掘といっても、あなたのコンピュータに貯蔵されていた金塊を勝手に掘り出しているわけではない。安心してもらいたい。

Q でも、勝手に仮想通貨を採掘されることは私が意図したことじゃないよ?広告はネットにいつも出ているし、広告が出るのは仕方ないことだと思っているから意図していることだよ?

A まず、意図というものは個人個人で異なる。そこで「社会通念上」という前提のもとで法律の話は進めなくてはいけない。たしかに、ネット広告のように長い歴史をもつものなら、「仕方ないよね」という意図が社会で一般化するだろう。しかし、Coinhiveは今までになかった新しい発明であり、「良いもの」「悪いもの」「仕方ないもの」といった社会での認識は形成されていない。新しいものはよく人々の思い込みとは違うことを実現する。最初にスマートフォンが出たとき、携帯なのにボタンがついていないのは「意図に反したデザイン」だったはずだし、最初に動画広告ができたときは、それを見た人はさぞ驚いたはずである。(僕もそうだった)今までの人々が知らない発明は、みんな「そんな事考えなかった」という反意図性を持っている。もし、それが「意図に反する」から「ウイルス」とされてしまうと、コンピュータに関わる分野では、新しい技術はすべてウイルスとなってしまうことになる。

まとめると

プログラマが怒っているのは、

  • Coinhiveと広告は同じものなのに片方だけウイルスはおかしい。
  • Coinhiveは別に悪いことをしているわけでもない。そこらの「ウイルス」とは全然異なっている。
  • 新しい技術はみんなの知らないものなのに、それを「人々の意図に反するもの=ウイルス」というのはひどい。

ということ。みなさんに伝わったでしょうか...? おかしい。と怒っていただけたら嬉しいです。

これを読んで怒った人のできること。

  • このことをみんなに広めましょう。怒っている人を増やせばそれが「社会通念」になります。
  • 控訴された後の裁判費用などは寄付で集められめられました。寄付ができるかもしれません。

(興味がある人向け)

Q なんで採掘は難しい数学の問題を解くことなの?

A 仮想通貨とキャッシュレス決済はなにが違うでしょうか?それは「中央なき分散型システム」である点です。例えばPayPayなら、それぞれのユーザーのPayPay残高はすべて、PayPayの中央サーバで管理されています。中央サーバが「AさんはX円」「BさんはY円」「CさんはZ円」というふうに記憶しています。AさんがBさんにお金を送ったら、管理しているデータを書き換えることで対応します。対して、仮想通貨はそれぞれの残高はそれぞれのユーザーが管理します。Aさんが「私はXコイン持っています」といい、Bさんが、Cさんが、というわけです。AさんがBさんにコインを送ったら、それそれがデータを書き換えて対応しています。
 しかし、この方法だと、Aさんがお金を送ったのに自分の残高を書き換えない、といった不正が可能になってしまいます。というか、自分で管理しているんですから、いくらでも書き換えられるわけです。そこで、不正防止のため、仮想通貨を使う人はすべて正確な取引記録を持つことになっています。取引記録はコインが初めて作られたときから、いままでのありとあらゆる人の間の取引の中で作られており、一本のひものように、現在から最初までたどることができます。改ざんするためには、ひもを切って、切ったところに新しい紐をまるで結んでいないかのようにつけ、さらにもとの長さまで取引記録のひもを作り直さなくてはいけません。これは現実的に不可能とされています。このような仕組みで仮想通貨は不正を防止しています。
 しかし、このひもを作るためにはたくさんの計算が必要です。誰が誰と取引をして、というデータをまとめるには誰かがたくさんの計算をしなくてはいけません。これを喜んでやってくれる人はいないので、やってくれた人に仮想通貨を配る仕組みがあるのです。これを採掘とよんでいます。つまり、採掘は別に掘っているわけでなく、バイトをして賃金をもらっている感覚に近いです。
 このような仕組みはブロックチェーンと呼ばれています。分散型台帳技術ともいわれます。この呼び方のがわかりやすくて好きですね。