ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

ハッシュ関数について(後編? + SHA-256を実装してみる)

中身に入る前に...

グループワークとしてリレーブログを続けていたら、セキュリティキャンプフォーラム2022で発表させていただけることになりました

www.ipa.go.jp

他の内容もおもしろそう2

こんな機会はなかなかないので、楽しんできたいと思います〜


例によってリレーブログの時間です*1!前の僕の記事はこれ、前回の方のブログはこちらになります。

potaxyz.hatenablog.jp

bigdrea6.hatenablog.com

今回のテーマはハッシュ、ということでハッシュ関数の1つであるSHA256を実装してみようかなと思います。

※色々あって記事の内容が前の方と被ってしまいましたが、書いてしまったのでせっかくなので投稿します

ハッシュ関数の概要

ハッシュ関数とは

ハッシュ関数とは、任意の長さの入力データ(メッセージ)を一定の手順で計算し、あらかじめ決められた固定長の出力(ハッシュ値)を得る関数です。

とくに、セキュリティのために使われるのは一方向ハッシュ関数とか、暗号学的ハッシュ関数とか言われて、(条件がゆるいものから厳しいものの順に)次の3つの暗号学的性質を持ちます。

  • 衝突困難性(衝突発見困難性):同じ出力値を生成するような2つの入力値を発見することが困難であること。すなわち、H(m1)=H(m2)となるような異なるメッセージm1とm2を探すことが困難であること。
  • 第2原像計算困難性:ある入力値と同じハッシュ値となるような別の入力を求めることが困難であること。すなわち、m1があたえられたときH(m1)=H(m2)となるようなm2(ただしm1とは異なる)を探すのが困難であること。
  • 原像計算困難性(一方向性):出力値から入力値を発見することが困難であること。すなわち、あるハッシュ値hが与えられた時、h=H(m)をみたす任意のメッセージmを探すことが困難であること。

ちなみに、ハッシュってのは、ハッシュドポテトとかのハッシュで、切り刻んでごちゃごちゃにして混ぜるみたいな意味です。

利用例

ハッシュ関数は、

  • パスワード認証
    • 平文パスワードではなく、平文のハッシュ値をシステムに保存しておき、ログインするときには入力されるたびにハッシュ値を計算してシステム内のハッシュ値と比較する)
  • ワンタイムパスワードの生成
    • S/Key方式
  • 改竄検知
  • デジタル署名
    • 送信者から送るデータDとする。受信者は、データDを受け取り、ハッシュ値[X]を計算する。また、送信者から「署名」として、暗号化されたDのハッシュ値が送られてくる。これを受信者側で復号する[Y]。XとYが等しければ署名の検証に成功したことになる

などに利用されています。

上で述べた性質から、めっっちゃ長いデータでもハッシュ関数を通してハッシュ値を得れば、短いデータにしてやることができます。大きな本体のデータそのものを扱って確認するよりも、小さい値を確認するだけで正真性(改竄などがされていないこと)を確かめることができます。

種類

ハッシュ関数にはMD5SHA-1、SHA-256など、色々な種類があります。MD5SHA-1はすでに衝突困難性が破られているため、使用は非推奨とされていますが、セキュリティが必要とされていないところでは今でも使うとかなんとかどこかで見たことがある気がします(うろ覚え)。

SHA-256

ハッシュ関数について簡単にまとめたところで、今回はSHA-256をピックアップして実装してみようと思います。

ちなみに、ここで実装するのは自分の理解を深めるという目的あってのことです。セキュリティ的にはここにあるコードを利用することはせず、SHA-256の機能を提供してくれるライブラリ等を使う方がいいです。

なお、SHA-256の簡単なしくみの概要は前回のブログを参照してください。

あと、アニメーションでわかりやすくSHA-256の仕組みを説明してくれるものもあるので、興味があれば見てみるのもいいかも。

github.com

実装

実装にはNISTの論文を参考に、他の実装されている方のものも参考にしつつ、という感じで実装しました。

使用する定数の定義

の、小数点以下32bitが格納されています。

なんでこんな定数が使われているのかはどこにも書いていないので謎です。が、私見と調べてみた感じとして、2つ理由を考えてみました。私は専門家でもなんでもないので、1つの考えとして受け取ってください!真に受けないこと!

  1. 恣意的な数を選んでバックドアを作ったりはしていないということ。
    素数平方根や立方根を用いているというのは、あまり恣意的な感じがしない。他の疑似的にランダムな数字を定数に使用してもよさそうな気がするが、それが確実にランダムであるという保証はどこにもない。他人からはすぐにはわからないが、実際には仕様を定めた人にしかわからないような脆弱性がある定数かもしれない。

  2. 素数平方根や立方根が正規数であることが(未解決だが)予想されているため。
    正規数とは、無限小数表示において数字が一様に分布しており、数字の列が現れる頻度に偏りがないという性質を持つ実数のこと(wikipedia)。素数平方根は正規数であることが予想されており、小数点以下の数字の並びが一様に分布しているとエントロピーが最大になってくれるのでうれしいのかもしれない。

羅列したところであまり意味はないと思うので、雰囲気だけコードを載せます

K = (
    0x428A2F98,
    0x71374491,
    ...,
    0xC67178F2,
) # 実際には64個の数字が格納されている
H = (
    0x6A09E667,
    0xBB67AE85,
    ...,
    0x5BE0CD19,
) # 実際には8個の数字が格納されている

使用する関数の定義

以下に使用する8つの演算を定義しておきます。なお、計算は全て$\bmod\,2^{32}$上で考えるので、それを超えてしまうことのある演算には& 0xFFFFFFFFとして、$\bmod\,2^{32}$をとるのに該当する操作をおこなっています。

def ROTR(x, n):
    return ((x >> n) | (x << (32 - n))) & 0xFFFFFFFF


def SHR(x, n):
    return x >> n


def Ch(x, y, z):
    return (x & y) ^ (~x & z)


def Maj(x, y, z):
    return (x & y) ^ (x & z) ^ (y & z)


def SIGMA0(x):
    return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)


def SIGMA1(x):
    return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)


def sigma0(x):
    return ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)


def sigma1(x):
    return ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)

padding処理

以下のようなフォーマットの512bitsの倍数の下図の赤枠にあたるデータを成形します。lbitsの長さのメッセージMとします。

f:id:potaxyz:20220228234036j:plain

仕様書にはbit単位で書いてありますが、実装にはbyte単位で考えることに注意します。つまり、下のようになります。

f:id:potaxyz:20220228234128j:plain

まず、ハッシュ関数にかけたいメッセージmessageutf-8エンコードしておきます(メッセージのbyte数を正確にはかりたいため)。

メッセージの長さをmessage_lenとしてbyte数で取得しておきます。

