haneuma.log

生きるのをがんばりたいソフトウェアエンジニアのブログ

仕事のがんばり具合を記録して可視化する(記録する編)

はじめに

これは Yahoo! JAPAN 18 新卒 Advent Calendar 2018 の21日目の記事です。

みなさん仕事がんばってますか?自分は新卒らしくがんばっています。がんばっているので、がんばり具合を記録して可視化します。

やりたいことはだいたいこういうことです。 pokutuna.hatenablog.com

ざっくり書くと:

  • 開いているウィンドウのログを記録する
  • グラフにする

ということをやります。どんなウィンドウを開いていたかを時系列に並べてグラフにすれば「10時から1時間くらい Emacs 開いてるからコード書いてるんだな、がんばってるっぽいぞ!」というのがわかります。これががんばり具合です。

セキュリティ的に、社外秘を含む情報を扱う端末のログの外部送信は問題があるので、このような取り組みを社内の環境で行えるような仕組みを自分で作ります。今回は記録するところについて書きます。

できたもの

社用 PC が Mac なので Cocoa でアプリケーションを作ります。Swift は書いたことがないのでインターネットを駆使してがんばります。がんばると、このような JSON が獲得できます。

[
  {
    "kCGWindowAlpha" : 1,
    "kCGWindowLayer" : 0,
    "kCGWindowMemoryUsage" : 1128,
    "kCGWindowSharingState" : 0,
    "kCGWindowOwnerPID" : 39418,
    "kCGWindowNumber" : 154478,
    "kCGWindowOwnerName" : "Xcode",
    "kCGWindowStoreType" : 1,
    "kCGWindowBounds" : {
      "X" : 135,
      "Height" : 877,
      "Y" : 23,
      "Width" : 1305
    },
    "kCGWindowName" : "AppDelegate.swift"
  },
  {
    "kCGWindowAlpha" : 1,
    "kCGWindowLayer" : 0,
    "kCGWindowMemoryUsage" : 1128,
    "kCGWindowSharingState" : 1,
    "kCGWindowOwnerPID" : 2160,
    "kCGWindowNumber" : 151228,
    "kCGWindowOwnerName" : "Google Chrome",
    "kCGWindowStoreType" : 1,
    "kCGWindowBounds" : {
      "X" : 170,
      "Height" : 62,
      "Y" : 92,
      "Width" : 366
    },
    "kCGWindowName" : ""
  }, ...

開いているウィンドウの名前と、どのアプリケーションから起動されているかがわかりますね。おおむね重なり順も合っているはずですが、雑に作ったので怪しいかもしれない。 JSON が得られたので、Elasticsearch + Kibana で可視化できそうな感じがしますね。

しくみ

常駐の Cocoa App で5秒ごとにウィンドウログ取得して、JSON 形式で保存させています。XCode の気持ちになって、しかるべき場所にこのようなコードが書いてあると思ってください。

func applicationDidFinishLaunching(_ aNotification: Notification) {
    Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.saveLog), userInfo: nil, repeats: true)
}

@objc func saveLog() -> Void {
    let filename = self.getDocumentsDirectory().appendingPathComponent("\(NSDate().timeIntervalSince1970).json")

    let windowList = self.getWindowList()
    let data: Data = try! JSONSerialization.data(withJSONObject: windowList!, options: [])

    do {
        let windowInfoList = try JSONDecoder().decode([MyWindowInfo].self, from: data)

        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        let encoded = try! encoder.encode(windowInfoList)

        do {
            try String(data: encoded, encoding: .utf8)!.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
        } catch {
            print(error)
        }
    } catch {
        print(error)
    }
}

getWindowListMyWindowInfo あたりが大事なので、詳しく説明します。

ウィンドウリストを取得する

CGWindowListCopyWindowInfo() でさっくりウィンドウリストが取得できます。CFArray で結果が返ってくるので、外側は NSArray にキャストします。中身は NSDictioanry とします。.optionAll ですべてのウィンドウを取ってくると常駐アプリケーションや Desktop プロセスなどのがんばり具合に寄与しないものが取れてしまうので、適当にフィルタします。高さが23以下のウィンドウは常駐アプリケーションで、layer が 0 より小さいのは Desktop プロセスとかその辺です。用途によっては自作のフィルタではなく、CGWindowListCopyWindowInfo() のオプションでいい感じに必要なウィンドウだけ取得することもできます。

