DensanCTF

Writeupです(多分)

このとんかつが美味い2019受賞

ykbrさん作問だと一発で分かる。 Google Mapから探したけど分からなくて「水沢駅 とんかつ 温泉卵」と検索したら出てきました。メニューは「半熟卵」なのにこれで見つけるGoogle凄い。

More, more, more

分からないのでヒント見たらltrace、straceを使えとあり、ltraceでstrcmpの呼び出しが見えてフラグ取得。フラグが完全にhsmさんでしたね。

Hello, Reversing World!

stringsしてgrepで終わり

WHITE OUT

Base64では無さそうなのでBase52とか試すも分からず。いくら考えても分からず適当にフラグ検索したら平文で出てきました。マジか。 問題とはそこまで関係ないですが、neovimが激重になって辛かったです。 Neovimのバッファは行のリストで実装されているらしく、一行が巨大になると諸々の操作がO(n)な事になって重くなります。 各種エディタの実装を調べていた時にNeovimはline listらしいとの情報を見てはいたのですが、流石にNeovim程の巨大なプロジェクトでそんなナイーブなデータ構造は無いだろうと思い勝手にgap bufferのリストあたりだろうと思っていました。マジか2

この高専カンファが新春2019

春高専カンファに行きました。常にカンファに居ます(いいえ)

前日

高松→大阪なので近いですね。前日は殆ど何もしてないです。 バスは車輪が4つあるのでフェリーで高松から神戸三宮まで動きます。 f:id:namachan10777:20190114014822p:plain 近いですね。これだけ近いと自転車で行ったほうが良いです。

当日

午前の部

時刻 何か
0000 高松ジャンボフェリー乗り場
0100 出港
0510 入港
0800 淀川河川敷で就寝
1030 起床
1100 大阪駅
1130 ラーメン
1145 さくらインターネット到着

行きのフェリーにはちかっしーさんも乗っていたようです。

神戸三宮から大阪ですが、バイパスって車が最優先で設計されているので、歩道は道幅は広いもののアップダウンが激しく歩道橋も適当に設置されていて歩道を走ると本当に疲れます。疲れました。車道を走りましょう。

時間が余るのとフェリーの睡眠では足りないのとで淀川の河川敷で寝ました。1月とは言っても日中ならシュラフとウレタンマットがあれば安眠できます。太陽好き。大阪市はホームレス対策か何かで条例により野宿が禁止されているので昼寝(昼ではない)は出来ても宿泊が出来ないのが辛いところです。そもそも法的に都市公園での野宿はグレーですが。この条例の効果については大阪駅などでところどころ見られる強い生活感から感じられます。

自転車は有料駐輪場に置いてラーメンを食べに行きました。大阪駅は何度か来たことあるので構内は大して迷わず済みました。

午後の部

本体です。今年のグランフロント大阪には案内スタッフが配置されていて助かりますね。初見だとさくらインターネットに辿り着くの絶対に無理なので。 久しぶりにトミーとちゅらさんに会えて嬉しかったです。jigインターンのメンバーと2ヶ月おきに会う生活をしている。

一般発表

何と言っても最初の量子コンピュータの15分発表です。数式を追うのも精一杯と言うか後半は完全にthinking_face。 Cilviaさんの女装の話も本質で良かったですね。スライドも綺麗で流石だなと思います。 式部さんの発表はdotfilesについての物でしたが、僕もdotfilesは公開しているものの毎回手でln -sの温かみをしているのでGNU Makeでインストーラを書くのは是非取り入れたいです。

LT

termiusはプロプライエタリUbuntuしか対応してない(AURに無く公式サイトでUbuntuとあったので)ようで、少数派の苦悩。 政治経済の話は良かったですね。社会契約論以降を何もやってないので資本論をゆるふわに発表したいですが、知識と理解が空中浮遊しているので讃岐カンファぐらいにはどうにかしたい。

女子発表

ちゅらさんの発表が面白くて一番印象に残っています。航空機寝過ごした人の発表は一味違いますね。

