小林さんちのメイドラゴンで出てきたコード（小林さんを探せ！）

**:warning: 注意 :warning: この投稿には一部ネタバレを含んでいる可能性があります。**

またまた小林さんちのメイドラゴン関連の投稿です。

このアニメでは、主人公の小林さんが ~~SEなのに~~ 作品中でコードを書いている場面がいくつかあります。これらの場面ではコードを実際に書いている画面までくっきりと写っています。

凝ってるなぁと思って少し調べてみることにしました。

## 登場したコード
### 第一話
20:10ごろ、トールがケツァルコアトルと電話し終わった直後、曇り空をブレスで晴らす直前、小林さんの職場が一瞬写ったシーンで。

```py:第一話20：10ごろ.py
def __delitem__(self, key):
    self.db.delete(self.table, where="session_id=$key", vars=# 見切れ

def cleanup(self, timeout):
    timeout = datetime.# 入力中
```

### 第五話

02:25ごろ、OP直後、小林さんが同僚に「最近明るくなった」と話される直前。

```py:第五話02：25ごろ.py
import os, time, datetime, random, base64
import os.path
from copy import deepcopy
try:
    import cPickle as pickle
except ImportError:
    import pickle

from hashlib import sha1

from .# 入力中
```

06:14ごろ、トールが小林さんの会社を訪れた時。小林さんが同僚のPCに表示させられたこのコードを指し示した。

```py:第五話06：14ごろ.py

    def _validate_ip(self):
        # IPアドレスの変更を確認する
        if self.session_id and self.get('ip', None) != web.ctx.ip:
            if not self._config.ignore_change_ip:
               return self.expired() 
    
    def _save(self):
        if not self.get('_killed'):
            self._setcookie(self.session_id)
            self.store[self.session_id] = dict(self._data)
        else:
            self._setcookie(self.session_id, expires=-1)
            
    def _setcookie(self, session_id, expires='', **kw):
        cookie_name = self._config.cookie_name
        cookie_domain = self._config.cookie_domain
        cookie_path = self._config.cookie_path
        httponly = self._config.httponly
        secure = self._config.secure
        web.setcookie(cookie_name, session_id, expires=expires, domain=cookie_domain, httponly=httponly, secure=sec#見切れ
    
    def _generate_session_id(self):
        """ランダムのセッションIDを生成する"""

        while True:
            rand = os.urandom(16)
            now = time.time()
            secret_key = self._config.secret_key
```
### 第13話（最終話）
トールが去って二日後の夜、滝谷くんからの飲みに行く誘いを断った直後、小林さんのメガネに写る。

髪の毛で見えないところは?とする。

```py:第13話.py
        ?????e = ShelfStore(shelve.open('sess #見切れ
    XXX: ?helveはスレッドセーフ？要確認。
    """
    def __init__(self, shelf):
        self.shelf = shelf

    def __contains__(self, key):
        return key in self.shelf

    def __getitem__(self, key):
        atime, v = self.shelf[key]
        self[key] = v # update atime
        return v# 入力中
```

紛れもなく Python ですね。

## 出処を探す
情報が揃ったのでとりあえずググってみましょう。まずは第一話のコードでググります。

一番長い行でググりましょう。[検索結果 :mag_right: ](https://www.google.co.jp/search?q=self.db.delete%20self.table%2C+where%3D%22session_id%3D%24key%22%2C+vars%3D)

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/2f1eadda-94f3-6e50-6052-e2afb28b7d7d.png)

おや？　早速よく似たコードが……確かめてみましょう。 [最上位検索結果](http://ns2.iliaa.org/web/session.py)

み、みにくい……。めげずにページ内検索で探します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/720ff840-d631-67f1-429a-ce074600a714.png)

:tada: 見つかりました！ :sparkles:

このコードの最初に、

```py:session.py
"""
Session Management
(from web.py)
"""

```

とあります。

どうやらパブリックドメインの Web 用 Python フレームワーク、 [web.py](http://webpy.org/)　の一部のようです。

[GitHub にソースが上がっている](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py)ようなのでそちらを見ます。[314行〜](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L314)が該当範囲のようですね。

もしかしてと思い、他のコードも同ファイル内で調べてみると見つかりました。

| 話数 | 位置 |
| --: | :-- |
| 第一話 | [314行〜](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L314) |
| 第五話1つめ | [6行〜](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L6) |
| 第五話2つめ | [126行〜](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L126) |
| 第13話 | [329行〜](https://github.com/webpy/webpy/blob/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L326) |

表にまとめるとこうなります。
コメントが日本語に翻訳されてますね。しかも訳がうまい！

## 小林さんを探せ


**:warning: 注 ここからはネタです。**

さて、このコードが小林さんによって書かれた、とするならば、このファイルのContributorsの中に小林さんがいてもおかしくはないはずです。

このファイルのContributorsは現時点で以下の7人です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/f232d7e7-77cc-f30e-5776-1f217db45e90.png)

この中に小林さんがいるのでしょうか。

Gitでは、 [Git Blame] (http://qiita.com/siluejp/items/44960964ecbac77fe19a)という機能を使ってコードを誰がどのコミットで書いたかを見ることができます。

これはGitHub上でもこのボタンを押してみることができます。

![範囲を選択_004.png](https://qiita-image-store.s3.amazonaws.com/0/104663/69cb1c84-0caf-ec59-2c2e-27063bdb350e.png)

ボタンを押すと、このような画面にいきます。

![blame](https://qiita-image-store.s3.amazonaws.com/0/104663/2771c3cb-3d21-2f18-07cd-91b054e0b0a1.png)


この機能を使って調べてみると、作品中で小林さんがコードを実際に書いていた（カーソルが乗っていた）[17行目](https://github.com/webpy/webpy/blame/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L17)と[318行目](https://github.com/webpy/webpy/blame/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L318)、[338行目](https://github.com/webpy/webpy/blame/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L338)を書かれた人は[@anandology (Anand Chitipothu)](https://github.com/anandology)さんで、同僚に指し示していた[143行目](https://github.com/webpy/webpy/blame/4f51bae222ae5d00bd150e7a5e65cc7349e4b74d/web/session.py#L143)近くを書いていたのは[@seanhoughton (Sean Houghton)](https://github.com/seanhoughton)さんでした。

小林さんが書いていたところ：

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/a6ad2461-1474-611e-d941-fe98aa835445.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/7b25895a-df0d-9cc1-4197-b8379dd20a81.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/6c74a902-5613-8590-df2c-99ce55dfcec7.png)


この３つの行が同じ作者なのはなぜか？　小林さんだからでしょう！

同僚に見せていた箇所：

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/ca1a60aa-56c3-df4c-087b-f8a4f87666b3.png)

作者が小林さん（？）に何人か混じってますね。これはそのとき見せていた同僚なのでしょう！

こんなにも辻褄が合うのは偶然でしょうか？


つまり、[@anandology (Anand Chitipothu)](https://github.com/anandology)さんが小林さんで、[@seanhoughton (Sean Houghton)](https://github.com/seanhoughton)さんはそのとき近くにいた同僚の男性ということになりますね！[^1]　小林さん、インドの方だったんですか！ナマステ

## 最後に

:tada: 2021年7月二期放送決定おめでとうございます！ :tada:

[^1]: なりません