func getWindowList() -> [NSDictionary]? {
        guard let windowList: NSArray = CGWindowListCopyWindowInfo(.optionAll, kCGNullWindowID) else {
            return nil
        }

        let swiftWindowList = windowList as! [NSDictionary]

        let filteredWindowList = swiftWindowList.filter { (windowIndo: NSDictionary) -> Bool in
            var flag: Bool = true

            // Bounds filter
            let bounds = windowIndo[kCGWindowBounds] as! NSDictionary
            let height = bounds["Height"] as! Int
            if height <= 23 {
                flag = false
            }

            // Layer filter
            let layer = windowIndo[kCGWindowLayer] as! Int
            if layer < 0 {
                flag = false
            }

            return flag
        }

        return filteredWindowList
    }

JSON に変換する

getWindowList() で得られるのは NSDictionary の NSArray なので、JSON 文字列に変換していきます。 JSONSerialization -> JSONDecode -> JSONEncode という手順でやります。 Serialization で潰したデータを一旦 Decode して、人間に優しい表記で Encode する感じです。

平たく書くとこうなっています。例外の気持ちになって、しかるべきコードに読み替えてください。

let windowList = self.getWindowList()  // -> [NSDictionary]

// windowList を1行に潰す
let data: Data = JSONSerialization.data(withJSONObject: windowList, options: [])

// ねじ込む
let windowInfoList = JSONDecoder().decode([MyWindowInfo].self, from: data)

// 人間に優しい表記にする
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let encoded = encoder.encode(windowInfoList)
let dst = String(data: encoded, encoding: .utf8)!

Decode するときは Codable を使います。潰したデータを任意の構造体にねじ込めます。便利ですね。

struct MyWindowInfo: Codable {
    var kCGWindowAlpha: Double
    var kCGWindowBounds: MyWindowBounds
    var kCGWindowIsOnscreen: Bool?
    var kCGWindowLayer: Int
    var kCGWindowMemoryUsage: Int
    var kCGWindowName: String?
    var kCGWindowNumber: Int
    var kCGWindowOwnerName: String
    var kCGWindowOwnerPID: Int
    var kCGWindowSharingState: Int
    var kCGWindowStoreType: Int

    struct MyWindowBounds: Codable {
        var Height: Int
        var Width: Int
        var X: Int
        var Y: Int
    }
}

ログについて

ログは溜めて使ってこそ価値がありますね。弊社もそのようにやっています。そういうわけで、運用にあたって調べておきたいことを調べておきます。

容量・転送

常駐アプリケーションで5秒毎にテキストデータを生成しているので、ログが気になります。見てみると1ファイルあたり 44KB でした。 1時間で 60 * 60 / 5 * 44 = 31680KB になります。32MB くらいですね。今月の必要労働時間は147時間15分らしいので、1ヶ月で (147 * 60 * 60 + 15 * 60) / 5 * 44 = 4664880KB になります。4.7GB くらいですね。 保存期間を1年間とすると 56GB くらいになります。現実的な容量ですね。

また、ログの保存と可視化のために、適当なサーバに定期的に転送する必要があります。 1時間ごとに転送するとして 32MB くらいなので、現代のインターネットなら問題なさそうです。 社内のネットワークを計測したところ、7.80MB/sec でした。5,6秒あれば転送できそうです。

メモリ使用量

だいたい 12MB くらい食べています。社用 PC のメモリは 16GBなので、常駐させても問題なさそうです。

セキュリティ

ウィンドウ名に社外秘情報が含まれる可能性があるので、生ログは社内にしまっておく必要があります。

まとめ

いつ、どのくらい、どんなウィンドウ(アプリケーション)を開いていたかのログを使って、仕事のがんばり具合を記録・可視化する取り組みについて書きました。 この記事では Cocoa でロガーを作るところと、ログの保管について少しだけ検証しました。可視化するところは作業中なので、また別の記事に書きます。

