arcanum_jp’s blog

おっさんの日記

英単語の意味を教えてくれる、LINEボットを作りました

さーて、3連休、カミさん子供らは実家にいくというし、もう独身気分満タンだ!何しよう!と言うことで何か成果が見えるものをと考えて。Webを漁っていたらオープンデータな英語辞書を見つけたので。 

f:id:arcanum_jp:20190714155307p:plain

 

 

データはこちらを使っています。

github.com

 

データ形式が単語と意味がタブ区切りなだけでコンピュータが読む形式になっていないのが辛かったですが。 

 

とりあえず、英単語に対して意味を教えてくれます。それだけです。正味2日かかってしまった・・・(悲)

 

さて、ここからどう発展させましょうか

 

f:id:arcanum_jp:20190715120223j:plain

 

LINE botをSpringBootで作る

表題の通りです。前提として言語はJava、LINE Developperサイトでの設定は済んでいると仮定します。

pom.xmlに次の依存性を追加


pom.xml

<dependency>
    <groupId>com.linecorp.bot</groupId> 
    <artifactId>line-bot-spring-boot</artifactId>
    <version>2.7.0</version>
</dependency>


バージョンの最新版は以下で確認してください。
mvnrepository.com


application.propertiesにボットのトークンなどを設定します。line.bot.handler.pathはLINE Developperサイトで設定したものです。


application.properties

#---------------------------------------
# LINE
#---------------------------------------
line.bot.channel-token=xxxxxxxxxxxxxxxxxx
line.bot.channel-secret=xxxxxxxxxxxxxxx
line.bot.handler.path=/path/to/line/webhook


あとはコントローラーを作ります。サンプルはこちらにありますね。

github.com

リプライにリプライを返すだけのエコーボットです。

@LineMessageHandler
public class EchoController {

    @EventMapping
    public TextMessage handleTextMessageEvent(MessageEvent<TextMessageContent> event) {
        System.out.println("event: " + event);
        return new TextMessage(event.getMessage().getText());
    }

    @EventMapping
    public void handleDefaultMessageEvent(Event event) {
        System.out.println("event: " + event);
    }
}


クラスに@LineMessageHandlerをつけて、LINEからの目的のWebhookイベントのメソッドを作って@EventMappingをつければ良いようです。では、他の友達追加やブロックなどのイベントはどうやってフックするのでしょうか?例えば友達追加は以下のようなメッソッドを作成します。

@EventMapping
public TextMessage handleFollowEvent(FollowEvent event) {
    return new TextMessage("フォローありがとう!!");
}


どうやら目的のイベントごとの引数をとるメソッドを作るだけのようですね。Eventクラスについては以下を参考にしました。

static.javadoc.io

Eventクラスの既知のサブクラスは以下です。ブロックした場合などは相手にリプライを返せないので戻り値はvoidだったりしますが概ね同じですね。

イベントクラス名 説明
BeaconEvent LINEビーコンを受信した際に発生します。
FollowEvent 友達に入れられたときまたはブロックを解除された時に発生します。
JoinEvent グループやトークルームにジョインした際に発生します。
LeaveEvent グループから離れたときに発生します。
MessageEvent メッセージを受け取った時に発生します。
PostbackEvent 表示したテンプレートメッセージに反応した場合に発生します
UnfollowEvent ブロッックされた時に発生します。
UnknownEvent 上記以外で不明なメッセージを受信した際に発生します。


以前、ServletベースでLINEボットを作っていたことがあり、あの時はWebhookに来るJsonオブジェクトを認証して、自前で解析してtypeでテキストメッセージなのかフォローしてきたのかとか判定して云々なんてやっていたので本当に簡単に作れる感じですね。


その他

line-bot-spring-bootのバージョンを上げたら、こんな感じでokioにそんなメソッドねぇよ!!(意訳)なエラーが出ることがあります。

Exception in thread "OkHttp Dispatcher" java.lang.NoSuchMethodError: okio.BufferedSource.getBuffer()Lokio/Buffer;
        at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:252)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at com.linecorp.bot.client.HeaderInterceptor.intercept(HeaderInterceptor.java:39)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:221)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:172)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