$56\leq (l'\,\bmod\, 64)\leq 63$ byteをみたす数 $l'$ になるとハッシュ関数に入れるデータの形に合わなくなってしまう(一番後ろに入れる元のメッセージの長さのbit数を格納できない)ので、その分1ブロック増やします。

一番後ろに元のメッセージ長のbit数を表現する8byteを入れるのですが、message_lenとして得られているのはbyte数なので、3つシフトさせてbit数表現に直しておきます。

最終的に成形して得られるデータは「元のメッセージ+区切りの0x80+0埋め0x00+元のメッセージ長のbit数を表現する8byte」となります(これをあらためてmessageとしてやります)。

今回はこのメッセージのハッシュ値を計算してみましょう。

message = "シャーっと実装するSHA256🐱"
message = message.encode("utf8")

message_len = len(message)
padding_len = 64 - 8 - 1 - message_len % 64
if message_len % 64 > 64 - 8 - 1:
    padding_len += 64
message = (
    message + b"\x80" + b"\x00" * padding_len + struct.pack("!Q", message_len << 3)
)
message_len += 1 + padding_len + 8

本処理

padding処理を行なったデータを64byteずつに分け、先頭からその64byteごとのブロックをハッシュ計算にかけていきます。上で設定していたHというのが初期ハッシュ値というやつで、それと64byteごとのブロックを順次演算させてやります。

while len(message) >= 64:
    message_block = struct.unpack("!16L", message[:64])
    H = sha256_hash_computation(message_block)
    message = message[64:]

本処理は以下のような形になっています。こうやってみると意外と単純?

def sha256_hash_computation(message_block):
    W = [0] * 64

    # 1. Prepare the message schedule, W[t]:
    W[0:16] = message_block
    for t in range(16, 64):
        W[t] = (
            sigma1(W[t - 2]) + W[t - 7] + sigma0(W[t - 15]) + W[t - 16]
        ) & 0xFFFFFFFF  # +はmod 2^32上の演算であることに注意

    # 2. Initialize the eight working variables, a-h with the (i-1)st hash value:
    a, b, c, d, e, f, g, h = H

    # 3.
    for t in range(64):
        T1 = h + SIGMA1(e) + Ch(e, f, g) + K[t] + W[t]
        T2 = SIGMA0(a) + Maj(a, b, c)
        h = g
        g = f
        f = e
        e = (d + T1) & 0xFFFFFFFF
        d = c
        c = b
        b = a
        a = (T1 + T2) & 0xFFFFFFFF

    # 4. Compute the ith intermediate hash value Hi
    return [(x + y) & 0xFFFFFFFF for x, y in zip(H, [a, b, c, d, e, f, g, h])]

結合

最後に、8つの数が入っている配列Hを結合します。

message_digest = b"".join([struct.pack("!L", i) for i in H])

これでbit表示が得られていますが、ハッシュ値の表示として16進数に直しておきます。

message_digest = message_digest.hex()

これでハッシュ値を表示してみると

print(message_digest)
43b682dc606a6321cd51a05268c60f93fe2694473d34650bfb1c093ee560f795

が得られました。他のSHA256を計算してくれるものを使うと同じ値が得られるので、正しい実装ができていそうです。

動かしてみる

google colaboratoryで作ってみました。興味がある人は中のmessageのところとか書き換えて遊んでみよう〜

おわりに

ハッシュ関数、特にSHA-256には詳しくなれた気がします!

次回はこちらです。

参考文献

[1] NISTの論文

[2] Software Design 2022年3月号|技術評論社

[3] 『暗号技術入門 第3版 秘密の国のアリス』

[4] マスタリングTCP/IP 情報セキュリティ編 | Ohmsha

これまでのリレーブログ記事まとめ

ここにリレーブログ記事の履歴を載せておきます

*1:seccampのグループワークから生まれた企画。リレーブログのルール:前の人がが次の人のテーマを決める

京都十六社朱印めぐり2022

2日かけて御朱印を集めてみた。きっかけは忘れたけど熊野神社かどこかに幟旗たってたのを見かけたからだと思う。御朱印集めたことなかったから集めてみようかなーと思ったのと、自転車を新しくしたので街中走れるしいいじゃん、ってことでやることにした。

www.kyoto-16sha.jp

一番初めの神社の御朱印おしてもらえるところに十六社朱印巡りやりたいんですけど〜みたいなこと言うと、紙袋と共に16社の場所とかご利益が書いてあるチラシと、これ専用の朱印帳がもらえる。各神社の御朱印料も300円と統一されていてやりやすいと思う。

紙袋

チラシ(無くしたので代わりに市比賣神社に貼ってあったもの。これが表裏で1枚になってるものがもらえる)

f:id:potaxyz:20220216231245j:plain
チラシ

以下巡った記録 ちなみにswarmのチェックインは全て御朱印をもらったあとに行なった

本当は2/13-15で3日に分ける予定だったけど14日は起床に失敗したので13日に3つ、15日に残りを回ることになった。

2/13

天気は雨だったので自転車で行くには遠くて行きづらいところを狙おうということでとりあえず長岡天満宮から開始した。家を出るのも14時ごろとかなり遅かった。徒歩と市バスと阪急を利用。

1. 長岡天満宮

2/13 15:20頃訪問

16社の中では最も端に位置していると思う

大きい神社 八条が池という大きい池もある 本殿は平安神宮の社殿を持ってきてるとかなんとか

裏には梅林があったりした

2. 西院春日神

2/13 16:20頃訪問

きれいな神社 境内は撮影禁止っぽい?(少なくとも社殿は撮影禁止だった)

この神社のホームページに厄除けをする意味とは、みたいなことが書いてあってへえ〜となる

3. 吉祥院天満宮

2/13 16:50頃訪問

横に公園がくっついていて街に溶け込んでいる感があった。

他の神社はどっかで名前知ってたけどここだけ初めて聞いたな...となった

16個中2個が天満宮だけど菅公聖蹟二十五拝とかいうやつに入っているとかなんとか

2/15

朝9:30頃に白川通今出川を出発。この日は自転車で走り回った。どの神社も一応駐輪できる感じにはなっていそう。

4. 御靈神社

2/15 10:00頃訪問

上御霊神社ともよばれていて下御霊神社も存在する。応仁の乱はこのあたりから始まった

お腹壊れてたのでトイレに救われた

5. 今宮神社

2/15 10:30頃訪問

バラエティ豊か(?)な境内で楽しい

参道のあぶり餅が名物なんだけど食べたことないんだよな...

やすらい祭りが京都三大奇祭りの1つだったりする

東門のあたりの交差点がちょっとよくわからない形をしていて入りづらかった

6. 敷地神社

2/15 11:00頃訪問

f:id:potaxyz:20220216234321j:plain
境内

西大路通金閣寺から下っているとデカい鳥居が通りに面していてここか!となった

本殿の横に摂社として六勝神社が並んでいる(けっこうデカい、必勝祈願など)

神具庫が休憩所にされている コンクリートかなんかで作られてて若干浮いてる気がする

トイレがきれい

7. 六孫王神社

2/15 12:30頃訪問

昼食を食べてから一気に八条通まで南下

参道に六孫王会館とかいうとこがありなんかワイワイやってた

池に鯉が泳いでてそこに橋がかかっていて、それを恋の架け橋とかいって縁結びの聖地にしようとしてるとかなんとか(って境内の新聞かなんかに書いてあった記憶があったけど、調べたらけっこうそういう話書いてあって有名なんやなって思った)

誕生水とかいういい水が沸いてるらしい

f:id:potaxyz:20220216235051j:plain
なんかみたことある和歌だなあと思った

8. 御香宮神社

2/15 13:20頃訪問

かなり南下して丹波橋のあたりまできた

良い水らしい 飲んでないけど

ペットボトルで水汲んでる人も見かけた

(7.8.と水に縁のある神社が並んでますね)

9. 藤森神社

2/15 14:00頃訪問

競馬やる人はここ行って勝てるように祈ってこればいいと思う

クッソ狭い鳥羽街道を北上して次に向かったが、その間に伏見稲荷とか東福寺を通過した

f:id:potaxyz:20220217000935j:plain
伏見稲荷通過記念

10. 新熊野神社

2/15 14:30頃訪問

近くに今熊野観音寺があって勝手にそっちを想像してたら違った(よく考えたらあっちはお寺だね)

裏に熊野古道を模した京の熊野古道なるものがあって、そこ歩けば熊野三山御利益巡りしたのと同じご利益があるみたいなこと書いてあったと思うんだけど、そんな...となった

ここで足利義満観阿弥世阿弥の能を見たことで観阿弥世阿弥は躍進したらしい

京都三熊野神社の1つで、紀州熊野本宮大社に対応する

11. 豊国神社

2/15 14:50頃訪問

クソデカ正面通とクソデカ大和大路通の交わるところに鳥居がある

昔撮った写真

12. 市比賣神社

2/15 15:10頃訪問

女人守護の神社なので僕はお呼びでない感じがあった(参拝客は女性しかいなかった)

が、お守り売ってるところ(御朱印いただいたところ)は宮司さんか分からないが男性が対応していた

河原町五条あたり、河原町通りの横入ったとこにあってこんなところに...となった

13. 粟田神社

2/15 15:30頃訪問

三条通のところに鳥居があるがそれより奥にも鳥居がある そこに駐輪してよさそうな場所がある

石段がちょっと長い、それだけ上がるので境内からの眺めは良い

京都の東の出入口(粟田口といわれている)にあって旅行安全の神だったりする

今年もいい旅行がしたいと願っておいた

14. 熊野神社

2/15 15:50頃訪問

京大の近く東山丸太町にあるのでよく通過はしていたが実際境内に入ったことはなかったという

八ツ橋発祥の地らしい(なお横に西尾八ツ橋の店があり向かいには聖護院八ツ橋の店がある)

京都三熊野神社の1つで、紀州の熊野速玉大社に対応する

15. 熊野若王子神社

2/15 16:20頃訪問

哲学の道の南端にある 散歩でよく通る

京都三熊野神社の1つで、紀州熊野那智大社に対応する

16. 岡崎神社

2/15 16:30頃訪問

うさぎがいっぱいいてかわいい

個人的に好きなので一番最後にここを参拝することにした

おわりに

ということでなんとか回ることができた

十六社参拝記念品です

チャリの経路

御朱印です

僕は2日に分けたけど、検索かけてみた感じ頑張れば1日で全部回れるらしい

いい運動にもなったし、行ったことないところにも行けたし個人的には楽しかったです

グラフ作成の備忘録

思い出したら追記する。個人的なメモ

より良いのがあったら教えてください

matplotlib

プロット表示設定

import matplotlib as mpl
mpl.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.size'] = 16
mpl.rcParams['xtick.direction'] = 'in'
mpl.rcParams['ytick.direction'] = 'in'
mpl.rcParams['xtick.top'] = True
mpl.rcParams['ytick.right'] = True
mpl.rcParams['agg.path.chunksize'] = 100000
  • フォントをサンセリフ体にする(個人的な好み)
  • フォントサイズを16にする(デフォルトは12)
  • 目盛り線の向きを内向きにする(x軸方向)
  • 目盛り線の向きを内向きにする(y軸方向)
  • 目盛り線を書く(上側)
  • 目盛り線を書く(右側)
  • 大きなデータでplt.savefigした時にエラー吐かないようにするやつ

フォーマッタ

普段google colaboratoryを使っているので、それで使えるフォーマッタ。マジックコマンドを作ってくださっている方がいた。

note.com

google colaboratoryでデフォルトでは使えないフォントを使う

google drive内にfontというフォルダを作り、そこにフォントを入れておく。

フォルダ構成の例:

/content/drive/MyDrive/font/
└── Tsukushi A Round Gothic
    └── TsukushiAMaruGothic.ttc

その後、以下を実行

from google.colab import drive
drive.mount("/content/drive")

!cp -a "drive/MyDrive/font/" "/usr/share/fonts/"

!rm -r /root/.cache/matplotlib/

その後ランタイムを再起動する

プロット例1

f:id:potaxyz:20220212205154p:plain

fig, ax = plt.subplots(figsize=(8, 6))
ax.grid(axis="both", which="major", linestyle="--")
ax.set_xlabel("Energy [MeV]")
ax.set_ylabel("Events [count/s/MeV]")
ax.set_xlim([0.2, 6])
ax.set_yscale("log")
ax.plot(x, y)
plt.savefig("sample.png",dpi=300)

一番スタンダードな図?

一部だけ設定を変える

そのセルに表示される図表だけ設定を変えたい場合

設定をrc_contextに入れておく

COLOR_DARK = "#455a64"
COLOR_LIGHT = "#ffffff"
rc_context={
    "font.family":"Tsukushi A Round Gothic",
    "font.size":18,
    "axes.facecolor":"none",
    "legend.facecolor":COLOR_DARK,
    "text.color":COLOR_LIGHT,
    "axes.labelcolor":COLOR_LIGHT,
    "axes.edgecolor":COLOR_LIGHT,
    "xtick.color":COLOR_LIGHT,
    "ytick.color":COLOR_LIGHT
}
with plt.rc_context(rc_context):
    # 普通にグラフ作る

プロット例2

上を利用してプロット。

f:id:potaxyz:20220212212601p:plain

with plt.rc_context(rc_context):
    fig, ax = plt.subplots(figsize=(10, 8))
    for id in sorted(dict_dataframes.keys()):
        df = dict_dataframes[id]
        ax.plot(df["time_elapsed"],
                df["fit_residual"],
                label="ID {}".format(id))
    ax.grid(axis="both", which="major", linestyle="--")
    ax.minorticks_on()
    ax.set_xlabel("Time[min]")
    ax.set_ylabel("Pressure (baseline subtracted)[hPa]")
    ax.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0)
    ax.set_xlim(-200, 200)
    ax.set_ylim(-0.6, 2.1)
    plt.savefig("pressure_subtracted.png",
                facecolor="#222222",
                bbox_inches="tight",
                dpi=300)
    #スライドに貼る時はこっちを使う
    #plt.savefig("pressure_subtracted.svg",transparent=True,bbox_inches="tight")
  • minorticks_on()で補助目盛りがつく