Swift は初めて書いたので、記事内のソースコードについてコメントがあればぜひお願いします。また、このプログラムは社内の GHE に置いているので、興味のある方は入社して一緒にがんばり具合を記録しましょう。

以上、Yahoo! JAPAN 18 新卒 Advent Calendar 2018 の21日目の記事でした。

参考

第51回 情報科学若手の会に参加しました

はじめに

wakate.org

今年も情報科学若手の会に行ったので書きます。こちらは参加者の気持ちで、幹事の気持ちは反省会後にまた書きます。

過去の参加記録はこちらです。

今年で参加も4回目になるので、感慨深いかもしれない。今年は気づいたら終わってた気がしました。楽しい時間は終わるのが早いというので、そういうことですね。気が抜けているだけかもしれないので、気合を入れたい。

発表の感想

招待講演と若手特別講演

招待講演はコンテナーデータセンターを個人で作ったお話を、宇田さん。

「データセンターを個人で作った」という文字列が強力なので何を聞いても面白く、とても楽しい時間だった。「コンテナー即売会」「いかにもコンテナーを置くためのようないい物件」「土地が買えてしまったので後戻りできなくなった」がお気に入りワードベスト3です。 普段キーボードを叩いて暮らしているので現実空間に存在するものを作る話は夢があるし、遠い存在だと思っていたデータセンターに親近感がわいて良かった。ラック3台くらいなら単相電源で良いのか〜なるほど〜と思った。質問者が皆「自分もデータセンター欲しくなりました、」という枕詞をつけて質問を始めており、やはりこれは情報科学の人間の夢なんだと思う。僕もほしいので、とりあえず家で雑になっているラズパイをどうにかするところから始めたい。

若手特別講演はプログラムの難読化手法について、黒米さん。

難読化というとソースコードをややこしくするだけだと思っていたけれど、ロジックの難読化や論理式の複雑化など、色々なアプローチがあって興味深いと思った。 一番面白かったのは、プログラムの高速化の手法を難読化の方法として用いるところ。他のセッションでちょうど高速化はコードが複雑になって辛いという話をしていたので、ふつうのソフトウェア開発で欠点になるところを活用してしまうのは皮肉っぽい。活用する側が攻撃側なので欠点といえば欠点なのだけど。SATソルバの話なども出てきて、プログラミング言語の色々を使って攻防が繰り広げられているのだあ、と思った。あとはやっぱり機械学習が使われてきており、今後もっと使われていくという見解を得た。後輩がそのようなことをやっていて、構文木をデータとして入れて云々という内容だった気がするので、今度会ったら詳しく聞こうと思った。 聞いてて面白いけど詳しく理解できなかったことはとても残念だったので、精進したい。

一般/ショート

情報科学のことならなんでもOKという趣向で発表を募っているので、毎年様々な分野の深い話を聞けて良い。 トピックスはだいたいこう。

プログラミング言語、セキュリティ、インフラの話が多かった気がする。同じ人を壇上で3回くらい見かけるのを2回くらいやった気がするので、そういう関係かもしれない。

印象に残った感想を述べていきます。

  • 非同期処理の手法がとっちらかりすぎててすごい

  • Lispは神言語

  • やはり一度コンパイラを作りたい
  • サイバー攻撃の可視化には学生時代の研究室の関係上一家言あるので(以下略)
  • ポートを家の扉に例えるのはかわいかった
  • 極力人間の仕事を減らすために環境構築を自動化したいが、年1回のためにどこまでやるかは考えるところがある
  • 「(時間を食われすぎるため)CTFは明らかに社会人には難しい」
  • 企業がこれほどまでにCTFに力を入れているのは、ハッカーの技術を吸収できるとか、未知の脆弱性を見つけられることもあるとか、メリットが大変大きいため
  • OSSは人
  • 発表中にOSSのオーナーにTwitterでメンションを投げて無事返信があり、めでたかった
  • 会計データで会社のマッチング
  • IaaSの多様性がしんどい
  • Rustは要するに安全なC++
  • REmacs
  • アカデミアでのニューラルネットはブームの終わりを迎えているところ
  • 計算機科学の知見が脳科学に示唆を与えている!可能性を感じて嬉しくなる
  • ディープラーニングは脳になれるか?→No(激うまギャグ)
  • ディープラーニングで中間表現を扱えるようになってきている
  • GANすごい
  • 「discriminatorがグレる」