LT

pythonはパイプライン演算子やメソッドチェーンのようなものでmapfoldが出来ないのがなあ。 プロジェクトのマネジメントは社会が無理になるので知見共有は積極的にやりたいです。MPが削られるので。

懇親会

caffeineさんとそこそこ話せて良かったです。前回の新春カンファほどFF外の人と会話出来なかったです。これが社会性の限界。 キーボード持っていくなどして会話力(かいわぢから)を補完します。

晩飯

jigインターン生とCilviaさん、福野さんで四国には無いサイゼに行きました。そこそこ食べましたが10人程度で入って8kで済むのすごい。 間違い探しクソ難しくない?

帰路

阪神高速下のバイパスをひたすら走りました。外側の1レーンが2輪専用なので側道を走ってもそこそこ安全です。文盲のドライバーが多いのか、2以上の数を数えられないドライバーが多いのか4輪ガンガン走っていましたが。路面状態は良好にも関わらず平均20 km/hしか出なくて貧脚ここに極まれりです。 出港時刻には余裕で間に合いフェリーで高松まで無事に帰れました。

翌日

0510に高松に着き、家に帰り風呂と就寝。起きるとTOEICで無事死にました。イングリッシュ無理。

高専カンファレンス in 名古屋

前日(移動日)

無計画です。何故なら計画が出来ないので。 瀬戸内海自転車一周を計画しているので予行でテントと寝袋を背負って移動しました。青春18切符です。

出席がアレなので4コマ目終わってからの行動ですが、これが原因で名古屋に辿り着けず米原までが限界でした。

道中大阪駅で見つけた野生のストロングゼロを紹介しておきます。多様性ですね。

当日

滋賀県内からの再出発です。絶起はしたものの普通に名古屋に1150に到着しました。 インターンで同室だったしゅんぴと合流して名古屋名物の台湾ラーメン食べました。

カプサイシンが程よく効いていて最高ですね。中川夏紀になりました(←?????)。台湾要素無いが...。

カンファ

印象に残った発表

ちげさんのフォントの話面白かったですね。フォントソムリエは怖い。 高専塾を作った人の発表はアニメーションが工夫されていて良さを感じました(語彙力)。 実行委員長の発表はアツくて流石実行委員長です。実行委員長すごい。

発表はどれも面白かったですがこれ以上やると語彙力が限界になりそうです。

懇親会

hsm_hx さんとGitコマンドかるたで対戦しました。ちなみにこれの作者は今回登壇していたちげさんです。 hsm_hxさんですが対戦する前まで「絶対勝てない」とか散々言っていたのに対戦始まってすぐ物凄い勢いで札を取っていったのでオタクそういうとこだぞになりました。 辛うじて引き分けましたがオタクそういうところだと思います。

今気付いたんですが、名古屋カンファから全ロボ行ったの僕だけではなかった。

飛び入りLTで限界旅行のLTをしたらウケたので嬉しかったです。宇部カンファではしっかり登壇したいですね。

全ロボ

名古屋カンファ終わってから全ロボ会場に移動していたら全ロボは2130以降入室不可能と知り死にました。青春18切符で名古屋から神戸まで2時間半で移動するのはどう考えても無理で限界宿泊発生です。

一応2日目には参加できましたが結構大変だしやはり名古屋→神戸を青春18切符で移動し次のイベントに参加は無理があると言うか無理しか無かったですね。

反省点

野宿はやめましょう。法的にグレー、雨に弱い、荷物が絶望的に重いなどの問題が発生します。ネカフェなら1.5kくらいで宿泊できるのでその辺りが狙いめですね。 宇部カンファはキャンプ場とネカフェで宿泊していきます...。

まとめ

カンファ、全ロボ共々お疲れ様でしたとありがとうございました:pray:

久しぶりのカンファでしたがやっぱり楽しいですね。jig.jpのインターンの人とも沢山会えました。新春カンファも楽しみです。