プロット例3

f:id:potaxyz:20220212213421p:plain

with plt.rc_context(rc_context):
    id = 13
    df = dict_dataframes[id]
    fig, ax = plt.subplots(figsize=(10, 8))
    ax.minorticks_on()
    ax.grid(axis="both", which="major", linestyle="--", color=COLOR_LIGHT)
    ax.grid(axis="both", which="minor", linestyle="--")
    ax.tick_params(axis="both", which="major", direction="in", length=5)
    ax.tick_params(axis="both", which="minor", direction="in", length=3)
    ax.plot(df["time_elapsed"],
            df["fit_residual"],
            marker="o",
            ls="-",
            color=COLOR_LIGHT,
            markerfacecolor="r",
            markersize=12,
            label="ID {} (baseline subtracted)".format(id))
    ax.set_xlim(-200, 200)
    ax.set_ylim(-0.6, 2.1)
    ax.set_ylabel("Pressure (baseline subtracted)[hPa]")
    ax.set_xlabel("Time[min]")
    ax.legend()
    plt.savefig("13.png",
                facecolor="#222222",
                bbox_inches="tight",
                dpi=300)
    #スライドに貼る時はこっちを使う
    #plt.savefig("13.svg",transparent=True,bbox_inches="tight")

スライドの例

f:id:potaxyz:20220212211054p:plain
スライドの例

最近はMarpというmarkdownでスライド作れるやつを使ってスライドを作成している。テーマはinvert。フォントはmacOSに標準搭載されている筑紫a丸ゴシックを使用している。(かわいいフォントで好き)

プロット例4

f:id:potaxyz:20220212215503p:plain

# from datetime import datetime, timedelta, timezone
# from matplotlib import dates as mdates

cmap = plt.get_cmap("tab10")
baseline = datetime(2022, 1, 15, 20, 40)
w = timedelta(seconds=12000)