交流イベントの感想

今年はナノブロックを説明書を見ないで組み立ててもらうゲームをしました。説明書を見て指示を出す人、ブロックを組み立てる人に分かれてやります。また、箱の中身は何だろな?クイズをやりました。ガラケーとかアヒルのおもちゃとか入れました。

みんな集中してて茶々を入れても構ってもらえず寂しかったです。 僕もやりたかった。

ナイトセッション・懇親会

会場の都合上、みなさんとお話できる時間は短かったですが、話したかった人と話せて良かったです。

おわりに

来年は発表したい。

推しきのこ #wakate2018

ヤフー株式会社に新卒入社していました

試用期間が終わったのでネタばらし。

haneuma0628.hatenablog.jp

ポートフォリオサイトにはちゃっかり書いてあるし、所属の記載が必要な場所には適宜書いているので今さらですが、4月に入社していました。10月から本配属されて元気に働いています。やることはインターネット広告の後ろの方で動いてる何かのアレです。

社会に出た感想

就活をしていた頃にぼんやりしていた「ソフトウェアエンジニア」が少しだけはっきりしてきました。良かったですね。 会社で色々なチームを見て、WebとSIerだけではないんだなあと思いました。 既に働いている友人知人がほとんどなので多少この仕事について分かっているつもりでしたが、人々が日々何を作っているかなんて全然知らなかったんだな、と思いました。

『人間の気持ちを察していい感じに動くシステムの、後ろの方のデータとかアーキテクチャとか基盤とかそういうやつ』というフワフワしたやりたい仕事像でしたが、会社には無数のシステム・サービスがあるので、具体的に面白そうなものなどを見つけることができて良かったです。新人のゆめとりそうとバズワードとフワフワの塊を、こういうのが向いてるんじゃない?と教えてくれる会社の人はすごいなあと思いました。引き続きよろしくお願いします。

これから

クビにならないようにがんばります。

カリフォルニア旅行記 3日目

アメリカにも少し慣れてきました。こんにちは。カリフォルニア旅行記と言いながらサンフランシスコしか散策していないので、今日はバークレーに行ってみます。

KIKKOMAN

アジア料理を食べると決意したので、飲茶をした。サンフランシスコらしさを保ちつつの重たくないアジア料理、という訳です。

海老餃子、焼売、Chinese Broccoli を食べた。蒸し物を食べるための醤油に感動した。KIKKOMAN、ありがとう。食べ物はカートで運ばれてくるので、英語のメニューと格闘せずに良くて便利だった。

お茶のポットが大きすぎて焦ったけど、隣のテーブルのガイにも同じ大きさのポットが運ばれてきてホッとした。振る舞いを真似るのにチラチラ見てしまって、落ち着かない食事にして申し訳なかったかもしれない。

f:id:haneuma0628:20180320154518j:image

Sain’t Patrick Day

航空券を予約した後にガイドブックを見て知ったのだけど、旅行3日目の3/17はちょうど Sain’t Patrick Day のパレードが開催される。この日は緑色のものを身につけて、ワイワイするとのことだった。楽しそうなのでパレードを眺めに行った。

f:id:haneuma0628:20180320175501j:image

それとなく緑色の人々が、楽器の演奏やダンスをしたり、お菓子やグッズを投げていた。緑色のビーズがジャラジャラしたやつと、キーホールダーと、チョコレートバーを貰った。浮かれているので、緑色のビーズがジャラジャラしたやつはこの日ずっと首にかけていた。

パレードは様々な団体が行なっていて、ナントカスクールとか、ナントカクラブとか、ポリスメンとかがいた。変なのもいた。

f:id:haneuma0628:20180320175536j:image

大学と学生街

大学生なので大学を見てみたくて、大学に行ってきた。カリフォルニアと言うとスタンフォード大学の印象が強かったけれど、シリコンバレーは遠いので、もう少し近いカリフォルニア大学 バークレー校に行った。