経緯としては始め、Webにあるサンプル通り、line-bot-sdkのバージョンを1.11.0で確認していましたが、上記のリポジトリを見るに2.7.0が最新とわかり、pom.xmlのバージョンを変更、サーバーにアップしてみたところ、上記のような事象が発生するようになりました。


例外メッセージでググるとまさにこれについて検索できました。
github.com

コントリビューターからバージョンを合わせて使ってね?的なメッセージを得てことなきを得ていたようですが、さっぱり意味がわからない。その時にpom.xmlに記載していたのは下記であり、どれもMavenリポジトリを確認してもokHttp3なんて使っていない。

spring-boot-starter-thymeleaf
spring-boot-starter-web
spring-boot-starter-web-services
spring-boot-starter-tomcat


結論として、バージョンを上げた後、プロジェクトのクリーンしてからビルドし、サーバーにデプロイする事で事象は発生しなくなりました。上記のイシューは多分他の依存してるライブラリででokHttpを使っていたのかなと思います。

スプラトゥーン夏物語(1)

ここはハイカラシティとハイカラタウンのどこか。ここでは日夜、スプラトゥーンの試合が行われている。

 

スプラトゥーンの会場となる場所はいつも試合が終わるとペンキを綺麗に洗う仕事がある。それらは金のない若イカにとってはいい収入になっていた。

 

1試合で平均、若イカの1ヶ月の給与ぐらいがかかる。試合に使う武器、ギアも買う必要がある。試合は実はとても高価でもっぱら金持ち貴族どもの遊びであった。

 

しかし皆、いつかは試合に出てみてぇなぁ・・・と夢を見る。そして金をスプトゥーンのペンキ落としのバイトで貯めるのであった。

 

「しっかし何でこんなにペンキ塗るかね?」

 

「あぁ、それ多分ミサイルマンだわ。。あいつら試合もしないでミサイル延々と撃つとかもう別のゲームしてんだわ・・」

 

「あぁ、ボールド系か、、特にボルネオな、、あいつら塗りが強い上にキルされてもビーコンですっ飛んでくるもんな・・もうゾンビだよ」

 

「なんじゃそりゃもったいないなぁ、、せっかく出たのに、俺ならキルだな、無限にキルしてやる!」

 

「いやぁ、、キルするにしたってやっぱチャーっしょ!芋ってキルに徹する・・」

 

「じゃぁ今日も頑張ってペンキ落としてちゃっちゃと金もらって帰るべ!」

 

こんな感じの会話が交わされているかもしれない。

 

「おい、こっちきてみろよ、、武器とギア一式あるぜ?どっかのバカ貴族が忘れていったのかな?しかも4人分、、」

 

「え?どんなのあんだ?・・・もみじ、ボールドマーカーネオ、銀モデ、4K・・・全部地雷武器じゃねぇか!」

 

「あぁ、、使えねぇってんで捨ててったんだな。。もったいない・・・」

 

「でもよ、、これであと参加券買えば出れるんじゃね?」

 

と顔を合わせる。

 

「貯金もよ、あと少しで参加券買う分はあるだろ?出れるんじゃねぇか?あと少しだ」

 

とそこへ見知らぬイカが・・・

 

「貧乏人諸君、ペンキ落としは終わった?試合が始まるんだけど?」

「ん?おまえら何見てんだ?あぁ、それ昨日俺が捨てたやつだわww」

「貧乏人には所詮使えないけどなww」

 

「アッタマくる・・・」

 

「だってお前らその前に金無ぇだろ?無理無理、出ることすらできん!」

「それくれてやるわwwせいぜい出れない気分を紛らわすために使いなww」

 

 

「おい、てめぇ!何いってんだよ?俺たちが出れないって?俺たちが出たらお前なんか何度でもキルしてやるぜ?」

 

 

「あぁ、無理無理、こっちは1000時間以上費やしてるんだぜ?お前たちは?0時間?無理っしょwいきがるのもおとといやってなw」

「じゃぁな、」

 

 

ーーーーーーーー

 

「くっそぉ!!」

 

「どうする?」

 

あいつだけはゆるせねぇ!」

 

「こいつはありがたくいただいてやんよ!あいつが捨てた武器でギッタギタにしてやろうぜ!」

 