fig = plt.figure(figsize=(24, 12))
grid = plt.GridSpec(2, 3, hspace=0)
axs = [fig.add_subplot(grid[i // 3, i % 3]) for i in range(6)]
for i in range(6):
    axs[i].plot(x, y[i], c=cmap(i))
    axs[i].set_ylabel("area{}[cps]".format(i + 1))
    axs[i].set_xlim(baseline - w, baseline + w)
    if i // 3 == 0:
        axs[i].tick_params(labelbottom=False)
    axs[i].xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
    axs[i].axvline(baseline, c="red", linestyle="--")
    axs[i].grid(axis="both", which="major", linestyle="--")
plt.savefig("areas.png",bbox_inches="tight",dpi=300)
#plt.savefig("areas.svg",transparent=True,bbox_inches="tight")
  • cmapでカラーマップの指定ができる。tab10が通常のカラーマップ。
  • 複数の図を並べるにはGridSpecを使うと楽?hspace,wspaceで図表の間隔を調節
  • tick_params(labelbottom=False)でラベルを消す
  • set_major_formatterで時刻軸のフォーマットを変える

プロット例5

f:id:potaxyz:20220212224716p:plain

# import matplotlib.pyplot as plt
# import matplotlib as mpl
# import seaborn as sns
# import numpy as np
# import pandas as pd

fig = plt.figure(figsize=(24, 10))
grid = plt.GridSpec(10, 2, hspace=0, wspace=0.15)
axLs = [fig.add_subplot(grid[i, 0]) for i in range(10)]
axR = fig.add_subplot(grid[:, 1])
for i in range(10):
    axLs[i].plot(df.iloc[:, i])
    axLs[i].set_ylabel(df.columns[i], labelpad=10)
plt.setp(axLs[9].get_xticklabels(), rotation=45)
sns.heatmap(df.corr(),
            annot=True,
            cmap="coolwarm",
            fmt=".2f",
            annot_kws={"size": 14},
            ax=axR,
            center=0)
axR.set_title("correlation")
plt.savefig("sample.png",dpi=300)
  • ヒートマップはseabornを使うと楽
  • sns.heatmapのaxにfig.add_subplotぶち込めばこうやって並べることができる

pickleの利用

めっちゃデカいデータの処理を中断した状態から再開したりとか、ローカルランタイムで処理しておいたものをgoogle driveにアップロードしておいて後で使う、みたいなことができる。処理後のデータ等をpickleという形式にしておいて後で読み込み、データを使うことができる。

# super_big_dataはなんかクソデカデータ
import pickle
with open("super_big_data.pickle", "rb") as pkl:
    pickle.dump(super_big_data,pkl)
super_big_pickle_file="super_big_data.pickle"
with open(super_big_pickle_file, "rb") as pkl:
    super_big_data = pickle.load(pkl)

プロット例6

f:id:potaxyz:20220212233127p:plain

pickle_file="take_time_to_make_np_array.pickle"
with open(pickle_file, "rb") as pkl:
    zz = pickle.load(pkl)[1:].T[1:].T

fig, ax = plt.subplots(figsize=(12, 8))
x = np.log(np.linspace(0, 70, 700 + 1)[1:])
y = np.log(np.linspace(0, 20, 200 + 1)[1:])
z = np.outer(y, x)
S = np.sort(events[0] * events[1])
mappable = ax.pcolormesh(x, y, zz, cmap="Blues_r")
fig.colorbar(mappable, ax=ax, label="z")
ax.scatter(events[0], events[1], c="red", zorder=99, marker="x")
ct = ax.contour(x, y, z, cmap="hsv", levels=S, zorder=90)
ax.clabel(ct, fontsize=14)
for i in range(len(files_and_errortime)):
    ax.annotate("Event {}".format(i + 1), (events[0][i], events[1][i]),
                c="red",
                zorder=99,
                fontsize=14)
ax.set_xlabel("log x")
ax.plot(x,
        exponent * x + constant,
        c="black",
        lw=5,
        label=r"$\log y={}+{}\log x$".format(round(exponent, 2),
                                             round(constant, 2)))
ax.set_ylabel("log y")
ax.set_xlim([0, 4])
ax.set_ylim([0, 3])
ax.legend(loc="lower left")
#plt.savefig("sample.png",dpi=300)
  • 配列zzを作るのにかなり時間がかかるのでpickleで読み込んでくる
  • ax.pcolormeshでz方向が色になるような感じのグラフが作れる
  • contourのclabelの数字の位置の指定はよくわからなかった

plotly

インタラクティブなグラフを作るライブラリは色々あるけどここではplotlyを取り上げる(使ったことあるのがこれだけなので)。

プロット例1

plotlyを使ってインタラクティブなグラフを表示する例(下のグラフは触ってみると動きます)

# import plotly.offline as po
# import plotly.graph_objects as go
# from plotly.subplots import make_subplots
# po.init_notebook_mode()

fig = make_subplots(rows=2, cols=1)
for id in sorted(dict_dataframes.keys()):
    fig.add_trace(
        go.Scatter(
            x=dict_dataframes[id].index,
            y=dict_dataframes[id]["pressure"],
            mode="lines",
            name="id {}".format(id),
        ), 1, 1)
    fig.add_trace(
        go.Scatter(
            x=dict_dataframes[id].index,
            y=dict_dataframes[id]["fit_residual"],
            mode="lines",
            name="id {} (subtracted)".format(id),
        ), 2, 1)
fig.update_layout(yaxis_title_text="Pressure")
fig.update_layout(yaxis2_title_text="Pressure (Baseline Subtracted)")
fig.update_layout(xaxis2_title_text="Time")
fig.update_layout(width=800, height=800)
fig.update_xaxes(matches="x")
fig.update_xaxes(
    type="date",
    range=[datetime(2022, 1, 15, 17, 30),
           datetime(2022, 1, 16, 0, 0)])
fig.add_vrect(
    x0=datetime(2022, 1, 15, 20, 30),
    x1=datetime(2022, 1, 15, 20, 50),
    fillcolor="lightsalmon",
    opacity=0.3,
    layer="below",
    line_width=0,
)
fig.add_vrect(
    x0=datetime(2022, 1, 15, 20, 50),
    x1=datetime(2022, 1, 15, 21, 40),
    fillcolor="lightgreen",
    opacity=0.3,
    layer="below",
    line_width=0,
)
fig.show(renderer="colab") #colaboratoryで使う時はこれで表示

colaboratoryとか自分のパソコン内でpython実行するだけならそのまま実行できるが、こうやってブログにのっけて公開するときはplotlyのページでSign Upする必要がある。

chart-studio.plotly.com

サインインしてsettings > API Keys、Regenerate Keyをしてapi_keyを取得する。その後下を実行する。

import chart_studio
chart_studio.tools.set_credentials_file(username="xxxxx", api_key="xxxxx")
import chart_studio.plotly as py
py.plot(fig, filename="sample", auto_open=True)

colaboratoryで実行するとリンクが取得できるので、iframeのsrcにぶち込んで貼り付けるといい。

gnuplot

texと親和性の高い図をgnuplotで生成する1

あんまり覚えてないけど実験で使ってたのを引っ張ってきた

set terminal epslatex size 14cm,10cm
set output "graph.eps"
set border lw 2
set xlabel "{$x(t)$}"
set ylabel "{$y(t)$}"
set zlabel "{$z(t)$}"
set ztics 10
set mxtics 2 
set mytics 2
set mztics 2
splot "lorenz_equation.txt" u 2:3:4 w l title "Lorenz equation"
quit

lorenz_equation.txtローレンツ方程式を計算した各点のデータ

こんな感じで作ったgnuplotファイル(拡張子がgp)をgnuplot make_graph.gpかなんかで実行してやるとepsファイルとtexファイルが生成される(graph.epsgraph.tex)。epsファイルが表示させたい曲線とか、texファイルに枠の情報が入ってる。texファイルの方は数字の位置とか気に入らなければ目grepしてやればいいと思う。

個人的にはこっちより下の方を使うことが多いが、点データが多すぎると生成されるtexファイルが重くなってしまうので、そういう時はこっちを使っている。

たまに位置ずれが起きたりするのがあんまり好きじゃないポイントではある。

texと親和性の高い図をgnuplotで生成する2

f:id:potaxyz:20220213002456j:plain

あんまり覚えてないけど実験で使ってたのを引っ張ってきた2

こっちは上と比較してepsファイルを出力せずtexファイルだけ生成するもの。

はじめにmacならターミナルを開いて作業フォルダでgnuplotと打ち込んで起動。その後set term tikz createstyleをする(なぜかパイプで渡せないため)。と、なんかいろいろ3つくらいgnuplot-lua-tikz.texみたいなファイルができる。

set terminal tikz size 8cm,6cm
set output "graph.tex"
set border lw 2
set xlabel "{$t$}"
set ylabel "{$u$}"
set mxtics 4
set mytics 4
#set xrange [0:20]
set yrange [0:10]
plot \
    "09.txt" u 1:2 w l lw 2 title "{$u_0=0.9$}",\
    "10.txt" u 1:2 w l lw 2 title "{$u_0=1.0$}",\
    "11.txt" u 1:2 w l lw 2 title "{$u_0=1.1$}"
quit

各txtファイルは数値計算結果が入っている。こいつを実行してやるとgraph.texが出力される。

メインのtexファイルには\usepackage{gnuplot-lua-tikz}を入れておく。あとはgraph.texを読み込みたいところに\include{graph}すればOK。

他の例

f:id:potaxyz:20220213002154p:plain

これはgnuplotファイルを頑張ると並べて表示できるという例

width=0.22
lms0=0.03
rms0=lms0+width
lms1=rms0+0.02
rms1=lms1+width
lms2=rms1+0.02
rms2=lms2+width
lms3=rms2+0.02
rms3=lms3+width

height=0.3
bms2=0.04
tms2=bms2+height
bms1=tms2+0.03
tms1=bms1+height
bms0=tms1+0.03
tms0=bms0+height

#set terminal postscript enhanced color
#set output "kadai3graph.eps"
#set terminal epslatex size 24cm,18cm
#set output "kadai3graph.eps"
set terminal tikz size 24cm,14cm
set output "kadai3graph.tex"

set border lw 2
#set ylabel "{$x(t)$}"
set clip two
set mytics 4 
#set xrange [0:100]
set xtics 20
set logscale y
#set key left top
unset key
set multiplot

##########0

set title "{$n=100$}"

set lmargin screen lms0
set rmargin screen rms0
set tmargin screen tms0
set bmargin screen bms0

set logscale y
set format x ""
set format y "{$%2.1t\\times 10^{%L}$}"
set ylabel "residue"
set yrange [10**(-5):10**0]

stats "kadai3_100.txt" u 3 name "residue100"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",residue100_mean) tc rgb "red"

plot "kadai3_100.txt" u 1:3 w p pt 2 lt 1 lw 2,\
    residue100_mean lc rgb "red" lw 1 dt 2

unset title

set lmargin screen lms0
set rmargin screen rms0
set tmargin screen tms1
set bmargin screen bms1

set logscale y
set format x ""
set format y "{$%2.1t\\times 10^{%L}$}"
set yrange [10**(-6):10**(-2)]
set ylabel "relative error"

stats "kadai3_100.txt" u 4 name "relativeerror100"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",relativeerror100_mean) tc rgb "red"

plot "kadai3_100.txt" u 1:4 w p pt 3 lt 1 lw 2,\
    relativeerror100_mean lc rgb "red" lw 1 dt 2

set lmargin screen lms0
set rmargin screen rms0
set tmargin screen tms2
set bmargin screen bms2

set logscale y
set format "%g"
#unset format y
set format y "{$%2.1t\\times 10^{%L}$}"
set xlabel "trials"
set ylabel "time[ms]"
set yrange [10**1:10**4.3]
stats "kadai3_100.txt" u 2 name "time100"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",time100_mean) tc rgb "red"

plot "kadai3_100.txt" u 1:2 w p pt 4 lt 1 lw 2,\
    time100_mean lc rgb "red" lw 1 dt 2

##########1

set logscale y
set title "{$n=200$}"
set format ""
unset xlabel
unset ylabel

set lmargin screen lms1
set rmargin screen rms1
set tmargin screen tms0
set bmargin screen bms0
set yrange [10**(-5):10**0]

stats "kadai3_200.txt" u 3 name "residue200"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",residue200_mean) tc rgb "red"

plot "kadai3_200.txt" u 1:3 w p pt 2 lt 2 lw 2,\
    residue200_mean lc rgb "red" lw 1 dt 2

unset title
set logscale y
set lmargin screen lms1
set rmargin screen rms1
set tmargin screen tms1
set bmargin screen bms1

set format ""
set yrange [10**(-6):10**(-2)]

stats "kadai3_200.txt" u 4 name "relativeerror200"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",relativeerror200_mean) tc rgb "red"

plot "kadai3_200.txt" u 1:4 w p pt 3 lt 2 lw 2,\
    relativeerror200_mean lc rgb "red" lw 1 dt 2

set lmargin screen lms1
set rmargin screen rms1
set tmargin screen tms2
set bmargin screen bms2

set logscale y
set format x "%g"
set format y ""
set xlabel "trials"
set yrange [10**1:10**4.3]

stats "kadai3_200.txt" u 2 name "time200"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",time200_mean) tc rgb "red"

plot "kadai3_200.txt" u 1:2 w p pt 4 lt 2 lw 2,\
    time200_mean lc rgb "red" lw 1 dt 2

##########2

set logscale y
set title "{$n=400$}"
set format ""
unset xlabel
unset ylabel

set lmargin screen lms2
set rmargin screen rms2
set tmargin screen tms0
set bmargin screen bms0

set yrange [10**(-5):10**0]

stats "kadai3_400.txt" u 3 name "residue400"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",residue400_mean) tc rgb "red"

plot "kadai3_400.txt" u 1:3 w p pt 2 lt 3 lw 2,\
    residue400_mean lc rgb "red" lw 1 dt 2

unset title
set logscale y
set lmargin screen lms2
set rmargin screen rms2
set tmargin screen tms1
set bmargin screen bms1

set format ""
set yrange [10**(-6):10**(-2)]

stats "kadai3_400.txt" u 4 name "relativeerror400"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",relativeerror400_mean) tc rgb "red"

plot "kadai3_400.txt" u 1:4 w p pt 3 lt 3 lw 2,\
    relativeerror400_mean lc rgb "red" lw 1 dt 2

set lmargin screen lms2
set rmargin screen rms2
set tmargin screen tms2
set bmargin screen bms2

set logscale y
set format x "%g"
set format y ""
set xlabel "trials"
set yrange [10**1:10**4.3]

stats "kadai3_400.txt" u 2 name "time400"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",time400_mean) tc rgb "red"

plot "kadai3_400.txt" u 1:2 w p pt 4 lt 3 lw 2,\
    time400_mean lc rgb "red" lw 1 dt 2

##########
set logscale y
set title "{$n=800$}"
set format ""
unset xlabel
unset ylabel

set lmargin screen lms3
set rmargin screen rms3
set tmargin screen tms0
set bmargin screen bms0

set format ""
set yrange [10**(-5):10**0]

stats "kadai3_800.txt" u 3 name "residue800"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",residue800_mean) tc rgb "red"

plot "kadai3_800.txt" u 1:3 w p pt 2 lt 4 lw 2,\
    residue800_mean lc rgb "red" lw 1 dt 2

unset title
set logscale y
set lmargin screen lms3
set rmargin screen rms3
set tmargin screen tms1
set bmargin screen bms1


set format ""
set yrange [10**(-6):10**(-2)]

stats "kadai3_800.txt" u 4 name "relativeerror800"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",relativeerror800_mean) tc rgb "red"

plot "kadai3_800.txt" u 1:4 w p pt 3 lt 4 lw 2,\
    relativeerror800_mean lc rgb "red" lw 1 dt 2

set lmargin screen lms3
set rmargin screen rms3
set tmargin screen tms2
set bmargin screen bms2

set logscale y
set format x "%g"
set format y ""
set xlabel "trials"
set yrange [10**1:10**4.3]

stats "kadai3_800.txt" u 2 name "time800"
set label 1 at graph 0,0.95 left sprintf("\\tiny Average:%e",time800_mean) tc rgb "red"

plot "kadai3_800.txt" u 1:2 w p pt 4 lt 4 lw 2,\
    time800_mean lc rgb "red" lw 1 dt 2

unset multiplot
quit

長いね

ランサムウェアについて

例によってリレーブログ*1の時間です(1日遅れてすみません)!前の僕の記事はこれ、前回の方のブログはこちらになります。

今回僕に与えられたテーマはランサムウェア。最近では病院のPCが乗っ取られたとかでニュースでたびたび見かける印象。軽くまとめてみます。

ランサムウェアとは

IPAのサイトから引用。

ランサムウェアとは、「Ransom(身代金)」と「Software(ソフトウェア)」を組み合わせた造語です。 感染したパソコンに特定の制限をかけ、その制限の解除と引き換えに金銭を要求する挙動から、このような不正プログラムをランサムウェアと呼んでいます。
(出典:ランサムウェア対策特設ページ - 情報セキュリティ - IPA

説明としては上の通り。というかランサムウェア対策特設ページなんてものがあるんですね。検索するとIPAのもの以外にもいくつかヒットしましたが。

最近の事例 - 病院を中心に

最近ニュースで見たもの2つをピックアップしてみる。

  • 事例1

www.yomiuri.co.jp

  • 事例2

www.yomiuri.co.jp

どちらも患者の基本情報である電子カルテが暗号化されるなどして閲覧できなくなり、データ復旧の見返りとして金銭を要求する脅迫文(外国語)が届いている。電子カルテが被害を受けると同時に、連動する会計システムも使えなくなってしまっている。

なぜ被害を受けてしまったのか

例えばこの記事:

cloud.watch.impress.co.jp

を参考にすると、事例1の方は

  • 脆弱性が確認されているVPNを、パッチを適用せず使用していた
  • 認証方式がパスワード方式だけだった

が原因ではないか、ということが書かれている。

昨今のランサムウェアによる攻撃を鑑みてか、厚生労働省から病院に対してお達しも出ている(PDF)。

【事務連絡】医療機関を標的としたランサムウェアによるサイバー攻撃について(再注意喚起)

また、twitterを眺めていたら以下のようなツイートを見つけた。

そんな管理体制で大丈夫??

ランサムウェアによる攻撃は最近増えているらしい

自分がこれまで意識していなかっただけかもしれないが、なんか最近ランサムウェアの被害がーみたいなのがネット記事になってるのをよく見る気がしている。のだが、実際増えているというデータがあるらしい。

企業・団体等におけるランサムウェア被害として、令和3年上半期に都道府県警察から警察庁に報告のあった件数は61件であり、前年下半期(21件)と比べて大幅に増加した。 (出典:警察庁 - 令和3年上半期におけるサイバー空間をめぐる脅威の情勢等について

また、RaaS(Ransomware as a service)という、ランサムウェアの開発・提供側と、ランサムウェアの拡散側のアフィリエイトに役割を分けて成果報酬を分配するビジネスモデルが登場してしまっているそう。

blog.trendmicro.co.jp

対策

攻撃から守る手段としては、例えばパスワード認証だけではなくて、多要素認証(MFA)を使うことなどが考えられる。多要素認証とは、文字の通り、2つ以上の要素によって行う認証のこと。最近では、twitterやLINEなどにログインしようとしたときに、IDとパスワードを入力した後に、携帯電話のSMSにワンタイムパスワードが送信され、それによって認証する、なんてものもよく見かけるようになったと思う。認証を多要素にすることで、攻撃の確率はガクッと減らすことができる。


ランサムウェアについて、なんとなくまとめてみました。次回はこちらで更新予定です。

*1:seccampのグループワークから生まれた企画。リレーブログのルール:前の人がが次の人のテーマを決める

積分技法など

twitter見てたら数学の記事を書くとどうのこうの...という話題があり、1つだけ書けるネタがあるなあと思ったので書いてみる。

自分が使ってるかどうかは別として知っている積分技法的なものを4つ紹介する。

Schwinger trick

場の量子論とかで使われるらしい積分技法。twitterでたまに見る。Schwinger parametrization - Wikipedia

Schwinger trick
$$ \frac{1}{A^n}=\frac{1}{(n-1)!}\int_0^\infty u^{n-1}e^{-{u}{A}} du $$

特に$n=1$の場合は

$$ \frac{1}{A}=\int_0^\infty e^{-{u}A} du $$

となる。

$A$はなにかしらの関数。

例題
$$ \int_0^\infty \frac{\sin x}{x}dx=\frac{\pi}{2} $$
$$ \begin{align} \int_0^\infty \frac{\sin x}{x}dx &=\mathrm{Im}\int_0^\infty \frac{e^{ix}}{x}dx \\ &=\mathrm{Im}\int_0^\infty \int_0^\infty e^{ix} e^{-ux} dudx \\ &=\mathrm{Im}\int_0^\infty \left[\frac{e^{-(u-i)x}}{-(u-i)}\right]_{x=0}^{x=\infty} du \\ &=\mathrm{Im}\int_0^\infty \frac{1}{u-i} du \\ &=\mathrm{Im}\int_0^\infty \frac{u+i}{u^2+1} du \\ &=\int_0^\infty \frac{1}{u^2+1} du \\ &=[\tan^{-1} u]_{u=0}^{u=\infty} \\ &=\frac{\pi}{2} \end{align} $$ $$ \tag*{$\blacksquare$} $$

Maz identity

ラプラス変換を知ってると楽にできたりするらしい。Laplace transform - Wikipedia

Maz identity
$$ \int_0^\alpha f(t)g(t)dt=\int_0^\alpha\mathcal{L}[f](s)\mathcal{L}^{-1}[g](s)ds $$
例題
$$ \int_0^\infty \frac{\sin x}{x}dx=\frac{\pi}{2} $$
$$ \begin{align} \int_0^\infty \frac{\sin x}{x}dx &=\int_0^\infty \mathcal{L}[\sin x](y)\mathcal{L}^{-1}\left[\frac{1}{x}\right](y) dy\\ &=\int_0^\infty \frac{1}{y^2+1}\cdot 1 dy \\ &=\frac{\pi}{2} \end{align} $$ $$ \tag*{$\blacksquare$} $$

Wick's theorem

こちらも場の量子論で使われたりする技法らしい。名前が正しいのか微妙だが次のリンクにならっておく。integration - reference for multidimensional gaussian integral - Mathematics Stack Exchange

Wick's theorem(の特定の場合) $x\in\mathbb{R}^n$,$A\in\mathbb{R}^{n\times n}$とすると
$$ \sqrt{\frac{\det A}{(2\pi)^n}}\int_{\mathbb{R}^n} x_ix_j\exp(-\frac{1}{2}x^\top Ax) d^nx=\frac{1}{2}(A_{ij}^{-1}+A_{ji}^{-1}) $$
となる。

より一般的な話は上のリンクを読んでもらえばいいと思うが、より一般には次の関係が成り立つらしい(あまり理解できなかったが、$f$を多項式に展開してみるとまあそうかな、という気になる)。

$$ I_J=\sqrt{\frac{\det A}{(2\pi)^n}}\int_{\mathbb{R}^n} \exp(-\frac{1}{2}x^\top Ax+J^\top x)f(x) d^nx $$
と定めると
$$ \begin{align} I_0&=\sqrt{\frac{\det A}{(2\pi)^n}}\int_{\mathbb{R}^n} \exp(-\frac{1}{2}x^\top Ax)f(x) d^nx\\ &=\left.f(\partial_J)\exp(-\frac{1}{2}J^\top A^{-1} J)\right|_{J=0} \end{align} $$
が成り立つ。ただし$A$は上の変形が意味をもつような正方で可逆な行列で、$J\in\mathbb{R}^n$はベクトル。

上の応用と説明を兼ねて平均$0$,分散共分散行列$Σ$の多変数ガウス分布について以下の関係が成り立つことを説明してみる。

例題 $n$次元ベクトル値の確率変数$X\sim \mathcal{N}(0,Σ)$について、$V[X]=E[XX^\top]=Σ$となる。つまり、
$$ \int_{\mathbb{R}^n} \frac{1}{\sqrt{(2\pi)^n\det Σ}}\exp\left(-\frac{1}{2}{x^\top}{Σ^{-1}}{x}\right) xx^\top d^nx=Σ $$
が成り立つ。

まず$Z_J$を以下で定める:

$$ Z_J=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}x^\top Σ^{-1}x+J^\top x\right)dx $$

ここで、$x=y+ΣJ$なる変換を使うと

$$ \begin{align} Z_J&=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}x^\top Σ^{-1}x+J^\top x\right)dx \\ &=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}(y+ΣJ)^\top Σ^{-1} (y+ΣJ)+J^\top (y+ΣJ)\right)dy \\ &=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}y^\top Σ^{-1} y-J^\top y-\frac{1}{2}J^\top ΣJ+J^\top y+J^\top Σ J \right)dy \\ &=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}y^\top Σ^{-1} y+\frac{1}{2}J^\top Σ J\right)dy \\ &=Z_0\exp\left(\frac{1}{2}J^\top Σ J\right) \end{align} $$