f:id:haneuma0628:20180320175553j:image

筑波大みたいだな、と思った。木々が生い茂り、散歩には良かった。学内のいたるところにリスがいた。追いかけると逃げられた。

UCバークレーは敷地内や少し離れたところに博物館や科学館、植物園などがあって、見学することができる。地図が読めなさすぎて目的の博物館が発見できず、科学館や植物園に行くバスは1週間ほど一時休止しており、何一つ見れないまま、ただ散歩だけすることになった。

学内には実験中のロボットや、ラジコン車のプログラミングをしている学生がいた。仲間を見つけたような気持ちで少し嬉しかった。学内の掲示板には、Web開発講座の案内が貼ってあった。ギークのemojiがかわいい。

f:id:haneuma0628:20180320175842j:image

正面入口から伸びるメインストリートを散策しようと思ったが、慌てて引き返してきた。明らかに街並みが怪しく、奇声をあげる人、ドラッグを売る人、などを観測した。おい、ガイドブック、ファンキーな店が多いけど思い切って入ってみよう、とは何だ、冗談だろ、と思った。

聞くと学生運動なども盛んで、リベラルやヒッピーの街なので、まあ、危ないよね、と納得した。確かに大学の周りは治安悪いな、と、自分の大学を思い出した。比べ物にならない程度ではあるけど。掲示板にもヤバそうなポスターが貼ってある。英語読めないので、雰囲気しか分からないけれど。

怖くないところもあって、バークレーに着いてすぐ行った Shattuck Ave のカフェは落ち着いていて良かった。ただ、ラテが丼で提供されて、これがアメリカか…となった。余談だけど、店員さんがモードな感じでカッコよかった。

f:id:haneuma0628:20180320175932j:image

f:id:haneuma0628:20180320175549j:image

うどん

危ない街から逃げ帰り、疲弊し、胃が弱り、あまり食欲もないのでうどんを食べた。何かに負けた気がしたが、健康第一を心がけた。海外旅行にインスタント日本食を持って行く人の気持ちが分かった。わかめうどんは優しい味がした。

次回

胃が復活し、現代美術を鑑賞して、アートなガールにキュンとなり、食事らしい食事に感動を覚えて、猫にモテます。

カリフォルニア旅行記 2日目

まだ生きてます。こんにちは。1日目は移動日だったので、実質今日からいい感じに観光していきます。

朝食と買い物

いわゆる時差ボケ的なもので全く寝れず、7時くらいから活動を開始した。ホテルにいても暇なので散歩をしたかったけれど、まだ暗くて危ないので夜明けを待った。原始的だ。

アメリカの朝食=パンケーキみたいな気持ちがあったので、パンケーキを食べに出かけた。

f:id:haneuma0628:20180319015517j:image

塩気とバター感があって、食事っぽい。薄いけど食べ応えがあって美味しかった。バターをグリッと塗ってメープルシロップをバサーとかけて食べるとうまい。そして重い。オレンジは癒し。

異国のスーパーが見たかったので、Trader Joe’s に行った。ドライフルーツとナッツがたくさん売っていて、ワインは投げ売りか?みたいな値段だった。あと、マッシュルームも安い。定番らしいショッピングバッグと、ドライマンゴーと野菜ジュースと水を買った。ドライマンゴーはでかくて分厚くて、野菜ジュースは野菜の味がした。

ケーブルカーと土砂降り

朝から活動できたのでケーブルカーに乗った。海が見たかったので、Powell Station から北に向かう電車に乗車した。椅子が外側を向いてて窓がない席に乗った。アトラクションだった。楽しすぎて写真も動画も撮り忘れた。高いところは苦手だけどジェットコースターは好きなんですよね。

終点の Fisherman's Wharf 付近で降りたら土砂降りに遭遇した。クラムチャウダーを食べてアシカを見る予定だったけど、雨雲から逃げていたらいつの間にか San Francisco Maritime National Historical Park まで来ていた。

空が青くて、遠くに Golden Gate Bridge が見えてめちゃくちゃ綺麗だった。あんまり綺麗なので、しばらくぼーっとしていた。

f:id:haneuma0628:20180319022430j:image