再版巡りマス

この世界は不完全なので理不尽があります。四国総文ミニプロコンがそう。 諸々の理由がありMackysonの4単位を掛けてミニプロコンに出ることになりました。

四国総合文化祭

12月に四国の高専の文化部が合同で行う文化祭です。2日間に渡って開催され、吹奏楽や合唱部のあれやそれ、漫研や文芸部の頒布などがあります。 毎年四国の高専が持ち回りで開催しており今年は詫間でした(高松と詫間は別高専なので)。

一日目

近接キャラですね。

時間が余ったので文芸部などの集まるブースに行き、文房具を見てきました。 生まれて初めて万年筆を触りましたがなるほどねになりました。

二日目

決勝で阿南と当たりましたが残念ながらというか当然ながら負けてしまいました。高松は入力無理太郎になったので「俺は今からソルバを捨てる!」をしましたが、阿南はソルバを運用しており完全に負けました。 ミニプロコンでは準優勝ですが、一日目と二日目の昼食は優勝したので平均すると優勝ではないでしょうか(ない)。

まとめ

漬け丼とうなぎは最高でしたね

D言語のインラインアセンブラ

人生にはインラインアセンブラが必要なことがありますよね。 D言語にはインラインアセンブラが実装されておりIntelスタイルでアセンブリを書くことが出来ます。

はじめに

この記事はD言語 Advent Calenderの12日目の記事です。 遅れての投稿で申し訳ありません。 ここに書いてあることは殆ど公式LLVM公式に書いてあるのでそちらを読んだほうが多分正確な情報が手に入ります。

基本構文

import std.stdio: writeln;

void main() {
    int a = 5;
    writeln(a);
    // asmブロックで囲む
    asm {
       // asm外で定義した変数を触れる
       mov RAX, a; // 末尾には「;」が必須
       add RAX, 1;
       mov a, RAX;
   }
    writeln(a);
}

関数からの値の返却

RAXレジスタに入れて抜けます。

int add(int a, int b) {
    asm {
       mov RAX, a;
       mov RBX, b;
       add RAX, RBX;
   }
}

D言語で追加された命令

align

align <Interger Expression>

命令を次の命令までの倍数で整列させるためにアセンブラにNOPを吐かせる命令です。

even

alignのに2が指定されたのと同じ意味です。

naked

D言語インラインアセンブラはデフォルトでprolog(論理型プログラミング言語ではない)とepilogを生成しますがそれをさせない命令です。 関数を全て書く場合などで、prologもepilogもプログラマ自信が書く場合などに使います。 基本は付けておいたほうが良いでしょう。

d.?

コードにデータを直接埋め込むための疑似命令です。 オペランドに文字列を指定すればバイト列で埋め込む事も出来ます。 |疑似命令|データ型| |-------:|-------:| | db | 8bit 整数 | | ds | 16bit 整数 | | di | 32bit 整数 | | dl | 64bit 整数 | | df | 32bit IEEE754浮動小数点数 | | dd | 64bit IEEE754浮動小数点数 | | de | 80bit 浮動小数点数 |

Operand Types

mov [RAX], 3;

上の例では3の型が曖昧です。3の型によって命令の意味が変わってしまいます。

mov int ptr [RAX], 3;

なのでこのようにintのptrとして書き込むとしてしてやります。

構造体等の扱い

struct Foo {
    int a, b, c;
}

// bを返す
int bar(Foo *f) {
    asm {
       mov RBX, f;
       mov EAX, Foo.b.offsetsetof[RBX];
   }
}

offsetsetofを使います。

struct Foo {
    int a, b, c;
    int bar(Foo *f) {
        asm {
           mov RBX, this;
           mov EAX, b[RBX];
       }
    }
}

構造体内だとメンバ名だけで書くことが出来ます。

最後に