となる。さて、これを$J$の第$i,j$成分$J_i,J_j$で微分して$J=0$を代入することを考える。まず上の式の一番目の行を使うと

$$ \begin{align} \left.\frac{\partial}{\partial J_i}\frac{\partial}{\partial J_j}Z_J\right|_{J=0}&=\left.\frac{\partial}{\partial J_i}\frac{\partial}{\partial J_j}\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}x^\top Σ^{-1}x+J^\top x\right)dx\right|_{J=0} \\ &=\left.\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}x^\top Σ^{-1}x+J^\top x\right) x_ix_jdx\right|_{J=0} \\ &=\int_{\mathbb{R}^n}\exp\left(-\frac{1}{2}x^\top Σ^{-1} x\right) x_ix_jdx \end{align} $$

次に一番下の行を使うと、

$$ \begin{align} \left.\frac{\partial}{\partial J_i}\frac{\partial}{\partial J_j}Z_J\right|_{J=0}&=\left.\frac{\partial}{\partial J_i}\frac{\partial}{\partial J_j} Z_0\exp\left(\frac{1}{2}J^\top Σ J\right)\right|_{J=0}\\ &=Z_0\frac{\partial}{\partial J_i}\frac{\partial}{\partial J_j}\left(\frac{1}{2}J^\top ΣJ\right)\\ &=\frac{1}{2}Z_0(Σ_{ij}+Σ_{ji})\\ &=Z_0Σ_{ij} \end{align} $$