こうしてこの夏、若イカの熱い戦いが始まろうとしていた。

 

 

 

 

Nettyをちょいと勉強

先日からきしださんがJJUGなどでServletオワコンと言っていたので、、、


多分これは最近きしださんが講演で発表したこの資料からだと思われる

speakerdeck.com

自分もこの資料(jjug行けない地方民は資料から察するしかないのです(笑))は見ていて、あぁそういう世界もあるんだなと、Helidonなんかは簡単にサンプルを実行させてみたりしてたのですが、Servletはもうオワコンと言う。

根拠の一つはすでにServletベースのフレームワークが出ていない、と言う事、そう言えばみんな大好きなSpringBootもServletベースだがこれも出てから何年たったのだろう。あとそれ以降Servletベースのフレームワークで新しいのを聞かない。

じゃぁJavaでWebをするときこれからは何を使えばいいの?ってなった時に多分、Oracleが公開しているHelidonなんかなんだろうと思うんだけど、そうすると仕事でやる上では疑問が起きてくる。

今までは、

1.Servletベースのフレームワークが使える

2.Servletベースからフレームワークが作れる

と言う知識が必要だったんだけど、これに、

3.Servletに拠らないフレームワークが使える

4.Servletに拠らないフレームワークが作れる

という知識が必要になってくるんじゃないかと、もちろん急激に1、2が廃れるはずもなく、今後Servletベースの知識は使えるとは思うけど、それ以外に3、4を学ばなくてはならない、少なくとも3は個人的にも知識、経験があるよと言えるようになってないといけないんではないかと。資料だとHelidonやMicronaut Framework、Quarkusあたり。

それらのフレームワークは色々な人がWebでエントリを公開していたりするけどじゃぁ4、のServletに拠らないフレームワークってどう作るんだろ?って思ったわけです。WebSocketから作るのか?そりゃ地獄だろ・・・という感覚しかない。きしださん曰く、どのフレームワークもベースはNettyとのこと、Netty?なんだろ?と思いちょいと勉強。(前置きが長すぎ)


Nettyの本家サイトはこちら。
netty.io

Nettyはこちらを参考にしました。
snuffkin.hatenablog.com

Nettyは、イベントドリブンな非同期通信を行うアプリケーションを開発するためのフレームワークです。ソケット周りを直接触る処理はNettyが行ってくれて、イベントドリブンで接続・切断時の処理を記述したり、電文受信時の処理を記述することができ、簡潔で見通しの良いネットワークプログラミングができます。また、Nettyには電文処理を行うアプリケーションを開発するときに必要なライブラリが用意されているため、オリジナルプロトコルを使う場合にもNettyを使えば開発しやすいです。

独自プロトコルのちょっとしたサンプル

今回も例によって例のごとく、人様の書いたエントリを教科書に勉強していきます。サンプルとしてこちらを確認してみました。

第1回
http://acro-engineer.hatenablog.com/entry/20130321/1363881318: title

第2回
http://acro-engineer.hatenablog.com/entry/20130327/1364394979: title

第3回
http://acro-engineer.hatenablog.com/entry/20130403/1364953739: title



3回構成で、1回目でサーバ側のコードを示して、2回目でクライアント側のコードを示しています。2回目まで作ると実行できる仕組みですね。3回目は1、2回目のソースを利用したNettyの解説です。クライアントから送信されたデータがサーバを伝ってクライアントにクルッと戻される感覚がわかります。


ソースコードはNettyの3系なのでpom.xmlに依存性追加するときは注意ですね。自分はMavenプロジェクトを作って適当にインポートされてるクラスを検索したらここが引っかかったので、依存性を追加して上記サイトのソースを入れて実行してみました。

Maven Repository: org.jboss.netty » netty » 3.2.0.Final

<!-- https://mvnrepository.com/artifact/org.jboss.netty/netty -->
<dependencies>
	<dependency>
    	<groupId>org.jboss.netty</groupId>
    	<artifactId>netty</artifactId>
    	<version>3.2.0.Final</version>
	</dependency>	
</dependencies>