D言語インラインアセンブラアセンブリそのままではなくD言語コンパイラによって意味解析まで行われるのでかなり書きやすくなっていると思います。 ただ、全ての命令が使える訳でも無く、例えばshlなどはオペランドを2つ取る形式しか使えません。 SSEもSIMDモジュールと同じでSSE4.2までです。 D言語のasm{}ではx86x86_64までしかサポートされていませんがLDCを使うとLLVMインラインアセンブラを使えるモジュールがあるのでARM、PPCMIPSなどのインラインアセンブラも書くことが出来ます。 D言語Adc遅れて申し訳ないです。

編集

Twitterでshitsyndromeさんにご指摘頂きアーキテクチャ名をamd64 -> x86x86_64に、EAXを一部RAXにしました。

OpenSCAD with clojure

この記事は高専Advent Calender 4日目の記事らしいです。 前日はykbrさんのGoでTwitter Botを改良していく記事でした。僕もそろそろコピーを作らないとですね。

Clojure始めました。 キーボードの記事という事になっていましたが、殆どOpenSCADをClojureで書く記事になります。

はじめに

皆さんEndgameしてますか?僕はしていません。 自作キーボードの界隈では至高のキーボードを手に入れることをEndgameと言います。 市販の入力デバイスの多くはテキスト入力かポインティングデバイスとしての機能に特化していることが多く、 どちらか片方ならば素晴らしいものは多いものの両方を高いレベルで満足させてくれる製品は数少ないのが現状です。 当然自作する流れになる訳ですが、ここで設計データの管理手法という問題が発生します。 3Dデータを直接GUIで構築するタイプのCADはCADベンダーが独自に提供するツールを使うかGitでバイナリとして扱うかになりがちです。 ならテキストで3Dデータを設計してやりましょう。

OpenSCAD

OpenSCAD - The Programmers Solid 3D CAD Modeller

幾何学計算にCGALを、GUIにQtを使ったテキストベースの3DCADです。部分的に翻訳された日本語のWikiチュートリアルなどがあります。 スクリプトを書いて3Dデータを作るためGitで管理しやすく複雑な形状も自動生成出来ます、がそこそこ辛いです。 トラックボールポチポチで出来ないのはトレードオフなので仕方ないですが変数が全てコンパイル時に計算される、 つまり最終的に格納された値で展開される為、スクリプトっぽい見た目に反して手でゴリゴリ書いていく羽目になります。 反復処理の抽象化すらかなり限定されてしまいます。つら...

scad.clj

なのでOpenSCADをより強力で汎用的な言語でラップするプロジェクトが幾つかあります。 紹介するのはclojureでの者ですが、RubyJavaScriptはありました。探したら他にもあるかもしれません。

プロジェクトの準備

僕はWindowsが苦手でMacOSが動くマシンも所持してないのでArch Linuxでの作業になります。 デスクトップOSのシェアはLinuxが7割以上ある(?)ので(?)多分大丈夫でしょう(???)

leiningen

clojureのパッケージマネージャです。 READMEにはstableからスクリプト落としてきてパス通せば良いと書いていますが、それやってリリースされてないパッケージダウンロードしようとしていたのでリポジトリをクローンしてリリースされたバージョンのスクリプトを使ったほうが良いです。 JREを入れていないなら先に入れておきましょう。leiningen 2.8.1だとopenjdk-8が良いらしいです。

git clone https://technomancy/leiningen && cd leiningen
git tag # 最新版を調べる
git checkout <latest version> # <latest version>は先程調べたバージョンで置換
sudo cp./bin/lein /usr/local/bin
lein # 起動してみる

プロジェクトを作る

lein new app scad-playground && cd scad-playground

プロジェクト名を変えたい場合はscad-playgroundを任意に置換してください。 project.cljを以下のように編集します。ライブラリのバージョンは適宜読み替えてください。

6,7c6
<   :dependencies [[org.clojure/clojure "1.8.0"]
<                  [scad-clj "0.5.3"]]
---
>   :dependencies [[org.clojure/clojure "1.8.0"]]

これで準備は完了です。

小さな立方体

./src/scad_playground/core.cljを以下のように編集します。