となる。ただし2行目について$\exp$を展開した時に$J_i,J_j$で微分して$J=0$を代入した時に残るのは$J$の2次式以下の部分だけであることに注意。 $Z_0=\sqrt{(2 \pi )^{n}\det Σ}$ なので、これら2つを比較すると

$$ \int_{\mathbb{R}^n} \frac{1}{\sqrt{(2\pi)^n\det Σ}}\exp\left(-\frac{1}{2}{x^\top}{Σ^{-1}}{x}\right) x_ix_j d^nx=Σ_{ij} $$

となることがわかる。これをすべての$i,j$について考えることで

$$ \int_{\mathbb{R}^n} \frac{1}{\sqrt{(2\pi)^n\det Σ}}\exp\left(-\frac{1}{2}{x^\top}{Σ^{-1}}{x}\right) xx^\top d^nx=Σ $$

がわかる。 $$ \tag*{$\blacksquare$} $$

確率分布の活用

確率分布やその期待値を利用して、その意味から積分値を求める方法。確率分布の性質を知っていればゴリゴリ計算しなくても確率論的な意味(?)を考えることで計算ができる。高校とかで何かの計算を順列とか場合の数の言葉に焼き直して解くのと似たようなものだと思う。

例題
$$ \int_{-\infty}^\infty |x|e^{-ax^2}dx=\frac{1}{a} $$

この例だと直接計算した方が早いかもしれないが、考え方の例としてこの問題を確率分布を利用して解いてみることにする。

ここで使う確率分布の確率密度関数(の一般形)を並べておく。

* ガウス分布$\mathcal{N}(μ,σ^{2})$:
$$ f_{\mathcal{N}(μ,σ^{2})}(x)=\frac{1}{\sqrt{2 \pi σ^{2}}}\exp\left(-\frac{(x-μ)^{2}}{2σ^{2}}\right) $$
* ガンマ分布$\mathrm{Ga}(\alpha,\beta)$:
$$ f_{\mathrm{Ga}(\alpha,\beta)}(x)=\frac{1}{\Gamma(\alpha)\beta}\left(\frac{x}{\beta}\right)^{\alpha-1}e^{-\frac{x}{\beta}} $$
* 自由度nのカイ2乗分布$\chi(n)$(ガンマ分布で$\alpha=\frac{n}{2},\beta=2$としたもの):
$$ f_{\chi(n)}(x)=\frac{1}{\Gamma(\frac{n}{2})2}\left(\frac{x}{2}\right)^{\frac{n}{2}-1}e^{-\frac{x}{2}} $$
* 母数$\lambda$の指数分布$\mathrm{Ex}(\lambda)$(ガンマ分布で$\alpha=1,\beta=\frac{1}{\lambda}$としたもの):
$$ f_{\mathrm{Ex}(\lambda)}(x)=\lambda e^{-\lambda x} $$

さて、これらを使って元の積分値を求めてみる。

$$ e^{-ax^{2}}=\sqrt{\frac{\pi }{a}}\cdot\frac{1}{\sqrt{2 \pi (2a)^{-1}}}\exp\left(-\frac{x^{2}}{2\cdot (2a)^{-1}}\right)\sim \sqrt{\frac{\pi }{a}}\cdot\mathcal{N}(0,(2a)^{-1}) $$

なので、$\mathcal{N}(0,(2a)^{-1})$で$|X|$についての期待値を考えて

$$ \int_{-\infty}^\infty |x|e^{-ax^2}dx=\sqrt{\frac{\pi }{a}}E[|X|] $$

が成り立つ。ここで、$Y=2aX^{2}$を考えると、$Y$は自由度1のカイ2乗分布$\chi(1)$に従う確率変数*1。つまり、その確率密度関数

$$ f_{\chi(1)}(y)=\frac{1}{\Gamma(\frac{1}{2})2}\left(\frac{y}{2}\right)^{-\frac{1}{2}}e^{-\frac{y}{2}}=\sqrt{\frac{2}{\pi}}\frac{1}{2}y^{-\frac{1}{2}}e^{-\frac{y}{2}} $$

となる。この$Y$を使うと

$$ \sqrt{\frac{\pi }{a}}E[|X|]=\sqrt{\frac{\pi }{a}}\cdot\frac{1}{\sqrt{2a}}E[\sqrt{2aX^2}]=\sqrt{\frac{\pi}{2}}\frac{1}{a}E[\sqrt{Y}] $$

と変形できる。ここで$E[\sqrt{Y}]$を計算するわけだが、$\chi(1)$の確率密度関数に注目すると、この期待値計算をするときに$\sqrt{y}=y^{\frac{1}{2}}$と$\chi(1)$の確率密度関数の$y^{-\frac{1}{2}}$が打ち消し合うことがわかる。さらに、$\chi(1)$の確率密度関数に含まれる$\frac{1}{2}e^{-\frac{y}{2}}$というのは$\lambda=\frac{1}{2}$の指数分布の確率密度関数なので、この部分について積分を実行すれば、確率密度関数が規格化されていることからその値は1となる。したがって、これらの観察によって

$$ \sqrt{\frac{\pi}{2}}\frac{1}{a}E[\sqrt{Y}]=\sqrt{\frac{\pi}{2}}\frac{1}{a}\cdot\sqrt{\frac{2}{\pi}}=\frac{1}{a} $$

であることがわかる。よって

$$ \int_{-\infty}^\infty |x|e^{-ax^2}dx=\frac{1}{a} $$

がわかった。 $$ \tag*{$\blacksquare$} $$

*1:自由度nのカイ2乗分布は標準ガウス分布に従う$n$個の確率変数$X_i$の2乗の和、つまり各$X_i \sim \mathcal{N}(0,1)$が独立同分布のとき、$Y=\sum_{j=1}^{n} {X_j}^{2}$は自由度nのカイ2乗分布$\chi(n)$に従う。標準ガウス分布の確率変数にするために上では分散の分だけスケールさせて標準化を行っている。

年越し、初詣、帰省

あけましておめでとうございます。

特になんということはないんですが年末年始の2020/12/31-2022/01/01の日記を書こうと思ったので書きます。徹夜していたのでこの2日は繋がっています。


2021年12月31日、7時半ごろ。毎年年を越してから完成する年賀状が珍しく年越し前に完成。満足して就寝。年賀状の写真はそのうち上げる。

昼間15時ごろ?に起床。友人からそば打ちをしないかと連絡がきていた。行くと返信。

あかつきでラーメン納め。あかつきスペシャル2玉、ポイントカード使ってライス小をつけるのがいつものセットとなっているのでそれを注文。お会計のときに来年もよろしくお願いしますと言われる。

f:id:potaxyz:20220106011045j:plain
ラーメンあかつき

ミスタードーナツカードがあと900円でVIPチケットもらえそうだったのを思い出してバスに乗って出町柳ミスドに行くも福袋は売り切れておりそのまま退店。よく考えたらドーナツ1個無料券のためにバス乗ってたらその時点で損してるんだよな。

そば打ちするついでに天ぷらやるからサラダ油買ってきてとのことだったので帰り道にスーパーに寄って購入。

バス停で変なじいさんに絡まれる。適当に話を受け流し良いお年を〜と言って手を振って別れた。

薬局で消臭剤とかを購入。

友人宅へ。そば打ち。自分と友人2人の3人いたが自分が一番最後でどうすれば良さそうかわかってきたので一番上手く作れた。ちゃんとそばになっていた。

f:id:potaxyz:20220106010958j:plain
年越しそば

ゆく年くる年

ジルベスターコンサートを見て年越し。

下鴨神社へ初詣。ちなみに先週も来たし先々週も来た。

f:id:potaxyz:20220106011251j:plain
下鴨神社 お焚き上げ

くじ引き300円高いな〜と思いつつも巫女さんに番号を告げてお金を払う。方丈記の序文が書いてあり感動。ただし吉凶のやつは「平」であまりよくなさそう。

f:id:potaxyz:20220106011410j:plain
おみくじ

友人たちと別れ帰宅。家の掃除をする。

掃除は終わらなかったが家を出て修学院駅まで歩く。始発で貴船に向かう。元旦とはいえ流石に始発なだけあって人はそんなにはいなかった。

貴船神社に到着。今年もきっと何度か訪れると思う。澄んだ気持ちになれるので。

f:id:potaxyz:20220106011515j:plain
貴船神社

f:id:potaxyz:20220106011545j:plain
参道

f:id:potaxyz:20220106012219j:plain
奥宮

鞍馬山の山道を歩く。

f:id:potaxyz:20220106011706j:plain
鞍馬山

鞍馬寺に到着。舞台から初日の出が見れたらいいなと思ったが雲がかかっておりいい感じには見えなかった。雲の隙間から顔を完全に覗かせたことは一応あったので初日の出は見れたということで。

f:id:potaxyz:20220106011744j:plain
初日の出?

昨日手に入れられなかったミスド福袋を買いに行く。阪急スクエアは元旦は閉まっているのでビブレに行くことに。

なにも考えずに修学院で電車を降りたらバスの接続がないことに気づき修学院道->北白川別当町->北大路バスターミナルという無駄な移動をすることになった(失敗1、元田中で降りてバスに乗るのがおそらく最適解)。

無事に買えた。

コメダで朝食。今年もコメダにはお世話になるだろう。

実家等へのお土産を買うため再びバスへ乗る。目的地が妙心寺前ではなく嵐電妙心寺駅前だったのに間違えてしまい時間ロス(失敗2)。

普段こんなよくわからないミスしないのに失敗続きで夜に引いた下鴨神社のおみくじが当たってしまっていないかと心配になる。

お店に到着。1組あたり8分程度かかっており1時間くらい待つことになってしまった。

くまもなか目当てだったが売り切れてしまったので(元々買う予定だったが)花びら餅を購入。家まで戻る。