Nettyは3系と4系でパッケージがガラリと変わっているので注意ですね。org.jboss.nettyで始まっていたら3系より以前、io.nettyで始まっていたら4系以降ということになります。Webで見つけられるサンプルが結構この辺苦労しました。コピペしたけど動かねぇ!なんでだ!みたいな。


上記サイトで記載しているサンプルは、サーバ側を実行してからクライアント側を起動すると標準出力にハローワールドが出ます。単純なサンプルでクライアントがサーバーに送った文字列をオウム返しにしています。著者が言うにはこの例で簡単な独自プロトコルの実装になっているそうです。サーバーもクライアントも送信と受信で、電文長+電文本体、という形式でやり取りしていて下記のような動きになっています。


クライアントが文字列送信
 ↓
サーバーが文字列受信
 ↓
サーバが文字列送信
 ↓
クライアントが文字列受信(標準出力に出力)


意外と面白いですが結構難しい。エントリではNettyの基本的な概念を教えてくれて助かります。パイプライン、アップストリーム、ダウンストリーム、ハンドラ、この辺をまず覚える必要がありますね。先ほどのブログの3回目に同じような概念図がありますが、実行したサンプルの流れを自分なりに大雑把に書くとこんな感じでしょうか。


f:id:arcanum_jp:20190629124956j:plain

パイプライン

 Nettyは送受信にパイプラインを作成して処理を行うそうです。クライアントサーバー間に確率されたトンネルみたいなイメージでしょうか。

ダウンストリーム、アップストリーム

 上記の図では、クライアント側もサーバー側もいずれも送信は情報の流れが下に、情報の受信が上になっているため、送信=ダウンストリーム、受信=アップストリームというそうです。

ハンドラ

 Nettyによって送信されてきたメッセージを処理するためのクラス。Nettyはネットワークでイベントドリブンとありましたがこれを言っているのでしょうか?ちょっと気になります。


ちなみにクライアントのこの部分をこんな風に変えるとクライアント側で送信した”Hello, World!”という文字列がサーバー側でクライアント側の情報が付加されて"handler : Hello, World!"と表示されます。ハンドラーで送信側の情報などが取れるみたいですね。

EchoServerHandler.java

public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) {
    String msg = (String) event.getMessage(); // 受信電文を取りだす
    ctx.getChannel().write(ctx.getName() + " : " +msg); // クライアントに送信
}


でも自分は独自プロトコルなネットワークプログラミングをしたいわけではなく、HTTPな処理を実装するにはどうするか?なので次回にNettyでのHTTPの実装を調べてみたいと思います。

杖をまた購入

どうも杖エンジニアのあるかなむです。自分自身ではロマンスグレーな髪を颯爽としながら杖をコツコツと歩き渋い感じだと思っていますが、はたから見ればただのジジイなのでしょう。また50前なのに。

 

どうも今使っている杖が壊れ始めて危ないのでまた購入しました。前回と同じKINGGEARの折りたたみ杖です。自分の場合、お客さんにはあんまりこういうの見せたくないので折りたたんでカバンにいれておけるのがいいなと使っています。

 

 

ヘルニア関係でもう足が動かないため杖を購入したのが去年、2018年の4月末に購入してGWに届いてから使っていたのでかれこれ1年ちょっとでした。意外と壊れやすいのか、それとも自分の畳んで伸ばしての頻度が高すぎたのかはわかりません。

 

さて、届いてAmazonなのでブツは例によって例のごとく巨大な箱に入ってくるのですが、こんな風に梱包されてきます。

 

f:id:arcanum_jp:20190620220555j:plain

開けるとこんな感じですね。杖本体が折りたたまれた状態になって、あと収納袋、説明書が入ってきます。

f:id:arcanum_jp:20190620220612j:plain

 

あれ?おまけでついてくる収納袋がちょっと前回と違う・・・これは今回のもの。裏面も同じ生地です。

f:id:arcanum_jp:20190620220623j:plain

 

これは前回ついてきた収納袋

f:id:arcanum_jp:20190620220630j:plain

裏地はこんな感じでメッシュになっていて入れると中身がちょい見える。まぁ自分はいらないかなぁって思っていたけど、まさかのグレードダウン・・・?