f:id:haneuma0628:20180319022922j:image

山登り

散歩しつつ、ランドマークを巡ることにした。目標を Lombard  Streat と Grace Cathedral に定めて、南下していく。

よく考えれば分かることだけど、坂を登って来たので、帰りも坂を登る。30°はありそうな急勾配を登った。息は上がるけど汗はかかなかったので、ジャパニーズヤマノボリよりは辛くなかった。

苦労して歩いた甲斐あって、Lombard  Streat からは最高の眺めを楽しめた。今回の旅行のベストショットだと思う。

f:id:haneuma0628:20180319062907j:image

再び坂を登り、Grace Cathedral を見学した。中は静かで、英語を聞きすぎて疲れた頭が休まった。キリスト教の作法が分からないけれど、旅の安全を祈っておいた。ステンドグラスが綺麗。

f:id:haneuma0628:20180319082800j:image

おしゃれストリート散策

歩き疲れたので少し休んでから、Hayes Valley を散策した。Hayes Vally は代官山をアレした感じのところ、と教えてもらった。代官山は行ったことないけど、代官山っぽいなと思った。

洋服を見たり、ガジェットのお店を見たりした。洋服はお臍を出していくスタイルに驚き、ガジェットは家をハックする系が目に付いた。

ハンバーガーに負ける

アメリカといえばハンバーガーだなと思って、昼前に1つ、昼過ぎに1つハンバーガーを食べた。あとフライドポテト。

昼前に食べたハンバーガーは肉屋さんがやってるお店のやつで、ターキーが挟まっていた。さすが、肉がうまい。ハンバーガーって美味しいんだな、と感動した。昼過ぎに食べたハンバーガーは Super Duper Burger のやつで、ジャンキーで美味しかった。フライドポテトも食べた。

思えば朝のパンケーキを食べたところから若干胃腸に不安があった。慣れない油ものに疲れて、ホテルに着いた頃にはお腹を壊してぐったりしていた。日本から持ってきた太田胃散を飲んで、しばらく寝たら少し良くなった。明日は絶対アジア料理を食べる、と決意した。

次回

点心のお店で醤油に感動し、Sain’t Patrick Day のパレードを眺め、丼に入ったラテに驚き、リスを追いかけ、学生街から逃げ帰り、絶対に食べないと決めていたジャパニーズフードを食べて落ち着きます。

カリフォルニア旅行記 1日目

生きてます。こんにちは。無事に渡航することができたので、旅行記を書いていきます。移動を含めて5日間滞在する予定です。よろしくお願いします。

アメリカに入国

福岡空港羽田空港→成田空港→サンフランシスコ空港 といった経路で向かいました。いつもは長いと感じる福岡→羽田が近所のスーパーに行く程度に感じられた。

成田空港でモバイルWiFiルータの受け取り、米ドルの調達、旅行用品の買い物をして搭乗の時間を待つ。空港のターミナルはぶらぶらするだけで楽しくて、フライトまで時間を潰すのにはそれほど苦労しなかった。

出国審査はスッと終わった。搭乗前に、ランダムな抜き打ち審査とやらに呼ばれた時は少し焦った。怪しい人物の再検査というわけではないらしく、安心した。

フライトは長かったけれど、機内食が出るし本と映画をダウンロードしておいたiPadを持ち込んだので、それほど暇ではなかった。本は『何者』を読んだ。映画は『ヒトラー 最後の12日間』を観た。

f:id:haneuma0628:20180317184049j:image

一番心配だったのが入国審査だけど、5分くらいで通過できてよかった。審査官のはじめの一言が聞き取れずに慌てたけれど、特に突っ込んだことも聞かれずに淡々と通過した。預けた荷物もロストせずに受け取れて、無事に空港を出ることができた。

ホテルのチェックインと散策

宿泊先のホテルのあるユニオンスクエア付近まではBARTで行った。日本の電車はきれいなんだな…と思った。降車駅のPowell Station はカジュアルにホームレスがいて、タバコか何かの臭いが強かった。海外に来たな〜という実感を得た。