(ns scad-playground.core
  (:require [scad-clj.scad]
            [scad-clj.model])
  (:gen-class))

(def simple-cube
  (scad-clj.model/cube 10 10 10))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "simple-cube.scad" (scad-clj.scad/write-scad simple-cube)))

nsは名前空間を作るマクロで、:requireキーワードで外部ライブラリを読み込むことが出来ます。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))
(def simple-cube
  (model/cube 10 10 10))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "simple-cube.scad" (scad/write-scad simple-cube)))

asキーワードを使うことでパッケージを短縮することが出来ます。以降やります。

openscad ./simple-cube.scad

小さな立方体をOpenSCADで表示したスクショ

プリミティブ図形達

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def simple-cube
  (model/cube 10 20 30))

(def simple-sphere
  (model/sphere 10))

(def simple-cylinder
  (model/cylinder 10 30))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "simple-cube.scad" (scad/write-scad simple-cube))
  (spit "simple-sphere.scad" (scad/write-scad simple-sphere))
  (spit "simple-cylinder.scad" (scad/write-scad simple-cylinder)))

f:id:namachan10777:20181204224907p:plainf:id:namachan10777:20181204224913p:plainf:id:namachan10777:20181204224918p:plain

ブーリアン演算

OR

union関数を使います。引数に渡された図形の論理和を取ります。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/union
    (model/cylinder 10 50)
    (model/sphere 20)))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

f:id:namachan10777:20181204234016p:plain
これは何?

AND

intersection関数を使います。引数に渡された図形の論理積を取ります。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/intersection
    (model/cube 15 15 50)
    (model/sphere 20)))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

f:id:namachan10777:20181204230511p:plain
両方向から少しだけ使った消しゴム

差分

difference関数です。ネジ穴等を開けるときに重宝します。 第一引数から以降の引数の領域を除去した図形が出力されます。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/difference
    (model/cube 15 15 50)
    (model/sphere 20)))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

f:id:namachan10777:20181204234153p:plain

基点変更

scad-cljではデフォルトでcenter=trueとなっています。これは図形の中心と現在の座標が一致するように図形を配置するという意味で、 これがtrueだと座標計算が面倒になる場合があります。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))
(def simple-cube
  (model/cube 10 10 10 :center false))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "simple-cube.scad" (scad/write-scad simple-cube)))

f:id:namachan10777:20181205005330p:plain 基点が変更されていますね。ちなみに球だと何も変わりません。

なめらかさ

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model])
  (:gen-class))