f:id:arcanum_jp:20190620220650j:plain

 

 あと握る部分とシャフトを連結している削り出し部分がちょっと変わってました。上は今回購入、下は前回購入。ちょっと安っぽくなったような気がします。以前のは曇ったヘアライン風にピカピカな丸が所々ついていてかっこよかったのですが。

f:id:arcanum_jp:20190620220816j:plain

 

見えづらいですがシャフトの連結部分の形状も変わってますね。左が今回購入、右が前回購入。前回のは直線的でゴツい感じだったのですが新しいのは連結部がテーパーになっています。

f:id:arcanum_jp:20190620221000j:plain

 

これの違いは連結後にちょっと変わってきますね。こんな感じで上が今回購入したものですが、連結部がテーバーに削り出しているためか、きっちりおさまる感じになっています。

f:id:arcanum_jp:20190620221736j:plain

 

これは下のゴムの部分。ついてきたゴムは大きくてゴツくてダサいのですぐ付け替えますが。

f:id:arcanum_jp:20190620221042j:plain

 

畳んだときに束ねる輪っかです。プラスチックじゃない何かでできてます。上は今回購入したのに付いてきたもの。下は古い方です。結構これが便利ですね。古いのは壊れたのですがガムテで付けて使ってました。

f:id:arcanum_jp:20190620222331j:plain

 

 

 さて、杖を使うからといって年から年中杖を使わないと歩けないわけではありません。普通に杖なしでも歩きますが、ヨタヨタする割には前から人が来て対面するときには自分もよけなくてはならないので非常に大変なんです。

 

そりゃ人から見れば前からくる危ないフラフラしたオッさん酒でも飲んでるのか?だし他人が歩くのも大変だなんてわかりませんし、オッさんお前がよけろよ!がデフォでしょうから。

 

そこで杖ですが街中を歩くときにさすがに杖はアイコンになるのですね。前から来る人たちはよけてくれます。老若男女、DQNも工事現場のおにいさんも。さすがに前から来た行動ののろい三本足クリーチャーが見えると大変だなって感じてよけてくれるのですね。いや、キモっ!!魂が近寄っちゃいけないって叫んでる!かもしれませんが。ありがたいことです。トトロのこのシーンですね。

 

さつき「木がよけてる!」

f:id:arcanum_jp:20190621165640j:plain

 

ジジババになると道でよけないのなんでだよ?お互い様だろ?って思っていましたが、結構体が言うこときかないと言う事はこう言う事なんだろうなと最近思うわけです。よけないのではなくて、よけられない、なのだろうと。

 

自分の場合は基本的に前から人が来た場合、よけるのが辛いので一旦止まる、止まってやり過ごすが行動として身についてしまいました。

 

 でも街中でよけてくれない人がいます。

 

ゾンビです

f:id:arcanum_jp:20190621175130p:plain

 

スマホ見ながら歩くアレですね、まぁギリギリではよけてくれたりするんですが正直、杖使いはギリギリやられると辛いのですよね。あぁ、この方このまま自分にぶつかるんだろうか・・・心臓に悪いです。

 

意外と杖で歩くときのパーソナルスペースって横方向に1.5倍ほど広くなるので、それが分からずにスマホに夢中なゾンビは直前で杖が足元に見えて「あっww」とか言いながら蹴っ飛ばして行く輩もいます。若い女性に多いのですが「チッ!」っとムカついて去っていく方もいます。いや、前見ないで歩いて危ないの貴方なのですが・・・

 

ゾンビは死んでますし考える力なんて無いでしょうから前から来る人がどんな状況か?なんて関係ないのでしょう。たまに池に捕獲された映像も見ますしね。千鳥足でアッチへフラフラ、こっちへフラフラ、唯一の餌であるスマホにかじりつきながら歩きます。死んでるんだからもう成仏しろよ!って思いますが。

 

あと、電車ですね。まぁキモくて汚いオッさんは社会的なランクとしては一番最下層にいる上に杖なんてついてる激弱君はそのまた下層にいる人種。気にする必要はない存在です。いない存在。多分皆の目には僕の体は透過画像の透過部分のように市松模様に見えてるかもしれません。蚊みたいなもんでしょ。まぁ、、席を譲られると言うことはまずありません。そんなもんです。むしろ蚊みたいに弱いアピールするんじゃねぇ、邪魔だなぁ俺の気持ちを逆なですんな!なんて思われているかもしれませんね。

 