ホテルに着いて、いよいよまともな英会話が必要になったのでがんばった。フロントの人は親切に対応してくれて、ひどい英語ながらも、なんとか受付ができた。ここで「英語喋るの緊張する」などという感情は破壊された。下手くそだろうがなんだろうが、やればできる。良かったですね。

f:id:haneuma0628:20180317191000j:image

チェックインまでは時間があったので、ホテルには荷物だけ預けて散歩に出かけた。

アメリカで最初の食事はサンドイッチにした。お店の店員さんとの会話はリスニングが全然ダメで、雰囲気でなんとかした。サンドイッチは美味しいけど重かった。

f:id:haneuma0628:20180317200758j:image

海が見たかったので、Ferry Building Marketplace の方まで歩いた。途中、写真を撮っていたおじちゃんに『この水面に広がる波紋と塔のコラボレーションが素敵だから写真を撮っているんだよ(ぼんやりした訳)』などと話しかけられた。英語を聞き取れる場合もあるのだな、と思って嬉しかった。わかる、めっちゃ綺麗だと思う!みたいなことを返した。

f:id:haneuma0628:20180317191843j:image

ところで、写真で分かるようにこの日は雨だった。カリフォルニアは天気が良いと聞いていたので少し残念だったけど、小雨程度なのでそこまで気にならなかった。ただ、海沿いは寒くて、コートとストールを持ってきて正解だった。

オフィス見学

以前参加したRails寺子屋でお世話になったhmskさんの働くIndiegogoのオフィスの見学と、アメリカどうですか的な話を聞きに行った。僕がRails寺子屋に参加したのがはるか昔のことだったけれど、覚えてもらえていて良かった。

オフィスを訪問したのは18時で、人々は酒を飲み、スケートボードで遊んでいて最高だった。毎週木曜日はそのように過ごしているとのこと。日本でも似たようなオフィスは増えてきているけれど、本当に夕方に人がいなくてお酒を飲んで遊んでいるんだな、アメリカンだな、と思った。みなエネルギッシュに短時間で仕事をこなしているとのことで、僕も見習いたいと思った。

コーヒーを飲んだりビールを飲んだりしながら、アメリカで働くとこんな感じ、という話を聞いた。ベタだけど、日本で働き疲れたら海外で働くのもいいなあ、と思った。修士号は便利だぞ。あとはアーク溶接や梅ヶ枝餅など、雑多なお喋りをして楽しく過ごした。

次回

ケーブルカーで坂道を疾走し、海辺で土砂降りに逢い、急勾配の坂道を登山し、大聖堂で祈りを捧げ、おしゃれストリートをぶらぶらして、ハンバーガーに胃をやられてお腹を壊します。

旅行準備進捗

パスポートは無事申請できて、思ったより早く受け取れた。申請を無事に済ませられてめでたかったので、ぶりの照焼定食を食べた*1

f:id:haneuma0628:20180221164323j:plain
パスポート申請の帰りに食べたぶり

パスポートが手に入ったので、飛行機とホテルの予約をした。

LCCというのもあるのだけど、旅慣れていないのでANAの飛行機を予約した。3月の終わりの航空券はそれなりに高額だった。中旬だと片道7~8万円くらいで買えそうだったので、予定より早目に旅行に行くことにした。

ホテルは日本語を話せるスタッフのいるところを探した。ぱっと思いついた予約サイトが楽天トラベルだったので、楽天トラベルを使った。人気順に並べて、上の方で宿泊費がいい感じのところを予約した。

パスポート、飛行機、ホテルの準備ができて気が楽になったので、旅行用品を買い集める作業を始めた。 雑にWeb上を検索していると、あれもこれも、という感じで疲れてきたので、ロフト行けば何とかなると思ってそのようにしました。何とかなった。

勢いが出たので、ついでに海外旅行保険WiFiルータの契約も済ませた。

これで滞在に必要な主たる手続き等は大体やった気がする。あとはESTAの申請だけですね。良かったですね。

ところで、準備のためにWebでちまちま情報収集をしていたけれど、ガイドブック買ったほうが早い気がしてきた。海外旅行について何も知らないので、学習の方法として体系的にやりたいみたいな気持ちがあったりする。断片的な情報を集めるのは面倒だし。