北野天満宮の人が多すぎたしバスの乗降も永遠にやってるしでバスが全然進まなかった。

起きて24時間経っているので流石に眠く寝落ち。起きた頃には銀閣寺道前だったが1日乗車券を床に落としており少し焦る。

帰省の準備を適当に済ませ京都駅へ。

年賀状の宛名書きのためボールペンを買う(が、結局使えなかった、失敗3)。

茶の菓が買いたい!と思ったが何故か京都駅内でうまく見つけられず八条口烏丸口を行ったり来たりしていたら閉店時間になっており買えずに終わる(失敗4)。

夕食として美味しそうな弁当を購入。

想定よりだいぶ遅い時間になってしまったため特急に課金。ただ新幹線だけだと面白くないので、新幹線としらさぎを使う。

米原近辺や関ヶ原のあたりは雪がかなりあった。

弁当がうまい。

弁当のゴミをフタ閉めてたとはいえ適当にお土産袋に入れた(なんで?)せいで汁がこぼれてお土産パッケージを汚してしまう(失敗5)。お土産を渡した友人にごめんと伝えたい。

実家に到着。猫と戯れる。

風呂にエアコンがついており驚く。

26時ごろ就寝。

f:id:potaxyz:20220106133117p:plain
めっちゃ歩いたね


今年の抱負はていねいなくらしをすること、よりactiveにagressiveに生きることです。

2021秋の京都紅葉散策 三十三所巡礼

今年は本気で紅葉狩りをしよう。そう決めた。

行ってみると散ってしまっていたようなところもあったが、結果として33ヶ所回ることができた。*1

それのレビュー的なものを京都市街を俯瞰した時に右下から大体反時計回りに書いていこうと思う。

本編

東福寺

  • 訪問:11/19 8:00頃
  • 拝観料:2000円(JR東海の事前予約制の早朝拝観コース)

2014年の11月に行っていたみたいなので7年ぶりの訪問。紅葉の時期は通天橋に人がめっちゃいて写真撮影が禁止されるほどらしい。それを見越して課金を行なって早朝拝観にしてみた。人が少なくて快適に見れたのでこの課金はよかったと思う(通常拝観が8:30開始なのだが長蛇の列ができていた)。通天橋からの景色が有名だが、その下を散策するのも楽しいと思う。

通天橋から

撮影スポットに人が集まってはいるが人が多いわけではなかった

東福寺塔頭 光明院

  • 訪問:11/19 9:00頃
  • 拝観料:300円

枯山水庭園がいい感じ。落ち着く。混んでないしね(途中で団体が来るとアレだが)。紅葉は始まったばかりという感じだった。

波心庭

吉野窓から

泉涌寺

  • 訪問:11/19 10:00頃
  • 拝観料:500円(伽藍)+300円(庭園)

こっちは色づいていた。人も少なめだった。

御座所庭園

泉涌寺別院 雲龍

  • 訪問:11/19 11:00頃
  • 拝観料:400円

ありがちな長方形の折り畳まれたパンフレットに加えて『雲龍院の「へぇ〜」ポイント』という小学校の生徒思いな先生が修学旅行とかで作って配りそうな感じのプリント(?)をもらった。七福神像のかっこよさNo1コンテストみたいなのが部屋の一角に展示してあり、それぞれの像の写真の前にある花瓶に花を1本添え、それを1票とみなして投票してもらう、みたいなことをやっていた。

紅葉は、うーん。

雲龍

今熊野観音寺

  • 訪問:11/19 11:30頃
  • 拝観料:なし

境内が縦に伸びている感じ(?)で上を見れば紅葉がたくさん。(そういうことを感じさせる写真は撮っていなかった)

参道入り口

大師堂

清水寺

  • 訪問:11/24 20:30頃(夜間拝観)
  • 拝観料:400円(昼夜問わず)

平日の受付終了間際なら多少マシかなとは思ったが、とにかく人が多くゆっくりはできない。超有名だからというだけでなく、他と比較すると夜間拝観料が安く、京都駅から近めだということも多くの旅行客が来やすい要因になっていると思う。人が多すぎることに対する文句はあるが、実際見て、お〜、とはなるので満足感は得られそう。

よくtwitterとかで見る写真が撮りたければ人混みの一員となるしかない。

清水の舞台と紅葉

音羽の滝のあたりから見上げる

高台寺

  • 訪問:11/30 20:30頃(夜間拝観)
  • 拝観料:600円

タイミングがよかっただけかもしれないが、思ったより人が少なかった。また、21:30まで拝観を受け付けており京都市内では(自分が調べた中では、24時間門が開いているような所を除いては)最も遅くまで拝観受付をしている寺院/神社だった。紅葉シーズンに旅行などで訪れた際には、色々見終わった後で更にここで夜間拝観していくという芸当が可能となる。

方丈前の枯山水庭園にちょっとしたプロジェクションマッピングがされていたり(波紋が描画されていた)、(仏教音楽でない)音楽が流れているエリアがあったりなんとなくチームラボみを感じた。アンドロイド観音とかやっているだけある。

臥龍池に映る紅葉が良かった。ちなみに、畳に座って落ち着くわね〜とかなる庭もいいですが、こういう歩いて色々見れる庭の方が個人的には好きです。

拝観順路の終わりの方に竹林があるのもオツだと思う。嵐山以外だと珍しい気がする。

臥龍池に映る紅葉

雰囲気のよい境内

竹林

高台寺塔頭 圓徳院

  • 訪問:11/30 21:30頃(夜間拝観)
  • 拝観料:500円

おそらくここも高台寺に倣ってか拝観の受付終了が21:30と京都市内で最遅。

長方形の折り畳まれたパンフレットに加え(これは渡されず自分で持っていく形式だったかもしれない)、新型コロナウイルス疫病退散と書かれた御朱印札をもらった。

受付のところから入るとすぐ南庭があるが、そこから建物に上がると思ったより先が長い。最後に北庭がある。自分が最後の拝観者だったので北庭の前に座ってぼーっとゆっくりしていった。

南庭

北庭

南禅寺

  • 訪問:随時(普段の散歩コースの終点のため)
  • 拝観料:なし(庭園、山門に入っていないため)

この記事に入れるか微妙だが一応行ってはいるため項目に入れた。

散歩コースの終点なのでいつでも行くだろうと思って(ただし行くのは夜で真っ暗なため紅葉はよく見えない)毎年紅葉の時期の写真を撮り忘れる。今年も撮り忘れた。

定番ですが、参道の山門前の左右に紅葉が生えてる感じが良いと思う。

南禅寺塔頭 天寿庵

  • 訪問:11/26 13:30頃
  • 拝観料:400円

わざわざ塔頭にお金払ってまで行こうという人は少ないのか外よりは空いていた。

本堂の前の庭は散っていたが池のある広い南庭は楽しめた。

本堂から見える南庭の紅葉

本堂前庭

書院南庭

南禅寺塔頭 南禅院

  • 訪問:11/26 14:00頃
  • 拝観料:400円

けいおんのOP等でも有名になった南禅寺水路閣の奥にある。

天寿庵と同じく、わざわざ塔頭にお金払ってまで行こうという人は少ないのか外よりは空いていた。

池をぐるっと1周取り囲むような形になっている。

南禅院

ちなみに、昨年は南禅寺塔頭大寧軒というのに行っておりこれで3つの塔頭を訪問したことになるが個人的な好みとしては大寧軒>天寿庵>南禅院かな、というところです。

永観堂

  • 訪問:12/1 20:30頃(夜間拝観)
  • 拝観料:600円

昼間は人でごった返しているが、平日の夜間拝観終了間際に行ったら混んでいなくてゆっくり見ることができた。昼間に来たことがないので一度行ってみたいと思う。

御影堂の前

放生池

帰り道の手前

真如堂

  • 訪問:11/28 14:30頃
  • 拝観料:なし(有料エリアは存在するが行かなかった)

そこそこ人はいる。三重塔と紅葉が映える。本堂の横や裏なんかも紅葉が良い感じになっていた。けっこう好き。

三重塔と紅葉

金戒光明寺

  • 訪問:12/5 20:00頃(夜間拝観)
  • 拝観料:1000円

個人的に最も好きな山門を持つ寺。受付終了ギリギリに行ったので空いていた。ライトアップ最終日だった。大体の夜間拝観は建物前にテント張ってたりとか明らかな受付があるのでわかりやすいが、ここは山門の方から登ってきた時に手前側に目に入ってくる昼間使っているであろう拝観受付的な看板がついてるテントが使われておらず、その奥の御影堂の中に受付があり、パッと見で若干わかりづらい(後述の靴袋渡してくれる人がいるとはいえ、手前のテントで隠れている)。その手前で靴袋持ってない人は紙袋が渡される。その際に志納金的なものをお願いされるのでケチは靴袋を持っていくといいと思う。

法然の一生を庭という形で表現されているらしい。手前からみるとグラデーションが綺麗。見頃は過ぎていたのでまずまずという感じだった。

山門

紫雲の庭

哲学の道

  • 訪問:12/9 6:30頃
  • 拝観料:なし

散歩コースというか家の目の前にあるのでいつでも行けはするが写真の撮影日を訪問日とした。紅葉は散りかけ。早朝に行くと気分がシャキっとする気がするが大体早朝に行く時は徹夜明けなのでシャキっとはしたくない気もする。

思ったよりまともな写真を撮っていなかったが銀閣寺寄りだとこの辺が好きかなというところを載せておく。実際には南禅寺寄りのところの方が紅葉はよく見れる。

哲学の道

安楽寺

  • 訪問:11/26 15:30頃
  • 拝観料:500円

疫病の影響で時短となり10時開門16時閉門になっていた。紅葉がよく見えるのは入り口のところ。

タイミングがよく30分に1回やっているらしいお寺の成り立ち的な話をお坊さんから聞くことができた。面白かった。

安楽寺

法然院

  • 訪問:12/9 7:00頃
  • 拝観料:なし