ガッツリ壁際によりかかって杖で支えます。日本一高い仙台地下鉄は必ず進行方向の左側のドアは開かないようになっているため、自分みたいなのは助かります。ドアと椅子の間にある角の吹き溜まりが僕の居場所です。ダンゴムシみたいな気持ちです。

 

ただ、どうしても杖を持つ手は下になるため、正直満員電車になると女性が乗ってくるのが怖いのですが。

 

最近は腰の痛みがまた出て来たらしく、あぁ、根本的に直さないとだめだよなぁと思いつつ、毎日、椅子から立ち上がって歩き出すと野球部の兄からよく聞いたケツバットの痛みが走ります。オールウェイズケツバーーット!!

 

体は大事にしましょう。

 

 

 

 

 

ずん子さん、革のコースター製作

先日書いたこちらですが・・・

 

arcanum.hatenablog.com

 

実はこのコースターを作る際に他にもコースターを作っていたのでご紹介。

 

革の表面に何かしらずん子さん的なものの彫刻を施して、あと中央に印象的な何かを埋め込んだら良いものができるのではないかと思い、製作。コースターを見る為と使う為の自分なりの工夫です。

 

コースターは通常カップを置くので中央に何かしらあっても見えませんがこの方法なら置いている間もずん子さんがわかるため良いのではないかと。 

 

皮を切ってイメージはこんな感じになるのでしょうか・・・

 

f:id:arcanum_jp:20190323222608j:plain

皮2枚でずん子さんのプレートを挟むように作ります。こんな風に接着剤でがっちりと接着しちゃいます。

f:id:arcanum_jp:20190323222337j:plain

 

これに絵を綺麗に見せるために周りに縁取りの金の輪っかをつけてレジンで表面を固めます。

f:id:arcanum_jp:20190323234101j:plain

 

実は2枚とも接着剤で接着しちゃえば糸で縫う必要などないのですが見せるために縫ってみます。この作業は初めてです。こんな風に糸を通すための線を作ります。向こうに見えるコースターは別件で作ったのですが正直見せられる代物にはなりませんでした。

f:id:arcanum_jp:20190329134620j:plain

 

1辺だけ縫ってみました。これをあと3回すると思うと気が重いですね・・・

f:id:arcanum_jp:20190329141908j:plain

 

さて、全て縫いました。もっと綺麗に縫えれば最高なのですが、自分の実力はこんなもんです。難しい!

f:id:arcanum_jp:20190329220715j:plain

f:id:arcanum_jp:20190329220756j:plain

 

 皮を使ったものは初めてでした。糸がロウで固められていて、縫うたびに指の温度で溶け出して、手がベタベタになり、で縫うのが苦労しました。革で何かを作る人ってこう言った苦労があるのかしら?

 

うーん、、正直また作れと言われたら・・・無理です。ごめんなさい。

 

ちゃんちゃん。。。

 

人は3度死ぬ(ポエム)

最近、邦画見るようになって、面白いなとおもったのが、「四月は君の嘘」や、「君の脾臓を食べたい」などの主人公の身近な人が若くして死ぬという作品。

 

多分だけどこの出来事によって、主人公たちはその瞬間瞬間では深い悲しみや色々な感情、影響を受けるのだろうけど、長い年月でみるとすっかり忘れるって事なんだよねと。

 

そして長いあいだ忘れて突然思い出すんだ。でもおっさんになって、そんな悲しい別れはなかったけど、昔のふとした記憶が蘇ってくるって事。突然思い出してあぁそういえばそんな事があったなぁと。そしてその人を思い出す。そして自分が死ねばその人の記憶は本当になくなる。

 

人は2度死ぬというが、人は死ぬと他人に強烈な影響を与えるが、忘れ去れる、2度目の死。そして潜水艦が浮上するように思い出させ、また生き返る。そしてその人が死ぬと自分がいたという記憶は全て失われ、そして3度目の死が訪れる。

 

とくにオチはありません