(def simple-cube
  (model/union
    (->>
      (binding [model/*fn* 100] (model/sphere 10))
      (model/translate [ 20 0 0]))
    (->>
      (binding [model/*fn* 10] (model/sphere 10))
      (model/translate [-20 0 0]))))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "simple-cube.scad" (scad/write-scad simple-cube)))

bindingを使いスコープを越えて変数を書き換えることで円や球の滑らかさを変更できます。 仕様として妙な気はしますがOpenSCAD自体がこうなっている為それに合わせたのでしょう。 f:id:namachan10777:20181205005238p:plain

移動

水平移動

translate関数を使います。

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/union
    (model/translate [20 0 0] (model/cube 15 15 50))
    (model/translate [-20 0 0] (model/sphere 20))))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

f:id:namachan10777:20181204234210p:plain

回転移動

rotate関数を使います

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/union
    (model/rotate [20 0 0] (model/cube 5 5 100))
    (model/rotate [0 20 0] (model/cube 5 5 100))))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

f:id:namachan10777:20181204234223p:plain

マクロ

clojure->>を使った書き方もあります。 水平移動を例に取ると、

(ns scad-scad.core
  (:require [scad-clj.scad :as scad]
            [scad-clj.model :as model]))

(def primitives
  (model/union
    (->>
      (model/cube 15 15 50)
      (model/translate [20 0 0]))
    (->>
      (model/sphere 20)
      (model/translate [-20 0 0] ))))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (spit "primitives.scad" (scad/write-scad primitives)))

最後に

全然キーボード作ってないですね。登録詐欺か? Adc書かずにCivをしていました大変申し訳ありません。Clojure+OpenSCADで設計をする記事は今後も書きたいです。

明日はhrt9092さんの画像処理に関する記事です。アドベントカレンダーを読むのを楽しみに日々を生きている。

gitchallenge

mixiのgitchallenge行ってきました。 LTも競技も非常に勉強になるし、飯もとにかく最高なので最高のイベントです。行ってない人は是非応募してほしいです。

参加まで

TLでnaoppyさんやhsm_hxさんがgitchallengeの話をしているのを見て知りました。 試験期間中ではありましたが、交通費全額支給とのことなので取り敢えずMackysonを誘って応募し、通りました。これで無事試験勉強時間が減ってGPAの危機になります。

前日

高松空港(TAK)から成田空港(NRT)までJetstarで飛びました。Jetstarは予約確認メールがJetstarしたり旅程表がJetstarするなどのトラブルはありましたが空港についてからと機上でのサービスは良かったです。接客よりメール配信基盤に投資して...。カプセルホテルで4k円とかで寝るのもなんだかなになったので、この日はMackysonと一緒にNRT空港で寝る予定でしたがMackysonが親族の家で泊まるムーブをしたのでぼっちになりました。 第2ターミナル2階で寝ましたがソファーはそこそこ埋まってました。冷暖房完備でそこそこ快適でしたが、床が硬かったので次は受託手荷物でキャンプ用のマットを預けます。

当日

朝0700に起床しました。成田空港の朝は早くて同業者(成田空港雑魚寝人)は殆ど消えていました。 京浜特急と総武線、山手線を乗り継いで御徒町まで行き燕湯で風呂りました。銭湯感あって良かった。 気がついたら時間ヤバくて開始時間5分前とかでした。Mackysonは開始時間5分後くらいに来ました。

午前

ペアはpinfortさんとです。 てっきりすぐチュートリアルして競技開始だと思っていましたが、LTが入りました。 Gitを使った開発フローの話と、GitHubでCI回してドメイン管理する話でした。 僕は適当にdevからブランチ生やして適当に手動マージしていましたが、Slackのbotでの自動マージや治安の悪いブランチなど勉強になりました。 2本目のLTでは、僕はCIは専らテストにしか使っていないのでデプロイとかも自動化するぞの機運になりました。 チュートリアルはWAを生やして無になりました...。

滅茶苦茶旨い欧風カレーが出てきました。

午後

本番です。序盤はpinfortさんと交互に解きましたが、僕がある問題で謎を生やしている間にpinfortさんがそこそこ難しい問題を殆ど解いてくれていて、carryしてもらった感がありました。 無限にWAを生やしていましたが謎を生やしていた問題は気がついたら解けていました。なぜ

高難易度を除いてペアで全部解けましたが、高難易度を2問解いたチームが居て負けて2位でした。あれ分かるのプロでは。 詳細は言えないですが、実際に発生しそうな問題もあり恐怖でした。

競技終了後にもLTが2問あり、Gitでデータサイエンスをする話とGitに詳しくなるまでの話でした。Linuxのコミットメッセージでポジティブなのはネガティブなのより少ない、Linux...感情...ウッ頭が。 GitはLinusが開発したということもあり、hamadaさんも怖い人だと勝手に思っていましたが滅茶苦茶優しいのを知りました。偏見はダメですね。

帰宅

新宿駅意味不明で屋根が見えるからここは1階だなと思っていると、僕をcarryしているMackysonが上に上がりだして、地上に出ました(?????????)。新宿バスタも2階に車が走っている(????)しエスカレーターを二度上がると4階に居ました(??????????)

インターンで同部屋だったエスパーをここで会えました。久しぶりの再会です。何人かは徳島でも会えましたが、インターンの人とはまた会いたいですね。

翌日

バス寝過ごしました。