早朝の散歩のゴールは大体ここに設定している。個人的に雰囲気が好きなところ。だいぶ散ってきてはいた。

参道

境内

詩仙堂

  • 訪問:11/29 14:00頃
  • 拝観料:500円

境内はあまり広くない。以前初夏の朝に行った時は自分含めて3人くらいしかいない状態で、静かな庭に響くししおどしの音が趣深いなあと思っていたのだけれど、あまりに人が多かったので趣も何もなくなってしまった。庭をぐるっと歩きそそくさと退散した。

詩仙堂

ししおどし(詩仙堂はししおどし発祥の地)

曼殊院

  • 訪問:11/26 18:30頃(夜間拝観)
  • 拝観料:600円

今年で夜間拝観が最後ということらしかったので夜に行ってきた。急な坂の上にあり、かなりきつい。

建物の中が広い。雰囲気は良いが、紅葉を見るという点では微妙だった。外の紅葉は見頃な感じだった気がする。

枯山水庭園

鷺森神社

  • 訪問:11/29 13:30頃
  • 拝観料:なし

参道の紅葉が良い。住宅街に溶け込んではいるが、昔からある伝統があって威厳ある神社感(?)があるのが良い。

参道

拝殿

なお、ここで経年劣化で買い換えないとなあと思っていたチャリがパンクして終了した。

叡山電車もみじのトンネル

  • 利用:11/26 出町柳19:15発の便、鞍馬21:23発の便(利用区間:修学院 - 貴船口
  • 運賃:380円x2

貴船神社のライトアップの時期にあわせて叡山電車も市原-二ノ瀬の間のもみじのトンネルをライトアップしている。貴船神社に行く場合は大抵の場合は叡山電車を使うのでどの便も混んでいると思われるが、空いているとすれば出町柳発の貴船神社のライトアップが終了した後の時刻に貴船口あたりに到着する便(=ライトアップしてくれる電車の終電)かなあと思う(貴船神社に行かずわざわざこれだけを見るためor通勤通学の帰宅のために乗る人は少ないだろうという推測、ライトアップしてくれる終電の出町柳行きは貴船神社で楽しみ終わった人がいっぱい乗る、しかも1両なので混む)。

もみじのトンネル

貴船神社

  • 訪問:11/26 20:00頃
  • 拝観料:なし

紅葉は散っていたのでライトアップを楽しむ感じになっていた。雪が降った時は毎年行くのだが、ライトアップ時に訪問するのは初めてだったのでこれはこれで良いなと思った。

鳥居

参道 紅葉は終了していた

境内

裏参道

京都御所

  • 訪問:12/3 14:00頃
  • 拝観料:なし

帝の住居、道もデカいし木もデカい。

学習院発祥の地のイチョウ

下鴨神社

  • 訪問:12/12 7:00頃
  • 拝観料:なし

京都で一番遅く紅葉する場所。紅葉シーズンの終わりの早朝に散歩しに来た。馬場ではじじばばさん達が朝の体操をしていた。

紅葉橋付近

参道

馬場

境内

神護寺

  • 訪問:11/7 18:30頃
  • 拝観料:800円

神護寺のライトアップが11/5,6,7の3日間だけということを11/7の夕方に知ったので急遽バスに乗って行ってきた。京都の山の外れにあるので普通に1時間くらいかかる。家出た時間がギリギリ過ぎて拝観受付終了18:30前に到着する終バス(二条駅から神護寺のある高雄地区への臨時直行便)で18:20に到着。

google mapで調べると何故か変なルートを案内されて10分では着けないことになったが、以下のルートを早歩きでバス停からひたすら下り続けること5分程度。ちょうど以下のルートの終点あたりに夜間拝観のチケット販売をしている場所がある(おそらく拝観終了=チケット販売終了だと思う)。

チケットを購入できたらそこからはひたすら上り続けて境内に入ることになる。

JR東海のひかりの京都とかいうイベントもやっていたようで竹灯籠が設置してあった。ライトアップされる紅葉と、街外れのおかげで真っ暗な空とのコントラストがとても良かった。

金堂

階段の上から

大覚寺

  • 訪問:12/3 15:00頃
  • 拝観料:500円(お堂エリア)+300円(大沢池エリア)

紅葉を見るという点では大沢池エリアだけでいいと思う。公式ホームページを見ると、全部回るとお堂エリア60分+大沢池エリア60分かかるみたいなことが書いてあるが、よっぽどじっくり見ない限り1時間あれば回れるはず。実際僕はお堂エリア20分+大沢池エリア25分で回った。

百人一首藤原公任が詠んだ名古曽滝の跡を見ることができてよかった。

池の周りを散策して彩りに秋を感じた。

もみじロード

大沢池

宝筐院

  • 訪問:11/30 12:30頃
  • 拝観料:500円

拝観方法が券売機で買ったチケットをおっちゃんに渡すスタイルだった。

入り口の門をくぐって出ると一面の紅葉が目に飛び込んでくる。自然にヤバって言ってしまった。今期で最も良かったスポットはここだと思います。紅葉に包まれたい人はここに行きましょう。

宝筐院(入口付近)

宝筐院(境内中程)

祇王寺

  • 訪問:11/30 11:30頃
  • 拝観料:300円

境内がコンパクトなので混みやすいかもしれない。散り紅葉がきれい。苔が有名なところなのでいろんな苔が並んでるコーナーがあった。

境内

山門

二尊院

  • 訪問:11/30 11:00頃
  • 拝観料:500円

散り始めてはいたがまだまだ赤かった。展望台は常寂光寺よりもいいかも。

紅葉の馬場

展望台からの右京の街並み

常寂光寺

  • 訪問:11/30 10:30頃
  • 拝観料:500円

境内散策が楽しい。満足度が高い。

仁王門を後ろから

鐘楼

石段

竹林と紅葉林

嵯峨野トロッコ列車

当日17:30頃に行ったが普通に窓側の席が取れた。もともと空いてたかもしれないし、キャンセルがあったのかもしれないがラッキーだった。

景色は真っ暗で何も見えない。ライトアップしてある紅葉を楽しもう。写真映えはあまりしないと思う。

普通の紅葉散策も楽しいですが、トロッコ列車に乗って眺めることでのみ得られる栄養があります。

嵯峨野トロッコ

天龍寺

  • 訪問:12/3 16:40頃
  • 拝観料:500円(庭園のみ)

弘源寺を見ていたら庭園以外拝観終了していた。日没直前なので暗い。紅葉も終わりに入ってきているなあという感じだった。この奥で散り紅葉が見られた。

曹源池庭園

宝厳院

  • 訪問:12/3 18:30頃(夜間拝観)
  • 拝観料:600円

苔と散り紅葉が綺麗。散策していて楽しいと思う。昼間も見てみたいと思った。

宝厳院

番外編

清涼寺

  • 訪問:11/30 12:00頃
  • 拝観料:400円

紅葉スポットの1つではあると思うのですが....

空腹でだいぶ判断力が落ちた状態になっていたため境内をくまなく回れず...多重塔とか見ていないし...

ちゃんと見れてないので紅葉散策にカウントしないことにした。

天龍寺塔頭 弘源寺

  • 訪問:12/3 16:20頃
  • 拝観料:500円

たまたま特別拝観とかいって看板出てたので入ってみた。拝観者は自分だけだった。建物内の撮影は禁止だったので写真はないが、近代の京都画壇の絵が襖にペタペタ貼ってあってちょっとした美術館みたいになっており面白かった。

枯山水庭園があり、借景が紅葉しているという形になっていた

紅葉スポットではなく美術館だなあと思うので紅葉散策にカウントせず番外編ということにした。

まとめ

かかった予算

これらすべての拝観(もしくは列車への乗車)にかかった金額は...

15590円

でした。移動に市バス使ってるので2万円はいかないにしてもそれくらい使った計算になりますね。

行けなかったところなど

頭の中にはあったり計画してたりはしたけれど行かなかったところも挙げるとたくさんあります

  • 山科地区全般(遠いため)
  • 大原三千院(遠いため)
  • 岩戸落葉神社(遠いため)
  • 赤山禅院、瑠璃光院などの一乗寺修学院地区(行くつもりだったがチャリが壊れて行く気がなくなったため)
  • 仁和寺などその辺の地区(時間がなかった)
  • 北野天満宮(一昨年紅葉シーズンに訪問したためパスした)
  • 建仁寺(夜間拝観行こうとしたら予約制だった)

などなど...

結果として本気度70%くらいだったと思う。

感想的な

一番よかったと思うところと満足度が高めだったところを下に挙げる。あくまで紅葉という観点から見ているもので、その寺社仏閣自体が微妙と言っているわけではないことに注意してほしい(例えば下で詩仙堂は挙げていないが昔初夏に行った時はとてもよかったし、清水寺はお盆に行った時の夜間拝観もよかった)。行った時期やタイミングが悪かっただけという可能性も十分ありうる。

  • 一番よかったところ

京都で紅葉見るならどこがいい?って聞かれたらこの2つを勧めると思う。

  • 満足度高めなところ
    • 嵐山地区:宝筐院以外だと、常寂光寺、宝厳院、大沢池、祇王寺の順
    • 東山地区:東福寺(早朝拝観で混んでなかったってのがデカいと思う)、高台寺
    • 岡崎・哲学の道あたりなど:真如堂南禅寺永観堂は昼間に見ると評価上がりそう)
    • 一乗寺修学院あたり:強いて言えば鷺森神社 上に挙げてるものに比べるとどうかな〜と思う、このエリアは気になっていたスポットが何個もあるのに、実際行ったスポット数が少ないのは反省点

地区としては嵐山が好きかなーという感じ

寺社仏閣の新規開拓とか、かなり昔に行ったところの再訪問ができたりとかして、この機会に色々行ってよかったと思う。

来年もどこか行くぞ〜


2022年版はこちら

potaxyz.hatenablog.jp

*1:紅葉を楽しむ列車も1ヶ所として計算